﻿var LinkButtonMenuItem;
if (typeof(LinkButtonMenuItem) == "undefined") {
    LinkButtonMenuItem = function(settings){
        this.initLinkButtonMenuItem(settings);
    };
};
LinkButtonMenuItem.prototype.initLinkButtonMenuItem = function(settings){
    this.settings = $.extend({
        linkId: null,
        queryFilterMenuActiveClass: null
    }, settings || {});
    this.isEnabled = true;
    this.bufferedHref = $("#" + this.settings.linkId).attr("href").toString();
};
/* ****************** Static Members ****************** */
/* ****************** Static Members ****************** */


/* ****************** Instance Members **************** */
LinkButtonMenuItem.prototype.activateMenuItem = function(query){
    var css = this.settings.queryFilterMenuActiveClass;
    var link = $("#" + this.settings.linkId);
    link.removeClass(css);
    var href = this.bufferedHref;
    var keys = FlashInteractor.getQueryKeys(href);
    var isMatch = true;
    if (keys != null) {
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            var hrefValue = FlashInteractor.getParamFromQuery(href, key);
            var queryValue = FlashInteractor.getParamFromQuery(query, key);
            if (hrefValue != queryValue) {
                isMatch = false;
                break;
            }
        }
    }
    else {
        isMatch = false;
    }
    if (isMatch == true) {
        link.addClass(css);
    }
};
LinkButtonMenuItem.prototype.setEnabled = function(){
    if (this.isEnabled == false) {
        this.isEnabled = true;
        $("#" + this.settings.linkId).attr("href", this.bufferedHref);
    }
};
LinkButtonMenuItem.prototype.setDisabled = function(){
    if (this.isEnabled == true) {
        this.isEnabled = false;
        var link = $("#" + this.settings.linkId);
        this.bufferedHref = link.attr("href").toString();
        link.attr("href", "javascript:void(0);");
    }
};
/* ****************** Instance Members **************** */


var LinkButtonBrowseAllMenuItem;
if (typeof(LinkButtonBrowseAllMenuItem) == "undefined") {
    LinkButtonBrowseAllMenuItem = function(settings){
        this.initLinkButtonMenuItem(settings);
    };
};
LinkButtonBrowseAllMenuItem.prototype.initLinkButtonMenuItem = function(settings){
    this.settings = $.extend({
        linkId: null,
        queryFilterMenuActiveClass: null
    }, settings || {});
    this.isEnabled = true;
    this.bufferedHref = $("#" + this.settings.linkId).attr("href").toString();
};
/* ****************** Static Members ****************** */
/* ****************** Static Members ****************** */


/* ****************** Instance Members **************** */
LinkButtonBrowseAllMenuItem.prototype.activateMenuItem = function(query){
    var css = this.settings.queryFilterMenuActiveClass;
    var link = $("#" + this.settings.linkId);
    link.removeClass(css);
    var queryValue = FlashInteractor.getParamFromQuery(query, "SearchIn");
    var isMatch = queryValue == "" || queryValue == "AllArtWorks";
    if (isMatch == true) {
        link.addClass(css);
    }
};
LinkButtonBrowseAllMenuItem.prototype.setEnabled = function(){
    if (this.isEnabled == false) {
        this.isEnabled = true;
        $("#" + this.settings.linkId).attr("href", this.bufferedHref);
    }
};
LinkButtonBrowseAllMenuItem.prototype.setDisabled = function(){
    if (this.isEnabled == true) {
        this.isEnabled = false;
        var link = $("#" + this.settings.linkId);
        this.bufferedHref = link.attr("href").toString();
        link.attr("href", "javascript:void(0);");
    }
};
/* ****************** Instance Members **************** */

var LinkButtonLotsSoldMenuItem;
if (typeof(LinkButtonLotsSoldMenuItem) == "undefined") {
    LinkButtonLotsSoldMenuItem = function(settings){
        this.initLinkButtonMenuItem(settings);
    };
};
LinkButtonLotsSoldMenuItem.prototype.initLinkButtonMenuItem = function(settings){
    this.settings = $.extend({
        linkId: null,
        queryFilterMenuActiveClass: null
    }, settings || {});
    this.isEnabled = true;
    this.bufferedHref = $("#" + this.settings.linkId).attr("href").toString();
};
/* ****************** Static Members ****************** */
/* ****************** Static Members ****************** */


/* ****************** Instance Members **************** */
LinkButtonLotsSoldMenuItem.prototype.activateMenuItem = function(query){
    var css = this.settings.queryFilterMenuActiveClass;
    var link = $("#" + this.settings.linkId);
    link.removeClass(css);
    var href = this.bufferedHref;
    var keys = FlashInteractor.getQueryKeys(href);
    var isMatch = true;
    if (keys != null) {
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            if (key != "sortby") {
                var hrefValue = FlashInteractor.getParamFromQuery(href, key);
                var queryValue = FlashInteractor.getParamFromQuery(query, key);
                if (hrefValue != queryValue) {
                    isMatch = false;
                    break;
                }
            }
        }
    }
    else {
        isMatch = false;
    }
    if (isMatch == true) {
        link.addClass(css);
    }
};
LinkButtonLotsSoldMenuItem.prototype.setEnabled = function(){
    if (this.isEnabled == false) {
        this.isEnabled = true;
        $("#" + this.settings.linkId).attr("href", this.bufferedHref);
    }
};
LinkButtonLotsSoldMenuItem.prototype.setDisabled = function(){
    if (this.isEnabled == true) {
        this.isEnabled = false;
        var link = $("#" + this.settings.linkId);
        this.bufferedHref = link.attr("href").toString();
        link.attr("href", "javascript:void(0);");
    }
};
/* ****************** Instance Members **************** */


