/*
 *	Javascript Mode unobstructive	
 *
 *  Gestion des maps google
 */
 
 
// Maps classique
function createInfoMarker(point, address) {	
		
	// Création de mini icones
	var icon = new GIcon();
	icon.image = path+"/images/puce_carte.png";
	icon.iconSize = new GSize(10, 10);
	icon.iconAnchor = new GPoint(4, 7);
	icon.infoWindowAnchor = new GPoint(5, 1);
	
	var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "click",
		function() {
			marker.openInfoWindowHtml(address);
		}
	);
  return marker;
}

function createInfoMarker2(point, address) {	
		
	// Création de mini icones
	var icon = new GIcon();
	icon.image = path+"/images/puce_carte.png";
	icon.iconSize = new GSize(10, 10);
	icon.iconAnchor = new GPoint(4, 7);
	icon.infoWindowAnchor = new GPoint(5, 1);

	var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "click",
		function() {
			marker.openInfoWindowHtml(address);
		}
	);
  return marker;
}

// Création des points de couleurs différentes
function createInfoMarker3(point, address, image) {	
		
	// Création de mini icones
	var icon = new GIcon();
	icon.image = path+"/images/"+image;
	//alert(path+"/images/"+image);
	icon.iconSize = new GSize(24, 24);
	icon.iconAnchor = new GPoint(4, 7);
	icon.infoWindowAnchor = new GPoint(5, 1);
	
	var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "click",
		function() {
			marker.openInfoWindowHtml(address);
		}
	);
  return marker;
}

// Maps avec itineraire
    
var carte;
var gdir;
var geocoder = null;
var adresse;

function initialize(depart_adresse, etape, destination_adresse, carte, code_postal) {
		
	if (GBrowserIsCompatible()) {      
    carte = new GMap2(document.getElementById('carteItineraire'));
	
									carte.addControl(new GSmallMapControl());
									carte.addControl(new GMapTypeControl());
									
		geocoder2 = new GClientGeocoder();
		gdir = new GDirections(carte);
		gdir.d = 0;
		
		gdir.departBrut = depart_adresse;
		gdir.destinationBrut = destination_adresse;
		
		var tab_cp = code_postal.split('-');
		
		if(tab_cp[0].length == 4) tab_cp[0] = '0'+tab_cp[0];
		if(tab_cp[1].length == 4) tab_cp[1] = '0'+tab_cp[1];
		
		if(tab_cp[0] != '') {
			GDownloadUrl(path+'/include/xhr_departement.php?cp1='+tab_cp[0]+'&cp2='+tab_cp[1], function(data, responseCode) {			
				var xml = GXml.parse(data);
				var rs = xml.documentElement.getElementsByTagName("result");
				
				var reg=new RegExp(",France", "g");
				
				for (var i = 0; i < rs.length; i++) {
					if(i==0) gdir.depart_adresse = depart_adresse.replace(reg,','+rs[i].getAttribute("id")+',France');
					else gdir.destination_adresse = destination_adresse.replace(reg,','+rs[i].getAttribute("id")+',France');
				}
				
				
			});
		}
				
    GEvent.addListener(gdir, 'load', onGDirectionsLoad);
    GEvent.addListener(gdir, 'error', handleErrors);

    setDirections(depart_adresse, etape, destination_adresse, 'fr');
  }
}
    
function setDirections(fromAddress, etape,  toAddress, locale) {
	//alert('from: ' + fromAddress + ' '+etape+' to ' + toAddress);
  gdir.load('from: ' + fromAddress + ' '+etape+' to: ' + toAddress, { 'locale': locale });
}

