﻿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,
		sortDdlIds: null,
		alternativeModeBtnIds: null,
		regularModeBtnIds: null,
		queryFilterDdlIds: null,
		queryFilterDdlContainerIds: null,
		queryFilterMenuContainerId: null,
		queryFilterMenuActiveClass: null,
		performSearch: null,
		lotDetailsPath: null,
		activeButtonCss: "viewModeActive",
		searchResultsLabels: null,
		hiddenContainerId: null,
		sponsoredLogoDescriptors: null
	}, 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();
				}
			});
		});
	}
	jQuery.each(this.settings.sortDdlIds, function() {
		$("#" + this).change(function() {
			if (me.settings.isEnabled == true) {
				var sortField = $(this).find("option:selected:first").val();
				me.changeSorting(sortField);
			}
		});
	});
	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();
				$(window).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.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 = {
	newly: "newly",
	soonest: "soonest",
	lowest: "lowest",
	highest: "highest"
};
FlashInteractor.filterMode = {
	browse: "browse",
	search: "search"
};
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 });
		}
	}
	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.loadData = function(servicePath, query, page, count, sort, width, height, callback) {
//	alert(query);
	query = escape(query);
//	alert(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();
	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);
		$(window).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);
		$(window).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.changeSorting = function(sortField) {
	this.flashViewer.setScrollPosition(0);
	this.settings.sortField = sortField;
	$(window).history("add", FlashInteractor.setQueryParam(window.location.hash, "sortby", sortField));
	//this.flashViewer.setSortString(this.settings.sortField);
	//this.searchLots();
};

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");
	if (sortby != null && sortby != "") {
		jQuery.each(this.settings.sortDdlIds, function() {
			$("#" + this + " option").removeAttr("selected");
			$("#" + this + " option[value='" + sortby + "']").attr("selected", "yes");
		});
	}
};
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;
	jQuery.each(this.settings.queryFilterDdlIds, function() {
		var options = $("#" + this + " option");
		options.removeAttr("selected");
		options.each(function() {
			var $this = $(this);
			var q1 = $this.attr("value");
			if (FlashInteractor.areValuesMatch(window.location.hash, q1, excludeKeys)) {
				$this.attr("selected", "yes");
			}
		});
	});
};
FlashInteractor.prototype.activateQueryFilterMenuItem = function() {
	var css = this.settings.queryFilterMenuActiveClass;
	var querySearchIn = FlashInteractor.getQueryParam("SearchIn");
	if (querySearchIn == "") {
		querySearchIn = "AllArtWorks";
	}
	if (this.settings.queryFilterMenuContainerId != null && css != null) {
		$("#" + this.settings.queryFilterMenuContainerId + " a").each(function() {
			var $this = $(this);
			$this.removeClass(css);
			var href = $this.attr("href");
			var bufferedHref = $this.attr("bufferedHref");
			var hrefSearchIn = FlashInteractor.getParamFromQuery(href, "SearchIn");
			var bufferedHrefSearchIn = FlashInteractor.getParamFromQuery(bufferedHref, "SearchIn");
			if (bufferedHrefSearchIn == querySearchIn || hrefSearchIn == querySearchIn) {
				$this.addClass(css);
			}
		});
	}
};

/**
* 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() {
	var mode = FlashInteractor.filterMode.search;
	var queries = this.getBrowseQueries();
	var query = window.location.hash;
	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 {
		for (var i = 0; i < queries.length; i++) {
			if (FlashInteractor.areValuesMatch(queries[i], query, FlashInteractor.commonQueryKeys)) {
				mode = FlashInteractor.filterMode.browse;
				break;
			}
		}
	}
	return mode;
};

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.notFound);
		}
		if (searchLabels != null && typeof (searchLabels) != "undefined") {
			hideLabels(searchLabels.found);
			hideLabels(searchLabels.notFound);
		}
		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();
					}
				});
			}
		}
		var subHolder = (this.data.TotalLines > 0) ? h.found : h.notFound;
		displayLabels(subHolder, this.data.TotalLines);
	}
};

FlashInteractor.prototype.scrollbarVisibilityChanged = function(visible){
	this.scrollVisible = visible;
	this.displaySearchResultsLabels();
};

FlashInteractor.prototype.setEnabled = function() {
	FlashInteractor.setDisabled(this.settings.queryFilterDdlIds, false);
	FlashInteractor.setDisabled(this.settings.sortDdlIds, false);
	FlashInteractor.setDisabled(this.settings.alternativeModeBtnIds, false);
	FlashInteractor.setDisabled(this.settings.regularModeBtnIds, false);
	$("#" + this.settings.queryFilterMenuContainerId + " a[bufferedHRef]").each(function() {
		var $this = $(this);
		var bufferedHref = $this.attr("bufferedHref").toString();
		if (bufferedHref.indexOf("BrowseAuctions.aspx") >= 0) {
			$this.attr("href", bufferedHref);
		}
	});
	this.settings.isEnabled = true;
};

FlashInteractor.prototype.setDisabled = function() {
	this.settings.isEnabled = false;
	FlashInteractor.setDisabled(this.settings.queryFilterDdlIds, true);
	FlashInteractor.setDisabled(this.settings.sortDdlIds, true);
	FlashInteractor.setDisabled(this.settings.alternativeModeBtnIds, true);
	FlashInteractor.setDisabled(this.settings.regularModeBtnIds, true);
	$("#" + this.settings.queryFilterMenuContainerId + " a").each(function() {
		var $this = $(this);
		var bufferedHref = $this.attr("href").toString();
		if (bufferedHref.indexOf("BrowseAuctions.aspx") >= 0) {
			$this.attr("href", "javascript:void(0);");
			$this.attr("bufferedHref", bufferedHref);
		}
	});
};

FlashInteractor.prototype.changeSearch = function(search) {
	if (this.settings.search != search) {
		var oldSearch = this.settings.search;
		this.settings.search = search;
		this.flashViewer.urlChanged(this.settings.search.replace("#", ""));
		this.settings.page = this.flashViewer.getPage();
		this.settings.viewType = this.flashViewer.getViewType();
		if (!FlashInteractor.areValuesMatch(oldSearch, this.settings.search, ["scroll"])) {
			if (this.settings.isEnabled) {
				this.searchLots();
			}
		}
	}
};
/* ****************** Instance Members **************** */














