var map;
var geocoder;
var coordonneesLongitude = "";
var coordonneesLatitude = "";
var messageAdressNonTrouve = "not found";
var zoom;

var userID = 0;
var adresseVoie;
var adresseCodePostal;
var adresseVille;
var adressePays;
var tabOptionsTZ = new Array(10);
var tabInfosDevise = new Array(4);
var titreLieu = "";
var lieuID = 0;
var lieuIDMaLocalisation = 0;
var lieuSysteme = 0;

var typeAffichage = "";
var flagVoieSuppr;
var adresseFiable = 0;
var codeHtmlBulle = "";

var strModifNomLieu = "";
var strAjoutNomLieu = "";
var strAjoutLieu = "";
var strMaLocalisation = "";



function geocode(voie, codePostal, ville, messageNonTrouve, messageVilleObligatoire) {
	if(ville == '') {
		alert(messageVilleObligatoire);
		return false;
	}
	if(codePostal.substr(0, 3) == '974') {
		codePostal = 'Réunion';
	}

	adresseVoie = voie;
	adresseCodePostal = codePostal;
	adresseVille = ville;
	messageAdressNonTrouve = messageNonTrouve;
	flagVoieSuppr = 0;
	
	if(geocoder == null)
		geocoder = new GClientGeocoder();
	
	geocoder.getLocations(adresseVoie+' '+adresseCodePostal+' '+adresseVille, infoAddress);
}



function infoAddress(response) {
	if(adresseVoie == "" || flagVoieSuppr == 1) zoom = 13;
	else zoom = 17;
	
	if(!response || response.Status.code != 200) {
	
		// Si la voie est renseignée, on test sans la voie
		if(adresseVoie != "" && flagVoieSuppr == 0) {
			flagVoieSuppr = 1;
			return geocoder.getLocations(adresseCodePostal+' '+adresseVille, infoAddress);
		}
		
		adresseFiable = 0;
//alert("Code erreur = "+response.Status.code);
		alert(messageAdressNonTrouve);
		map.clearOverlays();
		this.coordonneesLongitude = "";
		this.coordonneesLatitude = "";
		return dragMarker();
	}
	else {
		//adressePays = adresseVille = adresseVoie = adresseCodePostal = "";
		
		point = new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]);

		if(response.Placemark[0].AddressDetails.Country == null) //rustine
			adressePays = 'FR';
		else
			adressePays = response.Placemark[0].AddressDetails.Country.CountryNameCode;

		tabAdresse = response.Placemark[0].address.split(', ');

		if(response.Placemark[0].AddressDetails.Country == null)  //rustine
			administrativeArea = 'FR'
		else
			administrativeArea = response.Placemark[0].AddressDetails.Country.AdministrativeArea;

		if(tabAdresse.length > 4 &&
		   !administrativeArea.SubAdministrativeArea.Locality.Thoroughfare &&
		   !administrativeArea.SubAdministrativeArea.Locality.PostalCode) {
			adresseFiable = 1;
			adresseVille = tabAdresse[3];
			adresseCodePostal = tabAdresse[2];
			adresseVoie = tabAdresse[0]+', '+tabAdresse[1];
		}
		else {
			if(tabAdresse.length < 4) adresseFiable = 0;
			else adresseFiable = 1;

			if(administrativeArea && administrativeArea.SubAdministrativeArea && administrativeArea.SubAdministrativeArea.Locality) {
				if(administrativeArea.SubAdministrativeArea.Locality.Thoroughfare
				&& (temp = administrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName))
					adresseVoie = temp;
				if(administrativeArea.SubAdministrativeArea.Locality.PostalCode
				&& (temp = administrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber))
					adresseCodePostal = temp;
				if(temp = administrativeArea.SubAdministrativeArea.Locality.LocalityName)
					adresseVille = temp;
			}
		}


		// Maj de la liste des fuseaux horaires
		GDownloadUrl("/?onglet=geoTimezonesXml&latitude="+point.y+"&longitude="+point.x+"&pays="+adressePays, function(data, responseCode) {
		  var xml = GXml.parse(data);
		  var timezones = xml.documentElement.getElementsByTagName("timezone");
		  var idTimezone;
		  var codePays;

		  tabOptionsTZ = new Array(10);
		  for(i=0; i<timezones.length; i++) {
		    idTimezone = timezones[i].getElementsByTagName("idTimezone")[0].firstChild.nodeValue;
		    codePays = timezones[i].getElementsByTagName("codePays")[0].firstChild.nodeValue;
		    tabOptionsTZ[i] = new Option(idTimezone+" ("+codePays+")", idTimezone);
		  }

			// Maj du formatage de l'affichage de la devise
			GDownloadUrl("/?onglet=deviseInfosXml&pays="+adressePays, function(data, responseCode) {
				var xml = GXml.parse(data);
				var devises = xml.documentElement.getElementsByTagName("devise");

				tabInfosDevise[0] = devises[0].getElementsByTagName("codeDevise")[0].firstChild.nodeValue;
				if(devises[0].getElementsByTagName("symboleDevise")[0].firstChild != null) {
					tabInfosDevise[1] = devises[0].getElementsByTagName("symboleDevise")[0].firstChild.nodeValue;
					if(tabInfosDevise[1] == 128) tabInfosDevise[1] = "€"; // Caractere "euro" en latin-1
					else tabInfosDevise[1] = String.fromCharCode(tabInfosDevise[1]);
				}
				else
					tabInfosDevise[1] = "";
				tabInfosDevise[2] = devises[0].getElementsByTagName("facteur")[0].firstChild.nodeValue;
				tabInfosDevise[3] = devises[0].getElementsByTagName("positionSymboleDevise")[0].firstChild.nodeValue;

			  // Met à jour les champs d'adresse dans le formulaire. Cette fonction se trouve du coté html
			  majChampsAdresse();
			});
		});



		
		map.clearOverlays();
		map.setCenter(point, zoom);
		
		if(flagVoieSuppr == 0) {
			affichageBulle(point.y, point.x, response.Placemark[0].address, titreLieu);
		}
		else {
			alert(messageAdressNonTrouve);
			dragMarker();
			return false;
		}
	}
	return false;
}


