

var map;
var requestSent = false;
var icons = createIcons();
var polygons = Array();
var properties = Array();
var clusters = Array();
var pixelThreshold = 256;
var infoWindow;
var centerBeforeMove;
var timeout;
var updatelocked=0;
var keeplocation=0; // ma move end ponechat text v search_loc?

function load() {
	doLoad();
}


function doLoad() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById('map'));
		map.addMapType(G_PHYSICAL_MAP)
		map.setCenter(centerPoint, zoom);
		map.enableScrollWheelZoom();

		map.addControl(new GScaleControl());
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		
		// infoWindow = map.getInfoWindow();
		centerBeforeMove = map.getCenter();
		GEvent.addListener(map, "moveend", moveEnd);
		GEvent.addListener(map, "zoomend", zoomEnd);
	}
}



function moveEnd() {
/*
	var proj = map.getCurrentMapType().getProjection();
	var zoom = map.getZoom();
	
	var centerAfterMove = map.getCenter();
    var beforePx = proj.fromLatLngToPixel(centerBeforeMove, zoom);
	var afterPx = proj.fromLatLngToPixel(centerAfterMove, zoom);
	var d = Math.sqrt(Math.pow((beforePx.x - afterPx.x),2) + Math.pow((beforePx.y - afterPx.y),2));
	if (zoom > 3 && d < pixelThreshold) {
		return;
	}	
	centerBeforeMove = centerAfterMove;*/
	if ($("search_loc").value!="Type destination" && keeplocation==0) $("search_loc").value = "";
	keeplocation=0;
	doSearch();
	//zoomEnd();
};


function zoomEnd(oldZ,zoom) {
	keeplocation=1;
	var centerBeforeMove = map.getCenter();

    // Limit the zoomend event firing multiple times when zooming with the mouse wheel.
	if (timeout) {
		window.clearTimeout(timeout);
	}
	timeout = window.setTimeout(function(){
		doSearch();
	},200);

};



function doSearch()
{
    if (updatelocked) return;
    doSearch2("xml");
    doSearch2("html");
    state_save();
}

var prevzoom=0;

function doSearch2(mode) {
	if (requestSent) {
//		return;
	}

    var searchNE, searchSW;

	var zoom = map.getZoom();
	var proj = map.getCurrentMapType().getProjection();
	
	
	if (zoom <= 3 && prevzoom>3) $("show_countries").checked=true;
	if (zoom >= 6 && prevzoom<6) $("show_countries").checked=false;
	prevzoom = zoom;
	
	if (zoom > 333) {
    	var NEPx = proj.fromLatLngToPixel(map.getBounds().getNorthEast(), zoom);
    	var tileNEPx = new GPoint(NEPx.x - (NEPx.x % 256) + 256,NEPx.y - (NEPx.y % 256));
    	searchNE = proj.fromPixelToLatLng(tileNEPx,zoom);
    
    	var SWPx = proj.fromLatLngToPixel(map.getBounds().getSouthWest(), zoom);
    	var tileSWPx = new GPoint(SWPx.x - (SWPx.x % 256),SWPx.y - (SWPx.y % 256) + 256);
    	searchSW = proj.fromPixelToLatLng(tileSWPx,zoom);
    
    } else {
        searchNE = map.getBounds().getNorthEast();
        searchSW = map.getBounds().getSouthWest();
    }
  
	var lat1 = searchSW.lat().toFixed(6);
	var lon1 = searchSW.lng().toFixed(6);
	var lat2 = searchNE.lat().toFixed(6);
	var lon2 = searchNE.lng().toFixed(6);

	var h = $("check_h").checked;
	var c = $("check_c").checked;
	var ds = $("check_ds").checked;
	var adv = $("check_adv").checked;
	var show_countries = $("show_countries").checked;
	
	var q = $("search_q").value;
	if (q=='Search in Map') q='';
	//alert(q);

	var url = '/clustering?lat1=' + lat1 + '&lon1=' + lon1 + '&lat2=' + lat2 + '&lon2=' + lon2 + '&zoom=' + zoom;
	url += '&h=' + h;
	url += '&c=' + c;
	url += '&ds=' + ds;
	url += '&adv=' + adv;
	url += '&q=' + q;
	url += '&r=' + Math.random();
	url += '&mode=' + mode;
	url += '&sort=' + $("order1").value;
	url += '&perpage=' + $("perpage1").value;
	if (newpageno) url += '&newpageno=' + newpageno;
	url += '&show_countries=' + show_countries;
	
	requestSent = true;
	if (mode=='html')
	    var myAjax = new Ajax(url, {method: 'get', onComplete: readHTML}).request();
	else
	    var myAjax = new Ajax(url, {method: 'get', onComplete: readMarkers}).request();
	
};

