
var map;
	
var mgr;
	
var timer;

var markers= new Hashtable();
var traces= new Hashtable();
var pois= new Hashtable();
var isInfoVisible= new Hashtable();
var alarms= new Hashtable();
	
var default_icon = "rb/r-x_16_31";
var default_poi_icon = "cp/cp-x_15_31";
var default_icon_shadow = "/item_icons/pushpin/shadow-pushpin.png";
var defaulttrace_icon = "/item_icons/pushpin/grey_pushpin.png";
var defaulttrace_icon_shadow = "/item_icons/pushpin/shadow-pushpin.png";
var defaultalarm_icon = "/item_icons/alarms/warning_20x17.png";
var defaultalarm_icon_shadow = "/item_icons/alarms/shadow-warning_20x17.png";
var icon_directory = "/item_icons/";
	
var traceActive = false;

var last_alarm_date;

var geocoder = new GClientGeocoder();

var cookieName = "map";	

var AuthorizedItemsList="";

var CheckedItemHT=new Hashtable();
var CheckedItemList="";

function serializeCheckedItems()
{
	CheckedItemList="";
	var table = CheckedItemHT.keys();
	for (var i = 0; i < CheckedItemHT.size(); i++) 
	{
		CheckedItemList+=table[i];
		if (i<CheckedItemHT.size()-1) CheckedItemList+=",";
	}
	return CheckedItemList
	//alert(CheckedItemList);
}

function saveCheckedItems()
{
	createCookie(cookieName+"_chki",serializeCheckedItems(),365);
}

function updateCheckedItems(mobileid,visible)
{
	if (visible)
	{
		CheckedItemHT.set(mobileid,mobileid);
		saveCheckedItems();
		update();
		markers.get(mobileid).show();
	}
	else 
	{
		markers.get(mobileid).hide();
		CheckedItemHT.unset(mobileid);
		saveCheckedItems();
	}
}

function deserializeCheckedItems(serializedString)
{
	var reg=new RegExp("[,]", "g");
	var table=serializedString.split(reg);
	CheckedItemHT.clear();
	for (var i = 0; i <table.length; i++) 
	{
		var cb = document.getElementById("ck_"+table[i]);  
		if (cb!=null) 
		{
			CheckedItemHT.set(table[i],table[i]);
			cb.checked=true;
		}
	}
	// update the string for update function
	serializeCheckedItems();
}


function load(defaultLat, defaultLong, defaultZoom) 
  {
	if (readCookie(cookieName+"_chki")!=null) 
			deserializeCheckedItems(readCookie(cookieName+"_chki"));
  if (GBrowserIsCompatible()) 
    {
			map = new GMap2(document.getElementById("map"));
			map.setUIToDefault();
	 		map.addControl(new GOverviewMapControl());
	 		
			if (readCookie(cookieName)!=null) 
				deserializeMapState(readCookie(cookieName));
			else
				map.setCenter(new GLatLng(defaultLat, defaultLong), defaultZoom);
				
			map.setMapType(G_HYBRID_MAP);
	 		map.enableScrollWheelZoom();
	 		//mgr = new GMarkerManager(map, {trackMarkers:true}); 
    }
  }

function loadTimer() 
{
	 		timer = setInterval(update,30000);
}

// Download the data in data.xml and load it on the map. The format we
// expect is:
// <items>
//   <item lat="37.441" lng="-122.141"/>
//   <item lat="37.322" lng="-121.213"/>
// </items>
function update2()
{
	GDownloadUrl("last_location_data.php", function(data, responseCode) 
	{
		var icon;
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("item");
		for (var i = 0; i < markers.length; i++) 
		{
			display(parseInt(markers[i].getAttribute("id"),10), markers[i].getAttribute("name"),parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute("icon"),markers[i].getAttribute("date"),markers[i].getAttribute("spd"),markers[i].getAttribute("dir"),markers[i].getAttribute("alt"));
		}
	});
}

function update1()
{
	if (AuthorizedItemsList.length > 0)
	{
	new Ajax.Request("last_location_data.php", {
  method: 'post', parameters: {ItemList: AuthorizedItemsList},
  	onSuccess: function(transport) {
			var icon;
			var xml = GXml.parse(transport.responseText);
			var markers = xml.documentElement.getElementsByTagName("item");
			for (var i = 0; i < markers.length; i++) 
			{
				alert(markers[i].getAttribute("name"));
				display(parseInt(markers[i].getAttribute("id"),10), markers[i].getAttribute("name"),parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute("icon"),markers[i].getAttribute("date"),markers[i].getAttribute("spd"),markers[i].getAttribute("dir"),markers[i].getAttribute("alt"));
			}
  	}
  });
	}
}