// Est appelée lorsque l'on ferme la bulle d'info html: on supprime alors le marker
function closeBulle() {
	map.clearOverlays();
	this.coordonneesLongitude = "";
	this.coordonneesLatitude = "";
//	titreLieu = "";
//afficheCeFuseau();
}


// Permet de déplacer le marker à la volée
function dragMarker() {
	adresseFiable = 0;

	GEvent.addListener(map, "click", function(marker, point) {
		if(point) {
			affichageBulle(point.y, point.x, "", titreLieu);
		}
	});
	return false;
}



function affichageBulle(latitude, longitude, adresseGoogle, titreLieu) {
	this.coordonneesLongitude = longitude;
	this.coordonneesLatitude = latitude;

	if(typeAffichage == "bulleMaLocalisation") {
		// Formatage du code html de la bulle avec les données connues
		codeHtml = codeHtmlBulle.replace(/\[\[adresseGoogle\]\]/g, adresseGoogle);
		codeHtml = codeHtml.replace(/\[\[formChoixLieux\]\]/g, "");
		codeHtml = codeHtml.replace(/\[\[titreLieu\]\]/g, htmlEntities(titreLieu));

		var point = new GLatLng(latitude, longitude);
		var marker = new GMarker(point);
		map.clearOverlays();
		map.addOverlay(marker);
		GEvent.addListener(map,"infowindowclose", closeBulle); 
		marker.openInfoWindowHtml(codeHtml,{noCloseOnClick: true, onCloseFn: closeBulle});
		map.addOverlay(marker);
		return;
	}

	// le parametre "time" permet d'eviter un cache navigateur
	dateActuelle = new Date();
	GDownloadUrl("/?onglet=geoLieuxXml&latitude="+latitude+"&longitude="+longitude+"&userID="+userID+"&time="+dateActuelle.getTime(), function(data, responseCode) {
	  var xml = GXml.parse(data);
	  var lieux = xml.documentElement.getElementsByTagName("lieu");
	  var lieuID;
	  var nom;
	  var codeListeLieux = '<table class="normal" align="left"><tr><td>';
	  var codeDisabled = "";
	  
	  // Formatage du formulaire de "selection du lieu existant ou ajout d'un nouveau lieu"
		setTitreLieu("");
		lieuSysteme = 0;
	  for(var i = 0; i < lieux.length; i++) {
	    lieuID = lieux[i].getElementsByTagName("lieuID")[0].firstChild.nodeValue;
	    nom = lieux[i].getElementsByTagName("nom")[0].firstChild.nodeValue;
			if(nom == "") {
				nom = strMaLocalisation;
				lieuIDMaLocalisation = lieuID;
				if(lieuID==this.lieuID) {
          codeDisabled = "disabled";
  				lieuSysteme = 1;
        }
	  		codeListeLieux+= '<input type="radio" name="choixLieuID" value="'+lieuID+'" onclick="setTitreLieu(\''+asciiToText(nom).split("'").join("\\'")+'\', \'choixTitreLieu\', \'disabled\'), setLieuID(this.value), setLibelleNomLieu(strModifNomLieu), verifLieuSysteme()" '+(lieuID==this.lieuID?'checked':'')+'>'+nom+"<br>\n";
			}
			else
	  		codeListeLieux+= '<input type="radio" name="choixLieuID" value="'+lieuID+'" onclick="setTitreLieu(\''+asciiToText(nom).split("'").join("\\'")+'\', \'choixTitreLieu\', \'enabled\'), setLieuID(this.value), setLibelleNomLieu(strModifNomLieu), verifLieuSysteme()" '+(lieuID==this.lieuID?'checked':'')+'>'+nom+"<br>\n";

			if(lieuID==this.lieuID) setTitreLieu(nom);
	  }
	  if(lieux.length != 0)
  		codeListeLieux+= '<input type="radio" name="choixLieuID" value="0" onclick="setTitreLieu(\'\', \'choixTitreLieu\', \'enabled\'), setLieuID(this.value), setLibelleNomLieu(strAjoutNomLieu), document.getElementsByName(\'choixTitreLieu\').item(0).focus()">'+strAjoutLieu+"<br>\n";
		else
  		codeListeLieux+= strAjoutLieu+"<br>\n";

		if(getTitreLieu() == "")
			var libelleNomLieu = strAjoutNomLieu;
		else
			var libelleNomLieu = strModifNomLieu;


	  codeListeLieux+= '<span id="libelleNomLieu">'+libelleNomLieu+'</span> <input type="text" name="choixTitreLieu" size="30" maxlength="50" onblur="setTitreLieu(this.value)" value="'+getTitreLieu()+'" '+codeDisabled+'>';
//		codeListeLieux+= '<input type="button" value="OK" onclick="">';
	  codeListeLieux+= '<td><tr></table>';

	  codeListeLieux = codeListeLieux.split("$").join("$$");

		// Formatage du code html de la bulle avec les données connues
		codeHtml = codeHtmlBulle.replace(/\[\[adresseGoogle\]\]/g, adresseGoogle);
		codeHtml = codeHtml.replace(/\[\[formChoixLieux\]\]/g, codeListeLieux);
		codeHtml = codeHtml.replace(/\[\[titreLieu\]\]/g, htmlEntities(titreLieu));

		var point = new GLatLng(latitude, longitude);
		var marker = new GMarker(point);
		map.clearOverlays();
		map.addOverlay(marker);
		GEvent.addListener(map,"infowindowclose", closeBulle); 
		marker.openInfoWindowHtml(codeHtml,{noCloseOnClick: true, onCloseFn: closeBulle});
		map.addOverlay(marker);
	});
}


