// JavaScript Document

//<![CDATA[

var map, clustermanager = null;
var json=[];
var marker, markersArray=[];
var newMarkersArray = [];
var zoom = 6;

var clustericon = new GIcon();
clustericon.image = "images/cluster-active.gif";
clustericon.iconSize = new GSize(21, 25);
//clustericon.shadowSize = new GSize(21, 25);
clustericon.iconAnchor = new GPoint(11, 25);
clustericon.infoWindowAnchor = new GPoint(10, 12);
//clustericon.infoShadowAnchor = new GPoint(18, 25); // NB 23.09.09

var nonclustericon = new GIcon();
nonclustericon.image = "images/house-active.gif";
nonclustericon.iconSize = new GSize(21, 25);
//nonclustericon.shadowSize = new GSize(21, 25);
nonclustericon.iconAnchor = new GPoint(11, 25);
nonclustericon.infoWindowAnchor = new GPoint(10, 12);
//nonclustericon.infoShadowAnchor = new GPoint(18, 25); // NB 23.09.09

var visitedicon = new GIcon();
visitedicon.image = "images/house-visited.gif";
visitedicon.iconSize = new GSize(21, 25);
visitedicon.shadowSize = new GSize(21, 25);
visitedicon.iconAnchor = new GPoint(11, 25);
visitedicon.infoWindowAnchor = new GPoint(10, 12);
visitedicon.infoShadowAnchor = new GPoint(18, 25); // NB 23.09.09

var managerParamsPerZoomLevel = {
	"default"	: { minMarkersPerCluster : 2 , intersectPadding : 8  },
	"9" 		: { minMarkersPerCluster : 8 , intersectPadding : 10  },				
	"10" 		: { minMarkersPerCluster : 10 , intersectPadding : 10  },				
	"11" 		: { minMarkersPerCluster : 15 , intersectPadding : 10  },				
	"12" 		: { minMarkersPerCluster : 20 , intersectPadding : 10  },
	"13" 		: { minMarkersPerCluster : 25 , intersectPadding : 10  },
	"14" 		: { minMarkersPerCluster : 30 , intersectPadding : 10  },
	"15" 		: { minMarkersPerCluster : 1000 , intersectPadding : 10  },
	"16" 		: { minMarkersPerCluster : 1000 , intersectPadding : 10  },
	"17" 		: { minMarkersPerCluster : 1000 , intersectPadding : 10  },
	"18" 		: { minMarkersPerCluster : 1000 , intersectPadding : 10  }
};

var markerImage = 
{
	"default" 		: "images/house-active.gif" ,
	"cluster"		: "images/cluster-active.gif" ,
	"clusterOver"	: "images/cluster-hover.gif" ,
	"mouseOver"		: "images/house-hover.gif" ,
	"visited"		: "images/house-visited.gif"
};

function zoomChanged(oldLevel,  newLevel)
{
	var params = managerParamsPerZoomLevel[newLevel] ? managerParamsPerZoomLevel[newLevel] : managerParamsPerZoomLevel["default"]; 

	clustermanager.minMarkersPerCluster = params.minMarkersPerCluster;
	clustermanager.intersectPadding 	 = params.intersectPadding;

	clustermanager.refresh(true);
	
	i_ve_moved_so_refresh_me(false);
}

function zoomInClick( clusterMarker , infoWindow )
{
	var infoWindow = $(infoWindow).parent();
	var ch = null;

	clustermanager.defaultMarkerClick( clusterMarker );

}

function getPosition(){
	return gApplication.getMap().getCenter();
}

function markerClick (overlay,point) 
{
	
	var markerinfothing = this;
	
	var bounds = String(map.getBounds());
	var splitt = bounds.split(',');
	var top = splitt[0].substr(2, splitt[0].length);
	var left = splitt[1].substr(1, splitt[1].length-2);
	var bottom = splitt[2].substr(2, splitt[2].length);
	var right = splitt[3].substr(1, splitt[3].length-3);

	var center = map.getCenter();
	var zoomlevel = map.getZoom();

	var center_lat = center.y;
	var center_lon = center.x;

	var checked_data = '';

	var form = document.getElementById('google_property_search');
	for(i=0; i<form.elements.length; i++)
	{
		if(form.elements[i].type=="checkbox" && form.elements[i].name.indexOf('chk_') != -1)
		{
			if(form.elements[i].checked == true){
				checked_data+=form.elements[i].name+'#';
			}
		}
	}
	
	var from = document.getElementById('start_date').value;
	var to = document.getElementById('end_date').value;
	
	if(from!='Arrival (dd/mm/yyyy)' && to!='Departure (dd/mm/yyyy)')
	{
		$.ajax(
		{
		   type: "POST",
		   url: "googleMapsInfo.php",
		   data:"propertyId="+this.location.id+"&zoomlevel="+zoomlevel+"&center_lon="+center_lon+"&center_lat="+center_lat+"&zoom="+zoomlevel+"&data="+checked_data+"&from="+from+"&to="+to,
		   success: function(msg)
		   {
				//this.openInfoWindow (point,document.createTextNode("You clicked here!"));
	
				markerinfothing.openInfoWindowHtml(msg);
				markerinfothing.visited = true;
				markerinfothing.setImage(markerImage["visited"]);
				
		   },
		   error: function(XMLHttpRequest, textStatus, errorThrown){alert(textStatus); alert(errorThrown);}
		});
	}
	else
	{
		$.ajax(
		{
		   type: "POST",
		   url: "googleMapsInfo.php",
		   data:"propertyId="+this.location.id+"&zoomlevel="+zoomlevel+"&center_lon="+center_lon+"&center_lat="+center_lat+"&zoom="+zoomlevel+"&data="+checked_data,
		   success: function(msg)
		   {
				//this.openInfoWindow (point,document.createTextNode("You clicked here!"));
	
				markerinfothing.openInfoWindowHtml(msg);
				markerinfothing.visited = true;
				markerinfothing.setImage(markerImage["visited"]);
				
		   },
		   error: function(XMLHttpRequest, textStatus, errorThrown){alert(textStatus); alert(errorThrown);}
		});
	}
	
	//var t=setTimeout("i_ve_moved_so_refresh_me(false)", 2000);

}

