﻿var byPriceAjaxUrl = LANG_ROOT_PATH + 'AJAX/SearchByPriceData.aspx';
var getElement = function(id){ return (document.all ? document.all[id] : document.getElementById(id)); }
var byPriceWidgetTemplate = new jtemplate(getElement('byPriceTemplate').value);

Array.prototype.insert = function(pos, newValue){
	if(pos > -1 && pos < this.length)
		this.splice(pos, 0, newValue);
	else
		this.push(newValue);
};

Array.prototype.binarySearch = function(item, comparer){
	var hi = this.length, lo = -1, mid;
	while(hi - lo > 1){
		if(comparer(this[mid = hi + lo >> 1],item) > 0) lo = mid;
		else hi = mid;
	}
	return hi;
};

Array.prototype.binaryInsert = function(item, comparer){
	this.insert(this.binarySearch(item, comparer), item);
};

Date.constructor.prototype.parseDate = function(dateString, format){
	if(!dateString || dateString.length == 0){ return null; }
	if(!format || format.length == 0){ format = 'dd/MM/yyyy hh:mm'; }
	var regxSplit = /[\/|\-| |\:|\.|\,]/g
	var day = 1, month = 1, year = 1, hour = 0, minute = 0;
	var dateParts = dateString.split(regxSplit);
	var fmtParts = format.split(regxSplit);
	for(var i = 0; i < fmtParts.length && i < dateParts.length; i++){
		switch(fmtParts[i]){
			case 'd':
			case 'dd':
				day = parseInt(dateParts[i], 10); break;
			case 'M':
			case 'MM':
				month = parseInt(dateParts[i], 10) - 1; break;
			case 'yyyy':
			case 'yy':
				year = parseInt(dateParts[i], 10); break;
			case 'h':
			case 'hh':
				hour = parseInt(dateParts[i], 10); break;
			case 'mm':
				minute = parseInt(dateParts[i], 10); break;
		}
	}
	return new Date(year, month, day, hour, minute, 0);
};

Date.prototype.compareDate = function(dateTime){
	return (this.getDate() == dateTime.getDate() && this.getMonth() == dateTime.getMonth() && this.getYear() == dateTime.getYear());
}

Date.prototype.subtractTime = function(dateTime){
	var timeSpan = this.getTime() - dateTime.getTime();
	var d = (timeSpan < 0 ? 0 : Math.floor(timeSpan/86400000));
	var h = (timeSpan < 0 ? 0 : Math.floor((timeSpan-(d*86400000))/3600000));
	var m = (timeSpan < 0 ? 0 : Math.floor((timeSpan-((d*86400000)+(h*3600000)))/60000));
	return {days:d,hours:h,minutes:m,span:timeSpan};
}

var ParseTimeSpan = function(ts){
	var timeSpan = (ts ? ts.split(':') : []);
	var d = (timeSpan.length > 0 ? parseInt(timeSpan[0]) : 0);
	var h = (timeSpan.length > 1 ? parseInt(timeSpan[1]) : 0);
	var m = (timeSpan.length > 2 ? parseInt(timeSpan[2]) : 0);
	return {days:d,hours:h,minutes:m};

};

var DayNames = [TXT_SUNDAY,TXT_MONDAY,TXT_TUESDAY,TXT_WEDNESDAY,TXT_THURSDAY,TXT_FRIDAY,TXT_SATURDAY];
var DayAbbr = [TXT_SUN,TXT_MON,TXT_TUE,TXT_WED,TXT_THU,TXT_FRI,TXT_SAT];
var MonthNames = [TXT_JANUARY,TXT_FEBRUARY,TXT_MARCH,TXT_APRIL,TXT_MAY,TXT_JUNE,TXT_JULY,TXT_AUGUST,TXT_SEPTEMBER,TXT_OCTOBER,TXT_NOVEMBER,TXT_DECEMBER];
var MonthAbbr = [TXT_JAN,TXT_FEB,TXT_MAR,TXT_APR,TXT_MAY_SHORT,TXT_JUN,TXT_JUL,TXT_AUG,TXT_SEP,TXT_OCT,TXT_NOV,TXT_DEC];

