/**
 * Librairie Javascript, gestion des GoogleMap
 *
 *
 * @category     lib
 * @package      kalon
 * @author       Stéphane Péron
 * @version      1.1
 * @date         2008-06-17
 * 
 * 1.1 : - prise en charge de la propriété effacerPoints de la carte : si = true, seuls les points correspondant à la zone sélectionnée sont affichées.
 *       - propriété labelCarteComplete pour choisir l'intitulé de la première option du select de changement de zone.
 */

function saveMarkerPos(marker,nomChamp)
{
	if(!marker.getLatLng || !nomChamp)
		return;
	var ll=marker.getLatLng();
	var champ=document.getElementsByName(nomChamp)[0];
	if(champ)
		champ.value=ll.lat()+"|"+ll.lng();
}

/*
	Ajoute les points des zones de tabZones sur la carte
		point.pos = position du point sur la carte (latitude|longitude)
		point.url = URL appelée en AJAX pour obtenir le descriptif du point à afficher dans la bulle
		point.param = paramètres passés à la requête AJAX
*/
function ajouterPoints(carte,tabZones,nomZone)
{
	for(var zone in tabZones) {
		if(nomZone && nomZone!=zone) continue;  // si un nom de zone est donné, on ajoute uniquement les points de cette zone
		var tabZone = tabZones[zone];
		for(var i in tabZone) {
			var point = tabZone[i];
			if(! point.pos)
				continue;
			var tabCoord = point.pos.split("|");
			var ll=new google.maps.LatLng(tabCoord[0],tabCoord[1]);
			var marker=new google.maps.Marker(ll,{draggable:false});
			
			if(point.url) {
				marker.ll = ll;
				marker.url = point.url;
				marker.param = point.param;				
				google.maps.Event.addListener(marker, 'click', function()
				{
					ajaxpack.ll=this.ll;
					ajaxpack.carte = carte;
					ajaxpack.getAjaxRequest(this.url,this.param, donneReponseHTML, "xml")
					//carte.openInfoWindowHtml(this.ll,ajaxpack.getAjaxRequest(this.url,this.param, donneReponseHTML, "xml"));
				});
			}
			carte.addOverlay(marker);
			if(! carte.tabPoints[zone]) carte.tabPoints[zone] = new Array();
			carte.tabPoints[zone].push(marker);
		}
	}
}

// si nomZone=false, tous les points sont affichés, sinon seuls les points de la zone sont utilisés pour le centrage de la carte
function calerCarte(carte,posDefaut,tabZones,nomZone)
{
	var minLat=181,minLon=91,maxLat=-181,maxLon=-91;
	var nbPoints = 0;
	
	if(carte.effacerPoints) {  // masquer les points qui ne correspondent pas à la zone sélectionnée		
		for(var zone in carte.tabPoints) {
			if(zone == nomZone || nomZone == "") {
				for(var i = 0;i<carte.tabPoints[zone].length;i++) carte.tabPoints[zone][i].show();
			}
			else {
				for(var i = 0;i<carte.tabPoints[zone].length;i++) carte.tabPoints[zone][i].hide();
			}
		}
	}
	
	for(var zone in tabZones) {
		if(nomZone && nomZone!=zone) continue;  // si un nom de zone est donné, on cale par rapport aux points de cette zone uniquement
		var tabZone = tabZones[zone];
		for(var i in tabZone) {
			var point = tabZone[i];
			if(! point.pos)
				continue;
				
			var tabCoord = point.pos.split("|");
			minLat = Math.min(minLat,tabCoord[0]);
			maxLat = Math.max(maxLat,tabCoord[0]);
			minLon = Math.min(minLon,tabCoord[1]);
			maxLon = Math.max(maxLon,tabCoord[1]);
			
			nbPoints++;
		}
	}
	
	if(nbPoints>1) {	
		var deltaLat = (maxLat-minLat)*0.05;
		var deltaLon = (maxLon-minLon)*0.05;
		maxLat = Math.min(180,maxLat+deltaLat);
		minLat = Math.max(-180,minLat-deltaLat);
		maxLon = Math.min(90,maxLon+deltaLon);
		minLon = Math.max(-90,minLon-deltaLon);
		var region = new google.maps.LatLngBounds(new google.maps.LatLng(minLat,minLon),new google.maps.LatLng(maxLat,maxLon));
		var zoom = carte.getBoundsZoomLevel(region);
		var centre = region.getCenter()
		carte.navigEnCours = true;
		carte.setCenter(centre,zoom);
	}
	else {
		var tabPosDef=posDefaut.split("|"); // 0=latitude, 1=longitude, 2=zoom
		
		tabPosDef[0]=Number(tabPosDef[0]);
		tabPosDef[1]=Number(tabPosDef[1]);
		tabPosDef[2]=Number(tabPosDef[2]);
		
		carte.navigEnCours = true;
		
		if(nbPoints==1) carte.setCenter(new google.maps.LatLng(minLat,minLon), tabPosDef[2]);  // centré sur unique point, zoom par défaut
		else carte.setCenter(new google.maps.LatLng(tabPosDef[0],tabPosDef[1]), tabPosDef[2]);  // aucun point, position par défaut définie dans l'objetChamp
	}
}

