/**
 * Global scope
 */
var map, $_GET, gzoom = 10;
/**
 * jQuery GET request variables plugin
 * 
 * Gets an object in pair key value after "?" ex.: ?key=value&key2=value2 -> {key: value, key2: value2}
 */
$.extend({
	getUrlVars : function() {
		var vars = [], hash;
		var hashes = window.location.href.slice(
				window.location.href.indexOf('?') + 1).split('&');
		for ( var i = 0; i < hashes.length; i++) {
			hash = hashes[i].split('=');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		return vars;
	},
	getUrlVar : function(name) {
		return $.getUrlVars()[name];
	}
});
/**
 * Current page location GET variable pairs
 */
$_GET = $.getUrlVars();
/**
 * Set up our map here
 */
window.onload = function() {
	var bWidth = $(window).width();
	var wHeight = $(window).height(); // $(window).height();
	var sLeft = (bWidth - $('#wrapper').width()) / 2;
	var fHeight = $('#flash').height();
	var fWidth = $('#flash').width();
	var bbox;
	
	try {
		map = new Map(document.getElementById('flash'));
	} catch (e) {
		$('#noflash').show();
	}
	/**
	 * Set start position by geolocator or get request
	 * 
	 * 1) GET% ?lon=x&lat=y
	 * 2) Geolocator: $('#user-cords') exists
	 * 3) Default Moscow center
	 */
	if ($_GET.lon && $_GET.lat){
		bbox = {coords: {lon: $_GET.lon, lat: $_GET.lat, z: $_GET.z}};
	} else if ($('#user-cords').length) {
		var x = ($('#user-cords').text()).split(',');
		bbox = {coords: {lon: merc_x(x[1]), lat:merc_y(x[0]), z:gzoom}};
	} else {
		bbox = {coords: {lon: 4187521.87177, lat: 7473956.84308, z: gzoom}};
	}
	map.setCenter( {
		lon: bbox.coords.lon,
		lat: bbox.coords.lat,
		zoom: bbox.coords.z
	});
	/**
	 * Zoom and move callback
	 */
	function createPermaLink () {
		bbox = map.getBboxCoords();
		var c = '<h2>Постоянная ссылка на текущее место на карте</h2><p>' +
		'<input type="text" value="' +
		'http://pro-gorod.ru/maps/?z=' + bbox.coords.z + '&lon=' +bbox.coords.lon + '&lat=' + bbox.coords.lat + 
		'" style="width: 520px" />';
		return c;
	} 
	function triggerPermaLink () {
		$('#bbox').show().html(createPermaLink());
	}
	function CallBackPermaLink() {
		$('#bbox:visible').html(createPermaLink());
	}
	/**
	 * Permalink record
	 */
	$('#permalink').click(triggerPermaLink);
	map.mapMoveCallBack	= map.mapZoomCallBack = CallBackPermaLink;

	function makeResult(callback) {
		var nferror = 0;
		function notFound(t, total) {
			$('#searchClose').show();
			$('#processBar').hide();
			if (total)
				$('#searchResults').show().append('<ul><li>' + t + '</li></ul>');
		}
		function performPOI(p){
			var c;
			for (var ii in p) {
//				if ( p[ii].a_name != undefined && p[ii].b_name == undefined)  c = p[ii].a_name + ' ';
				if ( p[ii].b_name != undefined )  c = p[ii].b_name + ' ';
				if ( p[ii].c_name != undefined )  c += p[ii].c_name + ' ';	
				return c;
			}
		}
		function appendResult(head, resultsHtml) {
			$('#searchResults').show().append('<h3>' + head + '</h3><ul>' + resultsHtml + '</ul>').find('li').click(function() {
				var coord = $(this).attr('title');
				coord = coord.split(',');
				coord[0] = merc_x(coord[0]);
				coord[1] = merc_y(coord[1]);
				map.deleteGeometry('all');
				map.setCenter( {
					lon : coord[0],
					lat : coord[1],
					zoom : parseInt(coord[2])
				});
				map.createGeometry( {
					type : 'point',
					lon : coord[0],
					lat : coord[1],
					content : {
						body : $(this).text(),
						width : 200,
						height : 80,
						isClosing : true
					}
				});
			});
		}
		try {
			var zoom;
			if (callback.addr == undefined) {
				nferror++;
				notFound('По вашему запросу адреса не найдены.');
			} else {
				var resultsHtml = '';
				var head = 'Найдены адреса:';
				for ( var i in callback.addr) {
					var obj = callback.addr[i];
					if (obj.type == 1)
						zoom = 10;
					else
						zoom = 16;
					resultsHtml += '<li title="' + obj.x + ',' + obj.y + ', '
							+ obj.zoom + '">';
					resultsHtml += obj.addr;
					resultsHtml += '</li>';
				}
				appendResult(head, resultsHtml);
			}
			if (callback.poi == undefined) {
				nferror++;
				notFound('По вашему запросу POI не найдены.');
			} else {
				zoom = 16;
				var resultsHtml = '';
				var head = 'Найдены POI';
				for ( var i in callback.poi) {
					var poi = callback.poi[i];
					resultsHtml += '<li title="' + poi.x + ',' + poi.y + ', '
							+ poi.zoom + '">';
					resultsHtml += performPOI (poi.cats);
					resultsHtml += poi.name + '<br/> <span style="display: none"> ';
					if (poi.addr != undefined)
						resultsHtml += poi.addr + ' <br/> ';
					if (poi.tel != undefined)
						resultsHtml += poi.tel + ' <br/> ';
					if (poi.www != undefined)
						resultsHtml += '<a href="http://' + poi.www
								+ '" target="_blank">' + poi.www + '</a>';
					resultsHtml += '</span></li>';
				}
				appendResult(head, resultsHtml);
			}
			if (callback.addr_alt != undefined) {
				var resultsHtml = '';
				var head = 'Возможно вы имели ввиду:';
				for ( var i in callback.addr_alt) {
					var obj = callback.addr_alt[i];
					if (obj.type == 1)
						zoom = 10;
					else
						zoom = 16;
					resultsHtml += '<li title="' + obj.x + ',' + obj.y + ', '
							+ obj.zoom + '">';
					resultsHtml += obj.addr;
					resultsHtml += '</li>';
				}
				appendResult(head, resultsHtml);
			} else {
				nferror++;
			}
			if (callback.poi_alt != undefined) {
				zoom = 16;
				var resultsHtml = '';
				var head = 'Возможно вы имели ввиду POI:';
				for ( var i in callback.poi_alt) {
					var poi = callback.poi_alt[i];
					resultsHtml += '<li title="' + poi.x + ',' + poi.y + ', '
							+ poi.zoom + '">';
					resultsHtml += performPOI (poi.cats);
					resultsHtml += poi.name + '<br/> <span style="display: none"> ';
					if (poi.addr != undefined)
						resultsHtml += poi.addr + ' <br/> ';
					if (poi.tel != undefined)
						resultsHtml += poi.tel + ' <br/> ';
					if (poi.www != undefined)
						resultsHtml += '<a href="http://' + poi.www
								+ '" target="_blank">' + poi.www + '</a>';
					resultsHtml += '</span></li>';
				}
				appendResult(head, resultsHtml);
			} else {
				nferror++;
			}
			if (nferror == 4)
				notFound('По вашему запросу ничего не найдено.', 1);
			$('#processBar').hide();
			$('#searchResults li').hover(function() {
				$('>span', this).show();
			}, function() {
				$('>span', this).hide();
			});
		} catch (e) {
			alert(e);
		}
	}
	
	/**
	 * Search request
	 */
	function doRequests() {
		$('#searchResults').empty();
		$('#processBar').show();
		var req = $('#searchString').val();
		if (req == '') {
			alert('Введите запрос!');
		} else {
			map.search( {
				str : req.toLowerCase(),
				type : 'search'
			}, makeResult);
		}
	}
	/**
	 * Search via submit form by button click
	 */
	$('#searchButton').click(function() {
		doRequests();
	});
	/**
	 * Search via pressing enter; override page transition
	 */
	$('#searchMap').submit(function() {
		doRequests();
		return false;
	});
	/**
	 * Remove search results and close button
	 */
	$('#searchClose').click(function() {
		$(this).hide();
		$('#searchResults').hide().empty();
	});
	/**
	 * Show/hide fulscreen map
	 */
	$('#fullscreenMap').show().toggle(
		function() {
			$('#searchResults, #marketing-map, #searchMap, #searchClose, #marketing, #python, #permalink').hide();
			$('#flash object').css( {
				'top' : 0,
				'left' : 0,
				'bottom' : 0,
				'right' : 0,
				'height' : wHeight,
				'width' : $(document).width()
			});
			$(this).css( {
				'top' : (wHeight + 20) + 'px',
				'left' : 15
			});
		},
		function() {
			$('#searchMap, #marketing, #python, #marketing-map, #permalink').show();
			$('#flash object').css( {
				'height' : fHeight,
				'width' : fWidth,
				'left' : sLeft + 1,
				'top' : 182
			});
			if ($('#searchResults').html() != false) {
				$('#searchResults, #searchClose').show();
			}
			$(this).css( {
				'top' : 600,
				'left' : sLeft
			});
	});
}; 