Date.prototype.formatString = function(format){
	var regxSplit = /[\/|\-| |\:|\.|\,]/g
	var parts = format.split(regxSplit);
	for(var i = 0; i < parts.length; i++){
		if(parts[i] == null || parts[i].length == 0){ continue; }
		var part = parts[i];
		var val = null;
		if(part == 'd' || part == 'dd'){
			var day = this.getDate();
			val = (part == 'dd' && day < 10 ? '0' + day : day);
		}
		else if(part == 'ddd' || part == 'dddd'){
			val = (part == 'ddd' ? DayAbbr[this.getDay()] : DayNames[this.getDay()]);
		}
		else if(part == 'M' || part == 'MM'){
			var month = this.getMonth() + 1;
			val = (part == 'MM' && month < 10 ? '0' + month : month);
		}
		else if(part == 'MMM' || part == 'MMMM'){
			val = (part == 'MMM' ? MonthAbbr[this.getMonth()] : MonthNames[this.getMonth()]);
		}
		else if(part == 'yy' || part == 'yyyy'){
			val = this.getFullYear();
		}
		else if(part == 'h' || part == 'hh'){
			var hour = this.getHours();
			val = (part == 'hh' && hour < 10 ? '0' + hour : hour);
		}
		else if(part == 'mm'){
			var minute = this.getMinutes();
			val = (minute < 10 ? '0' + minute : minute);
		}
		if(val){ format = format.replace(part, val); }
	}
	return format;
};