function initCarte(carte,posDefaut,tabZones)
{
	var n=0;
	for(var i in tabZones) n++;
	if(n>1 && carte.affMenuZone)	carte.addControl(new selZoneControl(carte,tabZones));
	calerCarte(carte,posDefaut,tabZones,false);
	// l'appel de calerCarte doit se faire avec nomZone=false, pour afficher tous les points au départ.
	carte.tabPoints = new Array();
	ajouterPoints(carte,tabZones,"");
	carte.enableScrollWheelZoom();
	carte.savePosition();
	carte.posDefaut = posDefaut;
	carte.navigEnCours = false; // utilisé lorsque changement de position de la carte depuis le select Zones
}

//////////////////////////////////////////
// Réponse Ajax
function donneReponseHTML()
{
	var myajax=ajaxpack.ajaxobj
	if (myajax.readyState == 4){ //if request of file completed
		if (myajax.status==200 || window.location.href.indexOf("http")==-1){ //if request was successful or running script locally
			var code = myajax.responseText;
			if(ajaxpack.carte && ajaxpack.ll) {
				ajaxpack.carte.openInfoWindowHtml(ajaxpack.ll,code);
			}
		}
	}
}

////////////////////////////////////////////////////////
// Controle de sélection de zone
//------------------------------

// We define the function first
function selZoneControl(carte,tabZones)
{
	this.tabZones=tabZones;
	this.carte=carte;
}

// To "subclass" the GControl, we set the prototype object to
// an instance of the GControl object
selZoneControl.prototype = new google.maps.Control();

// Creates a one DIV for each of the buttons and places them in a container
// DIV which is returned as our control element. We add the control to
// to the map container and return the element for the map class to
// position properly.
selZoneControl.prototype.initialize = function(map)
{
	var container = document.createElement("div");
	
	var sel=document.createElement("select");
	sel[0]=new Option(this.carte.labelCarteComplete,"");
	var indice=1;
	for(var i in this.tabZones) {
		sel[indice++]=new Option(i,i);
	}
	
	sel.carte=this.carte;
	sel.tabZones=this.tabZones;
	google.maps.Event.addDomListener(sel, "change", function()
	{
		if(this.selectedIndex>=0) {
			var valeur = this.options[this.selectedIndex].value;
			calerCarte(this.carte,this.carte.posDefaut,this.tabZones,valeur);
		}
	});
	container.appendChild(sel);
	
	this.carte.getContainer().appendChild(container);
	
	if(!this.carte.effacerPoints) {
		google.maps.Event.addDomListener(this.carte, "moveend", function() {
			if(! sel.carte.navigEnCours) sel.selectedIndex = -1;
			sel.carte.navigEnCours = false;
		});
	}
	return container;
}

// By default, the control will appear in the top left corner of the
// map with 7 pixels of padding.
selZoneControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(80,5));
}