function update()
{
	if (CheckedItemList.length > 0)
	{
		//alert("update!");
		var postData = "ItemList="+CheckedItemList
		var handleSuccess = function(o)
		{ 
	    if(o.responseText !== undefined)
	    {  
				var icon;
				var xml = GXml.parse(o.responseText);
				var markers = xml.documentElement.getElementsByTagName("item");
				for (var i = 0; i < markers.length; i++) 
				{
					//alert(markers[i].getAttribute("name"));
					display(parseInt(markers[i].getAttribute("id"),10), markers[i].getAttribute("name"),parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")), markers[i].getAttribute("icon"),markers[i].getAttribute("date"),markers[i].getAttribute("spd"),markers[i].getAttribute("dir"),markers[i].getAttribute("alt"));
				}
  		}
  	};
  	
  	var handleFailure = function(o)
  	{
			YAHOO.log("The failure handler was called.  tId: " + o.tId + ".", "info", "example");
			if(o.responseText !== undefined)
			{
				// TODO Error Handling
			}
		};

  	
  	var callback =
		{
		  success:handleSuccess,
		  failure:handleFailure,
		  argument:['foo','bar']
		};

		var request = YAHOO.util.Connect.asyncRequest('POST', "last_location_data.php", callback, postData);

  	
	
	}
}

function showInfos()
{
	
}

function display(mobileid, name, latitude, longitude, iconname, sentDate, speed, direction, altitude) 
{
	var baseIcon = new GIcon();
	// Extract icon name
	var html="<B>"+name+"</B><BR/>"+sentDate+" UTC<BR/>"+direction+"&deg;<BR/>"+speed+"km/h";
	if (iconname.length<=1)
	{
		iconname = default_icon;
	}
	iconurl = location.href + icon_directory + iconname + ".png";

	// Get icon properties
	var reg=new RegExp("[/_\.]", "g");
	var table=iconname.split(reg);
	baseIcon.shadow = location.href + icon_directory + iconname.substring(0,iconname.indexOf("-"))+"_s.png";
	baseIcon.iconAnchor = new GPoint(table[2],table[3]);
	baseIcon.infoWindowAnchor = new GPoint(15,15);
	baseIcon.infoShadowAnchor = new GPoint(table[2],table[3]);

	var icon = new GIcon(baseIcon);
	icon.image = iconurl;

	
	var point = new GLatLng(latitude, longitude);
	if (markers.containsKey(mobileid)) 
	{
		map.removeOverlay(markers.get(mobileid));
		markers.unset(mobileid);
	}
		opts = 
		{ 
			"icon": icon,
			"clickable": true,
			"labelText": name,
			"labelClass": "deviceLabel",
			"labelOffset": new GSize(4, -4)
		};

		var marker = new LabeledMarker(point, opts);
		GEvent.addListener(marker, "click", function() 
		{
			marker.openInfoWindowHtml(html);
		});
		markers.set(mobileid,marker);
		map.addOverlay(marker);
}
 
function displayTrace(mobileid, name, latitude, longitude, iconname, sentDate, speed, direction, altitude) 
{
	var baseIcon = new GIcon();
	
	// Extract icon name
	var html=""+name+sentDate+"UTC<BR/>"+direction+"&deg;  "+speed+"km/h";
	/*if (iconname.length<=1)
	{
		iconurl = location.href + defaulttrace_icon;
	}
	else
	{
		iconurl = location.href + icon_directory + iconname;
	}*/
			iconurl = location.href + icon_directory + "360/arrow_"+direction+".png";

		baseIcon.shadow = location.href + defaulttrace_icon_shadow;
		baseIcon.iconAnchor = new GPoint(10, 10);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
		baseIcon.infoShadowAnchor = new GPoint(13, 40);
		var icon = new GIcon(baseIcon);
		icon.image = iconurl;
		var point = new GLatLng(latitude, longitude);
		var opts = 
		{ 
			"icon": icon,
			"clickable": true,
			"labelText": html,
			"labelClass": "traceLabel",
			"labelOffset": new GSize(9, -40)
		};

		var marker = new LabeledMarker(point, opts);
		map.addOverlay(marker);
}

function displayStop(mobileid, name, latitude, longitude, iconname, sentDate, debut, fin) 
{
	var baseIcon = new GIcon();
	
	// Extract icon name
	var html="Arret de "+debut+" &agrave; "+fin;
	/*if (iconname.length<=1)
	{
		iconurl = location.href + defaulttrace_icon;
	}
	else
	{
		iconurl = location.href + icon_directory + iconname;
	}*/
			iconurl = location.href + icon_directory + "stop/stop.png";

		baseIcon.shadow = location.href + defaulttrace_icon_shadow;
		baseIcon.iconAnchor = new GPoint(10, 10);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
		baseIcon.infoShadowAnchor = new GPoint(13, 40);
		var icon = new GIcon(baseIcon);
		icon.image = iconurl;
		var point = new GLatLng(latitude, longitude);
		var opts = 
		{ 
			"icon": icon,
			"clickable": true,
			"labelText": html,
			"labelClass": "stopLabel",
			"labelOffset": new GSize(9, -10)
		};

		var marker = new LabeledMarker(point, opts);
		map.addOverlay(marker);
}


function showMarker(mobileid)
{
	markers.get(mobileid).show();
}

function hideMarker(mobileid)
{
	markers.get(mobileid).hide();
}

function centerOnMarker(mobileid)
{
	map.panTo(markers.get(mobileid).getPoint());
}

function setMarkerVisibility(mobileid,visible)
{
	if (visible)
	{
		markers.get(mobileid).show();
	}
	else 
	{
		markers.get(mobileid).hide();
	}
		
}


function displayCustomHistory(mobileid, color, dateFilter, timeDisplayInterval)
{
		var postData = "action=S&filter=WHERE device_id=" + mobileid + " " + dateFilter + " ORDER BY date";
		var handleSuccess = function(o)
		{ 
	    if(o.responseText !== undefined)
	    {  
			var xml = GXml.parse(o.responseText);
			var at = xml.documentElement.getElementsByTagName("location");
			var pts = [];
			var currentDate;
			var endOfTraceDate=xmlStringToDate(at[at.length-1].getElementsByTagName("date")[0].childNodes[0].nodeValue);
			var lastDate=xmlStringToDate(at[0].getElementsByTagName("date")[0].childNodes[0].nodeValue);
			var currentLat;
			var lastLat=parseFloat(at[0].getElementsByTagName("latitude")[0].childNodes[0].nodeValue);
			var currentLong;
			var lastLong=parseFloat(at[0].getElementsByTagName("longitude")[0].childNodes[0].nodeValue);
			var currentSpeed=at[0].getElementsByTagName("speed")[0].childNodes[0].nodeValue;
			var currentDirection=at[0].getElementsByTagName("direction")[0].childNodes[0].nodeValue;
			var count=1;
			var lastDateDisplay=lastDate;
//			displayTrace(parseInt(at[0].getElementsByTagName("id")[0].childNodes[0].nodeValue), "(Depart) ", lastLat, lastLong, "", dateTimeToFr(lastDate), currentSpeed, currentDirection, "");

		
			var j=0;
			for (var i = 0; i < at.length; i++) 
			{
				currentDate=xmlStringToDate(at[i].getElementsByTagName("date")[0].childNodes[0].nodeValue);
				currentLat=parseFloat(at[i].getElementsByTagName("latitude")[0].childNodes[0].nodeValue);
				currentLong=parseFloat(at[i].getElementsByTagName("longitude")[0].childNodes[0].nodeValue);
				currentSpeed=at[i].getElementsByTagName("speed")[0].childNodes[0].nodeValue;
				currentDirection=at[i].getElementsByTagName("direction")[0].childNodes[0].nodeValue;
				if ((currentDate-lastDateDisplay) > (timeDisplayInterval * 60000))
				{
//				    displayTrace(parseInt(at[i].getElementsByTagName("id")[0].childNodes[0].nodeValue), "("+count+") ", currentLat, currentLong, "", dateTimeToFr(currentDate), currentSpeed, currentDirection, "");
				    lastDateDisplay = currentDate;
				    count++;
				}
				// display stop
				if (((currentDate.getTime()-lastDate.getTime())>1200000)&&(distance(lastLat, lastLong, currentLat, currentLong)<5)) //break
				{
				    //displayStop(parseInt(at[i].getElementsByTagName("id")[0].childNodes[0].nodeValue), dateTimeToFr(currentDate), lastLat, lastLong, "", "", dateTimeToFr(lastDate), dateTimeToFr(currentDate));
				}
				// break if blank
				if (((currentDate.getTime()-lastDate.getTime())>43200000)||(distance(lastLat, lastLong, currentLat, currentLong)>50)) //break
				{
					map.addOverlay(new GPolyline(pts,"#"+color,3,"0.5"));
					j=0;
					pts = []; // disable breaks
				}
				else
				{
					pts[j]=new GLatLng(currentLat, currentLong);
					j++;
				}
				lastDate = currentDate;
				lastLat=currentLat;
				lastLong=currentLong;
			}
			map.addOverlay(new GPolyline(pts,"#"+color,3,"0.5"));
			map.setCenter(new GLatLng(currentLat,currentLong));
  	}
	};
	  	var handleFailure = function(o)
  	{
			YAHOO.log("The failure handler was called.  tId: " + o.tId + ".", "info", "example");
			if(o.responseText !== undefined)
			{
				// TODO Error Handling
			}
		};

  	
  	var callback =
		{
		  success:handleSuccess,
		  failure:handleFailure,
		  argument:['foo','bar']
		};

		var request = YAHOO.util.Connect.asyncRequest('POST', "xml/location.php", callback, postData);

	
}



function displayHistory(mobileid)
{
	var kml = new GGeoXml(location.href+"/kml_history.php?ItemList='"+mobileid+"'");
	map.addOverlay(kml);
}

 
function serializeMapState()
{
	return map.getCenter().lat() + "!" + map.getCenter().lng() + "!" + map.getZoom();
}


function deserializeMapState(serializedString)
{
	var reg=new RegExp("[!]+", "g");
	var table=serializedString.split(reg);
	map.setCenter(new GLatLng(parseFloat(table[0]), parseFloat(table[1])), parseInt(table[2],10));
}

function saveMapState()
{
	createCookie(cookieName,serializeMapState(),365);
}

function getLocationIdCoordinates(location_id)
{
	new Ajax.Request("xml/location.php", {
  method: 'post', parameters: {action: 'S', filter: 'WHERE id=' + location_id},
  	onSuccess: function(transport) {
			var icon;
			var xml = GXml.parse(transport.responseText);
			var location = xml.documentElement.getElementsByTagName("location");
			var textcoords = location[0].getElementsByTagName("latitude")[0].childNodes[0].nodeValue + "," + location[0].getElementsByTagName("longitude")[0].childNodes[0].nodeValue;
			return textcoords;
  	}
	});
}

function displayAlarm(id, alarmtype, dateraised, status, mobile, latitude, longitude) 
{
	var baseIcon = new GIcon();
	// Extract icon name
	var html="<B>"+alarmtype+"</B><BR/>"+dateraised+"<BR/>Terminal : "+mobile+"<BR/>"+status+"<BR/>";
/*	if (iconname.length<=1)
	{*/
		iconurl = location.href + defaultalarm_icon;

		baseIcon.shadow = location.href + defaultalarm_icon_shadow;
		//baseIcon.iconSize = new GSize(50, 26);
		//baseIcon.shadowSize = new GSize(37, 34);
		baseIcon.iconAnchor = new GPoint(9, 25);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
		baseIcon.infoShadowAnchor = new GPoint(18, 25);
		var icon = new GIcon(baseIcon);
		icon.image = iconurl;
	//});
	var point = new GLatLng(latitude, longitude);
	if (alarms.containsKey(id)) 
	{
		alarms.get(id).setPoint(point);
		
	}
	else
	{
		opts = 
		{ 
			"icon": icon,
			"clickable": true,
			"labelText": name,
			"labelOffset": new GSize(-6, -30)
		};

		var alarm = new LabeledMarker(point, opts);
		GEvent.addListener(alarm, "click", function() 
		{
			alarm.openInfoWindowHtml(html);
		});
		alarms.set(id,alarm);
		map.addOverlay(alarm);
		map.panTo(point);
	}
}

 
function showAlarm(id, alarmtype, dateraised, status, mobile, location_id)
{
		var postData = "action=S&filter=WHERE id=" + location_id;
		var handleSuccess = function(o)
		{ 
	    if(o.responseText !== undefined)
	    {  
			var icon;
			var xml = GXml.parse(o.responseText);
			var location = xml.documentElement.getElementsByTagName("location");
			var latitude = parseFloat(location[0].getElementsByTagName("latitude")[0].childNodes[0].nodeValue);
			var longitude = parseFloat(location[0].getElementsByTagName("longitude")[0].childNodes[0].nodeValue);
			displayAlarm(id, alarmtype, dateraised, status, mobile, latitude, longitude);
  	}
	};
		 var handleFailure = function(o)
  	{
			YAHOO.log("The failure handler was called.  tId: " + o.tId + ".", "info", "example");
			if(o.responseText !== undefined)
			{
				// TODO Error Handling
			}
		};

  	
  	var callback =
		{
		  success:handleSuccess,
		  failure:handleFailure,
		  argument:['foo','bar']
		};

		var request = YAHOO.util.Connect.asyncRequest('POST', "xml/location.php", callback, postData);


}

function xmlStringToDate(xmldate)
{
	var realDate = new Date();
	realDate.setDate(parseInt(xmldate.substr(8,2),10));
	realDate.setMonth(parseInt(xmldate.substr(5,2),10)-1);
	realDate.setFullYear(xmldate.substr(0,4));
	realDate.setHours(xmldate.substr(11,2));
	realDate.setMinutes(xmldate.substr(14,2));
	realDate.setSeconds(xmldate.substr(17,2));
	return realDate;
}

function dateToSql(dateObject)
{
	var sqlDate = dateObject.getFullYear()+"-"+ (dateObject.getMonth()+1) +"-"+ dateObject.getDate()+" "+ dateObject.getHours()+":"+dateObject.getMinutes()+":" + dateObject.getSeconds();
	return sqlDate;
}

function dateToFr(dateObject)
{
	var sqlDate = dateObject.getDate() +"/"+ (dateObject.getMonth()+1)+"/"+ dateObject.getFullYear();
	return sqlDate;
}

function dateTimeToFr(dateObject)
{
	var sqlDate = dateObject.getDate() +"/"+ (dateObject.getMonth()+1)+"/"+ dateObject.getFullYear()+" "+ dateObject.getHours()+":"+dateObject.getMinutes()+":" + dateObject.getSeconds();
	return sqlDate;
}

// distance in km
function distance(lat1, lon1, lat2, lon2)
{
	if ((lat1==lat2)&&(lon1==lon2)) return 0;
	var R = 6371; // km
	var dLat = (lat2-lat1)*(2*Math.PI)/360;
	var dLon = (lon2-lon1)*(2*Math.PI)/360; 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1*(2*Math.PI)/360) * Math.cos(lat2*(2*Math.PI)/360) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	return d;
}