var byPriceWidgetManager = {
	airports:new Object(),
	operators:new Object(),
	flights:new Array(),
	resultsElement:null,
	pagingElement:null,
	minPrice:null,
	maxPrice:null,
	avgPrice:null,
	sumPrices:0,
	countPrices:0,
	lowRange:null,
	hiRange:null,
	lowElement:null,
	midElement:null,
	hiElement:null,
	map:null,
	page:1,
	pagesize:5,
	updating:false,
	operatorCount:0,
	xmlRequest:jxRequest,
	ajaxUrl:byPriceAjaxUrl,
	gridView:false,
	rememberView:false,
	menuMap:null,
	menuList:null,
	decimalSeparator:null,
	addResults: function(result){
		for(var i = 0; i < result.operators.length; i++){
			this.addOperator(result.operators[i]);
		}
		for(var i = 0; i < result.airports.length; i++){
			this.addAirport(result.airports[i]);
		}
		for(var i = 0; i < result.flights.length; i++){
			var item = result.flights[i];
			item.operator = this.operators[item.opid];
			if(item.outbound){ item.outbound.dateValue = Date.parseDate(item.outbound.date); }
			if(item.inbound){ item.inbound.dateValue = Date.parseDate(item.inbound.date); }
			this.addFlight(item);
		}
		this.setRange();
	},
	hasResults: function(){
		return (this.flights && this.flights.length > 0);
	},
	setRange: function(){
		this.avgPrice = this.sumPrices/this.countPrices;
		var minAvg = (this.minPrice + this.avgPrice)/2;
		var maxAvg = (((this.maxPrice + this.avgPrice)/2) + this.avgPrice)/2;

		var powerLow = Math.floor(Math.log(minAvg)/Math.log(10)) - 1;
		var roundLow = parseInt(powerLow <= 0 ? 5 : Math.pow(10, powerLow));
		this.lowRange = parseInt(minAvg/roundLow)*roundLow;

		var powerHi = Math.floor(Math.log(maxAvg)/Math.log(10)) - 1;
		var roundHi = parseInt(powerHi <= 0 ? 5 : Math.pow(10, powerHi));
		this.hiRange = parseInt(maxAvg/roundHi)*roundHi;
		
		elLow = getElement(this.lowElement);
		if(elLow){ elLow.innerHTML = "< " + this.lowRange; }
		
		elMin = getElement(this.midElement);
		if(elMin){ elMin.innerHTML = "< " + this.hiRange; }
		
		elHi = getElement(this.hiElement);
		if(elHi){ elHi.innerHTML = "> " + this.hiRange; }
	},
	addMarkers: function(){
		if(!this.map){ return; }
		for(var i = 0; i < this.flights.length; i++){
			var item = this.flights[i];
			var code = item.dest;
			var apt = this.getAirport(code);
			var pinImg = IMG_ROOT + 'i/widget/map/' + this.getMarkerImage(item.value);
			this.map.updateMarkers({
				id:code, img:pinImg,
				width:18, height:30, lat:apt.lat, lon:apt.lon,
				html:this.getMapHtml(item),
				title:this.getAptName(code) + ' - ' + item.price,
				visible:true
			});
		}
		this.map.renderMapBounds();
	},
	getMarkerImage: function(val){
		if(val < this.lowRange){ return 'low.png'; }
		else if(val < this.hiRange){ return 'mid.png'; }
		else{ return 'high.png'; }
	},
	addOperator: function(operator){
		if(!this.operators[operator.opid]){
			this.operators[operator.opid] = operator;
			this.operatorCount++;
		}
	},
	addAirport: function(airport){
		if(!this.airports[airport.code]){
			this.airports[airport.code] = airport;
		}
	},
	addFlight: function(item){
		this.flights.binaryInsert(item, this.valueComparer);
		if(!this.minPrice || item.value < this.minPrice){ this.minPrice = item.value; }
		if(!this.maxPrice || item.value > this.maxPrice){ this.maxPrice = item.value; }
		if(item.value){ this.sumPrices += item.value; this.countPrices++; }
	},
	valueComparer: function(a, b){
		var x = a.value;
		var y = b.value;
		return ((x > y) ? -1 : ((x < y) ? 1 : 0));
	},
	loadResults: function(onstart, cb){
		if(onstart){ onstart(); }
		if(this.map){ this.map.resetMap(); }
		this.airports = new Object();
		this.operators = new Object();
		this.flights = new Array();
		if(this.xmlRequest && this.ajaxUrl){
			var data = 'dep=' + byPriceSettings.dep;
			data += '&continent=' + byPriceSettings.continent;
			data += '&country=' + byPriceSettings.country;
			data += '&hasdates=' + byPriceSettings.hasdates;
			data += '&mindate=' + byPriceSettings.mindate;
			data += '&maxdate=' + byPriceSettings.maxdate;
			data += '&maxprice=' + byPriceSettings.maxprice;
			data += '&oneway=' + byPriceSettings.oneway;
			data += '&currency=' + byPriceSettings.currency;

			var mgr = this;
			var callback = function(req){ mgr.xmlResponse(req, cb); }
			this.xmlRequest.Request(this.ajaxUrl, callback, 'GET', data);
		}
	},
	xmlResponse: function(req, callback){
		if(req.readyState == 4){
			if(req.status == 200 && req.responseText){
				this.minPrice = null;
				this.maxPrice = null;
				this.avgPrice = null;
				this.sumPrices = 0;
				this.countPrices = 0;
				this.addResults(eval('(' + req.responseText + ')'));
			}
			if(callback){ callback(); }
			this.startRender();
		}
	},
	renderResults: function(){
		if(!this.updating){
			this.updating = true;
			var data = this.getPageResults();
			var elem = getElement(this.resultsElement);
			if(!data || data.length == 0){
				var msg = (this.flights.length == 0 ? TXT_NO_RESULTS_MSG : TXT_NO_RESULTS);
				elem.innerHTML = '<div class="ErrorMessage">' + msg + '</div>';
			}
			else{
				var resultsHtml = '';
				var maxItems = this.pagesize;
				for(var i = 0; i < data.length && i < maxItems; i++){
					resultsHtml += byPriceWidgetTemplate.apply({item:data[i], mgr:this, index:i});
				}
				if(resultsHtml.length == 0){
					var msg = (this.flights.length == 0 ? TXT_NO_RESULTS_MSG : TXT_NO_RESULTS);
					resultsHtml = '<div class="ErrorMessage">' + msg + '</div>';
				}
				elem.innerHTML = resultsHtml;
			}
			this.renderPaging();
			this.updating = false;
		}
	},
	startRender: function(){
		var mgr = this;
		var doRender = function(){
			if(mgr.gridView){ mgr.renderResults(); }
			else{ mgr.map.createMap(); mgr.addMarkers(); }
		};
		setTimeout(doRender, 250);
	},
	getPageResults: function(){
		var data = null;
		if(this.flights && this.flights.length > 0){
			data = this.selectPageResults(this.flights);
		}
		return data;
	},
	selectPageResults: function(results){
		var data = null;
		if(results && results.length > 0){
			this.page = Math.min(Math.ceil(results.length/this.pagesize), this.page);
			var pagestart = (this.page-1)*this.pagesize;
			var pageend = Math.min(pagestart+this.pagesize, results.length);
			var arr = (pageend > pagestart ? results.slice(pagestart, pageend) : null);
			data = arr;
		}
		return data;
	},
	renderPaging: function(){
		if(this.pagingElement){
			var elem = getElement(this.pagingElement);
			if(elem == null){ return; }
			var numResults = this.flights.length;
			var html = '';
			var pages = Math.ceil(numResults/this.pagesize);
			for(var i=1; i <= pages; i++){
				if(this.page == i){
					html += '&nbsp;<span class="ChangePageSelected"><b>' + i + '</b></span>';
				}
				else{
					var func = "byPriceWidgetManager.setPageNumber(" + i + ")";
					html += '&nbsp;<a class="ChangePage" onclick="' + func + '">' + i + '</a>';
				}
			}
			elem.innerHTML = TXT_RESULTS + ": " + html;
		}
	},
	refresh: function(){
		var mgr = this;
		var doRender = function(){ mgr.renderResults(); };
		setTimeout(doRender, 250);
	},
	getAirport: function(code){
		return this.airports[code];
	},
	getAptName: function(code){
		var aptname = '';
		if(this.airports[code]){
			var apt = this.airports[code];
			aptname = apt.city;
			if(apt.name && apt.name.length > 0){ aptname += ' ' + apt.name; }
		}
		return aptname;
	},
	getCity: function(code){
		if(this.airports[code]){
			var apt = this.airports[code];
			return apt.city;
		}
		return code;
	},
	getOperator: function(opid){
		var opname = '';
		if(this.operators[opid]){
			opname = this.operators[opid].name;
		}
		return opname;
	},
	getFintail: function(opid){
		var logo = '';
		if(this.operators[opid]){
			logo = IMG_ROOT + 'i/operator/' + this.operators[opid].logo;
		}
		return logo;
	},
	getDistance: function(lat1, lon1, lat2, lon2){
		var dist = Math.round(6378 * Math.acos(Math.sin(lat1/57.3) * Math.sin(lat2/57.3) + Math.cos(lat1/57.3) * Math.cos(lat2/57.3) * Math.cos(lon2/57.3 - lon1/57.3)),0)
		return dist;
	},
	setPageNumber: function(num){
		this.page = num;
		this.startRender();
	},
	getCss: function(rowIndex){
		return (rowIndex%2 == 0 ? "listResult1" : "listResult2");
	},
	getTax: function(val){
		var taxHtml = '';
		var strCss = 'txtOrange';
		if(!val){ taxHtml = TXT_TAX_EXCLUDED; }
		else if(val == '0'){ taxHtml = TXT_TAX_EXCLUDED; }
		else if(val == '2'){ taxHtml = TXT_EXCLUDING_TICKET_EMISSION; }
		else if(val == '3'){ taxHtml = TXT_APPROX_PRICE; }
		else{ taxHtml = TXT_TAX_INCLUDED; strCss = 'txtGreen' }
		if(taxHtml != ''){ taxHtml = '<span class="' + strCss + '">' + taxHtml + '</span>'; }
		return taxHtml;
	},
	getPrice: function(item){
		if(this.decimalSeparator != null && this.decimalSeparator.length > 0){
			var price = item.price;
			var i = price.indexOf(this.decimalSeparator);
			if(i > -1){ price = price.substring(0, i) + '<span class="priceSmall">' + price.substr(i, price.length) + '</span>'; }
			return price;
		}
		else{ return item.price; }
	},
	getRedirect: function(item){
		var url = LANG_ROOT_PATH + 'redirect.aspx';
		url += '?opid=' + item.opid;
		url += '&url=' + (item.url ? encodeURIComponent(item.url) : '');
		url += '&DepartAirport=' + item.dep;
		url += '&DestinationAirport=' + item.dest;
		url += '&Adults=1';
		url += '&Children=0';
		url += '&Infants=0';
		url += '&DepartureDate=' + (item.outbound ? encodeURIComponent(item.outbound.date) : '');
		url += '&ReturnDate=' + (item.inbound ? encodeURIComponent(item.inbound.date) : '');
		return url;
	},
	formatDate: function(dt, format){
		var dateString = '';
		if(dt){
			var dateFormat = (format ? format : 'd MMM');
			dateString = Date.parseDate(dt).formatString(dateFormat);
		}
		return dateString;
	},
	getCityHtml: function(item){
		var depCity = this.getCity(item.dep);
		var depName = this.getAptName(item.dep);
		var destCity = this.getCity(item.dest);
		var destName = this.getAptName(item.dest);
		var html = '<span title="' + depName + '">' + depCity + '</span> - <span title="' + destName + '">' + destCity + '</span>';
		var elem = getElement(this.resultsElement);
		var length = (elem ? elem.offsetWidth - 4 : 0);
		if(length <= 0){ return html; }
		if(this.visualLength('listTopRow',html) > length)
		{
			var depChanged = false;
			var destChanged = false;
			var tmpDep = depCity;
			var tmpDest = destCity;
			if(tmpDep.length > tmpDest.length){ tmpDep = tmpDep.substring(0, tmpDep.length-1); depChanged = true; }
			else{ tmpDest = tmpDest.substring(0, tmpDest.length-1); destChanged = true; }
			html = '<span title="' + depName + '">' + tmpDep + (depChanged ? '...' : '') + '</span> - <span title="' + destName + '">' + tmpDest + (destChanged ? '...' : '') + '</span>';
			while(this.visualLength('listTopRow',html) > length){
				if(tmpDep.length > tmpDest.length){ tmpDep = tmpDep.substring(0, tmpDep.length-1); depChanged = true; }
				else{ tmpDest = tmpDest.substring(0, tmpDest.length-1); destChanged = true; }
				html = '<span title="' + depName + '">' + tmpDep + (depChanged ? '...' : '') + '</span> - <span title="' + destName + '">' + tmpDest + (destChanged ? '...' : '') + '</span>';
			}
		}

		return html;
	},
	getLastUpdated: function(item){
		var html = '';
		if(item.updated != null){
			var timeSpan = ParseTimeSpan(item.updated);
			var updatedText = '';
			var updatedImg = '<img src="' + IMG_ROOT + 'i/clock3.gif" width="11" height="11" border="0" align="absmiddle">';
			if(timeSpan.days > 0){ updatedText += TXT_DAYS_AGO.replace('%1',timeSpan.days); }
			else if(timeSpan.hours > 0){ updatedText += TXT_HOURS_AGO.replace('%1',timeSpan.hours); }
			else if(timeSpan.minutes > 0){ updatedText += TXT_MINS_AGO.replace('%1',timeSpan.minutes); }
			else{
				updatedText = TXT_VERIFIED_AVAILABILITY;
				updatedImg = '<img src="' + IMG_ROOT + 'i/tick-green.gif" width="14" height="15" border="0" align="absmiddle">';
			}
			html = updatedImg + ' ' + updatedText;
		}
		else{
			html = '<img src="' + IMG_ROOT + 'i/tick-green.gif" width="14" height="15" border="0" align="absmiddle"> ' + TXT_VERIFIED_AVAILABILITY;
		}
		return html;
	},
	getShortHtml: function(item){
		var logo = '<img src="' + this.getFintail(item.opid) + '" border="0">';
		var redirect = this.getRedirect(item);
		var apts = item.dep + ' >> ' + item.dest;
		var html = '<table width="100%" align="center" cellpadding="0" border="0">';
		html += '<tr><td width="50%" valign="middle">';
		html += '<a href="' + redirect + '" class="ResultPrice" target="_blank">' +  item.price + '</a><br>' + this.getTax(item.tax) + '</td>';
		html += '<td width="50%" align="center"><a href="' + redirect + '" target="_blank">' + logo + '</a></td></tr>';
		html += '<tr><td>' + apts + '</td>';
		html += '<td align="center"><a href="' + redirect + '" target="_blank">' + item.operator.name + '</a></td></tr>';
		html += '<tr><td>' + this.formatDate(item.outbound.date, 'd MMM yyyy') + '</td>';
		html += '<td align="center">' + item.outbound.time + ' >> ' + item.outbound.arrive + '</td></tr>';
		if(item.way == 2 && item.inbound){
			html += '<tr><td>' + this.formatDate(item.inbound.date, 'd MMM yyyy') + '</td>';
			html += '<td align="center">' + item.inbound.time + ' >> ' + item.inbound.arrive + '</td></tr>';
		}
		html += '</table>';
		html += '<div class="lastUpdated">' + this.getLastUpdated(item) + '</div>';
		return html;
	},
	getListBody: function(item){
		var html = this.formatDate(item.outbound.date, 'dd MMM');
		if(item.way == 2 && item.inbound){ html += ' - ' + this.formatDate(item.inbound.date, 'dd MMM'); }
		html += ' - <a class="opLink" href="' + this.getRedirect(item) + '" target="_blank"><b>' + this.getOperator(item.opid) + '</b></a>';
		html += '<br/>';
		var ts = ParseTimeSpan(item.updated);
		var updatedText = TXT_UPDATED + ': ';
		if(ts.days > 0){ updatedText += TXT_DAYS_AGO.replace('%1',ts.days); }
		else if(ts.hours > 0){ updatedText += TXT_HOURS_AGO.replace('%1',ts.hours); }
		else if(ts.minutes > 0){ updatedText += TXT_MINS_AGO.replace('%1',ts.minutes); }
		html += '<img alt="' + TXT_LAST_UPDATED + '" src="' + IMG_ROOT + 'i/clock3.gif" width="11" height="11" align="middle" /> ';
		html += '<span class="listUpdated"> ' + updatedText + '</span>';
		return html;
	},
	getMapHtml: function(item){
		var html = '<div class="mapResult">';
		if(item){
			var txt = TXT_FROM_TO;
			txt = txt.replace('%1', this.getAptName(item.dep));
			txt = txt.replace('%2', this.getAptName(item.dest));
			html += '<div class="mapText">' + txt + '</div>';
			html += this.getShortHtml(item);
			html += '<div style="padding-top:4px;">';
			html += '<a class="blueText" href="' + this.getRedirect(item) + '" target="_blank">';
			html += TXT_VERIFY_AVAILABILITY;
			html += '</a></div>';
		}
		html += '</div>';
		return html;
	},
	visualLength: function(cssClass, html){
		var ruler = getElement("ruler");
		var width = 0;
		if(ruler){
			ruler.innerHTML = '<span class="' + cssClass + '">' + html + '</span>';
			width = ruler.offsetWidth;
			ruler.innerHTML = '';
			return width;
		}
		return width;
	},
	checkResize: function(){
		if(this.map && this.mapView){
			this.map.checkResize();
		}
	}
};

