// declare variable used by functions
var map;
var marker;
var polyline;
var center;
var geocoder;
var address;
var listenerClickOnTrip;
var listenerClickToChange;
var listenerMarkerAdd;
var listenerDragMarker;
var listenerClickMarker;
var cluster;
var polylineEncoder;
var tripExist = false;
var latTmp;
var lngTmp;
var lastTripAdded;
var tripexistmessage;
var rg;
var listenerLoadRg;

function loadMap() { // function called by index.php when page is loaded
	if (GBrowserIsCompatible()) // check if the browser is compatible with google maps
	{
	map = new GMap2(document.getElementById("map")); // create the map on the element with id "map", in index.php
	map.enableScrollWheelZoom();
	cluster = new ClusterMarker(map);
	map.setCenter(new GLatLng(54.0,315.0), 3); // center the map on france with the appropriate zoom level
	map.addControl(new GMapTypeControl(),new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,6))); // add type control to the map
	map.addControl(new GLargeMapControl3D(),new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10,35)));
	geocoder = new GClientGeocoder(); // add define a client geocoder on the geocoder variable
	polylineEncoder = new PolylineEncoder();
	rg = new GReverseGeocoder(map);
	initMyPupop(); // init the popup windows
	rg = new GReverseGeocoder(map);
	}
}

// function to center the map on its address params
function center(zipcode,city,theaddres) {

  var address = theaddres+" "+city+" "+zipcode; // group element of address in an address variable
  top.geocoder.getLocations(address, function (response) { // try to localise the address in the world 
	  if (!response || response.Status.code != 200) { // if no address is found 
		alert(VARADRESSNOTFOUND); // show this alert message 
	  } 
	  else {// if an address exist
		center = top.map.setCenter( new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]), 15); // center the map to the adress
	  }
  });
}

function encode(trip)
{
	var vertex=trip.getVertexCount();
	var points = new Array(0);
	for (var i=0;i<=vertex-1;i++)
	{
		points[i] = trip.getVertex(i);
	}
	var encoded = polylineEncoder.dpEncode(points);
	return encoded;
}

function save(trip,type,owner)
{
	if (owner==undefined){owner=""}
	var encoded = encode(trip);
	var points = encoded.encodedPoints;
	var levels = encoded.encodedLevels;
	sendRequest2('db/tripExist.php5?encodedPoints='+encoded.encodedPoints+'&encodedLevels='+encoded.encodedLevels+'&type='+type)
}

function addTripDragDrop() {// add a polyline by drag and drop
	polyline = new GPolyline(new GLatLng(37.4419, -122.1419));
    map.addOverlay(polyline); // show the polyline    
    polyline.enableDrawing({maxVertices:2});
	listenerClickOnTrip = new GEvent.addListener(polyline, "click", function(latlng) {actionTrip(latlng);});
}

function stopAddTripDragDrop()  
{
	map.removeOverlay(polyline);
	GEvent.removeListener(listenerClickOnTrip);
	sendRequest2('menu/tripDragDrop.php5');
}

function actionTrip(latlng)
{
	markerTripInfo = new GMarker(latlng);
	markerTripInfo.getIcon().infoWindowAnchor=markerTripInfo.getIcon().iconAnchor;
	map.addOverlay(markerTripInfo);
	markerTripInfo.openInfoWindowHtml(
	"<a href='javascript:void(0);' onclick='save(polyline,2);stopAddTripDragDrop();'>"+VARSAVETRIP+"</a><br>"+
	"<a href='javascript:void(0);' onclick='polyline.enableEditing();'>"+VAREDITTRIP+"</a><br>"+
	"<a href='javascript:void(0);' onclick='stopAddTripDragDrop();map.getInfoWindow().hide();'>"+VARCANCELTRIP+"</a><br>"
	);
	markerTripInfo.hide();
}

function refreshMap()  
{
	sendRequest2('db/dbMarker.php5');
}
	
function addMarkerDragDrop() {// add a marker by drag and drop
	listenerClickToChange = new GEvent.addListener(map, "click", changeMarker);
	marker = new GMarker(center, {draggable: true});
	marker.hide();
	listenerClickMarker = new GEvent.addListener(marker, "click",  function() {infoAddress(marker);});
	listenerLoadRg = new GEvent.addListener(rg, "load", info);
}

function stopAddMarkerDragDrop()  {
	GEvent.removeListener(listenerClickToChange);
	map.removeOverlay(marker);
	GEvent.removeListener(listenerClickMarker);
	GEvent.removeListener(listenerLoadRg);
}

function changeMarker(overlay, latlng) { // change marker coordones
	if (latlng != null) { 
		address = latlng;
		geocoder.getLocations(latlng, change); // get click's coordones and call function change
	}
}

function change(response) { // change marker positionning
  if (!response || response.Status.code != 200) { // if geocoder failled to find a location
	alert(VARADRESSNOTFOUND); // show this alert message
  } else { // if geocoder succed to find a location
    map.removeOverlay(marker); // hide marker
    point = new GLatLng(response.Placemark[0].Point.coordinates[1],response.Placemark[0].Point.coordinates[0]); // define a point to the coordones
    marker.setLatLng(point,{draggable:true}); // change coordones of the marker
	map.addOverlay(marker); // show the marker
	}
}

function infoAddress(marker) { // get marker coordones
	var point = marker.getLatLng();
	rg.reverseGeocode(point)
}

function info(placemark){
	var postalcodenumber = rg.getPlacemarkProperty(placemark,"PostalCodeNumber");
	var thoroughfarename = rg.getPlacemarkProperty(placemark,"ThoroughfareName");
	var localityname = rg.getPlacemarkProperty(placemark,"LocalityName");
	showMyPopup('form/formMarker.php5?address='+thoroughfarename+'&city='+localityname+'&zipcode='+postalcodenumber,210,100);
}
		
function sendRequest2(url,mode,marker){ // call a page php in assyncron mode
	if (mode==undefined) {mode = true;}
	if (marker==undefined) {marker = false;}
	var requestHttp=getRequestHttp();
	if (requestHttp==null)
	{
		alert(VARUNABLEDTOUSEAJAX);
	}
	else
	{
		requestHttp.open('GET',url,mode);
		requestHttp.onreadystatechange=function() {response2(requestHttp,marker);};
		requestHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		requestHttp.send(null);
	}
return;
}

function getRequestHttp() {// object requestHttp

	var requestHttp;
	if (window.XMLHttpRequest)
	{	// Mozilla
		requestHttp=new XMLHttpRequest();
		if (requestHttp.overrideMimeType)
		{ // problem firefox
			requestHttp.overrideMimeType('text/xml');
		}
	}
	else
	{
		if (window.ActiveXObject)
		{	// Internet explorer < IE7
			try
			{
				requestHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e)
			{
				try
				{
					requestHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e)
				{
					requestHttp=null;
				}
			}
		}
	}
	return requestHttp;
}

function response2(requestHttp,marker) {// lesten the state of request to lunch handle when it done
	if(marker == true)document.getElementById("loading").style.display = 'block';
	if (requestHttp.readyState==4)
	{
		if (requestHttp.status==200)
		{
			if (marker==true){document.getElementById("loading").style.display = 'none';}
			handleReponse2(requestHttp.responseText);
		}
	}
}

function handleReponse2(data) {// whrite in field the last information 
	//top.eval(data); // execute the javascript code that the php page wrote ( by echo function)
	if (window.execScript) {
		window.execScript(data);
	}
	else
	{
		top.eval(data);
	}
	cluster.refresh();
	return null;
}