var m_optionDefault = 'Tutti';
var m_currentURL = 'default';
var m_LoadFromSession = false;
var m_LastPage = 1;
var sacPath = '/search-ajaxclient/';

var EventTypes = {
    FORM_LOADED: 1,
    RSET_LOADED: 2
};

/**
 * Costruttore
 * @param itemType Il tipo di elemento su cui deve essere fatta la query. 
 * Corrisponde al parametro del metodo DWRResultSetSrv.getResultSet
 * Corrisponde al parametro del metodo DWRFormSrv.getFormObject 
 * @param opts oggetto contenente proprietÃ  aggiuntive: 
 * 	'countMatches' (default: false): determina se debba essere attivato il conteggio dei record che 'matchano' i filtri
 * 	'profile' (default: false): se abilitato stampa nel log (console di firebug o alert) informazioni riguardo i tempi di esecuzione
 */
var Controller = function(itemType, opts) {
    this.init(itemType, opts);
};

Controller.prototype = {
    init: function(itemType, opts) {

        opts = opts || {
            countMatches: false,
            profile: false,
            debug: false,
            filterBoxId: 'filterBox',
            pageSize: -1,
            optionDefault: 'Tutte',
            currURL:  'default',
            showSlider: false,
            renderCallback: function() {}
        };

        this.showSlider = opts.showSlider;
        m_currentURL = document.location.href;
        m_LoadFromSession = false;

        DWRJSONSrv.getObject('myLastURL', function(lastURL) {
            Logger.debug('myLastURL: '+lastURL + ' ' + m_currentURL);
            if (lastURL == m_currentURL && m_currentURL != 'default') {
                m_LoadFromSession = true;
                DWRJSONSrv.getObject('myLastPage', function(lastPage) {
                    if (lastPage != null)
                        m_LastPage = lastPage;
                });

            } 
        });
        
        this.itemType = itemType;
		
        this.countMatches = opts.countMatches || false;
        this.profile = opts.profile || false;
        this.pageSize = opts.pageSize || -1;
        m_optionDefault = opts.optionDefault || 'Tutte'; //***
        this.renderCallback = opts.renderCallback || (function() {});

        this.profileStartTime = 0;
		
        if(this.profile)
            Logger.addLogLevel(Logger.LOG_INFO);

        if(opts.debug)
            Logger.addLogLevel(Logger.LOG_DEBUG);
		
        this.view = new View();

        this.executeQuery();
        this.setupFilters(opts.filterBoxId);
        this.pager = new Pager(this.navBarClick, this);
    },

    /**
     * Esegue la query invocando il DWRResultSet e istanzia il ResultSet
     */
    executeQuery: function() {
        //ShowAjaxLoad();
        var that = this;

        var createRset = function(data) {
			
            if(data.errCode) {
                Logger.debug('DWRResultSetSrv - ' + data.errMg + '(' + data.errCode + ')');
		
            }
            else {
                Logger.debug('ECTRL: createRset');
                var res = {};
                //Deserializzazione del json restituito dal server
                eval('var results = ' + data);
                //Se il resultset e' composto da un solo elemento 'forzo' il formato
                if(!results.values.push) {
                    var record = results.values.value;
                    results.values = [record];
                }
                that.rset = new Resultset(results.keys, results.values);
                that.fireEvent(EventTypes.RSET_LOADED);
            }
        };

        //Esegue la chiamata Ajax
        DWRResultSetSrv.getResultSet(this.itemType, createRset);
    },

    navBarClick: function(el, type) {
        //ShowAjaxLoad();

        var update = false;
		
        switch(type) {
		
            case this.pager.FIRST_PAGE:
                if(!this.filteredRset.isFirstPage()) {
                    this.filteredRset.firstPage();
                    update = true;
                }
                break;

            case this.pager.PREVIOUS_PAGE:
                if(this.filteredRset.hasPreviousPages()) {
                    this.filteredRset.decPage();
                    update = true;
                }
                break;

            case this.pager.NEXT_PAGE:
                if(this.filteredRset.hasMorePages()) {
                    this.filteredRset.incPage();
                    update = true;
                }
                break;

            case this.pager.LAST_PAGE:
                if(!this.filteredRset.isLastPage()) {
                    this.filteredRset.lastPage();
                    update = true;
                }
                break;

            case this.pager.PAGE_NUMBER:
                var pn = parseInt(el.dom.innerHTML, 10);
                if( this.filteredRset.isValidPage(pn) && (pn != this.filteredRset.getCurrentPage()) ) {
                    this.filteredRset.gotoPage(pn);
                    update = true;
                }
                break;
        }
		
        if(update) {
            DWRJSONSrv.setObject('myLastPage', this.filteredRset.getCurrentPage(), function() {});
            this.showFilteredRset();
        }
		
        this.pager.update(this.filteredRset.getCurrentPage(), this.filteredRset.getTotalPages());
    },

    showFilteredRset: function() {
        var contentBox = document.getElementById('contentBox');
        if(contentBox) {
            while(contentBox.firstChild)
                contentBox.removeChild(contentBox.firstChild);
        }
        //Render resultset
        while(this.filteredRset.next()) {
            this.view.renderHit(this.filteredRset);
        }

        jQuery('.showspinner').each(function(){
            jQuery(this).removeClass('showspinner');
        });

        if(jQuery('#filterBox .selected').length > 0) {
            jQuery('#removeallfilters').show();
        } else {
            jQuery('#removeallfilters').hide();
        }

        if(this.renderCallback){
            this.renderCallback();
        }
    },

    renderRset: function() {
        
        this.profileStart();
        var that = this;
        window.setTimeout(function() {
            that.filteredRset = that.rset.applyFilters(FilterManager.getFilterGroups(), that.countMatches);

            if (that.showSlider == true) {
                that.filteredRset.applySecondPassFilters(FilterManager.getFilterGroups());
            }

            if(that.countMatches) {
                FilterManager.updateMatches(that.filteredRset.size());
            }
        
            FilterManager.disableEmptyFilters();
        
            that.filteredRset.firstPage();
            that.filteredRset.setPageSize(that.pageSize);
            that.filteredRset.gotoPage(m_LastPage);
            that.pager.update(that.filteredRset.getCurrentPage(), that.filteredRset.getTotalPages());
        
            that.showFilteredRset();
        }, 200);
 		
        this.profileEnd();
    },
	
    renderRset2: function() {
        var pn = this.filteredRset.getCurrentPage();
        this.filteredRset.gotoPage(pn);
        this.showFilteredRset();
        this.pager.update(this.filteredRset.getCurrentPage(), this.filteredRset.getTotalPages());
    },
	
    /**
     * Istanzia i filtri e verifica lo stato
     */
    setupFilters: function(filterBoxId) {
        filterBoxId = filterBoxId || 'filterBox';
        var that = this;


        FilterManager.setupFilterStatus(this.itemType, function() {
			    
            if(window.filterPortletResourceURL === undefined) {
                //Invoca il dwr e istanzia i filtri
                DWRFormSrv.getFormObject(this.itemType, function(json) {
                    if(json.errCode) {
                        Logger.debug('DWRFormSrv - ' + json.errMsg + '(' + json.errCode + ')');
                    }
                    else {
                        //Deserializzo i filtri e creo l'html relativo
                        eval('var filters = ' + json + ';');
                        that.createFilterBox(filterBoxId, filters);
                        that.attachOpenCloseEvents();
                        that.attachOrderByBar();
                        that.attachRegionsMap();
                        that.attachRemoveAllFilters();
                        that.fireEvent(EventTypes.FORM_LOADED);
                    }
                });
            }else{
                jQuery.getJSON(filterPortletResourceURL, function(filters){
                    that.createFilterBox(filterBoxId, filters);
                    that.attachOpenCloseEvents();
                    that.attachOrderByBar();
                    that.attachRegionsMap();
                    that.attachRemoveAllFilters();
                    that.fireEvent(EventTypes.FORM_LOADED);
                });
            }
        }, this);

    },

    /**
     * Istanzia i filtri e crea il box di ricerca html
     */
    createFilterBox: function(filterBoxId, filters) {
		
        var filterBox = document.getElementById(filterBoxId);
		
        if(filterBox) {
            var numFilters = filters.length;
            var filterParent = Ext.DomHelper.append(filterBoxId, {
                tag: 'ul',
                cls: 'filterContainerBox',
                style: 'display: none;'
            });
            for(var i = 0; i < numFilters; i++) {
                var filter = filters[i];
                if (filter.style == HtmlFilters.SLIDER) {
                    if (this.showSlider == true) {
                        this.createFilterFragment(filter, filterParent);
                    }
                } else {
                    this.createFilterFragment(filter, filterParent);
                }
            }
        }
    },
	
    /**
     * Crea l'html relativo ad un filtro
     */
    createFilterFragment: function(filter, filterParent) {

        var sliders = [];
        var filters = [];
        var filtersNode = [];
        var fieldName = filter.tpname;
        var fieldSubName = filter.tpsubname;
        var filterIsOpen = filter.open;

        //Crea il gruppo di filtri
        FilterManager.addFilterGroup(fieldName);

        switch(filter.style) {
            case HtmlFilters.SLIDER:

                var minValue = parseInt(filter.option.minvalue, 10);
                var maxValue = parseInt(filter.option.maxvalue, 10);
                var curMin = minValue;
                var curMax = maxValue;
                var filterCtrlId = fieldName;

                //Estraggo lo stato del filtro corrente
                var fStatus = FilterManager.getFilterStatus(filterCtrlId);

                if(fStatus != null) {
                    var pos = fStatus.indexOf(';');
                    if(pos > -1) {
                        curMin = parseInt(fStatus.substr(0, pos), 10);
                        curMax = parseInt(fStatus.substr(pos + 1), 10);
                    }
                }

                //Creo il filtro
                FilterManager.addFilter(fieldName, filterCtrlId, Operators.EQ, {
                    min: curMin,
                    max: curMax
                }, HtmlFilters.SLIDER);
				
                filtersNode.push({
                    tag: 'li',
                    cls: 'filter',
                    id: filterCtrlId + '_nod',
                    children: [
                    {
                        tag: 'div',
                        cls: 'filterCtrl left',
                        id: filterCtrlId,
                        children: [{
                            html: '<div id="handleMinValue" class="ui-slider-handle"></div><div id="handleMaxValue" class="ui-slider-handle" style="left:135px;"></div><div class="rangs"><span id="thumbMax" class="max slideing">1.000</span><span id="thumbMin" class="min slideing">0</span></div>'
                        }]
                    },
                    {
                        tag: 'div',
                        cls: 'filterCtrl left',
                        id: filterCtrlId + '_lbl',
                        style: 'padding-left: 63px;'
                    },
                    {
                        tag: 'div',
                        cls: 'clear',
                        html: ' '
                    }
                    ]
                });

                sliders.push({
                    id: filterCtrlId,
                    min: minValue,
                    max: maxValue,
                    curMin: curMin,
                    curMax: curMax
                });
				
                filters.push({
                    id: filterCtrlId,
                    type: filter.style
                });
                break;

            case HtmlFilters.CHECKBOX:
                //Creo un checkbox per ogni option definita nel filtro
                for(var i = 0; i < filter.option.length; i++) {

                    var option = filter.option[i];
                    var filterCtrlId = fieldName + '' + i;

                    //Estraggo lo stato del filtro corrente
                    var fStatus = FilterManager.getFilterStatus(filterCtrlId);

                    //Creo il filtro
                    FilterManager.addFilter(fieldName, filterCtrlId, Operators.EQ, option.value, HtmlFilters.CHECKBOX);

                    //Creo l'html
                    filterTag = {
                        style: 'position: absolute; left: -9999px;',
                        tag: 'input',
                        type: 'checkbox',
                        id: filterCtrlId
                    };
                    if(fStatus != null)
                        filterTag.checked = 'checked';
					
                    filtersNode.push({
                        tag: 'li',
                        cls: 'filter fltcheckbox',
                        children: [
                        {
                            tag: 'span',
                            cls: 'filterLabel left dimension160' ,
                            children: [filterTag,

                            {
                                tag: 'label',
                                'for': filterCtrlId,
                                id: filterCtrlId + '_lbl',
                                html: option.label
                            }
                            ]
                        },
                        {
                            tag: 'div',
                            cls: 'clear',
                            html: ' '
                        }
                        ]
                    });
					
                    filters.push({
                        id: filterCtrlId,
                        type: filter.style
                    });
                }
                break;
				
            case HtmlFilters.SUBFILTER:
                for(var i = 0; i < filter.option.length; i++) {

                    var option = filter.option[i];
                    var filterCtrlId = fieldName + '' + i;

                    //Creo il filtro
                    FilterManager.addFilter(fieldName, filterCtrlId, Operators.EQ, option.value, HtmlFilters.SUBFILTER, fieldSubName, option.sublist);

                    //Estraggo lo stato del filtro corrente
                    var fStatus = FilterManager.getFilterStatus(filterCtrlId);
                    var bIsFilterActive = FilterManager.getFilterStatus(filterCtrlId);
                    var fSubStatus = null;
                    var szSubDisplay = 'display: none;';

                    if (bIsFilterActive) {
                        szSubDisplay = 'display: list-item;';
                    } 

                    if (fStatus) {
                        fSubStatus = FilterManager.getFilterStatus(filterCtrlId+'_sub');
                        FilterManager.setSelectedSubValue(filterCtrlId, fSubStatus);
                    }
                    
                    //Creo l'html
                    filterTag = {
                        tag: 'input',
                        type: 'checkbox',
                        style: 'position: absolute; left: -9999px;',
                        id: filterCtrlId
                    };

                    if(fStatus != null) filterTag.checked = 'checked';

                    // ---------------------------------------------------
                    // <div id="accotype3_sub" class="filterCtrl">
                    //
                    // Sublist fragment
                    var suboptions = '';
                    if (option.sublist) {
                        if (option.sublist.length > 1) {
                            //Logger.debug('@@@@@@@@option.sublist - ' + option.sublist);
                            //str.indexOf(
                            // Checkbox
                            suboptions = '<table class="checkcat"><tr>';
                            for(var ii = 0; ii < option.sublist.length; ii++) {
                                //if(fSubStatus) {
                                //    var szChecked = '';
                                //    if (fSubStatus.indexOf(filterCtrlId+'_'+subOption) >= 0) {
                                //        szChecked = 'checked="checked"';
                                //    }
                                //}
                                var subOption = option.sublist[ii];
                                suboptions = suboptions + '<td align="center"><input type="checkbox" id="'+filterCtrlId+'_'+subOption+'"/></td>';
                                
                            }
                            suboptions = suboptions + '</tr><tr>';
                            // Labels
                            //Logger.debug('ECTRL: sublabels: '+option.sublabels);

                            if (option.sublabels) {
                                for(var is = 0; is < option.sublabels.length; is++) {
                                    var subLabel = option.sublabels[is];
                                    suboptions = suboptions + '<td align="center">'+subLabel+'</td>';
                                }
                            }
                            suboptions = suboptions +'<td align="center"><img border="0" src="'+option.subicon+'"/></td>';

                            suboptions = suboptions + '</tr></table>';
                        }
                    }
                    // ----------------------------------------------------

                    filtersNode.push(
                    {
                        tag: 'li',
                        cls: 'filter fltacco',
                        children: [ {
                            tag: 'span',
                            cls: 'filterCtrl left',
                            children: [filterTag]
                        },

                        {
                            tag: 'span',
                            cls: 'filterLabel left dimension160' ,
                            children: [{
                                tag: 'label',
                                cls: 'filterLabelAcco',
                                'for': filterCtrlId,
                                id: filterCtrlId + '_lbl',
                                html: option.label
                            }]
                        },
                        {
                            tag: 'div',
                            cls: 'suboptions',
                            style: szSubDisplay,
                            //style: 'display: none;',
                            id: filterCtrlId+'_sub',
                            html: suboptions
                        },
                        {
                            tag: 'div',
                            cls: 'clear',
                            html: ' '
                        }
                        ]
                    });

                    filters.push({
                        id: filterCtrlId,
                        type: filter.style
                    });
                }
                break;

            case HtmlFilters.DROPDOWN:
                var options = [];
                var filterCtrlId = fieldName;
                var filterValues = [];

                var fStatus = FilterManager.getFilterStatus(filterCtrlId);

                options.push({
                    tag: 'option',
                    value: '',
                    html: m_optionDefault
                });

                for(var i = 0; i < filter.option.length; i++) {
                    var option = filter.option[i];
                    var optionTag = {
                        tag: 'option',
                        value: option.value,
                        html: option.label
                    };
                    if(fStatus == option.value)
                        optionTag.selected = 'select';
                    options.push(optionTag);
                    filterValues.push(option.value);
                }

                FilterManager.addFilter(fieldName, filterCtrlId, Operators.EQ, filterValues, HtmlFilters.DROPDOWN);
				
                filtersNode.push({
                    tag: 'li',
                    cls: 'filter',
                    children: [

                    {
                        tag: 'span',
                        cls: 'filterCtrl',
                        children: [

                        {
                            tag: 'select',
                            id: filterCtrlId,
                            children: options
                        }
                        ]
                    },

                    {
                        tag: 'span',
                        cls: 'filterLabel',
                        id: filterCtrlId + '_lbl',
                        html: ''
                    },

                    {
                        tag: 'div',
                        cls: 'clear',
                        html: ' '
                    }
                    ]
                });
				
                filters.push({
                    id: filterCtrlId,
                    type: filter.style
                });
                break;
				
            case HtmlFilters.TEXTBOX:
                var filterCtrlId = fieldName;
                var fStatus = FilterManager.getFilterStatus(filterCtrlId);
                FilterManager.addFilter(fieldName, filterCtrlId, Operators.LIKE, '', HtmlFilters.TEXTBOX);
				
                filtersNode.push({
                    tag: 'li',
                    cls: 'filter',
                    children: [

                    {
                        tag: 'span',
                        cls: 'filterCtrl',
                        children: [

                        {
                            tag: 'input',
                            type: 'text',
                            id: filterCtrlId,
                            value: fStatus
                        }
                        ]
                    },

                    {
                        tag: 'span',
                        cls: 'filterLabel',
                        id: filterCtrlId + '_lbl',
                        html: filter.label
                    },

                    {
                        tag: 'div',
                        cls: 'clear',
                        html: ' '
                    }
                    ]
                });
				
                filters.push({
                    id: filterCtrlId,
                    type: filter.style
                });
                break;
        }

        var clsFilterGroupLabel = 'filterGroupLabel';
        var clsFilters = 'filters';
        var styFilters = 'display: block;';
                    
        if (filterIsOpen == "false") {
            clsFilterGroupLabel = clsFilterGroupLabel + ' close';
            clsFilters = clsFilters + ' close';
            styFilters = 'display: none;';
        }

        if(filters.length > 0) {
            //Creo l'html di tutti i filtri (vedi paragrafo 1.30.2 doc. tecnico)
            Ext.DomHelper.append(filterParent, {
                tag: 'li',
                children: [{
                    tag: 'ul',
                    cls: 'filterGroup',
                    children: [{
                        tag: 'li',
                        cls: clsFilterGroupLabel,
                        children: [{
                            tag: 'span',
                            html: filter.label
                        },{
                            tag: 'span',
                            cls: 'fltgrpcheck'
                        }]
                    },{
                        tag: 'li',
                        children: [{
                            tag: 'ul',
                            cls: 'filters',
                            style: styFilters,
                            children: filtersNode
                        }]
                    }]
                }]
            });

            //<li class="slider-price">

            // <div class="rangs">
            //  <span class="max slideing">2.100€</span>
            //  <span class="min slideing">600€</span>
            //</div>


            for(var i = 0; i < sliders.length; i++) {
                var sliderDef = sliders[i];
                //Logger.debug('Slider - ' + sliderDef.id + ' '+sliderDef.min+' ' + sliderDef.max + ' ' + sliderDef.curMin + ' '+sliderDef.curMax);
                jQuery("#"+sliderDef.id).slider({
                    range: true,
                    animate: false,
                    min: sliderDef.min,
                    max: sliderDef.max,
                    stepping: 1,
                    slide: function(event, ui) {
                        var thisHandle = jQuery(ui.handle);
                        var handleID = thisHandle.attr('id');
                        if (handleID == 'handleMinValue') {
                            minValue = ui.value;
                            Ext.get('thumbMin').update(minValue);
                        } else {
                            maxValue = ui.value;
                            Ext.get('thumbMax').update(maxValue);
                        }
                        return false;
                    },
                    change: function(event, ui) {
                        var thisHandle = jQuery(ui.handle);
                        var handleID = thisHandle.attr('id');

                        var group = FilterManager.getFilterGroup(sliderDef.id);
                        var filter = group.getFilter(sliderDef.id);

                        var minValue = filter.getMinValue();
                        var maxValue = filter.getMaxValue();

                        if (handleID == 'handleMinValue') {
                            minValue = ui.value;
                        } else {
                            maxValue = ui.value;
                        }
                        
                        FilterManager.setFilterStatus(sliderDef.id, minValue + ';' + maxValue);
                        FilterManager.setFilterValue(sliderDef.id, {
                            min: minValue,
                            max: maxValue
                        });

                        var theParent5 = jQuery('#'+sliderDef.id).parent().parent().parent().parent();
                        // If the value is different (max -> RSMax, min -> RSMin, enable spinner etc... otherwhise only show spinner
                        jQuery(theParent5).addClass('selected').addClass('showspinner');
                        jQuery('.filterGroupLabel .fltgrpcheck',jQuery(theParent5)).click(function(clickEvent){
                            clickEvent.stopPropagation();
                            jQuery(theParent5).removeClass('selected');
                            jQuery(theParent5).addClass('showspinner');
                            jQuery(this).unbind();
                            FilterManager.setFilterStatus(sliderDef.id, filter.getMinRSValue() + ';' + filter.getMaxRSValue());
                            FilterManager.setFilterValue(sliderDef.id, {
                                min: filter.getMinRSValue(),
                                max: filter.getMaxRSValue()
                            });

                            jQuery("#"+sliderDef.id).slider('setData','max',filter.getMaxRSValue());
                            jQuery("#"+sliderDef.id).slider('setData','min',filter.getMinRSValue());

                            jQuery("#"+filterCtrlId).slider('moveTo',{
                                x:filter.getMaxRSValue(),
                                y:10
                            },1, true);
                            Ext.get('thumbMax').update(filter.getMaxRSValue());
                            jQuery("#"+filterCtrlId).slider('moveTo',{
                                x:filter.getMinRSValue(),
                                y:10
                            },0, true);
                            Ext.get('thumbMin').update(filter.getMinRSValue());

                            ctrl.renderRset();
                        });
                        
                        
                        ctrl.renderRset();
                    }
                });
                
            }

            for(var i = 0; i < filters.length; i++) {
                var ctrl = this;
                var filter = filters[i];
                this.toggleFilter(filter.id, filter.type);
            }

        }

    },
    toggleFilter: function(id, type) {

        var ctrl = this;
        var el = Ext.get(id);
        // Logger.debug('ECTRL: toggleFilter: ' + id + '=' +type);
        switch(type) {
            case HtmlFilters.CHECKBOX:
                el.on({
                    'click': function() {
                        if(this.checked) {
                            FilterManager.setFilterStatus(id, 1);
                            FilterManager.activateFilter(id);
                            jQuery('#'+id).parent().parent().addClass('selected').addClass('showspinner');
                        }
                        else {
                            FilterManager.setFilterStatus(id, null);
                            FilterManager.deactivateFilter(id);
                            jQuery('#'+id).parent().parent().removeClass('selected').addClass('showspinner');
                        }
                        ctrl.renderRset();
                    }
                });
				
                if(el.dom.getAttribute('checked'))
                    FilterManager.activateFilter(id);
				
                break;

            case HtmlFilters.SUBFILTER:
                jQuery("#"+id+"_sub INPUT[type='checkbox']").click(function() {

                    // Sub Status
                    var selectedItems = new Array();
                    jQuery("#"+id+"_sub INPUT[type='checkbox']:checked").each(function() {
                        selectedItems.push(this.id);
                    });
                    FilterManager.setSelectedValue(id+'_sub', selectedItems);
                    FilterManager.setFilterStatus(id+'_sub', selectedItems); //added _sub to differentiate from normal filter
                    FilterManager.setSelectedSubValue(id, selectedItems);
                    // Sub Status

                    //Logger.debug('SUB input clicked - id='+id + ', this.id='+this.id+', this.parentNode.id=' +this.parentNode.id + ', selectedItems='+ selectedItems);

                    FilterManager.activateFilter(this.parentNode.id);
                    ctrl.renderRset();
                });

                el.on({
                    'click': function() {
                        var elJQ = jQuery('#'+id+'_sub');

                        // Ciclare su tutti i checkbox all'interno e quelli checkati aggiungerli al filtro
                        // quindi funzione setFilterSubStatus(id,1) se ttivo, setFilterSubStatus(id, null) se non attivo.
                        var theParent5 = jQuery('#'+id).parent().parent().parent().parent().parent();

                        if(this.checked) {
                            if (elJQ) {
                                elJQ.show()
                            }

                            jQuery(theParent5).addClass('selected').addClass('showspinner');

                            jQuery('.filterGroupLabel .fltgrpcheck',jQuery(theParent5)).click(function(clickEvent){
                                clickEvent.stopPropagation();
                                jQuery(theParent5).removeClass('selected');
                                if (elJQ) {
                                    elJQ.hide();
                                }

                                FilterManager.setSelectedSubValue(id, null);
                                FilterManager.setFilterStatus(id+'_sub', null);
                                //FilterManager.setFilterSubStatus(this.parentNode.id, null);
                                FilterManager.setFilterStatus(id, null);
                                FilterManager.deactivateFilter(id);

                                ctrl.renderRset();
                            });

                            jQuery("#"+id+"_sub INPUT[type='checkbox']").attr('checked', true);

                            // Sub Status
                            var selectedItems = new Array();
                            jQuery("#"+id+"_sub INPUT[type='checkbox']:checked").each(function() {
                                selectedItems.push(this.id);
                            });
                            FilterManager.setSelectedSubValue(id, selectedItems);
                            FilterManager.setFilterStatus(id+'_sub', selectedItems); //added _sub for diffentiate
                            //FilterManager.setFilterSubStatus(this.parentNode.id, this.id);
                            // Sub Status

                            FilterManager.setFilterStatus(id, 1);
                            FilterManager.activateFilter(id);
                        }
                        else {
                            if (elJQ) {
                                elJQ.hide()
                            }

                            jQuery(theParent5).removeClass('selected');
                            jQuery('.filterGroupLabel .fltgrpcheck',jQuery(theParent5)).unbind();
                            jQuery("#"+id+"_sub INPUT[type='checkbox']").attr('checked', false);

                            FilterManager.setSelectedSubValue(id, null);
                            FilterManager.setFilterStatus(id+'_sub', null);
                            //FilterManager.setFilterSubStatus(this.parentNode.id, null);
                            FilterManager.setFilterStatus(id, null);
                            FilterManager.deactivateFilter(id);
                        }
                        ctrl.renderRset();
                    }
                });

                if(el.dom.getAttribute('checked'))
                    FilterManager.activateFilter(id);

                break;
				
            case HtmlFilters.DROPDOWN:
                el.on({
                    'change': {
                        fn: function() {
                            var theParent5 = jQuery('#'+id).parent().parent().parent().parent().parent();
                            if(this.value != '') {
                                jQuery(theParent5).addClass('selected').addClass('showspinner');
                                jQuery('.filterGroupLabel .fltgrpcheck',jQuery(theParent5)).click(function(clickEvent){
                                    clickEvent.stopPropagation();
                                    jQuery(this).val(0);
                                    jQuery(theParent5).removeClass('selected');
                                    // Set the element at index 0 to be selected
                                    jQuery('#'+id+" option:eq(0)").attr("selected", "selected");

                                    FilterManager.setFilterStatus(id, '');
                                    FilterManager.deactivateFilter(id);
                                    ctrl.renderRset();
                                    if (id == 'regions') updateRegionsMap(); // Resetta la mappa se id = regions
                                    jQuery(this).unbind();

                                });
                                FilterManager.setFilterStatus(id, this.value);
                                FilterManager.setSelectedValue(id, this.value);
                                FilterManager.activateFilter(id);
                            }
                            else {
                                jQuery(theParent5).removeClass('selected');
                                jQuery('.filterGroupLabel .fltgrpcheck',jQuery(theParent5)).unbind();
                                FilterManager.setFilterStatus(id, '');
                                FilterManager.deactivateFilter(id);
                                
                            }
                            
                            ctrl.renderRset();
                        }
                    }
                });

                var value = el.dom.getAttribute('value');
                if(value && value != '') {
                    FilterManager.setSelectedValue(id, value);
                    FilterManager.activateFilter(id);
                }
									
                break;
				
            case HtmlFilters.TEXTBOX:
                el.on({
                    'keyup': function() {
                        var activated = false;
                        var prevActive = FilterManager.isFilterActive(id);
                        if( (this.value != '') && (this.value.length > 2) ) {
                            FilterManager.setFilterStatus(id, this.value);
                            FilterManager.activateFilter(id);
                            FilterManager.setFilterValue(id, this.value);
                            activated = true;
                        }
                        else {
                            FilterManager.setFilterStatus(id, '');
                            FilterManager.deactivateFilter(id);
                        }
                        if(prevActive || activated)
                            ctrl.renderRset();
                    }
                });
				
                var value = el.dom.getAttribute('value');
                if(value && value.length > 2) {
                    FilterManager.setFilterValue(id, value);
                    FilterManager.activateFilter(id);
                }
				
                break;
        }
    },
    fireEvent: function(eventType) {

        switch(eventType) {
            case EventTypes.FORM_LOADED:
                this.formLoaded = true;
                break;
            case EventTypes.RSET_LOADED:
                this.rsetLoaded = true;
                break;
        }

        //Logger.info('fireEvent: ' + this.formLoaded + ' ' + this.rsetLoaded);
        if(this.formLoaded && this.rsetLoaded)
            this.renderRset();
    },
    profileStart: function() {
        this.profileStartTime = new Date().getTime();
    },
    profileEnd: function() {
        var totTime = new Date().getTime() - this.profileStartTime;
        Logger.info('Total time:: ' + totTime);
    },
    // New PTTCR-287
    attachOpenCloseEvents: function() {
        //alert('attachOpenCloseEvents');
        jQuery('.filterGroupLabel').click(function() {
            if (jQuery('.filters',jQuery(this).parent()).is(':visible') == true) {
                jQuery(this).addClass('close');
                jQuery('.filters',jQuery(this).parent()).hide('fast');
                jQuery('.filters',jQuery(this).parent()).addClass('close');
            } else {
                jQuery(this).removeClass('close');
                jQuery('.filters',jQuery(this).parent()).removeClass('close');
                jQuery('.filters',jQuery(this).parent()).show('fast');
            }
        });
    },
    attachRemoveAllFilters: function() {
        var theCtrl = this;
        jQuery('#removeallfilters').click(function(){
            FilterManager.disableAllFilters();
            jQuery('#filterBox .selected').each(function(){
                jQuery(this).removeClass('selected');
            });
            updateRegionsMap();
            theCtrl.renderRset();
        });
    },
    attachRegionsMap: function() {
        var theCtrl = this;
        if (jQuery('#regions').length > 0) {
            jQuery('#regions').parent().parent().prepend(getHtmlRegionMap());
            jQuery('#regions').change(function() {
                var selImg = EnumRegions[jQuery(this).val()];
                if (selImg != undefined) {
                    oSrcSelected = ''+sacPath+'img/mappa-'+selImg+'.jpg';
                } else {
                    oSrcSelected = ''+sacPath+'img/mappa-page.jpg';
                }
                jQuery('#regionsmap img').attr('src',oSrcSelected);

            });
        }
    },
    attachOrderByBar: function() {
        // Controllo se esiste il container per la barra di ordinamento
        if ((jQuery('#orderby').length > 0) && (jQuery('#orderbyconfig').length > 0) ) {
            var jsonOrdObjArr=jQuery('#orderbyconfig').text();
            var orderObjArr = eval(jsonOrdObjArr);
            if(typeof(orderObjArr)!="undefined"){

                var orderByLabel = jQuery('#orderbyconfig').attr('title');
            
                var orderHtml = '';
                for (var i=0;i<orderObjArr.length;i++) {
                    orderHtml += ' <li id="orderbar'+i+'"><span class="desc">'+orderObjArr[i]['sortLbl']+'</span></li>';
                }
                var theCtrl = this;

                jQuery('#orderby').css('width','703px');
                jQuery('#orderby').html(
                    '<ul class="bar">'+
                    '  <li id="orderbar999"><strong>'+orderByLabel+'</strong></li>'+
                    orderHtml+
                    '  <li style="float: none; border-width: 0pt; width: auto; position: static;"> &#160;</li>'+
                    '</ul>'
                    );

                var orderByBar = jQuery('#orderby').show();
        
                jQuery('li', orderByBar).click(function(){
                    var sAsc = 0;
                    var idx = parseInt(this.id.substr(8));
                    var sDefault = orderObjArr[idx].sortAsc;

                    if (jQuery(this).hasClass('selected')){
                        if (jQuery('span',this).hasClass('desc')){
                            jQuery('span',this).removeClass('desc');
                            jQuery('span',this).addClass('asc');
                            sAsc = 0;

                        } else {
                            jQuery('span',this).removeClass('asc');
                            jQuery('span',this).addClass('desc');
                            sAsc = 1;
                        }
                    } else {
                        jQuery('#orderby li').removeClass('selected');
                        jQuery(this).addClass('selected');
                        jQuery('span',this).removeClass('desc');

                        if (sDefault == 0) {
                            jQuery('span',this).addClass('asc');
                            sAsc = 0;
                        } else {
                            jQuery('span',this).addClass('desc');
                            sAsc = 1;
                        }
                    }
            
                    
                    if (idx < 90) {
                        theCtrl.rset.setSortOptions(orderObjArr[idx].sortTyp,orderObjArr[idx].sortFld,sAsc);
                        theCtrl.renderRset();
                    } else {
                        theCtrl.rset.setSortOptions(0,'',0);
                        theCtrl.renderRset();
                    }

                });
            }
        }
    }

};