var startLoadResults = function(){
	showProgress();
};

var onLoadResults = function(){
	if(!byPriceWidgetManager.hasResults()){ showNoResults(); }
	else if(byPriceWidgetManager.gridView){ showList(); }
	else{ showMap(); }
};

var addEvent = function(obj, type, fn){ 
	if(obj.attachEvent){
		obj.attachEvent('on' + type, fn); 
	}
	else if(obj.addEventListener){
		obj.addEventListener(type, fn, false);
	}
};

var mapMenuElem = getElement("menuMap");
var listMenuElem = getElement("menuList");
var progressElem = getElement("progressBar");
var mapElem = getElement("byPriceMapOuter");
var listElem = getElement("listOuter");
var menuElem = getElement("byPriceMenu");
var legend = (getElement('PriceIndex') ? getElement('PriceIndex') : getElement('PriceIndexTop'));
var noResultsElem = getElement("NoResults");

var showMap = function(){
	if(mapMenuElem){ mapMenuElem.className = "menuOn"; }
	if(listMenuElem){ listMenuElem.className = "menuOff"; }
	if(progressElem){ progressElem.style.display = 'none'; }
	if(mapElem){ mapElem.style.display = ''; }
	if(listElem){ listElem.style.display = 'none'; }
	if(menuElem){ menuElem.style.display = ''; }
	if(legend){ legend.style.display = ''; }
	if(noResultsElem){ noResultsElem.style.display = 'none'; }
	byPriceWidgetManager.gridView = false;
	byPriceWidgetManager.startRender();
	if(byPriceWidgetManager.rememberView){
		var expires = new Date();
		expires.setMonth(expires.getMonth() + 12);
		setCookie('ADVView','map',expires,'/',null,null);
	}
};