var LinkButtonMenuManager;
if (typeof(LinkButtonMenuManager) == "undefined") {
    LinkButtonMenuManager = function(settings){
        this.initLinkButtonMenuManager(settings);
    };
};

LinkButtonMenuManager.prototype.initLinkButtonMenuManager = function(settings){
    this.settings = $.extend({
        menuItems: null
    }, settings || {});
    this.isEnabled = true;
};
/* ****************** Static Members ****************** */
/* ****************** Static Members ****************** */


/* ****************** Instance Members **************** */
LinkButtonMenuManager.prototype.activateMenuItem = function(query){
    if (this.settings.menuItems != null) {
        for (var i = 0; i < this.settings.menuItems.length; i++) {
            this.settings.menuItems[i].activateMenuItem(query);
        }
    }
};
LinkButtonMenuManager.prototype.setEnabled = function () {
	if (this.isEnabled == false) {
		this.isEnabled = true;
	}

	$(".subMenu").each(function () {
		$(this).find("a").each(function () {
			var href = $(this).attr('prevref');
			$(this).attr('href', href.replace('?', '#'));

		});
	});
};
LinkButtonMenuManager.prototype.setDisabled = function () {
	if (this.isEnabled == true) {
		this.isEnabled = false;
	}

	$(".subMenu").each(function () {
		$(this).find("a").each(function () {
			if ($(this).attr('prevref') == undefined) {
				var href = $(this).attr('href');
				$(this).attr('prevref', href);
				$(this).attr('href', href.replace('#', '?'));
			}

		});
	});


};
/* ****************** Instance Members **************** */






var DropDownListManager;
if (typeof(DropDownListManager) == "undefined") {
    DropDownListManager = function(settings){
        this.initDropDownListManager(settings);
    };
};

DropDownListManager.prototype.initDropDownListManager = function(settings){
    this.settings = $.extend({
        dropDownId: null,
        views: null
    }, settings || {});
    this.isEnabled = true;
    this.activeView = null;
    var me = this;
    $("#" + this.settings.dropDownId).change(function(){
        var selectedValue = me.getSelectedValue();
        $(me).trigger("changed", selectedValue);
    });
    
};
/* ****************** Static Members ****************** */
/* ****************** Static Members ****************** */


/* ****************** Instance Members **************** */
DropDownListManager.prototype.activateField = function(getActiveView, activeValue){
    if (this.activeView != getActiveView()) {
        var html = "";
        var viewItem = null;
        for (var i = 0; i < this.settings.views.length; i++) {
            if (this.settings.views[i].view == getActiveView()) {
                viewItem = this.settings.views[i];
                this.activeView = viewItem.view;
                break;
            }
        }
        if (viewItem != null) {
            for (var i = 0; i < viewItem.options.length; i++) {
                html += "<option value='" + viewItem.options[i].value + "'>" + viewItem.options[i].name + "</option>";
            }
        }
        $("#" + this.settings.dropDownId).html(html);
    }
    
    $("#" + this.settings.dropDownId + " option").removeAttr("selected");
    $("#" + this.settings.dropDownId + " option[value='" + activeValue + "']").attr("selected", "yes");
};
DropDownListManager.prototype.getSelectedValue = function(){
    return $("#" + this.settings.dropDownId).find("option:selected:first").val();
};
DropDownListManager.prototype.setEnabled = function () {
    if (this.isEnabled == false) {
        this.isEnabled = true;
        $("#" + this.settings.dropDownId).attr("disabled", false);
    }
};
DropDownListManager.prototype.setDisabled = function(){
    if (this.isEnabled == true) {
        this.isEnabled = false;
        $("#" + this.settings.dropDownId).attr("disabled", true);
    }
};
/* ****************** Instance Members **************** */



var FlashInteractor;
if (typeof(FlashInteractor) == "undefined") {
    FlashInteractor = function(settings){
        this.initFlashInteractor(settings);
    };
};