function getPropertyMarker( prop )
{
	
	var marker = new GMarker(new GLatLng( prop.lat , prop.lng) , { icon : nonclustericon, title : prop.title + " - click for details" } );

	marker.location = prop;
	
	GEvent.addListener(marker, "click", markerClick );
	
	GEvent.addListener(marker,'mouseover',function(point)
	{
		this.setImage( markerImage["mouseOver"] );
	});
	
	GEvent.addListener(marker,'mouseout',function(point)
	{
		if(marker.visited)
		{
			this.setImage( markerImage["visited"] );
		}
		else
		{
			this.setImage( markerImage["default"] );
		}
	});	
	return marker;
}


function initialise_getProperties(){

	var bounds = String(map.getBounds());
	var splitt = bounds.split(',');
	var top = splitt[0].substr(2, splitt[0].length);
	var left = splitt[1].substr(1, splitt[1].length-2);
	var bottom = splitt[2].substr(2, splitt[2].length);
	var right = splitt[3].substr(1, splitt[3].length-3);
	var checked_data = '';
	
	var zoomlevel = map.getZoom();
	
	var from = document.getElementById('start_date').value;
	var to = document.getElementById('end_date').value;

	var form = document.getElementById('google_property_search');
	for(i=0; i<form.elements.length; i++)
	{
		if(form.elements[i].type=="checkbox" && form.elements[i].name.indexOf('chk_') != -1)
		{
			if(form.elements[i].checked == true){
				checked_data+=form.elements[i].name+'#';
			}
		}
	}
	
	//alert(checked_data);

	if(from!='Arrival (dd/mm/yyyy)' && to!='Departure (dd/mm/yyyy)')
	{
		$.ajax(
		{
		   type: "POST",
		   url: "googleMapsGetMarkers.php",
		   data:"top="+top+"&left="+left+"&bottom="+bottom+"&right="+right+"&data="+checked_data+"&from="+from+"&to="+to+"&zoomlevel="+zoomlevel,
		   success: function(msg)
		   {
				eval(msg);
				doit();
		   }
		});
	}
	else
	{
		$.ajax(
		{
		   type: "POST",
		   url: "googleMapsGetMarkers.php",
		   data:"top="+top+"&left="+left+"&bottom="+bottom+"&right="+right+"&data="+checked_data+"&zoomlevel="+zoomlevel,
		   success: function(msg)
		   {
				eval(msg);
				doit();
		   }
		});
	}



}

function doit(){

	for (var i=0; i<json.length; i++) {

	 markersArray.push( getPropertyMarker( json[i] ) );

	}
	
	
	if(json.length==0){
	
		// if we initialise an area without any icons, we need to force the markers array
	
		var center = map.getCenter();
		var center_lat = center.y;
		var center_lon = center.x;

		json[0] = {'id':0000001, 'lat':"+center_lat+", 'lng':"+center_lon+", 'title':'tester'}
		markersArray.push( getPropertyMarker( json[0] ) );
		
	}
	
	

	var params = managerParamsPerZoomLevel[zoom] ? managerParamsPerZoomLevel[zoom] : managerParamsPerZoomLevel["default"];

	clustermanager=new ClusterMarker(map, { clusterMarkerIcon:clustericon,
									 		intersectPadding:params.intersectPadding,
											markers:markersArray,
											minMarkersPerCluster:params.minMarkersPerCluster } );

	clustermanager.fitMapToMarkers();

	//GEvent.addListener( map , "zoomend" , zoomChanged );
	//alert('added');
	//GEvent.addListener( map , "dragend" , i_ve_moved_so_refresh_me );
	//alert('added');

	document.getElementById('loading').style.display = 'none';

}