function readHTML()
{
	var text = this.response.text;
	// rozdelime html a javascript
	ret = text.split('<---split--->');
	$("result").innerHTML=ret[0];
	//alert(text);
	requestSent = false;
	eval(ret[1]);
	newpageno = 1;
}

function clearMarkers(){
	var marker = properties.shift();
	while (marker) {
		map.removeOverlay(marker);
		marker = properties.shift();
	}
	var marker = clusters.shift();
	while (marker) {
		map.removeOverlay(marker);
		marker = clusters.shift();
	}
	var poly = polygons.shift();
	while (poly) {
		map.removeOverlay(poly);
		poly = polygons.shift();
	}
}

function readMarkers() {
    
	var xml = this.response.xml;
	requestSent = false;
	clearMarkers();
	var propCount = 0;

	var elements = xml.documentElement.getElementsByTagName('e');
    var declusterLimit = 1;

	for (var i = 0; i < elements.length; i++) {
	    
		var element = parseElement(elements[i])
        
		// Element is a cluster
		if (typeof element.gridSWLat != 'undefined') {
			if (parseInt(element.cnt) > declusterLimit) {
				var marker = parseCluster(element);
				clusters.push(marker)
				map.addOverlay(marker);
				propCount += parseInt(element.cnt);
			}
			else {
				var sMarkers = elements[i].getElementsByTagName('m');
				for (var s = 0; s < sMarkers.length; s++) {
					var element = parseElement(sMarkers[s]);
					var marker = parseMarker(element);
					properties.push(marker)
					map.addOverlay(marker);
					
				}
			}
		}
		// Element is a property
		else if (typeof element.obj_name != 'undefined') {
			var marker = parseMarker(element);
			properties.push(marker)
			map.addOverlay(marker);
			if (element.obj_id==Cookie.get("xobject_id"))
			{
			    updatelocked=1;
			    marker.openInfoWindowHtml(marker.info);
			    window.setTimeout(function(){
				updatelocked=0;
			    },1200);
			}
		}

		// marker pro mesto+stat
		else if (typeof element.country_lat != 'undefined') {
			var marker = parseCountryMarker(element);
			properties.push(marker)
			map.addOverlay(marker);
			
		}
		
	}
	
    // priste uz bublinu neukazuj
    var opt = {path: "/", duration: false};
    Cookie.set("xobject_id","-1",opt);
}


function parseElement(elem) {
	var str = '';
	str += '{';
	var attrs = elem.attributes;
	for ( var n = 0; n < attrs.length ; n++) {
		val = attrs[n].value;
		// proc to escapovani nefunguje?
		val = val.replace(/""/g,' ');
		val = val.replace(/''/g,' ');
		str += attrs[n].name + ': "' + val + '",';
	}
	str = str.replace(/,$/,"");
	str += '}';
//	alert(str);
	return element = eval("(" + str + ")");

}


function parseCluster(element) {	
	if (element.avLat && element.avLon) {
		var point = new GLatLng(parseFloat(element.avLat),parseFloat(element.avLon));
		var markerName = element.cnt + ' properties in this location';
		//var mIcon = icons["cluster"];
		var mIcon = icon9_99_999(element.cnt);
		var bounds = new GLatLngBounds();
		bounds.extend(new GLatLng(parseFloat(element.gridSWLat),parseFloat(element.gridSWLon)));
		bounds.extend(new GLatLng(parseFloat(element.gridNELat),parseFloat(element.gridNELon)));
		
		var marker = createMarker(point,markerName,'',mIcon,bounds,0);
		return marker;
	}
}