FlashInteractor.prototype.initFlashInteractor = function (settings) {
    this.settings = $.extend({
        isUserLoggedIn: false,
        alternateViewSettings: {
            width: 120,
            height: 130,
            count: 501
        },
        regularViewSettings: {
            width: 270,
            height: 270,
            count: 501
        },
        viewType: FlashInteractor.viewMode.alternate,
        sortField: FlashInteractor.sortFields.soonest,
        page: 1,
        pages: 1,
        isEnabled: true,
        search: "",
        flashViewerId: null,
        pageLabelIds: null,
        pagesLabelIds: null,
        nextButtonIds: null,
        prevButtonIds: null,
        sortDdl: null,
        alternativeModeBtnIds: null,
        regularModeBtnIds: null,
        queryFilterDdlIds: null,
        queryFilterDdlContainerIds: null,
        topMenuManager: null,
        performSearch: null,
        lotDetailsPath: null,
        activeButtonCss: "viewModeActive",
        searchResultsLabels: null,
        hiddenContainerId: null,
        sponsoredLogoDescriptors: []
    }, settings || {});
    this.flashViewer = document.getElementById(this.settings.flashViewerId);
    this.settings.page = this.flashViewer.getPage();
    this.settings.sortField = this.flashViewer.getSort();
    this.settings.viewType = this.flashViewer.getViewType();
    this.cachingService = new FlashInteractor.cacheableSearchService();
    // attach event handlers
    var me = this;
    if (this.settings.pageLabelIds != null) {
        jQuery.each(this.settings.pageLabelIds, function () {
            $("#" + this).keypress(function (e) {
                if (me.settings.isEnabled == true && e.which == 13) {
                    me.flashViewer.setScrollPosition(0);
                    me.settings.page = $(this).val();
                    me.searchLots();
                }
            });
        });
    }
    if (this.settings.nextButtonIds != null) {
        jQuery.each(this.settings.nextButtonIds, function () {
            $("#" + this).click(function () {
                if (me.settings.isEnabled == true && me.settings.page < me.settings.pages) {
                    me.settings.page++;
                    me.searchLots();
                }
            });
        });
    }
    if (this.settings.prevButtonIds != null) {
        jQuery.each(this.settings.prevButtonIds, function () {
            $("#" + this).click(function () {
                if (me.settings.isEnabled == true && me.settings.page > 1) {
                    me.settings.page--;
                    me.searchLots();
                }
            });
        });
    }
    if (this.settings.sortDdl != null) {
        $(this.settings.sortDdl).bind("changed", function (event, selectedValue) {
            if (me.settings.isEnabled == true) {
                me.changeSorting(selectedValue);
            }
        });
        ;
    }
    jQuery.each(this.settings.alternativeModeBtnIds, function () {
        $("#" + this).click(function () {
            if (me.settings.isEnabled == true) {
                me.switchToAlternateView();
            }
        });
    });
    jQuery.each(this.settings.regularModeBtnIds, function () {
        $("#" + this).click(function () {
            if (me.settings.isEnabled == true) {
                me.switchToRegularView();
            }
        });
    });
    jQuery.each(this.settings.queryFilterDdlIds, function () {
        var ddl = $("#" + this);
        ddl.change(function () {
            if (me.settings.isEnabled == true) {
                var searchQuery = $(this).find("option:selected:first").val();
                $.history("add", searchQuery);
            }
        });
    });
    FlashInteractor.instance = this;
    FlashInteractor.notifyReady();
    // restore state
    // restore query filter
    this.displayQueryFilterDdlContainer();
    this.activateQueryFilterField();
    this.activateQueryFilterMenuItem();

    // restore sortby
    this.activateSortField();
    // restore active button
    this.highlightActiveButton();
    this.activateSponsoredLogos();
    this.data = null;
    this.settings.search = this.correctSort(this.settings.search);    
    this.partialLoader = new FlashInteractor.partialLoader({
        interactor: this
    });

    this.scrollVisible = false;
    this.flashViewer.setUserLoggedIn(this.settings.isUserLoggedIn);
    this.searchLots(); // perform search
};

/* ****************** Static Members ****************** */
FlashInteractor.viewMode = {
    alternate: "brief",
    regular: "full"
};
FlashInteractor.sortFields = {
    /*relevance: "relevance",*/
    newly: "newly",
    soonest: "soonest",
    lowest: "lowest",
    highest: "highest"
};
FlashInteractor.filterMode = {
    browse: "browse",
    search: "search",
    fts: "fts"
};
FlashInteractor.instance = null;
FlashInteractor.readyHandlers = [];
FlashInteractor.ready = function(fn){
    FlashInteractor.readyHandlers.push(fn);
    if (FlashInteractor.instance != null) {
        // execute right now
        if (typeof(fn) != "undefined") {
            fn(FlashInteractor.instance);
        }
    }
};
FlashInteractor.notifyReady = function(){
    for (var i = 0; i < FlashInteractor.readyHandlers.length; i++) {
        var h = FlashInteractor.readyHandlers[i];
        if (h != null && typeof(h) != "undefined") {
            h(FlashInteractor.instance);
        }
    }
};
FlashInteractor.commonQueryKeys = ["scroll", "sortby", "page", "view"];
FlashInteractor.clientSideKeys = ["scroll"];
/* ****************** Static Members ****************** */

/* ****************** Nested Members ****************** */
FlashInteractor.cacheableSearchService = function(settings){
    this.initCacheableSearchService(settings);
};
FlashInteractor.cacheableSearchService.prototype.initCacheableSearchService = function(settings){
    this.settings = $.extend({
        cacheSize: 5,
        cacheDuration: 300000
    }, settings || {});
    this.cacheData = new Array();
};
FlashInteractor.cacheableSearchService.prototype.read = function(query){
    this.cleanUp();
    var data = null;
    for (var i = 0; i < this.cacheData.length; i++) {
        var keyValuePair = this.cacheData[i];
        if (keyValuePair.key == query || FlashInteractor.areValuesMatch(keyValuePair.key, query, FlashInteractor.clientSideKeys)) {
            data = keyValuePair.value;
            break;
        }
    }
    return data;
};
FlashInteractor.cacheableSearchService.prototype.remove = function(query){
    var index = -1;
    for (var i = 0; i < this.cacheData.length; i++) {
        if (this.cacheData[i].key == query || FlashInteractor.areValuesMatch(this.cacheData[i].key, query, FlashInteractor.clientSideKeys)) {
            index = i;
            break;
        }
    }
    if (index >= 0) {
        var newArray = new Array();
        for (var i = 0; i < this.cacheData.length; i++) {
            if (i != index) {
                newArray.push(this.cacheData[i]);
            }
        }
        this.cacheData = newArray;
    }
};
FlashInteractor.cacheableSearchService.prototype.cleanUp = function(){
    var now = new Date().valueOf();
    var keysToRemove = new Array();
    for (var i = 0; i < this.cacheData.length; i++) {
        var item = this.cacheData[i];
        if (now - item.timeStamp >= this.settings.cacheDuration) {
            keysToRemove.push(item.key);
        }
    }
    for (var i = 0; i < keysToRemove.length; i++) {
        this.remove(keysToRemove[i]);
    }
};
FlashInteractor.cacheableSearchService.prototype.write = function(query, data){
    this.cleanUp();
    if (this.read(query) != null) {
        this.remove(query);
    }
    while (this.cacheData.length >= this.settings.cacheSize) {
        this.cacheData.shift();
    }
    this.cacheData.push({
        key: query,
        value: data,
        timeStamp: (new Date()).valueOf()
    });
    
};