// Au chargement de la page, on charge la carte
function load(tabLibelles, userID, latitude, longitude, zoom, id, titre, typeAffichage) {
	if (GBrowserIsCompatible()) {
		point = new GLatLng(latitude, longitude);
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(point, zoom);
		
		this.coordonneesLatitude = latitude;
		this.coordonneesLongitude = longitude;
		this.lieuID = id;
		this.typeAffichage = typeAffichage;
		this.titreLieu = titre;
		this.userID = userID;

		if(tabLibelles != null) {
			this.strAjoutLieu = tabLibelles[0];
			this.strAjoutNomLieu = tabLibelles[1];
			this.strModifNomLieu = tabLibelles[2];
			this.strMaLocalisation = tabLibelles[3];
		}

		// Si on a désigné un lieu
		if(zoom > 10) {
			if(typeAffichage == 'marker') {
				var marker = new GMarker(point);
				map.addOverlay(marker);
				return;
			}

			if(typeAffichage == 'bulle') {
//				var point = new GLatLng(latitude, longitude);
				var marker = new GMarker(point);
				map.addOverlay(marker);
				GEvent.addListener(map,"infowindowclose", closeBulle); 
				marker.openInfoWindowHtml(titre,{noCloseOnClick: true, onCloseFn: closeBulle});
			}
			if(typeAffichage == 'bulleTitreLieu' || typeAffichage == 'bulleMaLocalisation') {
				affichageBulle(latitude, longitude, "", titre);
			}
		}
	} else {
		alert("Desole, l'API Google Maps n'est pas compatible avec votre navigateur.");
	}
}