// ---<< Regions - helper functions>>---
var oSrcSelected = "";


jQuery(window).load(function () {
    // run code
    MM_preloadImages(sacPath+'img/mappa-1.jpg',sacPath+'img/mappa-2.jpg',sacPath+'img/mappa-3.jpg',sacPath+'img/mappa-4.jpg',sacPath+'img/mappa-5.jpg',sacPath+'img/mappa-6.jpg',sacPath+'img/mappa-7.jpg',sacPath+'img/mappa-8.jpg',sacPath+'img/mappa-9.jpg',sacPath+'img/mappa-10.jpg',sacPath+'img/mappa-11.jpg',sacPath+'img/mappa-12.jpg',sacPath+'img/mappa-13.jpg',''+sacPath+'img/mappa-14.jpg',sacPath+'img/mappa-15.jpg');
});

var EnumRegions = {
    "valli-di-sole-pejo-e-rabbi" :1,
    "altopiano-paganella-dolomiti-di-brenta-lago-di-molveno":2,
    "madonna-di-campiglio-pinzolo-e-val-rendena":3,
    "valli-giudicarie-e-valle-del-chiese":4,
    "garda-trentino-e-valle-di-ledro":5,
    "vallagarina-rovereto-altopiano-di-brentonico":6,
    "altipiani-di-folgaria-lavarone-e-luserna":7,
    "valsugana-lagorai-vigolana-valle-dei-mocheni":8,
    "s-martino-di-castrozza-primiero-e-vanoi":9,
    "val-di-fiemme":10,
    "val-di-fassa":11,
    "altopiano-di-pine-e-valle-di-cembra":12,
    "trento-monte-bondone-valle-dei-laghi-valle-dell-adige":13,
    "terme-di-comano-dolomiti-di-brenta":14,
    "val-di-non":15
}