FlashInteractor.partialLoader = function(settings){
    this.initPartialLoader(settings);
};
FlashInteractor.partialLoader.prototype.initPartialLoader = function(settings){
    this.settings = $.extend({
        totalSize: 500,
        maxSize: 100,
        interactor: null
    }, settings || {});
    this.isInProgress = false;
    this.data = null;
    this.lastPageSize = this.settings.maxSize;
    var approximateIterations = parseInt(this.settings.totalSize / this.settings.maxSize);
    var deviation = this.settings.totalSize - approximateIterations * this.settings.maxSize;
    if (deviation > 0) {
        approximateIterations++;
    }
    if (approximateIterations > 1) {
        approximateIterations = 2;
    }
    this.totalIterations = approximateIterations;
    this.currentIteration = 0;
    this.isFinished = false;
};
/***
 * Entry point of partialLoader. Start loading here.
 */
FlashInteractor.partialLoader.prototype.load = function(){
    if (this.isInProgress) {
        return;
    }
    this.isInProgress = true;
    this.isFinished = false;
    this.loadPart();
};
FlashInteractor.partialLoader.prototype.loadPart = function(){
    if (this.currentIteration < this.totalIterations) {
        this.currentIteration++;
        var me = this;
        var size = this.currentIteration == 1 ? this.settings.maxSize : this.settings.totalSize;
        var actualPage = this.settings.interactor.settings.page;
        if (actualPage > 1) {
            size = this.settings.totalSize;
        }
        this.settings.interactor.searchLotsDelegate(actualPage, size, function(d){
            me.data = d;
            me.settings.interactor.updateData(me.data);
            if (d.Items.length < me.settings.maxSize) {
                me.currentIteration = me.totalIterations;
                me.finishLoading();
            }
            else {
                me.loadPart();
            }
        });
    }
    else {
        this.finishLoading();
    }
};
FlashInteractor.partialLoader.prototype.finishLoading = function(){
    if (!this.isFinished) {
        this.isFinished = true;
        this.settings.interactor.cachingService.write(this.settings.interactor.settings.search, this.data);
        //this.settings.interactor.data = null;
        this.loadingFinished();
    }
};
FlashInteractor.partialLoader.prototype.loadingFinished = function(){
    this.settings.interactor.flashViewer.lotsDataLoaded();
    this.settings.interactor.setEnabled();
    this.isInProgress = false;
    this.data = null;
    this.currentIteration = 0;
};
/* ****************** Nested Members ****************** */

/* ****************** Private Static Members ********** */
FlashInteractor.setValue = function(labelIds, value){
    if (labelIds == null) {
        return;
    }
    for (var i = 0; i < labelIds.length; i++) {
        $("#" + labelIds[i]).val(value);
    }
};
FlashInteractor.setHtml = function(labelIds, value){
    if (labelIds == null) {
        return;
    }
    for (var i = 0; i < labelIds.length; i++) {
        $("#" + labelIds[i]).html(value);
    }
};
FlashInteractor.setDisabled = function(ids, isDisabled){
    if (ids == null || ids == "" || typeof(ids) == "undefined" || typeof(ids.length) == "undefined") {
        return;
    }
    for (var i = 0; i < ids.length; i++) {
        $("#" + ids[i]).attr("disabled", isDisabled);
    }
};
FlashInteractor.getParamFromQuery = function(q, name){
    var hash = q;
    if (hash != null && hash != "" && typeof(hash) != "undefined") {
        var h = hash;
        if (h.indexOf("#") == 0 || h.indexOf("?") == 0 || h.indexOf("&") == 0) {
            h = h.substr(1, h.length - 1);
        }
        h = h.replace("#", "&");
        var paramName = name + "=";
        var start = h.indexOf(paramName, 0);
        if (start >= 0) {
            var start = start + paramName.length;
            var len = h.length - start;
            h = h.substr(start, len);
            start = h.indexOf("&", 0);
            if (start >= 0) {
                h = h.substr(0, start);
            }
            return h;
        }
        else {
            return "";
        }
    }
    return "";
};
FlashInteractor.getQueryParam = function(name){
    return FlashInteractor.getParamFromQuery(window.location.hash, name);
};
FlashInteractor.buildQueryString = function(keyValuePairs){
    var query = "";
    for (var i = 0; i < keyValuePairs.length; i++) {
        var pair = keyValuePairs[i];
        query += pair.key + "=" + pair.value;
        if (i < keyValuePairs.length - 1) {
            query += "&";
        }
    }
    return query;
};

FlashInteractor.setQueryParam = function (query, param, val) {
    var keys = FlashInteractor.getQueryKeys(query);
    var keyValuePairs = new Array();
    for (var i = 0; i < keys.length; i++) {
        if (keys[i] != param) {
            var qVal = FlashInteractor.getParamFromQuery(query, keys[i]);
            keyValuePairs.push({
                key: keys[i],
                value: qVal
            });
        }
    }
    
    if (param == "sortby") {
        if (val == "relevance") {
            keyValuePairs.push({
                key: "relevance",
                value: "true"
            });
            keyValuePairs.push({
                key: "sortby",
                value: "soonest"
            })
        }
        else {
            var relevanceIndex = -1;
            for (var i = 0; i < keyValuePairs.length; i++) {
                if (keyValuePairs[i].key == "relevance") {
                    relevanceIndex = i;
                    break;
                }
            }
            if (relevanceIndex != -1) {
                keyValuePairs.splice(i, 1);
            }
            keyValuePairs.push({
                key: param,
                value: val
            });
        }
    }
    else {
        keyValuePairs.push({
            key: param,
            value: val
        });
    }

    return FlashInteractor.buildQueryString(keyValuePairs);
};