function seeCloser(lat, lon, zoom) {
    var centerPoint = new GLatLng(lat, lon);
    map.setCenter(centerPoint, zoom);
    see_closer_click = true;
}
function icon9_99_999(cnt)
{
	var icon32 = new GIcon();
	icon32.iconSize = new GSize(30,31);
	icon32.iconAnchor = new GPoint(1,33);
	icon32.infoWindowAnchor = new GPoint(16,8);
	icon32.shadow = "/images/icons/XO-marker-shadow.png";
	
	fn = cnt;
	if (cnt<10) fn='00'+cnt;
	else if (cnt<100) fn='0'+cnt;
	
	//fn = '001';
	icon32.image='/images/icons/999/'+fn+".png";
	return icon32;
}

function parseMarker(element) {
	var point = new GLatLng(parseFloat(element.obj_lat),parseFloat(element.obj_lon));

    function commasToBR(str) {
        var new_str = str.replace(/,/g, "<br />");
        return new_str;
    } 
    
	var info = '<div class="map-info">'
		+ '<h3>' + element.obj_name + '</h3>' 
		+ '<a href="' + element.obj_url + '" title="View more information about ' + element.obj_name + '"><img src="'+element.obj_image+'" alt="View more information about ' + element.obj_name + '" /></a>'
		+ '<ul><li><a href="#" onclick="seeCloser(' + element.obj_lat + ',' + element.obj_lon + ',' + element.obj_zoom + '); return false;">View area</a></li><li><a href="' + element.obj_url + '">Read more</a></li></ul></div>';
	 
	var markerName = element.obj_name;
	var mIcon = icons["multi"];
	
	if (element.obj_type=="C") mIcon=icons["cruising"];
	if (element.obj_type=="H") mIcon=icons["hotel"];
	if (element.obj_type=="DS") mIcon=icons["ds"];
//	alert(element.obj_type);
	var marker = createMarker(point,markerName,info,mIcon,null,1);
	marker.info = info;
	return marker;
}

function parseCountryMarker(element) {
	var point = new GLatLng(parseFloat(element.country_lat),parseFloat(element.country_lon));
	var markerName = element.profiles + ' profile(s) in ' + element.country_name;
	var mIcon = icon9_99_999(element.profiles); //icons["country"];
	var bounds = new GLatLngBounds();
	//bounds.extend(point);

	bounds.extend(new GLatLng(parseFloat(element.country_north),parseFloat(element.country_east)));
	bounds.extend(new GLatLng(parseFloat(element.country_south),parseFloat(element.country_west)));

//	var marker = createMarker(point,markerName,"",mIcon,bounds,/*element.country_zoom*/map.getZoom()+1);
	var marker = createMarker(point,markerName,"",mIcon,bounds,element.is_region?3:2);
	return marker;
}


function createMarker(point,markerName,info,mIcon,bounds,type,zoom) {
	var marker = new GMarker(point,{icon:mIcon,title:markerName});
	marker.markerName = markerName;
	marker.type=type;
	
	if (info) {
		GEvent.addListener(marker, "click", function() {
			updatelocked=1;
			marker.openInfoWindowHtml(info);
			
			window.setTimeout(function(){
			    updatelocked=0;
			},1200);
			
		});
		
		var infowindowclose = GEvent.addListener(marker, "infowindowclose", function() {
		    if (point.distanceFrom(map.getCenter()) < 1.0) {
			    marker.openInfoWindowHtml(info);
			    GEvent.removeListener(infowindowclose);
			}
		});
	}
	if (bounds) {
		marker.bounds = bounds;
		marker.zoom = zoom;
		GEvent.addListener(marker, "click", function() {
			if (type==2) $("show_countries").checked=false; // pri kliku na zem budem priste ukazovat detaily
			if (type==3) $("show_countries").checked=true; // pri kliku na region priste ukazovat staty
			map.setCenter(marker.bounds.getCenter(), marker.zoom?marker.zoom:map.getBoundsZoomLevel(marker.bounds));
		});
	}

	return marker;
};