var RegionsEnum = {
    1:"valli-di-sole-pejo-e-rabbi",
    2:"altopiano-paganella-dolomiti-di-brenta-lago-di-molveno",
    3:"madonna-di-campiglio-pinzolo-e-val-rendena",
    4:"valli-giudicarie-e-valle-del-chiese",
    5:"garda-trentino-e-valle-di-ledro",
    6:"vallagarina-rovereto-altopiano-di-brentonico",
    7:"altipiani-di-folgaria-lavarone-e-luserna",
    8:"valsugana-lagorai-vigolana-valle-dei-mocheni",
    9:"s-martino-di-castrozza-primiero-e-vanoi",
    10:"val-di-fiemme",
    11:"val-di-fassa",
    12:"altopiano-di-pine-e-valle-di-cembra",
    13:"trento-monte-bondone-valle-dei-laghi-valle-dell-adige",
    14:"terme-di-comano-dolomiti-di-brenta",
    15:"val-di-non"
}

function MM_preloadImages() { //v3.0
    var d=document;
    if(d.images){
        if(!d.MM_p) d.MM_p=new Array();
        var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
        for(i=0; i<a.length; i++)
            if (a[i].indexOf("#")!=0){
                d.MM_p[j]=new Image;
                d.MM_p[j++].src=a[i];
            }
    }
}