FlashInteractor.getQueryKeys = function(query){
    if (query != null && query != "" && typeof(query) != "undefined") {
        var i1 = query.indexOf("#", 0);
        var i2 = query.indexOf("?", 0);
        var i3 = query.indexOf("&", 0);
        var max = Math.max(Math.max(i1, i2), i3);
        var index = Math.min(Math.min(i1 < 0 ? max : i1, i2 < 0 ? max : i2), i3 < 0 ? max : i3);
        if (index >= 0 && !(i3 > 0 && index == i3)) {
            query = query.substr(index + 1, query.length - (index + 1));
        }
        query = query.replace("#", "&");
        var parts = query.split("&");
        var keys = new Array();
        for (var i = 0; i < parts.length; i++) {
            var endIndex = parts[i].indexOf("=");
            var entry = parts[i].substr(0, endIndex);
            if (entry != "") {
                keys.push(entry);
            }
        }
        return keys;
    }
    return new Array();
};
FlashInteractor.isInRange = function(items, item){
    var res = false;
    for (var i = 0; i < items.length; i++) {
        if (items[i] == item) {
            res = true;
            break;
        }
    }
    return res;
};
FlashInteractor.excludeArray = function(items, itemsToExclude){
    var result = new Array();
    for (var i = 0; i < items.length; i++) {
        if (!FlashInteractor.isInRange(itemsToExclude, items[i]) && !FlashInteractor.isInRange(result, items[i])) {
            result.push(items[i]);
        }
    }
    return result;
};
FlashInteractor.excludeLots = function(firstPart, fullPart){
    if (fullPart == null) {
        return firstPart;
    }
    if (firstPart == null) {
        return fullPart;
    }
    firstPart.PageNumber = fullPart.PageNumber;
    firstPart.PageSize = fullPart.PageSize;
    firstPart.OrderField = fullPart.OrderField;
    firstPart.IsDesc = fullPart.IsDesc;
    firstPart.TotalPages = fullPart.TotalPages;
    firstPart.TotalLines = fullPart.TotalLines;
    var items = new Array();
    for (var i = firstPart.Items.length; i < fullPart.Items.length; i++) {
        items.push(fullPart.Items[i]);
    }
    firstPart.Items = items;
    return firstPart;
};
FlashInteractor.prototype.concatenateLotData = function(newData, oldData){
    var result = newData;
    result.TotalPages = result.PageNumber;
    result.PageNumber = 1;
    result.PageSize += oldData.PageSize;
    var items = new Array();
    for (var i = 0; i < oldData.Items.length; i++) {
        items.push(oldData.Items[i]);
    }
    for (var i = 0; i < newData.Items.length; i++) {
        items.push(newData.Items[i]);
    }
    result.Items = items;
    return result;
};

/**
 * The methods detects all keys from both queries and comparing the values of keys.
 * In case all values are match it returns true. In other case - returning false;
 * The parameter keysToExclude is array of keys which will not be compared.
 */
FlashInteractor.areValuesMatch = function (query1, query2, keysToExclude) {
	var isInRange = FlashInteractor.isInRange;
	var exclude = FlashInteractor.excludeArray;
	var keys1 = FlashInteractor.getQueryKeys(query1);
	keys1 = exclude(keys1, keysToExclude);
	var keys2 = FlashInteractor.getQueryKeys(query2);
	keys2 = exclude(keys2, keysToExclude);
	if (keys1.length == 0 || keys2.length == 0 || keys1.length != keys2.length) {
   		return false;
	}
	var res = true;
	for (var i = 0; i < keys1.length; i++) {
   		var key = keys1[i];
   		if (!isInRange(keys2, key)) {
   			res = false;
   			break;
   		}
   		var val1 = FlashInteractor.getParamFromQuery(query1, key);
   		var val2 = FlashInteractor.getParamFromQuery(query2, key);
   		if (val1.toLocaleLowerCase() != val2.toLocaleLowerCase()) {
   			res = false;
   			break;
   		}
	}
	return res;
};
FlashInteractor.areValuesMatchWithOutDefaultParams = function (query1, query2, keysToExclude, defaults) {
	var isInRange = FlashInteractor.isInRange;
	var exclude = FlashInteractor.excludeArray;
	var keys1 = FlashInteractor.getQueryKeys(query1);
	keys1 = exclude(keys1, keysToExclude);
	var keys2 = FlashInteractor.getQueryKeys(query2);
	keys2 = exclude(keys2, keysToExclude);
	if (keys1.length == 0 || keys2.length == 0 || keys1.length != keys2.length) {
		var biggerArray = null;
		var shorterArray = null;
		var biggerQuery = null;
		if (keys1.length > keys2.length) {
			biggerArray = keys1;
			shorterArray = keys2;
			biggerQuery = query1;
		} else {
			biggerArray = keys2;
			shorterArray = keys1;
			biggerQuery = query2;
		}
		var extraKeys = exclude(biggerArray, shorterArray);
		for (var i = 0; i < extraKeys.length; i++) {
			var key = extraKeys[i];
			var val = FlashInteractor.getParamFromQuery(biggerQuery, key);
			for (var j = 0; j < defaults.length; j++) {
				if (defaults[j].key == key) {
					if (defaults[j].value == val) {
						biggerArray = exclude(biggerArray, [key]);
					}
				}
			}
		}
		if (keys1.length == 0 || biggerArray.length == 0 || keys1.length != biggerArray.length) {
			return false;
		}
	}
	var res = true;
	for (var i = 0; i < keys1.length; i++) {
		var key = keys1[i];
		if (!isInRange(keys2, key)) {
			res = false;
			break;
		}
		var val1 = FlashInteractor.getParamFromQuery(query1, key);
		var val2 = FlashInteractor.getParamFromQuery(query2, key);
		if (val1.toLocaleLowerCase() != val2.toLocaleLowerCase()) {
			res = false;
			break;
		}
	}
	return res;
};
FlashInteractor.getFilterMode = function (query, queries) {
    var mode = FlashInteractor.filterMode.search;
    var keys = FlashInteractor.getQueryKeys(query);
    keys = FlashInteractor.excludeArray(keys, FlashInteractor.commonQueryKeys);
    if (keys.length == 0) {
        // browse all - if no any parameters in query string
        mode = FlashInteractor.filterMode.browse;
    }
    else if (FlashInteractor.getParamFromQuery(query, "FreeText") != "") {
        mode = FlashInteractor.filterMode.fts;
    }
    else {
        for (var i = 0; i < queries.length; i++) {
            if (FlashInteractor.areValuesMatch(queries[i], query, FlashInteractor.commonQueryKeys)) {
                mode = FlashInteractor.filterMode.browse;
                break;
            }
        }
    }
    return mode;
};
FlashInteractor.loadData = function(servicePath, query, page, count, sort, width, height, callback){
    query = escape(query);
    var d = "{query:'" + query + "', page:" + page.toString() + ", pageSize:" + count.toString() + ", orderField:'" + sort.toString() + "', imageWidth:" + width.toString() + ", imageHeight:" + height.toString() + "}";
    $.ajax({
        type: "POST",
        url: servicePath,
        data: d,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(lotPage){
            if (typeof(lotPage.d) != "undefined") {
                lotPage = lotPage.d;
            }
            callback(lotPage);
        }
    });
};
/* ****************** Private Static Members ********** */

