var map;
var requestSent = false;
var timeout;
var icons = createIcons();
var showCountries=2;
var selObj=0;
var updatelocked=0;
var firsttime=1;
var initialized=0;
var keeplocation=0; // ma move end ponechat text v search_loc?
var html_too = 0;
var newpageno = 0;
var show_all_types = 0;

// map load se vola pro zobrazeni mapy z detailu profilu
function mapLoad(clat,clng,mapzoom,lat,lng,p_selObj,maptype) {
	if (initialized) return;
	
	if (GBrowserIsCompatible()) {
		show_all_types = 1;
		map = new GMap2(document.getElementById('googlemap'));

		map.addMapType(G_PHYSICAL_MAP)
	        var centerPoint = new GLatLng(clat, clng);
		map.setCenter(centerPoint, mapzoom);
		map.enableScrollWheelZoom();
		map.setUIToDefault();

		g_maptype = 0;
		if (maptype==1) g_maptype = G_SATELLITE_MAP;
		if (maptype==2) g_maptype = G_HYBRID_MAP;
		if (maptype==3) g_maptype = G_PHYSICAL_MAP;
		
		map.setMapType(g_maptype);

		selObj = p_selObj;
//		alert(selObj);
		
		// infoWindow = map.getInfoWindow();
		centerBeforeMove = map.getCenter();
		GEvent.addListener(map, "moveend", moveEnd);
		GEvent.addListener(map, "zoomend", zoomEnd);
		doSearch();
		initialized = 1;
	}
}

function moveEnd() {
	doSearch();
	if ($("#geo_search").val()!="Destination" && keeplocation==0) $("#geo_search").val("");
	keeplocation=0;
};


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);

};

var prevzoom=-1;

function get_filter()
{
	// pripravime filter
	filter = '';
	var inputs = document.getElementsByTagName('input'); 
	for (i=0; i<inputs.length; i++)
	{
	    if (inputs[i].name.indexOf('check_')!=0 || !inputs[i].checked) continue;
	    if (filter) filter = filter + ',';
	    a = inputs[i].name.split('_');
	    filter = filter + a[a.length-1];
	}
	return filter;
}


function doSearch() {
	if (requestSent) {
//		return;
	}


    if (updatelocked) return;

    var searchNE, searchSW;

	var zoom = map.getZoom();
//	alert(zoom);
//	if (!IsNumeric(zoom)) zoom=1;
	
	var proj = map.getCurrentMapType().getProjection();
	

	if (zoom <= 1 && prevzoom>1) showCountries=2; //uz chceme videt regiony
	if (zoom <= 3 && prevzoom>3) showCountries=1; //uz chceme videt staty
	if (zoom >= 6 && prevzoom<6) showCountries=0; //uz chceme videt detaily

	if (prevzoom<0)
	{
	    if (zoom >= 5) showCountries=0; //uz chceme videt detaily
	    else if (zoom <= 1) showCountries=2; //uz chceme videt regiony
	    else showCountries=1; //uz chceme videt staty
	}
	
	prevzoom = zoom;
	
        searchNE = map.getBounds().getNorthEast();
        searchSW = map.getBounds().getSouthWest();

        center = map.getCenter();

	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 lat = center.lat().toFixed(6);
	var lon = center.lng().toFixed(6);

	var show_countries = $("show_countries").checked;
	var typefilter = get_filter();

	// ulozime aktualni pozici do session, nespis se pak uziva jen stred a zoom a filter, ale ulozime vse
	var opt = {path: "/", duration: false};
	$.cookies.set("xnorth",lat2,opt);
	$.cookies.set("xsouth",lat1,opt);

	$.cookies.set("xeast",lon2,opt);
	$.cookies.set("xwest",lon1,opt);

	$.cookies.set("xizoom",zoom.toString(),opt);
	$.cookies.set("xclat",lat,opt);
	$.cookies.set("xclng",lon,opt);
	$.cookies.set("xfilter",typefilter,opt);

	
	var url = '/clustering?lat1=' + lat1 + '&lon1=' + lon1 + '&lat2=' + lat2 + '&lon2=' + lon2 + '&zoom=' + zoom;
	if (show_all_types) url += '&all=1';
	url += '&filter='+typefilter;
	url += '&r=' + Math.random();
//	url += '&mode=xml' 
	url += '&sort=' + $("#order1").val();
	url += '&perpage=' + $("#perpage1").val();
	url += '&show_countries=' + showCountries;
	if (newpageno) url += '&newpageno=' + newpageno;
	
//	alert(url);
	
	requestSent = true;
	//alert(url);
	$.ajax({ url: url+"&mode=xml", success: function(data) {process_result(data);}, processData: false });
	if (html_too)
	$.ajax({ url: url+"&mode=html", success: function(data) {process_html(data);}, processData: false });
	
	//var myAjax = new Ajax(url, {method: 'get', onComplete: readMarkers}).request();
	
};