function MM_swapImgRestore() { //v3.0
    var i,x,a=document.MM_sr;
    for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) {
        if (oSrcSelected.length > 0) {
            x.oSrc = oSrcSelected;
        }
        x.src=x.oSrc;
    }
    jQuery("#regionsmaplabelover").hide();
}

function MM_findObj(n, d) { //v4.01
    var p,i,x;
    if(!d) d=document;
    if((p=n.indexOf("?"))>0&&parent.frames.length) {
        d=parent.frames[n.substring(p+1)].document;
        n=n.substring(0,p);
    }
    if(!(x=d[n])&&d.all) x=d.all[n];
    for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
    if(!x && d.getElementById) x=d.getElementById(n);

    if (oSrcSelected.length > 0) {
    // x.oSrc = oSrcSelected;
    }

    return x;
}

function MapOnMouseOver(areaID) {
    var selArea = RegionsEnum[areaID];
    if(checkSelectedIndex(document.getElementById("regions"), selArea)) {

        var szMapLabel = getTextByIndex(document.getElementById("regions"), selArea);
        var iWidth = ectrlTextWidth(szMapLabel);
        if (iWidth < 154) {
            iWidth = 154;
        }

        jQuery("#regionsmaplabelover").html(szMapLabel);
        jQuery("#regionsmaplabelover").show();
        jQuery("#regionsmaplabelover").css("width", iWidth);
        jQuery("#regionsmaplabelover").css("margin-left", 164-iWidth);
        MM_swapImage('mappa','',sacPath+'img/mappa-'+areaID+'.jpg',1);
        
    }
    
}