/* ****************** Instance Members **************** */
FlashInteractor.prototype.getCurrentViewSettings = function(){
    var viewSettings = null;
    if (this.settings.viewType == FlashInteractor.viewMode.alternate) {
        viewSettings = this.settings.alternateViewSettings;
    }
    else 
        if (this.settings.viewType == FlashInteractor.viewMode.regular) {
            viewSettings = this.settings.regularViewSettings;
        }
    return viewSettings;
};
FlashInteractor.prototype.searchLots = function(){
    if (!this.settings.isEnabled) {
        return;
    }
    this.data = null;
    this.setDisabled();
    var isBrowse = this.getFilterMode() == FlashInteractor.filterMode.browse;
    var h = isBrowse ? this.settings.searchResultsLabels.browseLabels : this.settings.searchResultsLabels.searchLabels;
    this.notFoundPageVisibilityChanged(h.notFoundPage, false);
    this.flashViewer.resetLotData();
    this.flashViewer.showLoadingBox(true);
    var cachedValue = this.cachingService.read(this.settings.search);
    if (cachedValue != null) {
        this.updateData(cachedValue);
        this.setEnabled();
    }
    else {
        var me = this;
        
        this.partialLoader.settings.totalSize = this.getCurrentViewSettings().count;
        this.partialLoader.settings.performLoad = function(page, size, callback){
            me.searchLotsDelegate(page, size, callback);
        };
        this.partialLoader.load();
    }
};
FlashInteractor.prototype.updateData = function(data){
    this.setDisabled();
    //	this.flashViewer.initView(this.settings.viewType);
    this.searchLotsCallback(data);
};
FlashInteractor.prototype.searchLotsDelegate = function(page, size, callback){
    var viewSettings = this.getCurrentViewSettings();
    FlashInteractor.loadData(this.settings.performSearch, this.settings.search, page, size, this.settings.sortField, viewSettings.width, viewSettings.height, callback);
};
FlashInteractor.prototype.searchLotsCallback = function(lotPage){
    var firstPage = this.data;
    this.data = lotPage;
    this.settings.pages = this.data.TotalPages;
    this.settings.page = this.data.PageNumber;
    FlashInteractor.setHtml(this.settings.pagesLabelIds, this.settings.pages);
    FlashInteractor.setValue(this.settings.pageLabelIds, this.settings.page);
    this.highlightActiveButton();
    
    FlashInteractor.setDisabled(this.settings.nextButtonIds, (this.settings.page >= this.settings.pages));
    FlashInteractor.setDisabled(this.settings.prevButtonIds, (this.settings.page <= 1));
    this.displaySearchResultsLabels();
    this.activateSortField();
    this.displayQueryFilterDdlContainer();
    this.activateQueryFilterField();
    this.activateQueryFilterMenuItem();
    this.activateSponsoredLogos();
    
    var excludedPart = FlashInteractor.excludeLots(firstPage, this.data);
    this.flashViewer.initView(this.settings.viewType);
    this.flashViewer.collectLots(excludedPart);
};

FlashInteractor.prototype.toLotDetails = function(lotId){
	this.setDisabled();
    this.flashViewer.showLoadingBox(true);
    window.location.href = this.settings.lotDetailsPath + lotId + ".aspx?q=" + escape(this.flashViewer.getQueryString());
};

FlashInteractor.prototype.switchToAlternateView = function(){
    if (this.settings.isEnabled && this.settings.viewType != FlashInteractor.viewMode.alternate) {
        this.settings.page = 1;
        this.flashViewer.setScrollPosition(0);
        this.settings.viewType = FlashInteractor.viewMode.alternate;
        var query = FlashInteractor.setQueryParam(window.location.hash, "view", this.settings.viewType);
        $.history("add", query);
    }
};

FlashInteractor.prototype.switchToRegularView = function(){
    if (this.settings.isEnabled && this.settings.viewType != FlashInteractor.viewMode.regular) {
        this.settings.page = 1;
        this.flashViewer.setScrollPosition(0);
        this.settings.viewType = FlashInteractor.viewMode.regular;
        var query = FlashInteractor.setQueryParam(window.location.hash, "view", this.settings.viewType);
        $.history("add", query);
    }
};

FlashInteractor.prototype.updateFavorites = function(lotId, isInFavorites){
    var me = this;
    if (isInFavorites) {
        AddToWatchListWithCallback(this.settings.isUserLoggedIn, lotId, function(obj){
            if (obj.isAdded) {
                me.createFavoriteImage(lotId, obj.url);
                me.flashViewer.favoriteChange(true);
            }
        });
    }
    else {
        RemoveFromWatchListWithCallback(lotId, function(isRemoved){
            if (isRemoved) {
                me.flashViewer.favoriteChange(false);
            }
        });
    }
};