function asciiToText(texteAscii) {
	texteAscii = texteAscii.replace(/&#0*39;/g, "'");
	return texteAscii;
}

function trim(string) {
	return string.replace(/(^\s*)|(\s*$)/g,'');
}

function latitudePoint() {
	return this.coordonneesLatitude;
}

function longitudePoint() {
	return this.coordonneesLongitude;
}

function coordonnees() {
	return "("+this.coordonneesLongitude+","+this.coordonneesLatitude+")";
}

function getAdresseVoie() {
	return adresseVoie;
}

function getAdresseCodePostal() {
	return adresseCodePostal;
}

function getAdresseVille() {
	return adresseVille;
}

function getAdressePays() {
	return adressePays;
}

function getAdresseFiable() {
	return adresseFiable;
}

function setCodeHtmlBulle(codeHtml) {
	codeHtmlBulle = '<html><head><LINK rel="stylesheet" type="text/css" href="config/style.css"></head><body>'+codeHtml+'</body></html>';
}

function verifLieuSysteme() {
	if(lieuID > 0 && lieuIDMaLocalisation == lieuID)
		lieuSysteme = 1;
	else
		lieuSysteme = 0;
}

function setTitreLieu(titre) {
	titreLieu = titre;
}

function setTitreLieu(titre, champ, option) {
	titreLieu = titre;
	if(document.getElementsByName(champ).item(0) != null) {
		document.getElementsByName(champ).item(0).value = titre;
		if(option == "disabled")
			document.getElementsByName(champ).item(0).disabled = true;
		if(option == "enabled")
			document.getElementsByName(champ).item(0).disabled = false;
	}
}

function getTitreLieu() {
	return asciiToText(titreLieu);
}

function setLieuID(id) {
	lieuID = id;
}

function getLieuID() {
	return lieuID;
}

function setLibelleNomLieu(str) {
	document.getElementById("libelleNomLieu").innerHTML=str;
}

function getLieuSysteme() {
	return lieuSysteme;
}

function getOptionsTZ(obj) {
	for(i=tabOptionsTZ.length; i>0; i--) obj[i-1] = null;
	for(i=0; i<tabOptionsTZ.length; i++)
		if(tabOptionsTZ[i]) obj[i] = tabOptionsTZ[i];
}

function getOptionsBudget(obj, str) {
	var tabOptions = str.split(',');
	var choix;
	var val, i, j;
	var strDevise;

	for(i=0; i<tabOptions.length; i++) {
		var ligneOption = tabOptions[i];
		var tabLigneOption = ligneOption.split(':');
		if(tabLigneOption[1].indexOf("|") != -1) {
			var ligneOption1 = " "+tabLigneOption[1]+" ";
			var tabLigneOption1 = ligneOption1.split('|');

			choix = "";			
			if(tabInfosDevise[1] != "") strDevise = tabInfosDevise[1];
			else {
				if(tabInfosDevise[3] == 1) strDevise = tabInfosDevise[0];
				else strDevise = tabInfosDevise[0]+" ";
			}

			for(j=0; j<tabLigneOption1.length - 1; j+=2) {
				if(tabInfosDevise[3] == 1) val = (tabLigneOption1[j+1]*tabInfosDevise[2])+" "+strDevise;
				else val = strDevise+(tabLigneOption1[j+1]*tabInfosDevise[2]);
				choix+= tabLigneOption1[j]+val;
			}
		}
		else
			var choix = tabLigneOption[1];
		if(obj[i] == null)
			obj[i] = new Option(trim(choix), tabLigneOption[0]);
		else {
			obj[i].value = tabLigneOption[0];
			obj[i].text = trim(choix);
		}
	}
}