function ectrlTextWidth(text){
    var calc = '<span style="display:none">' + text + '</span>';
    jQuery('body').append(calc);
    var width = jQuery('body').find('span:last').width();
    jQuery('body').find('span:last').remove();
    return width;
};


function MM_swapImage() { //v3.0
    var i,j=0,x,a=MM_swapImage.arguments;
    document.MM_sr=new Array;
    for(i=0;i<(a.length-2);i+=3)
        if ((x=MM_findObj(a[i]))!=null){
            document.MM_sr[j++]=x;
            if(!x.oSrc) x.oSrc=x.src;
            x.src=a[i+2];
        }
}

function MapOnMouseClick(areaID) {
    oSrcSelected = ''+sacPath+'img/mappa-'+areaID+'.jpg';
    var selArea = RegionsEnum[areaID];
    setSelectedIndex(document.getElementById("regions"), selArea);
    var regobj = document.getElementById("regions");
    ectrlFireEvent(regobj,'change');
}

function ectrlFireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evth = document.createEvent("HTMLEvents");
        evth.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evth);
    }
}

function getTextByIndex(s, valsearch){
    var sText = "";
    for (i = 0; i< s.options.length; i++)    {
        if (s.options[i].value == valsearch)        {
            sText = s.options[i].text;
            break;
        }
    }
    return sText;
}