FlashInteractor.prototype.createFavoriteImage = function(lotId, url){
    if (this.settings.hiddenContainerId != null) {
        var html = "<a id='anchor_lot_" + lotId + "' href='javascript:void(0);'>";
        html += "<img src='" + url + "' />";
        html += "</a>";
        $("#" + this.settings.hiddenContainerId).html(html);
    }
};
FlashInteractor.prototype.setSorting = function(sortField){
    this.flashViewer.setScrollPosition(0);
    this.settings.sortField = sortField;
};
FlashInteractor.prototype.changeSorting = function(sortField) {
	this.setSorting(sortField);
	$.history("add", FlashInteractor.setQueryParam(window.location.hash, "sortby", sortField));
};

FlashInteractor.prototype.highlightActiveButton = function(){
    var me = this;
    jQuery.each(this.settings.regularModeBtnIds, function(){
        $("#" + this).removeClass(me.settings.activeButtonCss);
    });
    jQuery.each(this.settings.alternativeModeBtnIds, function(){
        $("#" + this).removeClass(me.settings.activeButtonCss);
    });
    var view = this.settings.viewType;
    if (view == FlashInteractor.viewMode.regular) {
        jQuery.each(this.settings.regularModeBtnIds, function(){
            $("#" + this).addClass(me.settings.activeButtonCss);
        });
    }
    else {
        jQuery.each(this.settings.alternativeModeBtnIds, function(){
            $("#" + this).addClass(me.settings.activeButtonCss);
        });
    }
};
FlashInteractor.prototype.activateSortField = function () {
    var sortby = FlashInteractor.getQueryParam("sortby");
    var freeText = FlashInteractor.getQueryParam("FreeText");
    var relevance = FlashInteractor.getQueryParam("relevance");
    var searchState = FlashInteractor.getQueryParam("LotSearchState");

    if (sortby != null && sortby != "") {
        if (this.settings.sortDdl != null) {
            if (relevance == "true")
                sortby = "relevance";
            this.settings.sortDdl.activateField(function () {
                if ((freeText != null) && (freeText != ""))
                    return "fts";

                if (searchState.toString() == "2") {
                    return "browseSold";
                }
                return "browseAll";
            }, sortby);
        }
    }
};
FlashInteractor.prototype.displayQueryFilterDdlContainer = function(){
    if (this.settings.queryFilterDdlContainerIds != null) {
        var isBrowseAll = this.getFilterMode() == FlashInteractor.filterMode.browse;
        jQuery.each(this.settings.queryFilterDdlContainerIds, function(){
            var ddlCont = $("#" + this);
            if (isBrowseAll) {
                ddlCont.show();
            }
            else {
                ddlCont.hide();
            }
        });
    }
};
/**
 * Parses query string and detects what drop down item should be active.
 * Drop down list contains SearchIn parameters like 'Photographs', 'Prints', 'WorksOnPaper' etc.
 * Also drop down list may content SpecialSale requests. All SpecialSale requests may have many parameters.
 * So only two kinds of filter are represented in the drop down list: SearchIn, SpecialSale
 * To extract SpecialSale query from others parameters we should exclude the following keys:
 * 		scroll, sortby, page, view
 * The idea is to try detect SpecialSale first.
 */
FlashInteractor.prototype.activateQueryFilterField = function () {
    var excludeKeys = FlashInteractor.commonQueryKeys;
    var selectedItem = null;
    jQuery.each(this.settings.queryFilterDdlIds, function(){
        var options = $("#" + this + " option");
        options.each(function(){
            var $this = $(this);
            var q1 = $this.attr("value");
            if (FlashInteractor.areValuesMatch(window.location.hash, q1, excludeKeys)) {
                options.removeAttr("selected");
                $this.attr("selected", "yes");
            }
        });
    });
};
FlashInteractor.prototype.activateQueryFilterMenuItem = function(){
    if (this.settings.topMenuManager != null) {
        this.settings.topMenuManager.activateMenuItem(window.location.hash);
    }
};

/**
 * The method getBrowseQueries returns array of queries which are used to default browse mode.
 * Others queries will mean user navigates from AdvancedSearch page
 */
FlashInteractor.prototype.getBrowseQueries = function(){
    var queries = new Array();
    if (this.settings.queryFilterDdlIds != null) {
        jQuery.each(this.settings.queryFilterDdlIds, function(){
            var options = $("#" + this + " option");
            options.each(function(){
                var $this = $(this);
                var q1 = $this.attr("value");
                queries.push(q1);
            });
        });
    }
    return queries;
};

FlashInteractor.prototype.activateSponsoredLogos = function(){
    var query = window.location.hash;
    if (this.settings.sponsoredLogoDescriptors != null) {
        for (var i = 0; i < this.settings.sponsoredLogoDescriptors.length; i++) {
            var sponsoredLogo = this.settings.sponsoredLogoDescriptors[i];
            var container = $("#" + sponsoredLogo.containerId);
            if (FlashInteractor.areValuesMatch(query, sponsoredLogo.query, FlashInteractor.commonQueryKeys)) {
                container.show();
            }
            else {
                container.hide();
            }
        }
    }
};

FlashInteractor.prototype.getFilterMode = function(q){
    var query = "";
    if (typeof(q) == "undefined") {
        query = window.location.hash;
    }
    else {
        query = q;
    }
    return FlashInteractor.getFilterMode(query, this.getBrowseQueries());
};