var showList = function(){
	if(mapMenuElem){ mapMenuElem.className = "menuOff"; }
	if(listMenuElem){ listMenuElem.className = "menuOn"; }
	if(progressElem){ progressElem.style.display = 'none'; }
	if(mapElem){ mapElem.style.display = 'none'; }
	if(listElem){ listElem.style.display = ''; }
	if(menuElem){ menuElem.style.display = ''; }
	if(legend){ legend.style.display = 'none'; }
	if(noResultsElem){ noResultsElem.style.display = 'none'; }
	byPriceWidgetManager.gridView = true;
	byPriceWidgetManager.startRender();
	if(byPriceWidgetManager.rememberView){
		var expires = new Date();
		expires.setMonth(expires.getMonth() + 12);
		setCookie('ADVView','list',expires,'/',null,null);
	}
};

var showProgress = function(){
	if(progressElem){ progressElem.style.display = ''; }
	if(mapElem){ mapElem.style.display = 'none'; }
	if(listElem){ listElem.style.display = 'none'; }
	if(menuElem){ menuElem.style.display = 'none'; }
	if(legend){ legend.style.display = 'none'; }
	if(noResultsElem){ noResultsElem.style.display = 'none'; }
};

var showNoResults = function(){
	if(progressElem){ progressElem.style.display = 'none'; }
	if(mapElem){ mapElem.style.display = 'none'; }
	if(listElem){ listElem.style.display = 'none'; }
	if(menuElem){ menuElem.style.display = 'none'; }
	if(legend){ legend.style.display = 'none'; }
	if(noResultsElem){
		noResultsElem.style.display = '';
		noResultsElem.innerHTML = '<div class="NoResultsText">' + TXT_NO_RESULTS_MSG + '</div>';
	}
};

if(mapMenuElem){ addEvent(mapMenuElem, "click", showMap); }
if(listMenuElem){ addEvent(listMenuElem, "click", showList); }

var setCookie = function(name, value, expires, path, domain, secure){
	document.cookie = name + '=' + value +
		(expires ? '; expires=' + expires.toGMTString() : '') +
		(path ? '; path=' + path : '') +
		(domain ? '; domain=' + domain : '') +
		(secure ? '; secure' : '');
};

var attachByPriceInfoWindow = function(map, marker, html){
	var xPad = (mapElem && mapElem.offsetWidth ? (mapElem.offsetWidth-185)/2 : 3);
	xPad = Math.min(20, Math.round(xPad));
	if(map && marker){
		GEvent.addListener(marker, "click", function(){ marker.openExtInfoWindow(map, "byprice_info", html, {beakOffset:3,paddingX:xPad,paddingY:15}); });
	}
};