var FilterManager = function() {

    var filterStatus = {};
    var filterSubStatus = {}; //CR119
    var filterGroups = {};
    var lookupTbl = {};
    var fStatusPostfix = '';
    var fShowPriceRange = false;

    return {
        addFilterGroup: function(fieldName, condition) {
            //Logger.debug('ECTRL: addFilterGroup: ' + fieldName + '=' +condition );
            filterGroups[fieldName] = new FilterGroup(fieldName, condition);
        },
		
        addFilter: function(fieldName, filterCtrlId, operator, filterValue, filterType, fieldSubName, filterSubValue) {

            var fltPrevStatus = filterStatus[fieldName];
            var fltPrevSubStatus = filterStatus[fieldName+'_sub']; //CR119

            var flt;
            		
            switch(filterType) {
                //CR119
                case HtmlFilters.SUBFILTER:
                    flt = new SubFilter(fieldName, operator, filterValue, fieldSubName, filterSubValue, filterCtrlId);
                    if (fltPrevStatus) {
                        flt.active = true;
                        flt.selectedValue = fltPrevStatus;
                        flt.selectedSubValue = fltPrevSubStatus;
                    }
                    break;
                //CR119
                case HtmlFilters.DROPDOWN:
                    flt = new DropdownFilter(fieldName, operator, filterValue);
                    if (fltPrevStatus) {
                        flt.active = true;
                        flt.selectedValue = fltPrevStatus;
                    }
                    break;
                case HtmlFilters.SLIDER:
                    flt = new RangeFilter(fieldName, filterValue.min, filterValue.max);
                    break;
                default:
                    flt = new Filter(fieldName, operator, filterValue);
                    if (fltPrevStatus) {
                        flt.active = true;
                        flt.selectedValue = fltPrevStatus;
                    }
            }
            filterGroups[fieldName].addFilter(filterType, filterCtrlId, flt);
            lookupTbl[filterCtrlId] = fieldName;
        },
		
        activateFilter: function(filterCtrlId) {
            var grp = this.getFilterGroup(filterCtrlId);
            if(grp) {
                grp.activateFilter(filterCtrlId);
            }
        },
        deactivateFilter: function(filterCtrlId) {
            var grp = this.getFilterGroup(filterCtrlId);
            if(grp) {
                grp.deactivateFilter(filterCtrlId);
            }
        },
        isFilterActive: function(filterName) {
            var grp = this.getFilterGroup(filterName);
            if(grp) {
                return grp.isFilterActive(filterName);
            }
            return false;
        },
        setFilterValue: function(filterName, filterValue)	{
            var grp = this.getFilterGroup(filterName);
            if(grp) {
                grp.setFilterValue(filterName, filterValue);
            }
        },
        getFilterValue: function(filterName, filterValue)	{
            var grp = this.getFilterGroup(filterName);
            if(grp) {
                return grp.getFilterValue(filterName, filterValue);
            } else {
                return null;
            }
        },
        setSelectedValue: function(filterName, filterValue) {
            var grp = this.getFilterGroup(filterName);
            if(grp) {
                grp.setSelectedFilterValue(filterName, filterValue);
            }
        },
        setSelectedSubValue: function(filterName, filterValue) {
            var grp = this.getFilterGroup(filterName);
            if(grp) {
                Logger.debug('setSelectedSubValue: filterName=' + filterName+', filterValue='+filterValue);
                grp.setSelectedFilterSubValue(filterName, filterValue);
            }
        },
        disableFilter: function(filterName) {
            if (filterName != 'accoprice') {
                document.getElementById(filterName).disabled = true;
            }
        },
        enableFilter: function(filterName) {
            document.getElementById(filterName).disabled = false;
        },
        getFilterGroups: function() {
            return filterGroups;
        },
        disableEmptyFilters: function() {
            for(groupName in filterGroups) {
                filterGroups[groupName].disableEmptyFilters();
            }
        },
        disableAllFilters: function() {
            for(groupName in filterGroups) {
                jQuery('#'+groupName+" option:eq(0)").attr("selected", "selected");
                filterGroups[groupName].disableAllFilters();
            }
        },
        updateMatches: function(resultSetSize) {
            
            Logger.debug('ECTRL: updateMatches');
            for(var groupName in filterGroups) {
                var group = filterGroups[groupName];
                var filters = group.getFilters();

                for(var filterName in filters) {
			
                    var filterType = filters[filterName].type;
                    var filterCtrlId = filters[filterName].filterCtrlId;
                    var filterCtrlIdTmp = filters[filterName].filterCtrlId+'_clone';
                    var filter = filters[filterName].filter;
			
                    if(filterType == HtmlFilters.DROPDOWN) {
                        var fltElTmp = Ext.get(filterCtrlIdTmp);
                        var fltBoxHidden = Ext.get('filterBox_hidden');

                        // Creo il DIV nascosto per inserire i cloni
                        if (fltBoxHidden == null) {
                            jQuery('#filterBox').after('<div id ="filterBox_hidden"  style="display: none;" ></div>');
                        }

                        // Clone filtro se prima volta
                        if (fltElTmp == null) {
                            jQuery('#'+filterCtrlId+':first').clone(true).attr('id',jQuery('#'+filterCtrlId)[0].id +'_clone').appendTo('#filterBox_hidden');
                            fltElTmp = Ext.get(filterCtrlIdTmp);
                        }
                        
                        // End Clone filtro
                        var selVal=jQuery('#'+filterCtrlId).val();
                        jQuery('#'+filterCtrlId).html('');
                        for(var i = 0; i < fltElTmp.dom.options.length; i++) {
                            var val = fltElTmp.dom.options[i].value;
                            if(val != '') {
                                var match = filter.getMatches(val);
                                if(match > 0) {
                                    var item = fltElTmp.dom.options[i].innerHTML;
                                    item = item + ' (' + match + ')';
                                    if (selVal == val) {
                                        jQuery('<option value="'+val +'" selected="">'+item+'</option>').appendTo('#'+filterCtrlId);
                                    } else {
                                        jQuery('<option value="'+val +'">'+item+'</option>').appendTo('#'+filterCtrlId);
                                    }
                                }
                            } else {
                                jQuery('<option value="">'+fltElTmp.dom.options[i].innerHTML+'</option>').appendTo('#'+filterCtrlId);
                            }
                        }
                        
                    } else {
                        matches = filter.getMatches();
                        if(filterType == HtmlFilters.SUBFILTER) {
                            jQuery("#"+filterCtrlId+"_sub INPUT[type='checkbox']").each(function() {
                                subMatch = filter.getSubMatches(this.id);
                                if (subMatch == 0) {
                                    jQuery("#"+this.id).attr('checked', false);
                                    document.getElementById(this.id).disabled = true;
                                } else {
                                    document.getElementById(this.id).disabled = false;
                                }
                            });
                        }

                        var cntEl = document.getElementById(filterCtrlId + '_cnt');
                        if(cntEl) {
                            cntEl.innerHTML = '(' + matches + ')';
                        }
                        else {
                            var labelEl = document.getElementById(filterCtrlId + '_lbl');
                            if(!labelEl) {
                                Logger.debug(filterCtrlId + '_lbl NOT FOUND!!!!');
                            }
                            labelEl.innerHTML += '<span id="' + filterCtrlId + '_cnt">(' + matches + ')</span>';
                        }
                        
                        if ((matches == 0) && (resultSetSize > 0)) {
                            //Logger.debug('UPDATE Matches: '+filterCtrlId+' --> zero???'+matches);
                            jQuery("#"+filterCtrlId+'_cnt').parent().parent().parent().hide();
                        } else {
                            if (filterType != HtmlFilters.SLIDER) {
                              jQuery("#"+filterCtrlId+'_cnt').parent().parent().parent().show();
                            }
                        }

                        if(filterType == HtmlFilters.SLIDER) {
                            Logger.debug('UPDATE Matches: '+filterCtrlId+' '+filter.getMinRSValue() + ' ' + filter.getMinValue() + ' '+filter.getMaxValue() + ' ' +filter.getMaxRSValue() + ' ' + filter.hasPrices());
                            jQuery("#"+filterCtrlId).slider('setData','max',filter.getMaxRSValue());
                            jQuery("#"+filterCtrlId).slider('setData','min',filter.getMinRSValue());

                            if (filter.getMaxRSValue() == filter.getMaxValue()) {
                                Ext.get('thumbMax').update(filter.getMaxRSValue());
                            } else {
                                jQuery("#"+filterCtrlId).slider('moveTo',{x:filter.getMaxValue(),y:10},1, true);
                                Ext.get('thumbMax').update(filter.getMaxValue());
                            }

                            if (filter.getMinRSValue() == filter.getMinValue()) {
                                Ext.get('thumbMin').update(filter.getMinRSValue());
                            } else {
                                jQuery("#"+filterCtrlId).slider('moveTo',{x:filter.getMinValue(),y:10},0, true);
                                Ext.get('thumbMin').update(filter.getMinValue());
                            }
                             
                        }
                    }
                }
            }
        },
        updateMatches2: function(resultSetSize) {

            Logger.debug('ECTRL: updateMatches2');
            for(var groupName in filterGroups) {
                var group = filterGroups[groupName];
                var filters = group.getFilters();

                for(var filterName in filters) {

                    var filterType = filters[filterName].type;
                    var filterCtrlId = filters[filterName].filterCtrlId;
                    var filterCtrlIdTmp = filters[filterName].filterCtrlId+'_clone';
                    var filter = filters[filterName].filter;

                    if(filterType == HtmlFilters.DROPDOWN) {
                        var fltElTmp = Ext.get(filterCtrlIdTmp);
                        var fltBoxHidden = Ext.get('filterBox_hidden');

                        // Creo il DIV nascosto per inserire i cloni
                        if (fltBoxHidden == null) {
                            jQuery('#filterBox').after('<div id ="filterBox_hidden"  style="display: none;" ></div>');
                        }

                        // Clone filtro se prima volta
                        if (fltElTmp == null) {
                            jQuery('#'+filterCtrlId+':first').clone(true).attr('id',jQuery('#'+filterCtrlId)[0].id +'_clone').appendTo('#filterBox_hidden');
                            fltElTmp = Ext.get(filterCtrlIdTmp);
                        }

                        // End Clone filtro
                        var selVal=jQuery('#'+filterCtrlId).val();
                        jQuery('#'+filterCtrlId).html('');
                        for(var i = 0; i < fltElTmp.dom.options.length; i++) {
                            var val = fltElTmp.dom.options[i].value;
                            if(val != '') {
                                var match = filter.getMatches(val);
                                if(match > 0) {
                                    var item = fltElTmp.dom.options[i].innerHTML;
                                    item = item + ' (' + match + ')';
                                    if (selVal == val) {
                                        jQuery('<option value="'+val +'" selected="">'+item+'</option>').appendTo('#'+filterCtrlId);
                                    } else {
                                        jQuery('<option value="'+val +'">'+item+'</option>').appendTo('#'+filterCtrlId);
                                    }
                                }
                            } else {
                                jQuery('<option value="">'+fltElTmp.dom.options[i].innerHTML+'</option>').appendTo('#'+filterCtrlId);
                            }
                        }

                    } else {
                        matches = filter.getMatches();
                        /*if(filterType == HtmlFilters.SUBFILTER) {
                            jQuery("#"+filterCtrlId+"_sub INPUT[type='checkbox']").each(function() {
                                subMatch = filter.getSubMatches(this.id);
                                if (subMatch == 0) {
                                    jQuery("#"+this.id).attr('checked', false);
                                    document.getElementById(this.id).disabled = true;
                                } else {
                                    document.getElementById(this.id).disabled = false;
                                }
                            });
                        }*/

                        var cntEl = document.getElementById(filterCtrlId + '_cnt');
                        if(cntEl) {
                            cntEl.innerHTML = '(' + matches + ')';
                        }
                        else {
                            var labelEl = document.getElementById(filterCtrlId + '_lbl');
                            if(!labelEl) {
                                Logger.debug(filterCtrlId + '_lbl NOT FOUND!!!!');
                            }
                            labelEl.innerHTML += '<span id="' + filterCtrlId + '_cnt">(' + matches + ')</span>';
                        }

                        if ((matches == 0) && (resultSetSize > 0)) {
                            //Logger.debug('UPDATE Matches: '+filterCtrlId+' --> zero???'+matches);
                            jQuery("#"+filterCtrlId+'_cnt').parent().parent().parent().hide();
                        } else {
                            if (filterType != HtmlFilters.SLIDER) {
                              jQuery("#"+filterCtrlId+'_cnt').parent().parent().parent().show();
                            }
                            
                        }

                        if(filterType == HtmlFilters.SLIDER) {
                            Logger.debug('UPDATE Matches: '+filterCtrlId+' '+filter.getMinRSValue() + ' ' + filter.getMinValue() + ' '+filter.getMaxValue() + ' ' +filter.getMaxRSValue() + ' ' + filter.hasPrices());
                            jQuery("#"+filterCtrlId).slider('setData','max',filter.getMaxRSValue());
                            jQuery("#"+filterCtrlId).slider('setData','min',filter.getMinRSValue());

                            if (filter.getMaxRSValue() == filter.getMaxValue()) {
                                Ext.get('thumbMax').update(filter.getMaxRSValue());
                            } else {
                                jQuery("#"+filterCtrlId).slider('moveTo',{x:filter.getMaxValue(),y:10},1, true);
                                Ext.get('thumbMax').update(filter.getMaxValue());
                            }

                            if (filter.getMinRSValue() == filter.getMinValue()) {
                                Ext.get('thumbMin').update(filter.getMinRSValue());
                            } else {
                                jQuery("#"+filterCtrlId).slider('moveTo',{x:filter.getMinValue(),y:10},0, true);
                                Ext.get('thumbMin').update(filter.getMinValue());
                            }

                        }
                    }
                }
            }
        },
        getFilterGroup: function(filterCtrlId) {
            if(lookupTbl[filterCtrlId]) {
                return filterGroups[lookupTbl[filterCtrlId]];
            }
			
            return null;
        },
		
        /**
	* Verifica se lo stato dei filtri e' in sessione ed invoca la callback passata come parametro
	 */
        setupFilterStatus: function(itemType, callback, scope) {
            Logger.debug('ECTRL: *** setupFilterStatus ENTER: LoadFrom Session = '+m_LoadFromSession);
            fStatusPostfix = itemType;
            
            DWRJSONSrv.getObject('fltMask_' + fStatusPostfix, function(statusStr) {
                if (m_LoadFromSession) {
                    if(statusStr && statusStr != '') {
                        var couples = statusStr.split('&');
                        for(var i = 0; i < couples.length; i++) {
                            var couple = couples[i].split('=');
                            var key = decodeURIComponent(couple[0]);
                            var value = decodeURIComponent(couple[1]);
                            Logger.debug('ECTRL: *** setupFilterStatus: ' + key + '=' +value + ' - LoadFrom Session = '+m_LoadFromSession);
                            //if (str.indexOf("WORLD"))
                            filterStatus[key] = value;

                        }
                    }
                }
                callback.call(scope);
            });
            
        },
		
        getFilterStatus: function(filterName) {
            //Logger.debug('ECTRL: getFilterStatus: ' + filterName + '=' +filterStatus[filterName] );
            return (filterStatus[filterName] ? filterStatus[filterName] : null);
        },
        setFilterStatus: function(filterName, filterValue) {
            Logger.debug('ECTRL: setFilterStatus: ' + filterName + '=' +filterValue );
            filterStatus[filterName] = filterValue;
            var stat = '';
            for(key in filterStatus) {
                if(filterStatus[key] != null)
                    stat += encodeURIComponent(key) + '=' + encodeURIComponent(filterStatus[key]) + '&';
            }
            stat = stat.substr(0, stat.length - 1);
            DWRJSONSrv.setObject('fltMask_' + fStatusPostfix, stat, function() {});
            DWRJSONSrv.setObject('myLastURL', m_currentURL, function() {});
        }
    };
	
}();