FlashInteractor.prototype.displaySearchResultsLabels = function () {
	if (this.settings.searchResultsLabels != null) {
		var browseLabels = this.settings.searchResultsLabels.browseLabels;
		var searchLabels = this.settings.searchResultsLabels.searchLabels;
		// hide all labels before
		var hideLabels = function (holder) {
			if (holder != null && typeof (holder) != "undefined") {
				jQuery.each(holder, function () {
					$("#" + this.containerId).hide();
				});
			}
		}
		if (browseLabels != null && typeof (browseLabels) != "undefined") {
			hideLabels(browseLabels.found);
			hideLabels(browseLabels.notFoundPage);
		}
		if (searchLabels != null && typeof (searchLabels) != "undefined") {
			hideLabels(searchLabels.found);
			hideLabels(searchLabels.notFoundPage);
		}
		var isBrowse = this.getFilterMode() == FlashInteractor.filterMode.browse;
		var h = isBrowse ? browseLabels : searchLabels;
		var scrollVisible = this.scrollVisible;
		var displayLabels = function (holder, totalLines) {
			if (holder != null && typeof (holder) != "undefined") {
				jQuery.each(holder, function () {
					if (!this.dependsOnScroll || scrollVisible) {
						var msg = this.template.toString().replace("{0}", totalLines);
						var cnt = $("#" + this.containerId);
						cnt.html(msg);
						cnt.show();
					}
				});
			}
		}
		if (this.data.TotalLines > 0) {
			displayLabels(h.found, this.data.TotalLines);	
		}
		else {
			this.notFoundPageVisibilityChanged(h.notFoundPage, true);
		}
	}
};

FlashInteractor.prototype.notFoundPageVisibilityChanged = function (page, visible) {
	if (page != null && typeof (page) != "undefined") {
		jQuery.each(page, function () {
			visible ? $("#" + this.containerId).show() : $("#" + this.containerId).hide();
		});
	}
}

FlashInteractor.prototype.scrollbarVisibilityChanged = function(visible){
    this.scrollVisible = visible;
    this.displaySearchResultsLabels();
};

FlashInteractor.prototype.setEnabled = function () {
	FlashInteractor.setDisabled(this.settings.queryFilterDdlIds, false);
	if (this.settings.sortDdl != null) {
		this.settings.sortDdl.setEnabled();
	}
	FlashInteractor.setDisabled(this.settings.alternativeModeBtnIds, false);
	FlashInteractor.setDisabled(this.settings.regularModeBtnIds, false);
	LinkButtonMenuManager.prototype.setEnabled();
	this.settings.isEnabled = true;
};

FlashInteractor.prototype.setDisabled = function () {
	this.settings.isEnabled = false;
	FlashInteractor.setDisabled(this.settings.queryFilterDdlIds, true);
	if (this.settings.sortDdl != null) {
		this.settings.sortDdl.setDisabled();
	}
	FlashInteractor.setDisabled(this.settings.alternativeModeBtnIds, true);
	FlashInteractor.setDisabled(this.settings.regularModeBtnIds, true);
	LinkButtonMenuManager.prototype.setDisabled();
};
/*
 * Basically the method was developed to manage default sortFields.
 * Business logic is that default sort field is "soonest".
 * In case if you browse by sold lots - default sort field becomes "newly"
 * In case if you navigates from AdvancedSearch page - the first result should be sorted by "newly"
 * Others cases should be sorted by default
 *
 */
FlashInteractor.prototype.correctSort = function(search) {
    var sortby = FlashInteractor.getParamFromQuery(search, "sortby");
	var oldSearch = this.settings.search;
	var lotSearchState = FlashInteractor.getParamFromQuery(search, "LotSearchState");

	var isSearchOrSold = (lotSearchState == "2" || this.getFilterMode() == FlashInteractor.filterMode.search);
//	if (this.getFilterMode() == FlashInteractor.filterMode.fts) {
//        /*get sortby param directly from browser. Flash cannot interact with 'sortby='relevance' '*/
//	    sortby = FlashInteractor.getParamFromQuery(window.location.hash, "sortby");
//	    if (sortby == "" || sortby == FlashInteractor.sortFields.relevance && this.settings.sortField != sortby) {
//	        this.setSorting(FlashInteractor.sortFields.relevance);
//	        return FlashInteractor.setQueryParam(search, "sortby", FlashInteractor.sortFields.relevance);
//	    }
//	} else 
    if (isSearchOrSold) {
		if (sortby == FlashInteractor.sortFields.newly && this.settings.sortField != sortby) {
			this.setSorting(FlashInteractor.sortFields.newly);
			return FlashInteractor.setQueryParam(search, "sortby", FlashInteractor.sortFields.newly);
		}
	}
	else {
		var oldLotSearchState = FlashInteractor.getParamFromQuery(oldSearch, "LotSearchState");
		var isPrevSearchOrSold = this.getFilterMode(oldSearch) == FlashInteractor.filterMode.search || 
							oldLotSearchState == "2";
		// Switch sort field back to "soonest" if user navigates from Sold view or AdvancedSearch view
		
		if (sortby == "" && isPrevSearchOrSold && !isSearchOrSold) {
			this.changeSorting(FlashInteractor.sortFields.soonest);
			var res = FlashInteractor.setQueryParam(search, "sortby", FlashInteractor.sortFields.soonest);
			this.activateSortField();
			return res;
		}
	}
	return search;
};
FlashInteractor.prototype.changeSearch = function (search) {
    if (this.settings.search != search) {
        var oldSearch = this.settings.search;
        this.settings.search = this.correctSort(search);
        this.flashViewer.urlChanged(this.settings.search.replace("#", ""));
        this.settings.page = this.flashViewer.getPage();
        this.settings.viewType = this.flashViewer.getViewType();
        if (!FlashInteractor.areValuesMatchWithOutDefaultParams(oldSearch, this.settings.search, ["scroll"], [{ key: "page", value: 1 }, { key: "view", value: this.settings.viewType}])) {
            if (this.settings.isEnabled) {
                this.searchLots();
            }
        }
    }
};
/* ****************** Instance Members **************** */