function loadPois()
{
new Ajax.Request(location.href+'/xml/poi.php', {
	parameters: 'action=S',
  method: 'post',
  onSuccess: function(transport) {
   		var icon;
		var xml = GXml.parse(transport.responseText);
		var markers = xml.documentElement.getElementsByTagName("poi");
		for (var i = 0; i < markers.length; i++) 
		{
			displayPOI(parseInt(markers[i].getElementsByTagName("id")[0].firstChild.nodeValue,10), markers[i].getElementsByTagName("name")[0].firstChild.nodeValue,parseFloat(markers[i].getElementsByTagName("latitude")[0].firstChild.nodeValue), parseFloat(markers[i].getElementsByTagName("longitude")[0].firstChild.nodeValue), markers[i].getElementsByTagName("icon")[0].firstChild.nodeValue,"","","","");
		}
 
  }
  
});
}

function displayPOI(mobileid, name, latitude, longitude, iconname, info1, info2, info3, info4) 
{
	var baseIcon = new GIcon();
	// Extract icon name
	var html="<B>"+name+"</B><BR/>"+info1+"<br/>"+info2+"<br/>"+info3+"<br/>"+info4;

	if (iconname.length<=1)
	{
		iconname = default_poi_icon;
	}
	iconurl = location.href + icon_directory + iconname + ".png";

	// Get icon properties
	var reg=new RegExp("[/_\.]", "g");
	var table=iconname.split(reg);
	baseIcon.shadow = location.href + icon_directory + iconname.substring(0,iconname.indexOf("-"))+"_s.png";
	baseIcon.iconAnchor = new GPoint(table[2],table[3]);
	baseIcon.infoWindowAnchor = new GPoint(15,15);
	baseIcon.infoShadowAnchor = new GPoint(table[2],table[3]);
	
		var icon = new GIcon(baseIcon);
		icon.image = iconurl;
	//});
	var point = new GLatLng(latitude, longitude);
	if (pois.containsKey(mobileid)) 
	{
		pois.get(mobileid).setPoint(point);
	}
	else
	{
		opts = 
		{ 
			"icon": icon,
			"clickable": true,
			"labelText": name,
			"labelOffset": new GSize(-6, 0)
		};

		var marker = new LabeledMarker(point, opts);
		GEvent.addListener(marker, "click", function() 
		{
			marker.openInfoWindowHtml(html);
		});
		pois.set(mobileid,marker);
		map.addOverlay(marker);
	}
}


function removeMarkers()
{
	var idx=markers.keys();
	if (idx != null)
	{
		for(var i=0; i < idx.length; i++)
		{ //While we have more elements
			map.removeOverlay(markers.get(idx[i]));
			markers.unset(idx[i]);
		}
	}
}

function removePois()
{
	var idx=pois.keys();
	if (idx != null)
	{
		for(var i=0; i < idx.length; i++)
		{ //While we have more elements
			map.removeOverlay(pois.get(idx[i]));
			pois.unset(idx[i]);
		}
	}
}