function process_html(text)
{
    // rozdelime html a javascript
    ret = text.split('<---split--->');
    $("#results").html(ret[0]);
    //alert(text);
    requestSent = false;
    eval(ret[1]);
    newpageno = 1;
}

function process_result(data)
{
    //alert('ajax returned');
    map.clearOverlays() 
    // data jsou XML
//    alert(data.text);
//    var xmlString = (new XMLSerializer()).serializeToString(data);
//    alert(xmlString);
    var ecka = $(data).find('e');
    ecka.each(function(){
        process_tag_e($(this));
     });
    // kdy nema zadna m, tak zprocesime obalujici e tag
}

function process_tag_e(e)
{
    //alert(e);
    var cnt = $(e).attr('cnt');
    var cnt = 0;
    $(e).find('m').each(function(){
	process_object($(this));
        cnt++;
     });
//    alert(cnt);    
    if (cnt==0) process_object(e);
}

//**********************************************************************************************************************

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 process_object(o)
{
    var name = $(o).attr('obj_name');
//    alert(name);
    //alert(name);
    if ($(o).attr('obj_lat'))
    {
	// konkretni objekt
	//alert ('objekt');
	var point = new google.maps.LatLng(parseFloat($(o).attr('obj_lat')),parseFloat($(o).attr('obj_lon')));

	var mIcon = icons["multi"];
	var obj_type = $(o).attr('obj_type');
	
	mIcon = icons["hotel"];
	
	if ($(o).attr('obj_id')==selObj) mIcon=icons["marker"];
	
//	if (element.obj_type=="C") mIcon=icons["cruising"];
//	if (element.obj_type=="H") mIcon=icons["hotel"];
//	if (element.obj_type=="DS") mIcon=icons["ds"];

	var marker = new google.maps.Marker(point,{icon:mIcon,title:name});

	obj_lat = $(o).attr('obj_lat');
	obj_lon = $(o).attr('obj_lon');
	obj_zoom = $(o).attr('obj_zoom');
	
	resort_name = $(o).attr('resort_name');

	if ($(o).attr('obj_id')==selObj && 0==1) 
	{
	    // vybrany objekt
	    mIcon=icons["cruising"];
	    /*
	    marker.info = '<div class="map-info">'
		+ '<h3>' + name + '</h3>'
		+ '<img src="'+($(o).attr('obj_image'))+'" alt="View more information about ' + name + '" />'
		+ '<ul>';
		*/
	/*
	      if (resort_name)
	      marker.info = marker.info + '<li><a href="javascript:seeRect('+
		    $(o).attr('resort_north')+','+
		    $(o).attr('resort_south')+','+
		    $(o).attr('resort_east')+','+
		    $(o).attr('resort_west')+');">View All in '+resort_name+'</a></li>';
		*/
		
	/*
	    marker.info = marker.info 
		+ '<li><a href="/google-map-page?all=1&amp;lat='+obj_lat+'&amp;lng='+obj_lon+'&amp;zoom='+obj_zoom+'">List All in '+resort_name+'</a></li>'
		+ '</ul>'
		+ '</div>';
		*/
//		alert(marker.info);
	}
	else // jiny objekt
	
	marker.info = '<div class="map-info">'
		+ '<h3>' + name + '</h3>' 
		+ '<a href="' + $(o).attr('obj_url') + '" title="View more information about ' + name + '"><img src="'+$(o).attr('obj_image')+'" alt="View more information about ' + name + '" width="183" height="122" /></a>'
		+ '<ul><li><a href="#" onclick="seeCloser(' + obj_lat + ',' + obj_lon + ',' + obj_zoom + '); return false;">View area</a></li><li><a href="' + $(o).attr('obj_url') + '">Read more</a></li></ul><br class="cleaner" /></div>';


	GEvent.addListener(marker, "click", function() {
		updatelocked=1;
		marker.openInfoWindowHtml(this.info);
		
		window.setTimeout(function(){
		    updatelocked=0;
		},1200);
		
	});
	if ($(o).attr('obj_id')==selObj && firsttime)
	{ 
	    GEvent.trigger(marker,"click");
	    firsttime=0;
	}

	map.addOverlay(marker);
    }
    
    // kdyz je to cluster
    if ($(o).attr('avLat'))
    {
	var cnt = $(o).attr('cnt');
	var point = new google.maps.LatLng(parseFloat($(o).attr('avLat')),parseFloat($(o).attr('avLon')));
	var name =  cnt + ' properties in this location';

	var mIcon = icon9_99_999(cnt);
	var bounds = new GLatLngBounds();

	bounds.extend(new GLatLng(parseFloat($(o).attr('gridSWLat')),parseFloat($(o).attr('gridSWLon'))));
	bounds.extend(new GLatLng(parseFloat($(o).attr('gridNELat')),parseFloat($(o).attr('gridNELon'))));

	
	var marker = new google.maps.Marker(point,{icon:mIcon,title:name});
	marker.bounds = bounds;

	GEvent.addListener(marker, "click", function() {
		map.setCenter(marker.bounds.getCenter(), map.getBoundsZoomLevel(marker.bounds));
		
	});
	map.addOverlay(marker);
    }
    
    // stat+region
    if ($(o).attr('country_lat'))
    {
	var cnt = $(o).attr('profiles');
	var point = new google.maps.LatLng(parseFloat($(o).attr('country_lat')),parseFloat($(o).attr('country_lon')));
	var name = cnt + ' profile(s) in ' + $(o).attr('country_name');
	var mIcon = icon9_99_999(cnt); //icons["country"];

	var bounds = new google.maps.LatLngBounds();
	bounds.extend(point);

	bounds.extend(new google.maps.LatLng(parseFloat($(o).attr('country_north')),parseFloat($(o).attr('country_east'))));
	bounds.extend(new google.maps.LatLng(parseFloat($(o).attr('country_south')),parseFloat($(o).attr('country_west'))));

	var marker = new GMarker(point,{icon:mIcon,title:name});

	marker.type = $(o).attr('is_region')?3:2;
	marker.bounds = bounds;

	google.maps.Event.addListener(marker, "click", function() {
		if (marker.type==2) showCountries=0; // pri kliku na zem budem priste ukazovat detaily
		if (marker.type==3) showCountries=1; // pri kliku na region priste ukazovat staty
		map.setCenter(marker.bounds.getCenter(), map.getBoundsZoomLevel(marker.bounds));
		
	});
	
	map.addOverlay(marker);
    }    
}

function seeCloser(lat, lon, zoom) {
    var centerPoint = new GLatLng(lat, lon);
    map.setCenter(centerPoint, zoom);
//    see_closer_click = true;
}

function seeRect(north,south,east,west)
{
	var bounds = new GLatLngBounds();

	bounds.extend(new GLatLng(parseFloat(north),parseFloat(east)));
	bounds.extend(new GLatLng(parseFloat(south),parseFloat(west)));
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}

//**********************************************************************************************************************

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'));

	return icons;
}


