
var selector =
	{
	    loadingFinishedEvent: function () { }
        ,
	    fixcolumns: function () { }
        ,
	    selectorColumnIndexes: null
		,
	    filters: {}
	    ,
	    defaultFilters: {}
		,
	    currentPage: 0
		,
	    isLoading: false
	    ,
	    toCompareList: new Array()
	    ,
	    isNewQuery: true
	    ,
	    queryUrl: null
	    ,
	    compareUrl: null
	    ,
	    userFilters: new Array()
        ,
	    closeTooltip: null
        ,
	    closeMessage: null
        ,
	    noFiltersSelected: null
        ,
	    duplicateFavorite: null
        ,
	    userFilterNameWarning: null
        ,
	    activateCriteria: null
        ,
	    deleteCriteria: null
        ,
	    activate: null
        ,
	    yes: null
        ,
	    no: null
        ,
	    initialize: function (options) {
	        selector.queryUrl = options.postUrl;
	        selector.compareUrl = options.compareUrl;
	        selector.closeTooltip = options.userFilters.closeTooltip;
	        selector.closeMessage = options.userFilters.closeMessage;
	        selector.noFiltersSelected = options.userFilters.noFiltersSelected;
	        selector.duplicateFavorite = options.userFilters.duplicateFavorite;
	        selector.userFilterNameWarning = options.userFilters.userFilterNameWarning;
	        selector.activateCriteria = options.userFilters.activateCriteria;
	        selector.deleteCriteria = options.userFilters.deleteCriteria;
	        selector.activate = options.userFilters.activate;
	        selector.yes = options.userFilters.yes;
	        selector.no = options.userFilters.no;

	        // Set colors and click event handler on disabled filters
	        $('h3, label.option', options.filterItems.group).css('color', '#666666');
	        options.filterItems.group.bind('click', function () { return stopPage.show(); });

	        // Render user filters
	        selector.renderUserFilters(options.userFilters.container.find('tbody'));

	        // Bind comparison widget
	        options.comparison.widget.bind('click', options.comparison.message, selector.validateCompare);

	        if (null != options.fixcolumns) {
	            selector.fixcolumns = options.fixcolumns;
	        }
	        // Bind click event on target table rows to send to product detail page
	        selector.loadingFinishedEvent = function () {
	            $('#targetTable tbody tr').click(function (e) {
	                var evt = window.event || e;
	                var el;

	                if ($.browser.msie)
	                    el = $(evt.srcElement)
	                else
	                    el = $(evt.target);

	                var tr;
	                if (el.is('td'))
	                    tr = el.parents('tr');
	                else if (el.is('tr'))
	                    tr = el;

	                if (tr != null)
	                    document.location = $(this).find('a').attr('href');
	            });
	        };

	        // Set filter widgets
	        for (var i = 0; i < options.filterItems.widgets.length; i++) {
	            var w = options.filterItems.widgets[i];
	            var m = w.widget.multiselect(w.options);
	            if (w.showFilter) {
	                m.multiselectfilter(w.filterOptions);
	            }

	            //m.multiselect('uncheckAll')[0].selectedIndex = -1;

	        }
	        var tooltip = new $.tai_tooltip($('#toggle-filters a'));


	        // Bind events to user filters pane
	        options.userFilters.dropPane.bind('click', function () {
	            if (options.userFilters.container.css('display') == 'block') {
	                options.userFilters.container.slideUp('slow', 'easeInBack');
	                $(this).empty().append($('<a class="seticons-down" title="' + options.userFilters.openTooltip + '">' + options.userFilters.openMessage + '</a>'));
	            }
	            else {
	                options.userFilters.container.slideDown('slow', 'easeInBack');
	                $(this).empty().append($('<a class="seticons-up" title="' + options.userFilters.closeTooltip + '">' + options.userFilters.closeMessage + '</a>'));
	            }
	            var tooltip = new $.tai_tooltip($(this).children('a').eq(0));
	        });


	        var previousFilters = false;
	        //Save default filter values
	        selector.storeDefaultFilters();

	        //Try to load user favorite filter, if no pre-filters are present in url
	        if (document.location.href.toLowerCase().indexOf('pre_') === -1) {
	            previousFilters = selector.loadUserFilters();
	        } else {
	            $('#selectorFilterForm .myfilters').hide();
	            for (var key in selector.defaultFilters) {
	                var values = selector.defaultFilters[key].split('@@');
	                for (var i = 0; i < values.length; i++) {
	                    var value = values[i];
	                    $("select[name='" + key + "'] option[value='" + decodeURIComponent(value) + "']")
                        .attr("selected", true)
	                }
	                $("input[type='checkbox'][name='" + key + "'][value='" + decodeURIComponent(value) + "']").attr("checked", true);
	                $("select[name='" + key + "']").multiselect('refresh');
	            }
	        }

	        //Set the default columns and transform to comboboxes
	        selector.setHeadingComboboxes(options.listHeaders.minWidth, options.listHeaders.minMenuWidth, options.listHeaders.defaultText);

	        selector.updateLabels();

	        //Do the first query
	        selector.query(previousFilters);

	    }
		,
	    query: function (usePreviousFilters, page) {
	        selector.loadingStart();
	        //Get filter values
	        if (!usePreviousFilters) {
	            selector.loadFilterValues();
	            selector.clearToCompare();
	        }
	        if (usePreviousFilters == null) {
	            /* if USER SELECT RESULT BT */
	            //$("div.myfilters").show();
	            //$("#manage-filters").slideDown('slow', 'easeInBack');
	            //$("#toggle-filters").empty().append($('<a class="seticons-up" title="' + selector.closeTooltip + '">' + selector.closeMessage + '</a>'));
	        }
	        //Get current page index
	        if (page) {
	            selector.currentPage = page;
	        }
	        else {
	            selector.currentPage = 0;
	        }
	        selector.filters["page"] = selector.currentPage;

	        //Get current sort order
	        selector.filters["sort"] = $("#selectorOrder").val();


	        //Make the request
	        $.ajax({
	            type: "POST",
	            cache: false,
	            url: selector.queryUrl,
	            data: selector.filters,
	            success: selector.queryCallback
	        });
	    }
		,
	    queryCallback: function (html) {

	        $("#selectorTableDataContainer").empty().append(html);

	        selector.fillColumnIndexes();
	        selector.fixcolumns();

	        //Check for cookie with default column headers
	        var cookie = $.cookie(selector.filters.productGroupType + '_default_headers');
	        if (cookie) {
	            var cols = $.parseJSON(cookie);
	            $(cols).each(function () {
	                $('#' + this.dropDown).val(this.column);
	                //$('#' + this.dropDown).multiselect('refresh');
	            });

	            selector.adaptSourceData();
	            selector.updateLabels();
	        } else {
	            selector.adaptSourceData();
	        }

	        selector.loadingFinished();
	    }
		,
	    fillColumnIndexes: function () {
	        selector.selectorColumnIndexes = new Object();
	        var headings = $("#selectorTableDataContainer table thead tr th");
	        for (var i = 0; i < headings.length; i++) {
	            var h = $(headings[i]).text();
	            if (h == null || h == "") {
	                throw "Column heading on '#selectorTableDataContainer table thead tr th' at index " + i + " cannot be empty.";
	            }
	            selector.selectorColumnIndexes[h.toUpperCase()] = i;
	        }
	    }
		,
	    getColumnsIndex: function () {
	        var columnNames = new Array("nodeid", $("#selectorColumn0").val(), $("#selectorColumn1").val(), $("#selectorColumn2").val(), $("#selectorColumn3").val(), $("#selectorColumn4").val(), $("#selectorColumn5").val());

	        var indexes = new Array();
	        for (var i = 0; i < columnNames.length; i++) {
	            var name = columnNames[i];
	            if (name == null || name == "") {
	                throw "Column name for the selection cannot be empty, check the html element selectorColumn" + (i - 1) + ". and the source table";
	            }
	            var index = selector.selectorColumnIndexes[name.toUpperCase()];
	            if (index == null) {
	                throw "Column '" + name + "' does not exist on source table, check the html element selectorColumn" + (i - 1) + " and the source table.";
	            }
	            else {
	                indexes[i] = index;
	            }
	        }
	        return indexes;
	    }
		,
	    replaceSourceData: function () {
	        //append the security message
	        $("#selectorTableDataContainer table tbody span.closed").empty().append($("#securityReplacement").html());

	        if ($("#replacements").length > 0) {
	            var toReplace = $("#replacements").val().split(",");
	            for (var i = 0; i < toReplace.length; i++) {
	                var r = toReplace[i].split(":");
	                $("#selectorTableDataContainer table tbody td:contains('" + r[0] + "')").html(r[1]);
	            }
	        }
	    }
	    ,
	    adaptSourceData: function () {
	        selector.replaceSourceData();
	        var clonedRows = $("#selectorTableDataContainer table tbody tr").clone();
	        if (clonedRows.length > 0) {
	            var columnIndexes = selector.getColumnsIndex();

	            clonedRows = selector.adaptColumns(columnIndexes, clonedRows);
	            $("#messageNoRows").hide();
	            $("#targetTable tbody").empty().append(clonedRows);

	            //replace the empty values with - sign
	            $("#targetTable tbody td:empty").text("-");

	            selector.checkInList();

	            //pager
	            $("#targetPager").empty();
	            if ($("#selectorTableDataContainer div.pager").length > 0) {
	                $("#targetPager").append($("#selectorTableDataContainer div.pager").clone());

	                //pager totals
	                $("#targetPagerTotal span.first").text($("#selectorTableDataContainer div.pagerTotal span.first").text());
	                $("#targetPagerTotal span.last").text($("#selectorTableDataContainer div.pagerTotal span.last").text());
	                $("#targetPagerTotal span.total").text($("#selectorTableDataContainer div.pagerTotal span.total").text());
	                $("#targetPagerTotal").show();
	            }
	            else {
	                $("#targetPagerTotal").hide();
	            }
	            $("input.compare-button").show();
	        }
	        else {
	            $("#targetTable tbody").empty();
	            $("#targetPager").empty();
	            $("#targetPagerTotal").hide();

	            $("#messageNoRows").show();
	        }
	    }
		,
	    adaptColumns: function (columnIndexes, originalRows) {
	        //the first colunm is the nodeid.

	        var totalColumns = columnIndexes.length;

	        var clonedTds = new Array();
	        for (var i = 0; i < totalColumns; i++) {
	            var selectors = "td:nth-child(" + (columnIndexes[i] + 1) + ")";
	            clonedTds[i] = originalRows.find(selectors);
	        }

	        var rows = $("<tbody></tbody>");

	        for (var i = 0; i < originalRows.length; i++) {
	            var r = $("<tr></tr>");

	            //Add the cell values. For each column...
	            //The first link should include 1 checkbox and a link
	            var nodeId = $(clonedTds[0][i]).text();
	            var firstColumnText = $(clonedTds[1][i]).text();
	            var firstCell = $("<td class=\"name\"><input type=\"checkbox\" name=\"nodeid\" /> <a></a></td>")

	            $("a", firstCell).attr("href", "/invest/map/src/" + nodeId + ".htm").attr("rel", "nofollow").attr("class", "table-links").text(firstColumnText);
	            $("input", firstCell).attr("value", nodeId).click(function () { selector.selectToCompare(this); });
	            r.append(firstCell);


	            //The rest of the columns are plain
	            for (var j = 2; j < totalColumns; j++) {
	                var cell = clonedTds[j][i];
	                r.append($(cell).clone());
	            }

	            rows.append(r);
	        }
	        clonedTds = null;

	        return $("tr", rows);
	    }
	    ,
	    loadFilterValues: function () {
	        selector.filters = selector.loadFilterValuesEx();
	    }
	    ,
	    loadFilterValuesEx: function () {
	        var filters = new Object();

	        $("#selectorFilterForm select").each(
				function () {
				    var obj = $(this);
				    if (obj.val() != null && obj.val() != "") {
				        var filterName = "Selector_" + obj.attr("name");
				        if (obj.val().join == undefined)
				            filters[filterName] = obj.val();
				        else
				            filters[filterName] = obj.val().join("@@");
				    }
				}
			);
	        $("#selectorFilterForm input[type='hidden']").each(
				function () {
				    var obj = $(this);
				    if (obj.val() != "") {
				        filters[obj.attr("name")] = obj.val();
				    }
				}
			);
	        $("#selectorFilterForm label.option :checkbox:checked").each(
				function () {
				    var obj = $(this);
				    if (obj.val() != "") {
				        var filterName = "Selector_" + obj.attr("name");
				        var previousValue = "";
				        if (filters[filterName] != null) {
				            previousValue = filters[filterName] + "@@";
				        }
				        filters[filterName] = previousValue + obj.val();
				    }
				}
			);
	        return filters;
	    }
        ,
	    storeDefaultFilters: function () {

	        // TODO: Não funciona com o URL Rewriter

	        var urlParts = document.location.href.split("/");
	        for (var i = 0; i < urlParts.length; i++) {
	            var part = urlParts[i];
	            if (part.substr(0, 4) == "pre_") {
	                var key = part.substr(4);
	                var value = urlParts[i + 1];
	                if (value.length > 4) {
	                    if (value.substr(value.length - 4) == ".htm") {
	                        value = value.substr(0, value.length - 4);
	                    }
	                }
	                selector.defaultFilters[key] = value;
	            }
	        }
	        var url = $.urlParser.parse(document.location.href);
	        for (var key in url.parameters) {
	            if (key.substr(0, 4) === 'pre_') {
	                selector.defaultFilters[key.replace('pre_', '')] = url.parameters[key];
	            }
	        }
	    }
	    ,
	    clearFilters: function () {
	        $("#selectorFilterForm input[type='checkbox']:checked").attr("checked", false);
	        $("#selectorFilterForm select").multiselect('uncheckAll').each(function () {
	            $(this).val('')[0].selectedIndex = -1;
	        });

	        for (var key in selector.defaultFilters) {
	            var value = selector.defaultFilters[key];
	            $("select[name='" + key + "'] option[value='" + value + "']")
                    .attr("selected", true)
                    .parent()
                    .multiselect('refresh');
	            $("input[type='checkbox'][name='" + key + "'][value='" + value + "']").attr("checked", true);
	        }
	    }
		,
	    loadingStart: function () {
	        selector.isLoading = true;
	        $("#loadingdiv").width($("#targetTable").outerWidth());
	        var totalheight = parseInt($("#targetTable").outerHeight()); // +parseInt($("#targetPager").outerHeight() + $("#messageNoRows:visible").outerHeight());
	        $("#loadingdiv").height(totalheight);
	        $('#loadingdiv').css('display', '');
	        $("input.compare-button").hide();
	    }
		,
	    loadingFinished: function () {
	        $('#loadingdiv').css('display', 'none');

	        $("#targetTable tbody tr:nth-child(even)").addClass('even-row');

	        $("#targetTable tbody").show();
	        $("#targetPager").show();

	        //scroll(0, 0);

	        selector.loadingFinishedEvent();
	    }
	    ,
	    //Sets the default columns and Set the html select elements as jquery combobox
	    setHeadingComboboxes: function (width, listWidth, defaultText) {
	        //Preselect columns
	        if ($("#defaultSelected").length > 0) {
	            var columns = $("#defaultSelected").val().split(/,/);

	            for (var i = 0; i < columns.length; i++) {
	                $("#selectorColumn" + (i + 1)).val(columns[i]);
	            }
	        }

	        $("#selectorColumn1, #selectorColumn2, #selectorColumn3, #selectorColumn4, #selectorColumn5")
                .multiselect({ header: false, minWidth: 115, menuMinWidth: listWidth, multiple: false, alternateSelectedText: defaultText, change: function () {
                    selector.adaptSourceData();
                    selector.updateLabels();

                    var cols = new Array(
                        { dropDown: 'selectorColumn0', column: $("#selectorColumn0").val() },
                        { dropDown: 'selectorColumn1', column: $("#selectorColumn1").val() },
                        { dropDown: 'selectorColumn2', column: $("#selectorColumn2").val() },
                        { dropDown: 'selectorColumn3', column: $("#selectorColumn3").val() },
                        { dropDown: 'selectorColumn4', column: $("#selectorColumn4").val() },
                        { dropDown: 'selectorColumn5', column: $("#selectorColumn5").val() });

                    var c = JSON.stringify(cols);
                    var cookie = $.cookie(selector.filters.productGroupType + '_default_headers', c, { expires: 3650, path: '/invest' });
                    $("#targetTable tbody tr:nth-child(even)").addClass('even-row');
                }
                });
	    }
	    ,
	    order: function (index, orderType) {
	        $('#selectorOrder').val($("#selectorColumn" + index).val() + " " + orderType);
	        selector.query(true);
	    }
	    ,
	    orderEx: function (index, orderType, sortingLink) {
	        var images = $('#sortingCells img');
	        for (var i = 0; i < images.length; i++) {
	            $(images[i]).attr("src", $(images[i]).attr("src").replace("-selected", ""));
	        }
	        $(sortingLink).children("img").attr("src", $(sortingLink).children("img").attr("src").replace(".gif", "-selected.gif"));
	        this.order(index, orderType);
	    }
	    ,
	    updateLabels: function () {
	        for (var i = 1; i <= 5; i++) {
	            $("#selectorColumnLabel" + i).empty().append($("#selectorColumn" + i + " :selected").text());
	        }
	    }
	    ,
	    validateCompare: function (evt) {
	        if (selector.toCompareList.length < 2 || selector.toCompareList.length > 4) {
	            var b = $(this);
	            b.validationEngine('showPrompt', evt.data, '', 'topRight', true);
	            var i = setInterval(function () { clearInterval(i); b.validationEngine('hide'); }, 5000);
	        }
	        else {
	            //set new location to compare page
	            var nodesList = selector.toCompareList.toString();
	            var url = selector.compareUrl;
	            if (url.indexOf("?") >= 0) {
	                url += "&";
	            }
	            else {
	                url += "?";
	            }
	            url += "nodeid=" + nodesList;

	            window.location.href = url;

	        }
	        return false;
	    }
		,
	    selectToCompare: function (sender) {
	        if ($(sender).is(":checked")) {
	            selector.toCompareList.push($(sender).val());
	        }
	        else {
	            var index = $.inArray($(sender).val(), selector.toCompareList);
	            if (index >= 0) {
	                selector.toCompareList.splice(index, 1);
	            }
	        }
	        selector.updateCompareLabel();
	    }
		,
	    checkInList: function () {
	        for (var i = 0; i < selector.toCompareList.length; i++) {
	            $("#targetTable tbody input:checkbox[name='nodeid'][value='" + selector.toCompareList[i] + "']").attr("checked", "checked");
	        }
	    }
		,
	    clearToCompare: function () {
	        selector.toCompareList = new Array();
	        $("#targetTable tbody input[name='nodeid']:checked").attr("checked", false);
	        selector.updateCompareLabel();
	    }
		,
	    updateCompareLabel: function () {
	        var amount = selector.toCompareList.length;
	        $(".itemsSelected .amountSelected").text(amount.toString());
	        if (amount > 0) {
	            $(".itemsSelected a").show();
	        }
	        else {
	            $(".itemsSelected a").hide();
	        }
	    }
        ,
	    loadUserFilters: function () {
	        var cookie = $.cookie($('.selectorFilter [name="productGroupType"]').val() + '_filters');
	        var foundFavorite = false;
	        if (cookie) {
	            var filters = $.parseJSON(cookie);
	            $(filters).each(function (i, n) {
	                selector.userFilters[i] = filters[i];
	                if (filters[i].isFavorite) {
	                    selector.filters = filters[i].filters;
	                    selector.applyUserFilter(selector.filters);
	                    foundFavorite = true;
	                }
	                selector.renderUserFilters($('#manage-filters table tbody'));
	            });
	            /* IF USER HAVE FILTERS IN COOKIES */
	            //	            if (filters != "" && filters != "[]") {
	            //	                $("div.myfilters").show();
	            //	                $("#manage-filters").slideDown('slow', 'easeInBack');
	            //	                $("#toggle-filters").empty().append($('<a class="seticons-up" title="' + selector.closeTooltip + '">' + selector.closeMessage + '</a>'));
	            //	            }
	            /* SHOW USER FILTERS */
	        }
	        return foundFavorite;
	    }
        ,
	    saveUserFilters: function (table, name, isFavorite) {

	        if ($('#selectorFilterForm').validationEngine('validate', { scroll: false })) {
	            if ($('#selectorFilterForm :selected,#selectorFilterForm :checked').length == 0) {
	                alert(selector.noFiltersSelected);
	                return;
	            }
	            for (var f = 0; f < selector.userFilters.length; f++) {
	                if (selector.userFilters[f].isFavorite && $('#favorite').attr('checked')) {
	                    $(isFavorite).validationEngine('showPrompt', selector.duplicateFavorite, '', 'topRight', true);
	                    return;
	                }
	            }
	        }

	        if (name.val() == "" || name.val().length > 50) {
	            $('#manage-filters table tfoot #filtername').validationEngine('showPrompt', selector.userFilterNameWarning, '', 'topRight', true);
	            return;
	        }

	        selector.userFilters[selector.userFilters.length] = {
	            name: name.val(),
	            isFavorite: isFavorite.attr('checked'),
	            filters: selector.loadFilterValuesEx()
	        };
	        $.cookie(selector.filters.productGroupType + '_filters', JSON.stringify(selector.userFilters), { expires: 3650, path: '/invest' });
	        var row = $(document.createElement('tr'));
	        $('<td><input type="hidden" name="userfilterid" id="userfilterid" value="' + (selector.userFilters.length - 1) + '" />' + name.val() + '</td>').appendTo(row);
	        $('<td>' + (isFavorite.attr('checked') ? selector.yes : selector.no) + '</td>').appendTo(row);
	        $('<td><a id="activate-filter" title="' + selector.activateCriteria + '">' + selector.activate + '</a></td>').appendTo(row);
	        $('<td><a id="remove-filter" class="form-reset" title="' + selector.deleteCriteria + '">&nbsp;</a></td>').appendTo(row);
	        row.appendTo(table);
	        $(table).find('#activate-filter').bind('click', selector.activateUserFilter);
	        $(table).find('#remove-filter').bind('click', selector.removeUserFilter);
	        var tooltip = new $.tai_tooltip($('#activate-filter,#remove-filter'));

	        name.val('');
	        isFavorite.removeAttr('checked');
	    }
        ,
	    renderUserFilters: function (table) {
	        $(table).children('tbody tr').each(function () { $(this).remove() });
	        $.each(selector.userFilters, function (i, n) {
	            var row = $(document.createElement('tr'));
	            $('<td><input type="hidden" name="userfilterid" id="userfilterid" value="' + i + '" />' + n.name + '</td>').appendTo(row);
	            $('<td>' + (n.isFavorite ? selector.yes : selector.no) + '</td>').appendTo(row);
	            $('<td><a id="activate-filter" title="' + selector.activateCriteria + '">' + selector.activate + '</a></td>').appendTo(row);
	            $('<td><a id="remove-filter" class="form-reset" title="' + selector.deleteCriteria + '">&nbsp;</a></td>').appendTo(row);
	            row.appendTo(table);
	        });

	        $(table).find('#activate-filter').bind('click', selector.activateUserFilter);
	        $(table).find('#remove-filter').bind('click', selector.removeUserFilter);

	        var tooltip = new $.tai_tooltip($('#activate-filter,#remove-filter'));
	    }
        ,
	    activateUserFilter: function () {
	        var filter = selector.userFilters[$(this).parents('tr').find('#userfilterid').val()];
	        selector.clearFilters();
	        selector.applyUserFilter(filter.filters);
	        selector.query();
	    }
        ,
	    removeUserFilter: function () {
	        selector.userFilters.splice($(this).parents('tr').find('#userfilterid').val(), 1);
	        $.cookie(selector.filters.productGroupType + '_filters', JSON.stringify(selector.userFilters), { expires: 3650, path: '/invest' });

	        $(this).parents('tr').remove();

	        $.cookie(selector.filters.productGroupType + '_filters', JSON.stringify(selector.userFilters), { expires: 3650, path: '/invest' });
	    },
	    applyUserFilter: function (filter) {
	        var userFilters = {};

	        $.each(filter, function (name, value) {
	            if (name.toLowerCase().indexOf('selector_') !== -1) {
	                userFilters[name.replace('Selector_', '')] = value;
	            }
	        });
	        foundFavorite = true;

	        for (var key in userFilters) {
	            var value = userFilters[key];
	            var values = value.split("@@");
	            $("select[name='" + key + "']").val(values).multiselect('refresh');
	            for (var i = 0; i < values.length; ++i) {
	                $("input[type='checkbox'][name='" + key + "'][value='" + values[i] + "']").attr("checked", true);
	            }
	        }
	    }
	}
