$(function() {
    var _filterWrapper = $(".filterWrapper");
    var _allFilters = $(".filterWrapper .allFilters");
    var _allFiltersTrigger = _allFilters.find("select");
    var _keywordFilter = $(".filterWrapper .keywordFilter");
    var _keywordFilterTrigger = _keywordFilter.find(":button");
    var _filterResultsWrapper = $(".filterResultsWrapper");
    var _filterResultsList = $(".filterResultsWrapper .filterResultsList");
    var _filterResultsNoneLabel = $(".filterResultsWrapper .filterResultsNoneLabel");
    var _filterResultsCount = $(".filterResultsCount");
    var _pageNumberSelect = $(".merchantList .pageNumbering select");
    var _hdnFilterCriteria = $("input.filterCriteria:hidden");
    var _filterResultsCountMessage = $(".filterResultsCountMessage");
    var _event = "change";
    var _filterControl = "select";
    var _keywordControl = "button";
    var _objFilterCriteria = {};
    var _hdnResortName = $("[id$=hdnResortName]");
    var _hdnMerchantType = $("[id$=hdnMerchantType]");

    _hdnFilterCriteria.val("");

    if (_allFilters.find("a").length > 0) {
        _allFiltersTrigger = _allFilters.find("ul a");
        _keywordFilterTrigger = _keywordFilter.find("a");
        _event = "click";
        _filterControl = "anchor";
        _keywordControl = "anchor";
    }

    _hdnFilterCriteria.unbind("change").bind("change", function() {
        _objFilterCriteria = getFilterCriteria();
    });

    _filterResultsList.find("a").live("mouseup", removeFilter);

    _pageNumberSelect.unbind("change").bind("change", function() {
        if ($.trim($(this).val()).length > 0) {
            _objFilterCriteria["items"] = $(this).val();
            var strFilterCriteria = setFilterCriteria(_objFilterCriteria);
            getFilteredResults(merchantListPageGuid, strFilterCriteria);
        }
    });

    _allFiltersTrigger
        .unbind(_event).bind(_event, UpdateMerchantList);
    _keywordFilterTrigger
        .unbind("click").bind("click", UpdateMerchantList);

    var doAjax = "false";
    if (_filterControl == "anchor") {
        _allFiltersTrigger
                .filter(".selectFilterResult")
                .removeClass("selectFilterResult")
                .trigger(_event);
    } else {
        _allFiltersTrigger.each(function() {
            if (this.selectedIndex > 0) {
                $(this).trigger(_event);
            }
        });
    }

    updateResultCount();

    if (
            !(
                $.trim(_keywordFilter.find(':text').val()) == "" ||
                $.trim(_keywordFilter.find(':text').val()).toLowerCase() == "keyword"
            )
        ) {
        _keywordFilterTrigger.trigger("click");
    }
    doAjax = "true";

    _keywordFilter.find(':text').unbind("focus").bind("focus", function() {
        if ($(this).val().toLowerCase() == "keyword") {
            $(this).val("");
        }
    });
    _keywordFilter.find(':text').unbind("blur").bind("blur", function() {
        if ($.trim($(this).val()).length == 0) {
            $(this).val("Keyword");
        }
    });

    function UpdateMerchantList(e) {
        var invalidChoice = false;
        if (_filterControl == "anchor") {
            e.preventDefault();
            invalidChoice = $(this).hasClass("selectFilterResult");
        } else if (_filterControl == "select") {
            if (typeof this.selectedIndex != "undefined" && this.selectedIndex == 0) {
                invalidChoice = true;

                var keyExists = -1;
                var key = $(this).find("option").eq(1).val().split(":")[0];
                _filterResultsList.find("li.filterItem a").each(function(idx) {
                    var keyValue = $(this).data("keyValue");

                    if (keyValue[0] == key) {
                        keyExists = idx;
                        return false;
                    }
                });

                _filterResultsList.find("li.filterItem a").eq(keyExists).trigger("mouseup");
            }
        }

        if (!invalidChoice) {
            _filterResultsNoneLabel.html("");
            // Find out the filter type and filter options
            var keyValue = getKeyValue(this);
            var key = keyValue[0];
            var val = keyValue[1];
            var keyText = keyValue[2];
            var valText = keyValue[3];
            
            // Make the link blue
            if ($(this).closest(".keywordFilter").length > 0) {
                if (
					        $.trim($(this).closest(".keywordFilter").find(":text").val()) == "" ||
					        $.trim($(this).closest(".keywordFilter").find(":text").val()) == "Keyword"
				        ) {
                    alert("Please enter a keyword.");
                    return false;
                }
            } else if (_filterControl == "anchor") {
                $(this).parent().siblings().find("a").removeClass("selectFilterResult");
                $(this).addClass("selectFilterResult");
            }

            // Update the hidden text box
            _objFilterCriteria[key] = val;
            var strFilterCriteria = setFilterCriteria(_objFilterCriteria);

            // Update the criteria list
            var keyExists = -1;
            _filterResultsList.find("li.filterItem a").each(function(idx) {
                var keyValue = $(this).data("keyValue");

                if (keyValue[0] == key) {
                    keyExists = idx;
                    return false;
                }
            });

            if (keyExists > -1) {
                var item = _filterResultsList.find("li.filterItem:eq(" + keyExists + ")");
                item.html('<label>' + keyText + ":</label> <span>" + valText + "</span> ");
                $("<a href=\"javascript:void(0);\">(remove)</a>")
						    .data("objLink", $(this))
						    .data("keyValue", keyValue)
						    .appendTo(item);
            } else {
                var item = $("<li class='filterItem'><label>" + keyText + ":</label> <span>" + valText + "</span>   </li>").appendTo(_filterResultsList);
                $("<a href=\"javascript:void(0);\">(remove)</a>")
						    .data("objLink", $(this))
						    .data("keyValue", keyValue)
						    .appendTo(item);
            }
            if (doAjax == "true") {
                // Make the Ajax Call
                setTimeout(function() {
                    getFilteredResults(merchantListPageGuid, strFilterCriteria);
                }, 1000);
            }
        }
        return false;

    }

    function removeFilter(e) {
        e.preventDefault();
        var obj = $(this).data("objLink");
        // Find out the filter type and filter options
        var keyValue = $(this).data("keyValue");
        var key = keyValue[0];
        var val = keyValue[1];
        var keyText = keyValue[2];
        var valText = keyValue[3];
        
        if (obj.closest(".keywordFilter").length > 0) {
            obj.closest(".keywordFilter").find(":text").val("");
        } else if (_filterControl == "anchor") {
            obj.removeClass("selectFilterResult");
        } else {
            obj[0].selectedIndex = 0;
        }

        // Update the hidden text box
        delete _objFilterCriteria[key];
        var strFilterCriteria = setFilterCriteria(_objFilterCriteria);

        // Update the criteria list
        $(this).closest("li").remove();

        // Restore None Text
        if (_filterResultsList.find("li.filterItem").length == 0) {
            _filterResultsNoneLabel.html("None");
        }
               // Make the Ajax Call
        getFilteredResults(merchantListPageGuid, strFilterCriteria);

        return false;
    }

    function getFilteredResults(PageGuid, strFilterCriteria) {
        /*
        switch (arguments.length){
        case 0:
        strFilterCriteria = "";
        break;
        case 1:
        // Only Filter crieria is passed
        strFilterCriteria = PageGuid;
        break;
        case 2:
        //Both guid and filter criteria is passed
        merchantListPageGuid = PageGuid;
        break;
        case
        }
        */
        // Remove single quotes from the filter string
        
        strFilterCriteria = strFilterCriteria.replace(/\'/g, "");

        $(".merchantListWrapper").showLoading();
        var serviceURL = "/vailresorts/sites/Global/WebServices/MerchantListWebService.svc/UpdateMerchantList"
        $.ajax({
            type: "POST",
            url: serviceURL,
            data: "{\"merchantListPageGuid\" : \"" + merchantListPageGuid + "\",\"strFilterCriteria\" : \"" + strFilterCriteria + " \"}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
			_mapInited = false;
                $("<div id='temp' class='hideDiv'></div>")
				    .appendTo("body")
				    .html(msg.d);


                if ($("#temp div[id^='fragment']").length > 0) {
                    $("#temp div[id^='fragment']").each(function(idx) {
                        $(".exploreContainer div[id$=pnlListView] [id^=" + $(this).attr("id") + "]").html($(this).html());
                    });
                } else {
                    // I think we do not need this else section. There should always be fragments. Review and remove.
                    $("div[id$=pnlListView] .merchantList").html($("#temp").html());
                }
             
                /*  Artifact - 970018, 974265 - fix
                $('.exploreContainer #fragment-1 table').html( $('#temp table').html() );
                */

                $("#temp").remove();

                _pageNumberSelect = $(".merchantList .pageNumbering select");
                _pageNumberSelect.unbind("change").bind("change", function() {
                    if ($.trim($(this).val()).length > 0) {
                        _objFilterCriteria["items"] = $(this).val();
                        var strFilterCriteria = setFilterCriteria(_objFilterCriteria);

                        getFilteredResults(merchantListPageGuid, strFilterCriteria);
                    }
                });
               
                $(".mainTabs .tabs-selected").trigger("click");

                //applyShader( $("div[id$=pnlListView] div[id^=fragment]") );

                $(".merchantList .middleTabs li.tabs-selected a").trigger("click");

                $(".merchantListWrapper").hideLoading();

                updateResultCount();
                saveToTripDialog();

            },
            error: function(xhr, status, error) {
                handleGlobalMerchantListError(xhr, status, error);
            }
            
        }); // Ajax call
        
    }

    function handleGlobalMerchantListError(xhr, status, error) {
        var errMsg = getErrorMessage(xhr, status, error);
        $("[id$='_pnlListView']").html('<div class="largeGboxContainer"><span class="errorMessage">' + errMsg + '</span></div>');
    }

    function updateResultCount() {
        if (!MerchantListResultCount) {
            return;
        }
        if (_hdnResortName.val() == "Keystone") {

            if (MerchantListResultCount > 0) {
                //_filterResultsCount.text(MerchantListResultCount);
                if (MerchantListResultCount > 1) {
                    $(".searchResultCount").html(MerchantListResultCount + " " + _hdnMerchantType.val() + " Matches");
                }
                else {
                    $(".searchResultCount").html(MerchantListResultCount + " " + _hdnMerchantType.val() + " Match");
                }
            }
            else {
                $(".searchResultCount").html("No " + _hdnMerchantType.val() + " Matches");
                _filterResultsCount.text("0");
            }
        }
        else {

            if (MerchantListResultCount > 0) {
                _filterResultsCount.text(MerchantListResultCount);
            }
            else {
                _filterResultsCount.text("No ");
            }

            if (_hdnResortName.val() == "Breckenridge") {
                if (MerchantListResultCount > 1) {
                    $(".filterResultsCountMessage").html(" " + _hdnMerchantType.val() + " Matches");
                }
                else {
                    $(".filterResultsCountMessage").html(" " + _hdnMerchantType.val() + " Match");
                }
            }
            else {
                if (MerchantListResultCount > 1) {
                    $(".filterResultsCountMessage").html(" (Products)");
                }
                else {
                    $(".filterResultsCountMessage").html(" (Product)");
                }
            }
            $(".filterResultsCountMessage").css("display", "inline");
        }

    }

    function getKeyValue(obj) {
        if ($(obj).closest(".keywordFilter").length > 0) {
            var key = "fkeyword";
            var val = $(obj).closest(".keywordFilter").find(":text").val();
            var keyText = "Keyword";
            var valText = $(obj).closest(".keywordFilter").find(":text").val();
        } else {
            if (_filterControl == "select") {
                var key = $.trim($(obj).val().split(":")[0]);
                var val = $.trim($(obj).val().split(":")[1]);

                var keyText = $(obj).closest("li").find("label").html();
                if (keyText.indexOf(":") > 0) {
                    keyText = $.trim(keyText.split(":")[0]);
                }
                var valText = $.trim($(obj).find("option").eq($(obj)[0].selectedIndex).text());
            } else {
                var key = $(obj).closest("ul").siblings("a").attr("href").split("#")[1];
                var val = $(obj).attr("href").split("#")[1];
                var keyText = $.trim($(obj).closest("ul").siblings("a").html());
                var valText = $.trim($(obj).html());
            }
        }

		val = val.replace(/(<([^>]+)>)/ig,""); 
		valText = valText.replace(/(<([^>]+)>)/ig,""); 
	
        return [key, val, keyText, valText];
    }

    function getFilterCriteria(sel) {
        /*
        if(!sel){ sel = "#filterResults input.filterCriteria"; }
        return eval( "({" + $(sel).val() + "})" );
        */

        return eval("({" + _hdnFilterCriteria.val() + "})");
    }

    function setFilterCriteria(obj, sel) {
        //if(!sel){ sel = "#filterResults input.filterCriteria"; }

        var strFilterCriteria = [];
        $.each(obj, function(key, val) {
          val = val.replace(/\:/g, "");
          strFilterCriteria.push("'" + key + "':'" + escape(val) + "'");
        });
        strFilterCriteria = strFilterCriteria.join(",");

        //$(sel).val( strFilterCriteria );
        _hdnFilterCriteria.val(strFilterCriteria);

        return strFilterCriteria;
    }
});