function handleErrors(){
	if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS) {
		
		var dg = gdir.depart_adresse;
	
		switch(gdir.d) {
			case 0 : // On ajoute le nom du departement 
				gdir.d = 1;
				setDirections(gdir.depart_adresse, '', gdir.destination_adresse, 'fr');
				break;
			case 1 : // On injecte "rue"
				gdir.d = 2;
				// On recherche si il y a une numéro devant
				
				if(!gdir.depart_adresse || !gdir.destination_adresse) {
					chercheVille(gdir.departBrut);	
					gdir.d = 10;
					break;
				}
				
				var c1 = gdir.depart_adresse.split(' ');
				var d1 = gdir.destination_adresse.split(' ');
				
				if(isNaN(c1[0]) == true) var c = 'rue '+gdir.depart_adresse;
				else var c = gdir.depart_adresse.replace(c1[0],c1[0]+' rue ');
																									
				if(isNaN(d1[0]) == true) var d = 'rue '+gdir.destination_adresse;
				else var d = gdir.destination_adresse.replace(d1[0],d1[0]+' rue ');
				
				setDirections(c, '', d, 'fr');
				break;
			case 2 : 
				gdir.d = 3;
				// On injecte "rue"
				// On recherche si il y a une numéro devant
				var c1 = gdir.depart_adresse.split(' ');
				var d1 = gdir.destination_adresse.split(' ');
				
				if(isNaN(c1[0]) == true) var c = 'Avenue '+gdir.depart_adresse;
				else var c = gdir.depart_adresse.replace(c1[0],c1[0]+' Avenue ');
																									
				if(isNaN(d1[0]) == true) var d = 'Avenue '+gdir.destination_adresse;
				else var d = gdir.destination_adresse.replace(d1[0],d1[0]+' Avenue ');
				
				setDirections(c, '', d, 'fr');				
				break;				
			case 3 : 
				// On injecte "rue"
				gdir.d = 4;
				// On recherche si il y a une numéro devant
				var c1 = gdir.depart_adresse.split(' ');
				var d1 = gdir.destination_adresse.split(' ');
				
				if(isNaN(c1[0]) == true) var c = 'Routes '+gdir.depart_adresse;
				else var c = gdir.depart_adresse.replace(c1[0],c1[0]+' Routes ');
																									
				if(isNaN(d1[0]) == true) var d = 'Routes '+gdir.destination_adresse;
				else var d = gdir.destination_adresse.replace(d1[0],d1[0]+' Routes ');
				
				setDirections(c, '', d, 'fr');
				
				break;
			case 4 : 
				gdir.d = 5;
				chercheVille(gdir.depart_adresse);
				break;
			default : 
				alert('Veuillez nous excuser pour le soucis momentanée d\'affichage de la carte');
		}
	}
	else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	  alert('Erreur dans la geolocalisation du point, la raison de cette erreur est inconnue. Code erreur: ' + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	  alert('Le parametre HTTP est soit manquant, soit mauvais.Pour une bonne requete, entrez une adresse non nulle. Code erreur: ' + gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert('The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons. Error code: ' + gdir.getStatus().code);
	     
	else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	  alert('La clé fournie est invalide ou ne fonctionne pas pour ce domaine. Code erreur: ' + gdir.getStatus().code);

	else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	  alert('Le trajet demande n\'a pas pu etre traite. Code erreur: ' + gdir.getStatus().code);
	    
	else {
		if(gdir.d != 1) {			
			switch(gdir.d) {
				case 10 : 
					// On tente une recherche par ville
					var tabA = gdir.departBrut.split('(');
					var tabB = gdir.destinationBrut.split('(');
																							 
					var a = tabA[0].replace(',France','');
					var b = tabB[0].replace(',France','');
					
					setDirections(a+', france', '', b+', france', 'fr');				
					break;				
				case 11 : 
					gdir.d = 12;
					chercheVille(gdir.departBrut);				
					break;
				case 12 : 
					gdir.d = 13;
					chercheVille(gdir.destinationBrut);				
					break;				
				case 13 : 
					alert('Désolé, localisation impossible pour '+gdir.destinationBrut);
					break;
				default: 
					gdir.d = 10;
					
					// On tente une recherche par ville
					var a = gdir.departBrut.split('(');
					var b = gdir.destinationBrut.split('(');
					
					setDirections(a[0], '', b[0], 'fr');
			}
		}
	}
	   
}

function chercheVille(ville) {
	var ville = ville.replace(',France','');
	
	geocoder2.getLocations(ville+', france', addAddressToMap);
}

function addAddressToMap(response) {
      //carte.clearOverlays();
      if (!response || response.Status.code != 200) {
        alert("Désolé, localisation impossible");
      } else {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
				ville = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
				carte2 = new GMap2(document.getElementById('carteItineraire'));
				carte2.setCenter(point, 13);	
				carte2.addControl(new GSmallMapControl());
				carte2.addControl(new GMapTypeControl());
				
				carte2.addOverlay(createInfoMarker(point, ville));
      }
    }
 
function onGDirectionsLoad() {
  var km = gdir.getDistance().meters/1000;
  var miles = gdir.getDistance().meters/1609.344;
  document.getElementById("distance").innerHTML=km+" km";
} 