function i_ve_moved_so_refresh_me(removefrommap){

	//alert(removefrommap);

	var bounds = String(map.getBounds());
	var splitt = bounds.split(',');
	var top = splitt[0].substr(2, splitt[0].length);
	var left = splitt[1].substr(1, splitt[1].length-2);
	var bottom = splitt[2].substr(2, splitt[2].length);
	var right = splitt[3].substr(1, splitt[3].length-3);
	
	var zoomlevel = map.getZoom();

	var ids = '';
	var oldids = json;
	
	var from = document.getElementById('start_date').value;
	var to = document.getElementById('end_date').value;

	for(i=0; i<json.length; i++){
		ids += json[i].id + ',';
	}
	
	//if(ids != ''){
	
		//if(removefrommap == true){
			ids = '';
			oldids = '';
		//}
	
		json = [];
	
		var form = document.getElementById('google_property_search');
	
		var checked_data = '';
	
		for(i=0; i<form.elements.length; i++)
		{
			if(form.elements[i].type=="checkbox" && form.elements[i].name.indexOf('chk_') != -1)
			{
				if(form.elements[i].checked == true){
					checked_data+=form.elements[i].name+'#';
				}
			}
		}
	
		document.getElementById('loading').style.display = 'block';
	
		var dateinfo = '';
	
		if(document.getElementById('hidden_start').value != '' && document.getElementById('hidden_finish').value != ''){
			dateinfo = document.getElementById('hidden_start').value+'##'+document.getElementById('hidden_finish').value;
		}
		
		
		if(document.getElementById('chebs')){document.getElementById('chebs').innerHTML = "top="+top+"&left="+left+"&bottom="+bottom+"&right="+right+"&data="+checked_data+"&dateinfo="+dateinfo+"&currentids="+ids;}


		if(from!='Arrival (dd/mm/yyyy)' && to!='Departure (dd/mm/yyyy)')
		{
			$.ajax(
			{
			   type: "POST",
			   url: "googleMapsGetMarkers.php",
			   data:"top="+top+"&left="+left+"&bottom="+bottom+"&right="+right+"&data="+checked_data+"&dateinfo="+dateinfo+"&currentids="+ids+"&from="+from+"&to="+to+"&zoomlevel="+zoomlevel,
			   success: function(msg)
			   {
					//alert(msg);
					
					//if(removefrommap == true){
						clustermanager.removeMarkers();
					//}
					eval(msg);
					reloadmap(oldids);
					//alert(oldids+ ' ' + oldids.length);
			   }
			});
		}
		else
		{
			$.ajax(
			{
			   type: "POST",
			   url: "googleMapsGetMarkers.php",
			   data:"top="+top+"&left="+left+"&bottom="+bottom+"&right="+right+"&data="+checked_data+"&dateinfo="+dateinfo+"&currentids="+ids+"&zoomlevel="+zoomlevel,
			   success: function(msg)
			   {
					//alert(msg);
					//if(removefrommap == true){
						clustermanager.removeMarkers();
					//}
					eval(msg);
					reloadmap(oldids);
					//alert(oldids+ ' ' + oldids.length);
			   }
			});
			
		}
	//}
}

function reloadmap(oldids){

	newMarkersArray = [];

	for (var i=0; i<json.length; i++) {

		newMarkersArray.push( getPropertyMarker( json[i] ));

	}


	if(newMarkersArray.length != 0){

		clustermanager.addMarkers(newMarkersArray);

	}
	
	//alert(newMarkersArray.length  + ' ' + oldids.length);

	clustermanager.refresh();

	var newmarkers = json;
	
	json = [];

	//rebuild the json array with the old and new positions
	for(i=0; i<oldids.length; i++){
		json[i] = {'id':oldids[i].id, 'lat':oldids[i].lat, 'lng':oldids[i].lng, 'title':oldids[i].title};
	}
	for(o=0; o<newmarkers.length; o++){
		json[i] = {'id':newmarkers[o].id, 'lat':newmarkers[o].lat, 'lng':newmarkers[o].lng, 'title':newmarkers[o].title};
		i++;
	}
	
	var thisjson;
	
	for(i=0;i<json.length; i++){
		var newjson = json[i].id+'  ';
		thisjson += newjson;
	}

	document.getElementById('loading').style.display = 'none';

}



function myOnLoad() {
	if (GBrowserIsCompatible()) {

		var lat = document.getElementById('thelat').value;
		var lon = document.getElementById('thelong').value;
		var zoomlevel = document.getElementById('zoomlevel').value;

		zoomlevel = Number(zoomlevel);  // zoom level must be numeric, not string.

		map=new GMap2(document.getElementById('map'));
		map.setCenter(new GLatLng(lat, lon), zoomlevel, G_NORMAL_MAP);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		
		map.addMapType(G_PHYSICAL_MAP);
		map.removeMapType(G_HYBRID_MAP);
		
		map.enableScrollWheelZoom();
		
		GEvent.addListener( map , "zoomend" , zoomChanged );
		GEvent.addListener( map , "dragend" , i_ve_moved_so_refresh_me );

		initialise_getProperties();

	}
}