function checkSelectedIndex(s, valsearch){
    var found = false;
    for (i = 0; i< s.options.length; i++)    {
        if (s.options[i].value == valsearch)        {
            found = true;
            break;
        }
    }
    return found;
}


function setSelectedIndex(s, valsearch){
    var found = false;
    for (i = 0; i< s.options.length; i++)    {
        if (s.options[i].value == valsearch)        {
            s.options[i].selected = true;
            found = true;
            break;
        }
    }
    return found;
}

function  updateRegionsMap() {
    oSrcSelected = sacPath+'img/mappa-page.jpg';
    jQuery('#regionsmap img').attr('src',oSrcSelected);
}

function getHtmlRegionMap(){
    //    <body onload="MM_preloadImages(''+sacPath+'img/mappa-1.jpg',''+sacPath+'img/mappa-2.jpg',''+sacPath+'img/mappa-3.jpg',''+sacPath+'img/mappa-4.jpg',''+sacPath+'img/mappa-5.jpg',''+sacPath+'img/mappa-6.jpg',''+sacPath+'img/mappa-7.jpg',''+sacPath+'img/mappa-8.jpg',''+sacPath+'img/mappa-9.jpg',''+sacPath+'img/mappa-10.jpg',''+sacPath+'img/mappa-11.jpg',''+sacPath+'img/mappa-12.jpg',''+sacPath+'img/mappa-13.jpg',''+sacPath+'img/mappa-14.jpg',''+sacPath+'img/mappa-15.jpg');">
    
    return '<div id="regionsmap" width="190" ><img src="'+sacPath+'img/mappa-page.jpg" width="160" height="135" border="0" usemap="#Map" name="mappa" />'+
    '<map name="Map" id="Map">'+
    '<area onmouseover="MapOnMouseOver( 1)" onclick="MapOnMouseClick( 1)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="1"  shape="poly" coords="13,49,31,46,38,41,44,41,46,44,50,31,56,24,48,24,37,12,35,8,28,13,19,15,21,20,9,26,16,32,13,36" href="javascript:void(0)" alt="1" />'+
    '<area onmouseover="MapOnMouseOver( 2)" onclick="MapOnMouseClick( 2)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="2"  shape="poly" coords="46,51,46,60,52,63,56,61,65,63,67,58,63,55,66,48" />'+
    '<area onmouseover="MapOnMouseOver( 3)" onclick="MapOnMouseClick( 3)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="3"  shape="poly" coords="11,65,25,68,35,70,39,67,46,67,46,51,42,44,37,44,30,48,10,51" />'+
    '<area onmouseover="MapOnMouseOver( 4)" onclick="MapOnMouseClick( 4)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="4"  shape="poly" coords="8,67,1,78,0,84,4,92,2,107,10,111,21,107,17,94,26,87,27,79,33,70" />'+
    '<area onmouseover="MapOnMouseOver( 5)" onclick="MapOnMouseClick( 5)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="5"  shape="poly" coords="22,105,42,108,55,92,49,80,46,87,28,87,19,95" />'+
    '<area onmouseover="MapOnMouseOver( 6)" onclick="MapOnMouseClick( 6)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="6"  shape="poly" coords="40,122,47,104,57,92,57,87,63,84,66,86,73,82,75,91,70,98,72,103,84,101,79,112,80,117,76,120,68,128,60,124,49,130" />'+
    '<area onmouseover="MapOnMouseOver( 7)" onclick="MapOnMouseClick( 7)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="7"  shape="poly" coords="74,86,75,91,69,99,72,102,83,101,95,92,100,82,84,83" />'+
    '<area onmouseover="MapOnMouseOver( 8)" onclick="MapOnMouseClick( 8)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="8"  shape="poly" coords="75,72,78,78,73,82,75,84,100,81,98,89,106,85,111,82,121,89,132,85,132,71,125,60,117,46,105,57,97,54,95,62,83,72" />'+
    '<area onmouseover="MapOnMouseOver( 9)" onclick="MapOnMouseClick( 9)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="9"  shape="poly" coords="119,45,126,58,133,67,133,71,150,70,159,56,159,52,144,32,154,17,150,13,145,26,136,27,132,37,127,37,126,41" />'+
    '<area onmouseover="MapOnMouseOver(10)" onclick="MapOnMouseClick(10)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="10" shape="poly" coords="93,41,97,52,105,55,120,42,127,36,122,28,111,29,99,35" />'+
    '<area onmouseover="MapOnMouseOver(11)" onclick="MapOnMouseClick(11)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="11" shape="poly" coords="122,26,128,22,129,11,138,9,143,12,146,6,151,13,146,23,138,25,133,34,129,35,128,30" />'+
    '<area onmouseover="MapOnMouseOver(12)" onclick="MapOnMouseClick(12)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="12" shape="poly" coords="75,57,74,71,83,71,95,59,95,53,90,44,84,51,80,50" />'+
    '<area onmouseover="MapOnMouseOver(13)" onclick="MapOnMouseClick(13)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="13" shape="poly" coords="72,81,66,85,62,84,55,88,52,82,55,70,54,65,62,64,66,65,69,59,66,55,69,49,75,48,81,40,81,50,74,56,74,71,77,78" />'+
    '<area onmouseover="MapOnMouseOver(14)" onclick="MapOnMouseClick(14)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="14" shape="poly" coords="47,61,47,68,39,68,29,79,29,86,45,86,51,78,54,69,52,64" />'+
    '<area onmouseover="MapOnMouseOver(15)" onclick="MapOnMouseClick(15)" onmouseout="MM_swapImgRestore()" href="javascript:void(0)" alt="15" shape="poly" coords="43,15,49,23,59,23,52,31,47,44,48,50,70,45,76,45,76,40,82,35,84,10,80,6,66,5,67,13,61,10" />'+
    '</map><div id="regionsmaplabelover"></div></div>';

}

// ---<< Regions - helper functions>>---