function createIcons() {
	var baseIcon32 = new GIcon();
	baseIcon32.iconSize = new GSize(30,31);
	baseIcon32.iconAnchor = new GPoint(1,33);
	baseIcon32.infoWindowAnchor = new GPoint(16,8);
	baseIcon32.shadow = "/images/icons/XO-marker-shadow.png";
	
	var icons = Array();

	//icons["cluster"] = (new GIcon(baseIcon32, '/images/icons/XO-cluster.png'));
	icons["marker"] = (new GIcon(baseIcon32, '/images/icons/XO-marker.png'));
	icons["country"] = (new GIcon(baseIcon32, '/images/icons/XO-country.png'));
	icons["city"] = (new GIcon(baseIcon32, '/images/icons/XO-city.png'));

	icons["hotel"] = (new GIcon(baseIcon32, '/images/icons/ico-hotel.png'));
	icons["cruising"] = (new GIcon(baseIcon32, '/images/icons/ico-cruising.png'));
	icons["ds"] = (new GIcon(baseIcon32, '/images/icons/ico-ds.png'));

/*
	baseIcon32.shadow = "/images/icons/m9-stin.png";
	icons["m9"] = (new GIcon(baseIcon32, '/images/icons/m9.png'));

	baseIcon32.shadow = "/images/icons/m99-stin.png";
	icons["m99"] = (new GIcon(baseIcon32, '/images/icons/m99.png'));

	baseIcon32.shadow = "/images/icons/m999-stin.png";
	icons["m999"] = (new GIcon(baseIcon32, '/images/icons/m999.png'));
*/	
	return icons;
}



function unload() {
	GUnload();
}





function doSearchLoc()
{
	var url = '/clustering?';
	url += 'search_loc=' + encodeURIComponent($("search_loc").value);

	var myAjax = new Ajax(url, {method: 'get', onComplete: doSearchLocDone}).request();
	
};

function doSearchLocDone()
{
    var text = this.response.text;
    // rozdelime na casti
    a = text.split('|');
    if (a[0]=='+')
    {
	lat = a[1];
	lng = a[2];
	zoom = a[3];
	north = a[4]
	south = a[5];
	east = a[6]; 
	west = a[7];
	
	if (a[8]=='T') 
	{
	    if (zoom<4) zoom=11;
	}
	else
	{
	    if (zoom<4) zoom=6;
	}
	
	if (north!=0) //kdyz nejsou hrany, pojedem postaru podle zoomu
	{
	    var bounds = new GLatLngBounds();
	    //alert(north+" " +east);
	    bounds.extend(new GLatLng(parseFloat(north),parseFloat(east)));
	    bounds.extend(new GLatLng(parseFloat(south),parseFloat(west)));
	    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	}
	else map.setCenter(new GLatLng(lat, lng), zoom); 
	doSearch()
	//alert('a');
    }
    else alert('The location name entered was not found. Please use the Fulltext Search in the right hand side of the header.');
}

function state_save()
{
    var opt = {path: "/", duration: false};
	
    // ulozime stav filtru a pozici mapy
    center = map.getCenter();
    Cookie.set("xclat",center.lat(),opt);
    Cookie.set("xclng",center.lng(),opt);
    Cookie.set("xizoom",map.getZoom(),opt);

    Cookie.set("xcb_h",($("check_h").checked)?1:0,opt);
    Cookie.set("xcb_c",($("check_c").checked)?1:0,opt);
    Cookie.set("xcb_ds",($("check_ds").checked)?1:0,opt);

    Cookie.set("xshow_countries",($("show_countries").checked)?1:0,opt);

    var opt = {path: "/", duration: false};
//    Cookie.set("xobject_id","-1",opt);

//    alert(map.getZoom());
}
