function ResultList() {
    this.reset = function() {
        this.list = new Array();

        /**
        * Contains the ids list of visibile result set's elements.
        */
        this.visibleList = new Array();
        this.toCompare = 0;
        this.compareList = new Object();
        // Number of total result
        this.totalResultsRequired = 0;
        // Partners to call
        this.partners = new Object();
        // Current page number
        this.currentPage = 0;
        this.resPerPage = 0;
        // Filter data
        this.filtersCurrentField = null;
        this.filtersCurrentStrip = null;

        //AjaxService List for pager
        this.ajaxServiceList = new Object({'textlink':true, 'shoppingSearch':true, 'bookmark':true});

        //Response
        this.response = new Array();

        /**
        * Contains the list of selected filter-strip (multiselection of filters..not multi-selection of strip for the same filter).
        */
        this.filtersSelected = new Object();
        this.filters = undefined;
        // Se i parametri sono gia presenti:
        if(typeof this.params == 'object') {
            if(this.params.showInformations) {
                if(this.params.waitDivId != null){
                    var waitDiv = document.getElementById(this.params.waitDivId);
                }
                else{
                    var waitDiv = null;
                }
                
                if(waitDiv != null) { 
                    waitDiv.style.display = 'block';
                }
                
                if(this.params.noResultsId != null){
                    if(
                        this.params.noResultsId &&
                        this.params.noResultsId != null &&
                        document.getElementById(this.params.noResultsId) &&
                        document.getElementById(this.params.noResultsId) != null
                    ) {
                        document.getElementById(this.params.noResultsId).style.display = 'none';
                    }
                }

                document.getElementById(this.params.resultDisplayId).style.display = 'none';
                document.getElementById(this.params.resultContainerId).innerHTML = "";
            }

            if(typeof(this.params.partnerList) != 'undefined' && count(this.params.partnerList) != 0) {
                for(partner in this.params.partnerList) {
                    this.setPagerParams(partner, this.params.partnerList[partner].pagerParams);
                    this.totalResultsRequired += Number(this.params.partnerList[partner].params.numForPage);
                }
            }
        }
    }


    this.setup = function(params) {
        // se non é definito this.params, quindi se è la prima esecuzione di this.setup()
        if(typeof this.params == 'undefined') {
            this.params = new Object();
            paramsList = ["id"];
            function param_default(pname, def) { 
                if (typeof params[pname] == "undefined") { 
                    params[pname] = def; 
                }
                paramsList.push(pname);
            };
            param_default('fromCampain',      1);
            //general params
            param_default('colPosition',      1);
            param_default('largestCol',       2);
            param_default('colsNumber',       1);
            param_default('showInformations', true);
            param_default('defaultSorting',   'partner');
            param_default('comparatorMax',    3);
            //ContentServer Calls data
            param_default('service',         null);
            param_default('partnerList',     Object());
            param_default('function',        null);
            param_default('recordCallback',  null);
            param_default('resultsCallback', null);
            param_default('objName',         null);
            //graphical ids
            param_default('waitDivId',             null);
            param_default('noResultsId',           null);
            param_default('compareButtonId',       null);
            param_default('sortBarId',             null);
            param_default('resultContainerId',     null);
            param_default('resultDisplayId',       null);
            param_default('comparatorContainerId', null);
            param_default('compareContainerId',    null);
            param_default('comparatorWaitId',      null);
            param_default('mainContainer',         null);
            param_default('sorterSelect',          null);
            //graphical flags
            param_default('showPager',      null);
            param_default('showOrder',      null);
            param_default('showComparator', null);
            param_default('top_keyword',    null);
            // events
            param_default('addResultEvent',   null);
            param_default('showResultsEvent', null);
            param_default('showFiltersEvent', null);
            //other functions
            param_default('sortByFunction',         null);
            param_default('htmlizeFunction',        null);
            param_default('openComparatorFunction', null);
        }
        var checkConfig = true;
        for(var ii in params) {
            if (this.arrIndexOf(paramsList, ii) == -1) {
                alert("Wrong config option: " + ii);
                checkConfig = false;
            }
        }
        if(checkConfig) {
            for(paramName in params) {
                this.params[paramName] = params[paramName];
            }
        }
        this.reset();
    }


    this.call = function(page) {
        var resCounter = 0;
        if(typeof(this.resCounter) != "undefined") {
            resCounter = this.resCounter;
        }
        var partnerName;
        var partnerParams;
        var pagerParams;
        var partnerWeight = count(this.partners);
        var partnerNumber;
        for(partnerName in this.partners) {
            // copy of Partner Params
            partnerParams = cloneOf(this.partners[partnerName].params);
            // partner results for page
            partnerNumber = partnerParams.numForPage;
            if(page == 1) {
                pagerParams = this.partners[partnerName].pagerParams.next;
            } else if(page == -1) {
                resCounter -= this.localResCounter + this.previous_localResCounter;
                pagerParams = this.partners[partnerName].pagerParams.prev;
                this.resCounter = resCounter;
            }
            // adding pager params
            for(paramName in pagerParams) {
                partnerParams[paramName] = pagerParams[paramName];
            }
            // partner sorting
            partnerParams['partnerWeight'] = partnerWeight;
            partnerParams['partnerNumber'] = partnerNumber;
            partnerWeight--;
            if(this.params.showPager && this.ajaxServiceList[this.params.service] == undefined) {
                delete partnerParams.numForPage;
            }
            gjcall('contentServer', {
                'service':         this.params.service,
                'partner':         partnerName,
                'params':          partnerParams,
                'function':        this.params['function'],
                'recordCallback':  this.params.recordCallback,
                'resultsCallback': this.params.resultsCallback,
                'objName':         this.params.objName,
                'resCounter':      resCounter
            });
        }
    }


    this.addResult = function(service, partner, func, objName, record) {
        if((addResultEvent = getFunction(this.params.addResultEvent)) != null) {
            addResultEvent(this, record);
        }
        recordCopy = {
            'id':        this.list.length,
            'object':    cloneOf(record),
            'partner':   partner,
            'toCompare': false,
            'hidden':    false
        }
        this.list[recordCopy.id] = recordCopy;
        this.list[recordCopy.id].object.filterList = new Object();
        /*if(typeof this.filters != 'undefined' && this.filtersCurrentField != null && this.filtersCurrentStrip != null) {
            this.filterHide(recordCopy.id);
        }*/
        if(typeof(this.localResCounter) == "undefined") {
            this.localResCounter = 0;
        }
        this.localResCounter += 1;
        return recordCopy.id;
    }


    this.showResults = function(service, partner, func, objName) {
        if(typeof partner != 'undefined') {
            this.partners[partner].done = true;
        }
        // showResults Event
        if((showResultsEvent = getFunction(this.params.showResultsEvent)) != null) {
            showResultsEvent(this, partner);
        }
        if(typeof this.filters != 'undefined') {
            // showFilters Event
            if((showFiltersEvent = getFunction(this.params.showFiltersEvent)) != null) {
                showFiltersEvent(this);
            }
        }
        if(this.params.showInformations) {
            if(this.showDone()) {
                if(this.params.waitDivId != null){
                    var wDiv = document.getElementById(this.params.waitDivId);
                }
                else {
                    var wDiv = null; 
                }

                if(wDiv != null) {
                    wDiv.style.display = 'none';
                }
            }
            // Se c'è un solo elemento:
            if(this.getLength() == 1) {
                var showComparator = this.params.showComparator;
                var showOrder      = this.params.showOrder;
                var showPager      = this.params.showPager;
                this.params.showComparator = 0;
                this.params.showOrder      = 0;
                this.params.showPager      = 0;
            }
            // ***
            if(this.showDone()) {
                if(this.getLength() == 0 && count(this.filtersSelected) == 0) {
                    var noResultsDiv = document.getElementById(this.params.noResultsId);
//                    alert(dump(this.params['partnerList'][partner]['params']));
                    if((this.params['partnerList'][partner]['params']['shopping_query']!="")||(this.params['partnerList'][partner]['params']['textlink_search']!=""))
                    {
                        if(noResultsDiv != null) { // nuovo sistema
                            noResultsDiv.style.display = 'block';
                        } else { // vecchio sistema (sconsigliato)
                            if(wDiv != null) {
                                wDiv.style.display = 'block';
                                wDiv.innerHTML = "";
                                var br = document.createElement("br");
                                wDiv.appendChild(br);
                                var text = document.createTextNode(_("COMMON_SORRY_NO_RESULT_MESSAGE"));
                                wDiv.appendChild(text);
                                var br2 = document.createElement("br");
                                wDiv.appendChild(br2);
                                var br3 = document.createElement("br");
                                wDiv.appendChild(br3);
                            }
                        }
                    }
                }
            }
            if(this.params.defaultSorting != null) {
                this.sortResult(this.params.defaultSorting);
            }
            else {
                this.showPage(0);
            }
            // Se c'è un solo elemento:
            if(this.getLength() == 1) {
                this.params.showComparator = showComparator;
                this.params.showOrder      = showOrder;
                this.params.showPager      = showPager;
            }
            // ***
        }
    }


    this.noResults = function(partner) {
    }


    this.showDone = function() {
        var done = true;
        for(partner in this.partners) {
            done = done && this.partners[partner].done;
        }
        return done;
    }


    this.arrIndexOf = function(arr, searchElement, fromIndex) {
        if (Array.prototype.indexOf) {
            return arr.indexOf(searchElement, fromIndex);
        }
        if (!fromIndex) {
            fromIndex = 0;
        }
        for (var iElement = fromIndex; iElement < arr.length; iElement++) {
            if (arr[iElement] == searchElement) {
                return iElement;
            }
        }
        return -1;
    }


    // Hide the waiting div
    this.hideWait = function() {
        if(this.params.showInformations) {
            var wDiv = document.getElementById(this.params.waitDivId);
            if(wDiv != null) {
                wDiv.style.display = 'none';
            }
        }
    }


    // Show the waiting div
    this.showWait = function() {
        if(this.params.showInformations) {
            var wDiv = document.getElementById(this.params.waitDivId);
            if(wDiv != null) {
                wDiv.style.display = 'block';
            }
        }
    }


    // Show specific page
    this.showPage = function(page) {
        var numRes = (this.totalResultsRequired < this.getLength()) ? this.totalResultsRequired : this.getLength();
        var start = numRes * page;
        // setting internal vars
        if(this.ajaxServiceList[this.params.service] == undefined) {
            /* Needed only for not ajax pager */
            this.currentPage = page;
        }
        this.resPerPage = numRes;
        this.reDisplay(start, numRes);
        this.showPager(page + 1, page - 1, numRes);
    }

    this.showPagePrevNext = function(page) {
        var resCounter = 0;
        var currentPage = this.currentPage;
        currentPage += page;
        if(typeof(this.resCounter) != "undefined") {
            resCounter = this.resCounter;
        }
        
        this.reset();
        /* Reinserting currentPage for Ajax */
        this.currentPage = currentPage;
        if(this.currentPage == 0) {
            this.fromStart = true;
        }
        this.call(page);
        this.previous_localResCounter = this.localResCounter;
    }

    // Show updated pager
    this.showPager = function(next, prev, numRes) {
        if(this.params.showPager == 0) {
            return; 
        }
        var totalPages = Math.ceil(this.getLength()/numRes);
        if(totalPages == 1) {
            return;
        }
        if(totalPages < (this.getLength()/numRes)){
            totalPages++;
        }
        if(totalPages >= 10) {
            totalPages = 10;
        }
        var isPagerDiv = false;
        if(document.getElementById(this.params.objName+"_pager") != null) {
            divResult = document.getElementById(this.params.objName+"_pager");
            divResult.innerHTML = '';
            isPagerDiv = true;
        }
        else {
            divResult = document.getElementById(this.params.resultContainerId);
        }

        var divPager = document.createElement("div");
        // CHE SCHIFOOOOOOOOOOOO
        // DA TOGLIEREEEEEEEEEEE
        if(this.params.service == 'relatedSearch') {
            divPager.className = "page_bar_related_search";
        } else {
            divPager.className = "page_bar_shopping";
        }

        var prevSpan = document.createElement("span");
        var prevText = "&laquo;&nbsp;"+(_("COMMON_PREVIOUS"));
        if(this.currentPage > 0) {
            // Previus button
            var prevLink = document.createElement("a");
            prevLink.href =  "javascript:execute('search', {objName: '" +this.params.objName+ "', number_page: "+prev+"});";
            prevLink.title = _("COMMON_PAGE") + " " + (prev + 1);
            prevLink.innerHTML = prevText;
            prevSpan.appendChild(prevLink);
        }
        else {
            prevSpan.innerHTML = prevText;
        }
        divPager.appendChild(prevSpan);

        // parte centrale numerica
        var pages = new Array();
        for (var i = 0; i < totalPages; i++) {
            var preSpace = document.createTextNode(" ");
            divPager.appendChild(preSpace); 
            if(i != this.currentPage) {
                pages[i] = document.createElement("a");

//                pages[i].href =  "javascript: " + this.params.objName + ".showPage(" + i + ");";
                pages[i].href =   "javascript:execute('search', {objName: '" +this.params.objName+ "', number_page: "+i+"});";
                
                pages[i].title = _("COMMON_PAGE") + " " + (i + 1);
                pages[i].innerHTML = i+1;
            }
            else {
                pages[i] = document.createTextNode(i+1);
            }
            divPager.appendChild(pages[i]);
            var postSpace = document.createTextNode(" ");
            divPager.appendChild(postSpace);
            if(i < totalPages-1) { 
                var pipe = document.createTextNode("|");
                divPager.appendChild(pipe); 
            }
        }

        var nextSpan = document.createElement("span");
        var nextText = (_("COMMON_NEXT"))+"&nbsp;&raquo;";
        if(this.currentPage < totalPages-1) {
            // Next button
            var nextLink = document.createElement("a");
            nextLink.href =  "javascript:execute('search', {objName: '" +this.params.objName+ "', number_page: "+next+"});";
            nextLink.title = _("PAGE") + " " + (next + 1);
            nextLink.innerHTML = nextText; 
            nextSpan.appendChild(nextLink);
        }
        else {
            nextSpan.innerHTML = nextText;
        }
        divPager.appendChild(nextSpan);
        divResult.appendChild(divPager);

        if(isPagerDiv == true) {
            divResult.style.display = 'block';
        }
    }

    // Show updated pager
    this.showPagerPrevNext = function(next, prev, numRes) {
        var partnerName;
        for(partnerName in this.partners) {
            break;
        }
        var isPagerDiv = false;
        if(document.getElementById(this.params.objName+"_pager") != null) {
            divResult = document.getElementById(this.params.objName+"_pager");
            divResult.innerHTML = '';
            isPagerDiv = true;
        }
        else {
            divResult = document.getElementById(this.params.resultContainerId);
        }

        var divPager = document.createElement("div");
        divPager.className = "page_bar_shopping";

        var divLeft = document.createElement("div");
        divLeft.className = "page_bar_shopping_left";
        if(this.partners[partnerName].pagerParams && this.partners[partnerName].pagerParams.prev != null) {
            var prevSpan = document.createElement("span");
            prevSpan.className = "frecce";
            prevSpan.innerHTML = "&lt;&lt;&nbsp;";
            // Previus button
            var prevLink = document.createElement("a");
            prevLink.href =  "javascript:execute('search', {objName: '" +this.params.objName+ "', number_page: "+prev+", ajax: true});";
            //prevLink.title = _("COMMON_PAGE") + " " + (prev + 1);
            prevLink.appendChild(prevSpan);
            prevLink.innerHTML += _("COMMON_PREVIOUS");
            divLeft.appendChild(prevLink);
        }
        else {
            divLeft.innerHTML = "&nbsp;";
        }
        divPager.appendChild(divLeft);

        var divRight = document.createElement("div");
        divRight.className = "page_bar_shopping_right";
        if(this.partners[partnerName].pagerParams && this.partners[partnerName].pagerParams.next != null) {
            // Next button
            var nextSpan = document.createElement("span");
            nextSpan.className = "frecce";
            nextSpan.innerHTML = "&nbsp;&gt;&gt;";
            var nextLink = document.createElement("a");
            nextLink.href =  "javascript:execute('search', {objName: '" +this.params.objName+ "', number_page: "+next+", ajax:true});";
            //nextLink.title = _("PAGE") + " " + (next + 1);
            nextLink.innerHTML = _("COMMON_NEXT"); 
            nextLink.appendChild(nextSpan);
            divRight.appendChild(nextLink);
        }
        divPager.appendChild(divRight);
        divResult.appendChild(divPager);

        if(isPagerDiv == true) {
            divResult.style.display = 'block';
        }
    }

    this.reDisplay = function(start, numRes) {
        this.countPart = new Array();
        for(var partnerName in this.params.partnerList) {
            this.countPart[partnerName] = cloneOf(this.params.partnerList[partnerName].params.numForPage);
        }
        document.getElementById(this.params.resultContainerId).innerHTML = "";
        this.params.htmlizeFunction = getFunction(this.params.htmlizeFunction);
        if(this.params.htmlizeFunction == null) {
            return false;
        }
        // count_i is current real index
        var count_i = 0;
        // for(var i in this.list) {
        for(var i = 0; i < this.list.length; i++) {
            if(typeof(this.list[i].hidden) == 'undefined' || this.list[i].hidden == false) {
                if(count_i >= start && (count_i < (start + numRes))) {
                    this.params.htmlizeFunction(this.params.resultContainerId, this, i);
                } else if(count_i >= (start + numRes)) {
                    break;
                }
                count_i++;
            }
        }
        if(count_i > 0) {
            if(this.params.resultDisplayId != '') {
                //alert('sono in reDisplay e sto per avviare: '+this.params.resultContainerId+' e '+this.params.resultDisplayId);
                document.getElementById(this.params.resultContainerId).style.display = 'block';
                document.getElementById(this.params.resultDisplayId).style.display = 'block';
                var divBar1 = document.getElementById(this.params.objName+"_orderBar1");
                var divBar2 = document.getElementById(this.params.objName+"_orderBar2");
                if(this.params.showOrder == 1 || this.params.showComparator == 1) {
                    if(divBar1 != null && divBar2 != null) {
                        divBar1.style.display = 'block';
                        divBar2.style.display = 'block';
                    }
                    if(this.params.showOrder == 1) {
                        document.getElementById(this.params.sortBarId+"1").style.display = 'block';
                        document.getElementById(this.params.sortBarId+"2").style.display = 'block';
                    }
                    if(this.params.showComparator == 1) {
                        if( (compareButton = document.getElementById(this.params.compareButtonId)) != null) {
                            compareButton.style.display = 'block';
                        }
                        if( (compareButton1 = document.getElementById(this.params.compareButtonId+"1")) != null) {
                            compareButton1.style.display = 'block';
                        }
                        if( (compareButton2 = document.getElementById(this.params.compareButtonId+"2")) != null) {
                            compareButton2.style.display = 'block';
                        }
                    }
                } else {
                    if(divBar1 != null && divBar2 != null) {
                        divBar1.style.display = 'none';
                        divBar2.style.display = 'none';
                    }
                }
            }
        }
    }


    this.sortResult = function(orderKey) {
        
        if(orderKey == 'partner') {
            this.sortResultByPartner();
        } else {
            this.getFunction = getFunction; //this one instead of getFunction() for use of the right scoping
            // CONTROLLO E SETTAGGI PER SINCRONIZZARE LE SELECT 
            var select1 = document.getElementById(this.params.sorterSelect + "1");
            var select2 = document.getElementById(this.params.sorterSelect+"2");
            if(!(select1 == null || select2 == null)) 
            {
                if(select1.options[select1.selectedIndex].value != orderKey)
                {
                    select1.options[select1.selectedIndex].selected = false;
                    select1.options[select2.selectedIndex].selected = true;
                }
                else
                {
                select2.options[select2.selectedIndex].selected = false;
                select2.options[select1.selectedIndex].selected = true;
                }
            }
            // FINE CONTROLLO   
            if(orderKey != '' && (sortByFunction = this.getFunction(this.params.sortByFunction)) != null) {
                eval(this.params.sortByFunction+'(orderKey)'); // this one instead of 'sortByFunction(orderKey);' for use of the right scoping
            }
            delete(this.getFunction);
        }
        this.showPage(0);
    }


    this.sortResultByPartner = function() {
        // Ajax Sorting - START
        this.list.sort( function (a, b) {
            var A = parseInt(a.object.partnerWeight);
            var B = parseInt(b.object.partnerWeight);
            return (A < B) ? 1 : ( (A > B) ? -1 : 0 );
        });
        // Ajax Sorting - END

        // SORTING OLD VERSION
        // var partnersCounters = new Array();
        // var partnerName;
        // for(partnerName in this.partners) {
        //     partnersCounters[ partnerName ] = this.partners[ partnerName ].params.numForPage;
        // }
        // var firstPageList = new Array();
        // var otherList = new Array();
        // for(i in this.list) {
        //     if( partnersCounters[ this.list[i].partner ] > 0) {
        //         partnersCounters[ this.list[i].partner ]--;
        //         firstPageList[ firstPageList.length ] = this.list[i];
        //     } else {
        //         otherList[ otherList.length ] = this.list[i];
        //     }
        // }
        // this.list = firstPageList.concat(otherList);
    }


    this.getLength = function() {
        var real_i = 0;
        // for(i in this.list) {
        for(i = 0; i < this.list.length; i++) {
            if(typeof this.list[i].hidden == 'undefined' || this.list[i].hidden == false) {
                real_i++;
            }
        }
        return real_i;
    }


    this.getElement = function(num) {
        if (num <= this.list.length) {
            return this.list[num];
        }
        return null;
    }


    this.changeCompareValue = function(name_id, checked) {
        var nameCompare = this.params.objName;
        //product exception
        if(nameCompare.indexOf('.similarProductsLists.') >= 0) {
            nameCompare = nameCompare.replace('.similarProductsLists.', '_similar_');
        }
        // for(i in this.list) {
        for(i = 0; i < this.list.length; i++) {
            if(nameCompare+'_'+this.list[i].id == name_id) {
                if(this.list[i].toCompare == false && checked == true) {
                    this.toCompare++;
                    this.compareList[name_id] = this.list[i];
                } else if(this.list[i].toCompare == true && checked == false) {
                    this.toCompare--;
                    delete(this.compareList[name_id]);
                }
                this.list[i].toCompare = checked;
            }
        }
    }
    
    this.deleteCompareValue = function() {
        for(i in this.compareList) {
            var el = document.getElementById(this.params.objName+'_'+this.compareList[i].id+'_comparecheck');
            if(el != undefined && el != null) {
                el.checked = false; // for IE;
                el.removeAttribute('checked'); // for FF
            }
            this.compareList[i].toCompare = false;
            this.toCompare--;
        }
        this.compareList = new Array();
//        this.showPage(this.currentPage);
    }

    this.toCompareList = function() {
        var toCompareList = new ResultList();
        toCompareList.setup({
            // showInformations: false --> doesnt need [html IDs], [layout flags], colPosition, colsNumber, htmlizeFunction and sortByFunction
            showInformations: false
        });
        for(i in this.compareList) {
            toCompareList.addResult('', '', '', '', this.compareList[i].object);
        }
        return toCompareList;
    }

    this.isComparable = function() {
        // showComparator Function
        if((openComparatorFunction = getFunction(this.params.openComparatorFunction)) == null) {
            return false;
        } else if(this.toCompare < 2) {
            return false;
        } else if(this.toCompare > this.params.comparatorMax) {
            return false;
        } else {
            return true;
        }
    }

    this.openComparator = function() {
        // showComparator Function
        if((openComparatorFunction = getFunction(this.params.openComparatorFunction)) == null) {
            alert('An error occurred in comparator opening');
            return false;
        } else if(this.toCompare < 2) {
            alert(_(this.params.service.toUpperCase()+'_COMPARE_AT_LEAST_TWO'));
            return false;
        } else if(this.toCompare > this.params.comparatorMax) {
            alert(_(this.params.service.toUpperCase()+'_COMPARE_MAX'));
            return false;
        } else {
            // nascondi risultati
            document.getElementById(this.params.resultDisplayId).style.display = "none";
            if(this.params.comparatorWaitId != null && document.getElementById(this.params.comparatorWaitId) != null) {
                // apri comparator WaitDiv
                document.getElementById(this.params.comparatorWaitId).style.display = "block";
            } else {
                // apri comparatore
                document.getElementById(this.params.comparatorContainerId).style.display = "block";
            }

            var compareContainer = document.getElementById(this.params.compareContainerId);
            while(compareContainer.rows.length > 0) {
                compareContainer.deleteRow(0);
            }
            openComparatorFunction(this);
            return true;
        }
    }


    this.showComparator = function() {
        if(this.params.comparatorWaitId != null && document.getElementById(this.params.comparatorWaitId) != null) {
            // chiudi comparator WaitDiv
            document.getElementById(this.params.comparatorWaitId).style.display = "none";
            // apri comparatore
            document.getElementById(this.params.comparatorContainerId).style.display = "block";
        }
    }


    this.closeComparator = function() {
        /* nascondi comparatore */
        document.getElementById(this.params.comparatorContainerId).style.display = "none";
        /* apri risultati */
        //alert('in closeComparator, sto per attivare '+this.params.resultDisplayId);
        document.getElementById(this.params.resultDisplayId).style.display = "block";
    }


    this.setPagerParams = function(partnerName, pagerParams) {
        this.params.partnerList[partnerName].pagerParams = pagerParams;
        this.partners[partnerName] = {
            'params': this.params.partnerList[partnerName].params,
            'pagerParams': typeof(this.params.partnerList[partnerName].pagerParams) != 'undefined' ? this.params.partnerList[partnerName].pagerParams : null,
            'done': false
        };
    }

    this.enumSort = function(a) {
        var i, j;
        for(i=0; i < a.length; i++){ 
            var smallest = i;
            for(j=i+1; j < a.length; j++) {
                if(a[j].cmp_value < a[smallest].cmp_value) {
                    smallest=j;
                }
            }
            var temp=a[i];  a[i]=a[smallest];  a[smallest]=temp; // swap
        } // for i
        return a;
    }
    
    /**
    * Re-evaluate the filter's set, counting elements for each filter's strip.
    * @return void function
    * @type void
    */
    this.evalFilters = function() {
        var i;
        for(i in this.filters) {
            var j;
            for(j = 0; j < this.filters[i].execs.length; j++) {
                this.filters[i].execs[j].count = 0;
            }
        }
        var ii;
        //for(ii in this.visibleList) {
        for(ii = 0; ii < this.visibleList.length; ii++) {
            var jj;
            if(this.list[ii].hidden == false) {
                for(jj in this.list[ii].object.filterList) {
                    if(this.filters[jj].execs[ this.list[ii].object.filterList[jj] ] != undefined) {
                        this.filters[jj].execs[ this.list[ii].object.filterList[jj] ].count++;
                    }
                }
            }
        }
    }
    
    /**
    * Build the filters' list for the given result set. Each filter's strip has an elementList with the list of elements' ids associated with that strip.
    * @param {Object} filters The filters' set given by ajax call.
    * @return void function
    * @type void
    */
    this.setFilters = function(filters) {
        if(typeof filters != 'undefined') {
            this.filters = new Object();
            for(i in filters) {
                this.filters[ filters[i].param_name ] = {type: filters[i].data_type, path: filters[i].path };
            }
            var objName = this.params.objName;
            // cycling filters
            for(filterName in this.filters) {
                if(this.list.length > 0) {
                    //alert(filterName);
                    field_type = this.filters[filterName].type;
                    field_path = this.filters[filterName].path;
                    filter_execs = new Array();
                    switch(field_type) {
                        case 'INT':
                            if(typeof field_number_min != 'undefined') {
                                delete(field_number_min);
                            }
                            if(typeof field_number_max != 'undefined') {
                                delete(field_number_max);
                            }
                            var i = 0;
                            numValues = new Array();
                            // for(ii in this.list) {
                            for(ii = 0; ii < this.list.length; ii++) {
                                field = eval('this.list[ii].object.'+field_path);
                                if(field != null && typeof field != 'object') {
                                    field = Number(field);
                                    if(typeof field_number_min == 'undefined' || field < field_number_min) {
                                        field_number_min = field;
                                    }
                                    if(typeof field_number_max == 'undefined' || field > field_number_max) {
                                        field_number_max = field;
                                    }
                                }
                                if(field != null && !isNaN(field)) {
                                    numValues[i++] = Number(field);
                                }
                            }
                            numValues = distinctValues(numValues);
                            numValues.sort(function(a, b) {return a-b});
                            var filter_strips = new Array();
                            if(numValues.length >= 5) {
                                for(i = 0; i < 5; i++) {
                                    filter_strips[i] = numValues[ Math.round( (parseFloat(numValues.length) / 5 ) * i ) ];
                                }
                            } else {
                                for(i = 0; i < numValues.length; i++) {
                                    filter_strips[i] = numValues[i];
                                }
                                delete(filter_strips[i]);
                            }
                            for(i = 0; i < filter_strips.length; i++) {
                                i = Number(i);
                                filter_execs[i] = new Array();
                                // se è l'ultimo strip
                                filter_execs[i] = (typeof(filter_strips[i+1]) == 'undefined') ?
                                        {'value_min': Math.floor(filter_strips[i]), 'value_max': Math.floor(field_number_max+1.0)} :
                                        {'value_min': Math.floor(filter_strips[i]), 'value_max': Math.floor(filter_strips[i+1])};
                                filter_execs[i].count = 0;
                                filter_execs[i].elemList = new Array();
                                // for(ii in this.list) {
                                for(ii = 0; ii < this.list.length; ii++) {
                          //          alert('for INT..element hidden value is ' + this.list[ii].hidden);
                                    if(this.list[ii].hidden == false) {
                                        field = eval('this.list[ii].object.'+field_path);
                                        if(filter_execs[i].value_min <= field && field < filter_execs[i].value_max) {
                                            filter_execs[i].count++;
                                            filter_execs[i].elemList.push(ii);
                                            this.list[ii].object.filterList[filterName] = i;
                                        }
                                    }
                                }
                            }
                        break;

                        case 'INT_LIST':
                            var i = 0;
                            numValues = new Array();
                            // for(ii in this.list) {
                            for(ii = 0; ii < this.list.length; ii++) {
                                field = eval('this.list[ii].object.'+field_path);
                                if(field != null && typeof field != 'object') {
                                    field = Number(field);
                                }
                                if(field != null && !isNaN(field)) {
                                    numValues[i++] = Number(field);
                                }
                            }
                            numValues = distinctValues(numValues);
                            numValues.sort(function(a, b) {return a-b});
                            var filter_strips = new Array();
                            
                            // for(i in numValues) {
                            for(i = 0; i < numValues.length; i++) {
                                filter_strips[i] = numValues[i];
                                i = Number(i);
                                filter_execs[i] = new Array();
                                // se è l'ultimo stri
                                filter_execs[i].count = 0;
                                filter_execs[i].cmp_value = numValues[i];
                                filter_execs[i].elemList = new Array();
                                // for(ii in this.list) {
                                for(ii = 0; ii < this.list.length; ii++) {
                                    if(this.list[ii].hidden == false) {
                                        field = eval('this.list[ii].object.'+field_path);
                                        if(filter_execs[i].cmp_value == field) {
                                            filter_execs[i].count++;
                                            filter_execs[i].elemList.push(ii);
                                            this.list[ii].object.filterList[filterName] = i;
                                        }
                                    }
                                }
                            }
                        break;

                        case 'ENUM':
                        case 'SET':
                            filter_strips = new Object();
                            // for(ii in this.list) {
                            for(ii = 0; ii < this.list.length; ii++) {
                                if(this.list[ii].hidden == false) {
                                    field = eval('this.list[ii].object.'+this.filters[filterName].path);
                                    if(field != null) {
                                        fields = (field_type == 'SET') ? field : [field];
                                        for(i = 0; i < fields.length; i++) {
                                            if(fields[i] == '') {
                                                fields[i] = 'EMPTYVALUE';
                                            }
                                            if(typeof filter_strips[ fields[i] ] == 'undefined') {
                                                filter_strips[ fields[i] ] = {'cmp_value': fields[i], 'count': 1, 'elemList': [ii]};
                                            } else {
                                                filter_strips[ fields[i] ].count++;
                                                filter_strips[ fields[i] ].elemList.push(ii);
                                            }
                                        }
                                    }
                                }
                            }
                            for(strip in filter_strips) {
                                filter_execs[ filter_execs.length ] = filter_strips[strip];
                                if(filter_execs.length == 5) {
                                    break;
                                }
                            }
                            //ORDINAMENTO ENUM
                            if(field_type == 'ENUM') {
                                filter_execs = this.enumSort(filter_execs);
                            }
                        break;
                    }
                    this.filters[filterName].execs = filter_execs;

                    /* Inserimento della posizione per le enum e i set */
                    // for(strip in filter_execs) {
                    for(strip = 0; strip < filter_execs.length; strip++) {
                        // for(elemIndex in filter_execs[strip].elemList) {
                        for(elemIndex = 0; elemIndex < filter_execs[strip].elemList.length; elemIndex++) {
                            this.list[ filter_execs[ strip ].elemList[elemIndex] ].object.filterList[filterName] = strip;
                        }
                    }
                }
            }
        }
    }

    /**
    * Destroy the filters array.
    * @return void function
    * @type void
    */
    this.unsetFilters = function() {
        delete(this.filters);
        this.filtersCurrentField = null;
        this.filtersCurrentStrip = null;
    }

    /**
    * Added to the selected filters' list the given field with its strip, updating the resultList.
    * @param {String} field The filter's name to add to selected list.
    * @param {String} strip The filter's strip associated to the field param.
    * @return void function
    * @type void
    */
    this.filterFor = function(field, strip) {
        this.filtersSelected[field] = strip;
        this.filterView();
    }
    
    /**
    * Delete the given filter from the selected filters' list, updating the resultList.
    * @param {String} field The filter's name to deselect
    * @return void function
    * @type void
    */
    this.deselectFilter = function(field) {
        delete(this.filtersSelected[field]); 
        this.filterView();
    }

    /**
    * Update the resultList, the filters' strip count and show the new result set to the user.
    * @return void function
    * @type void
    */
    this.filterView = function() {
        var index;
        this.visibleList = new Array();
        // for(index in this.list) {
        for(index = 0; index < this.list.length; index++) {
            this.list[index].hidden = false;
            this.filterHide(index);
        }
        this.evalFilters();
        this.showResults();
    }

    /**
    * Given an element's id, set that element to hidden or not.
    * @param {int} elementIndex The element's id to evaluate
    * @return void function
    * @type void
    */
    this.filterHide = function(elementIndex) {
        var field;
        var strip;
        var check_value;

        //mod per gestire la deselect del filtro
        for(field in this.filtersSelected) {
            check_value = this.filterCheckValue(elementIndex, field);
            this.list[elementIndex].hidden = (this.list[elementIndex].hidden || check_value);
            if(this.list[elementIndex].hidden) {
                break;
            }
        }
        if(this.list[elementIndex].hidden == false) { //visibile
            this.visibleList[elementIndex] = true;
        }
    }
    
    /**
    * Return the visible status for an element, for the given filter
    * @param {int} elementIndex The element's id to evaluate
    * @param {String} field The filter's name
    * @return The value of the visible status of the element
    * @type bool
    */
    this.filterCheckValue = function(elementIndex, field) {
        var check_value = false;
        var strip = this.filtersSelected[field];
        check_value = (this.list[elementIndex].object.filterList[field] == undefined || this.list[elementIndex].object.filterList[field] != strip);
        return check_value;
    }

    /**
    * Deselect all filter and show the complete result set.
    * @return void function
    * @type void
    */
    this.showAll = function() {
        this.filtersCurrentField = null;
        this.filtersCurrentStrip = null;
        this.filtersSelected = new Object();
        this.visibleList = new Array();
        // for(ii in this.list) {
        for(ii = 0; ii < this.list.length; ii++) {
            this.list[ii].hidden = false;
            this.visibleList[ii] = true;
        }
        this.evalFilters();
        //PORTIAMO AL VALORE "----------" LE SELECT DI ORDINAMENTO
        var select1 = document.getElementById(this.params.sorterSelect + "1");
        var select2 = document.getElementById(this.params.sorterSelect+"2");
        if( select1 != null && select1 != undefined) {
            select1.options[select1.selectedIndex].selected = false;
            select1.options[0].selected = true;
        }
        if( select2 != null && select2 != undefined) {
            select2.options[select1.selectedIndex].selected = false;
            select2.options[0].selected = true;
        }
        this.showResults();
    }


    // to evaluate
    this.initBodyResults = function() {
        var bodyResult = document.getElementById(this.params.resultContainerId);
        bodyResult.innerHTML = "";
        this.list = new Array();
    }

    this.setResultCounter = function(i) 
    {
        this.localResCounter = 0;
        if(typeof(i) != "undefined") {
            this.resCounter = i;
        }
    }

    this.getCLabTrack = function(partner) 
    {
        if(typeof(trackCLab) != "undefined" && trackCLab) {
            return "sendtrack('" + partner + "_" + this.getCLabKeyword(partner) + "')";
        }
        else {
            return "";
        }
    }

    /***** CONSTRUCTOR *****/
    this.reset();
}
