// Définition de la méthode arrayKeyExists() pour Array
Array.prototype.arrayKeyExists = function(key) {
	for(var i in this) {
		if(i == key) {
			return true;
		}
	}
	return false;
}

// Définition de la méthode inArray() pour Array
Array.prototype.inArray = function(val) {
	for(var i in this) {
		if(this[i] == val) {
			return true;
		}
	}
	return false;
}

function isArray(obj) {
   return obj instanceof Array
}

// Surcharge la classe GPolygon
GPolygon.prototype.setIdZone = function(texte) {
	this.idZone = texte;
}
GPolygon.prototype.getIdZone = function() {
	return this.idZone;
}

// Carte google
var map;

// Contient les infos parsées du fichier XML de données
var xml = null;
// Tableau de tableau. Chaque élément est indexé par un id de zone et contient un tableau des polygons de la zone
var tabTabPolygones = new Array;

// Définition des types d'icônes pouvant apparaître sur la carte
var icons = new Array;
// Icone jaune
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "/IMG/icone_gmaps/picto_or_taille1.png";
icon.iconSize = new GSize(30, 32);
icon.shadow = "";
icons[0] = icon;
// Icone petite jaune
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "/IMG/icone_gmaps/picto_or_taille2.png";
icon.iconSize = new GSize(19, 20);
icon.shadow = "";
icons[1] = icon;
// Icone grisée
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "/IMG/icone_gmaps/picto_gris_taille1.png";
icon.iconSize = new GSize(30, 32);
icon.shadow = "";
icons[2] = icon;
// Icone petite grise
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "/IMG/icone_gmaps/picto_gris_taille2.png";
icon.iconSize = new GSize(20, 21);
icon.shadow = "";
icons[3] = icon;
// Icone Bleue - destinations
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "/RelaisChateaux/img/rc-google-bleu.png";
icon.iconSize = new GSize(30, 32);
icon.shadow = "";
icons[4] = icon;

var descriptionEtablissement = '';

// Initialisation de la variable xml qui contient les données des polygones
function initXml() {
	if(xml == null) {
		new AjaxP.Request('/RelaisChateaux/xml/gmaps_polygons.xml', {
			asynchronous: false,
			onSuccess: function(transport) {
				xml = GXml.parse(transport.responseText);
			},
			onFailure: function() {
				alert('Could not load file');
			}
		}
		);
	}
}

// Retourne toutes les zones géo associées au cluster d'id donné
// Ex pour l'Europe : retourne toutes les zones géo de l'Europe + toutes les zones géo de la France
function getAllZonesGeoByClusterId(idCluster) {
	var res = '';

	if(isArray(tabZoneGeoByZoneGmaps[idCluster])) {
		for(var i=0 ; i<tabZoneGeoByZoneGmaps[idCluster].length ; i++) {
			res += tabZoneGeoByZoneGmaps[idCluster][i];
			if(i != tabZoneGeoByZoneGmaps[idCluster].length - 1) {
				res += ',';
			}
		}
	}

	var polygons = xml.documentElement.getElementsByTagName("polygon");
	for (var i = 0; i < polygons.length; i++) {
		if (polygons[i].getAttribute("ref")==idCluster) {
			// On vient de trouver un cluster fils de la zone courante => appel récursif
			tmp = getAllZonesGeoByClusterId(polygons[i].getAttribute("id"));
			if(tmp != '') {
				if(res != '') {
					res += ',';
				}
				res += tmp;
			}
		}
	}

	return res;
}

// Fonction de création des polygones de la zone dont l'id est donné en paramètre
function creationPolygones(idZone) {
	curLang = langue;
	curIdTypeSejour = idTypeSelectionne;
	if(!modeFonctionnementOffresSimple) {
		curNbNuits = nuits;
		curPrixMin = prix_min;
		curPrixMax = prix_max;
		curDate = date;
		//strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_clusters&idZoneGmaps='+idZone+'&lang='+curLang+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
		strRequeteAjax = '/RelaisChateaux/ajaxRechercheOffres/sejours_recherche_offres_js_liste_clusters.php?idZoneGmaps='+idZone+'&lang='+curLang+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
	} else {
		//strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_clusters&idZoneGmaps='+idZone+'&lang='+curLang+'&type='+curIdTypeSejour;
		strRequeteAjax = '/RelaisChateaux/ajaxRechercheOffres/sejours_recherche_offres_js_liste_clusters.php?idZoneGmaps='+idZone+'&lang='+curLang+'&type='+curIdTypeSejour;
	}

	// Calcul des polygones qui sont affichés et actifs (critères OK + filtres OK)
	tabListeClustersJaunes = new Array;

	// Calcul des polygones qui sont affichés grisés (critères OK + filtres NOT OK)
	tabListeClustersGris = new Array;

	new AjaxP.Request(strRequeteAjax, {
		  method: 'get',
		  onSuccess: function(transport) {
			eval(transport.responseText);
		  },
		  asynchronous:false
	});

	var nbPolygonsTrouves = 0;
	var polygons = xml.documentElement.getElementsByTagName("polygon");
	for (var i = 0; i < polygons.length; i++) {
		if (polygons[i].getAttribute("ref")==idZone) {
			nbPolygonsTrouves++;

			var inTabListeClustersJaunes = tabListeClustersJaunes.inArray(polygons[i].getAttribute("id"));
			var inTabListeClustersGris = tabListeClustersGris.inArray(polygons[i].getAttribute("id"));
			
			if(!inTabListeClustersJaunes && !inTabListeClustersGris) {
				continue;
			}

			var polyLatLngs = new Array;
			var id = polygons[i].getAttribute("id");
			var contentColor = polygons[i].getAttribute("content-color");
			var contentOpacity = polygons[i].getAttribute("content-opacity");
			var borderColor = polygons[i].getAttribute("border-color");
			var borderOpacity = polygons[i].getAttribute("border-opacity");
			var borderWeight = polygons[i].getAttribute("border-weight");
			point = polygons[i].firstChild;	
			while (point) {
				if (point.nodeType==1) {	//ELEMENT_NODE
					if (point.nodeName=='point') {
						//Coordonnees d'un point de la zone
						polyLatLngs.push (new GLatLng(parseFloat(point.getAttribute("lat")), parseFloat(point.getAttribute("lng"))));
					}
				}
				point = point.nextSibling;
			}

			if(inTabListeClustersJaunes) {
				borderColor = '#786200';
				contentColor = '#DAB200';
			} else if(inTabListeClustersGris) {
				borderColor = '#787878';
				contentColor = '#787878';
			}

			var poly = new GPolygon(polyLatLngs, borderColor, borderWeight, borderOpacity, contentColor, contentOpacity, {clickable: true});
			poly.setIdZone(id);
			GEvent.addListener(poly, "click", function () {
				// Appel à la fonction spécifique de clic sur un polygone
				clicPolygone(this.getIdZone());
			});
			
			map.addOverlay(poly);
		}
	}
	return nbPolygonsTrouves;
}

// Fonction d'ajout d'un point sur la carte
function ajouterPointCarte(lat, lng, title, typeIcon) {
	//alert(lat+', '+lng+', '+title+', '+typeIcon);
	// Création du marker
	var marker = new GMarker(new GLatLng(lat, lng), {title:title, icon: icons[typeIcon]});

	// Evénement au clic de la souris
	GEvent.addListener(marker, "click", function () {

		//récupère la description de l'établissement pour peupler la popup
		getContent(this.getLatLng().lat(), this.getLatLng().lng());

		//Affiche la popup établissement
		map.openInfoWindowHtml(this.getLatLng(), descriptionEtablissement);

	});

	// Affichage sur la carte
	map.addOverlay(marker);
}











function afficherPointsEtablissementsForZoneGmapsAvecPaysMultiples(idZoneGmaps) {
	curLang = langue;

	// Récupération de la liste des zones géo constituant le cluster
	curStrZonesGeoPrincipales = '';
	tmpDernierIdDesPaysParcourus = '';
	for(var i=0 ; i<tabZoneGeoByZoneGmaps[idZoneGmaps].length ; i++) {
		curStrZonesGeoPrincipales += tabZoneGeoByZoneGmaps[idZoneGmaps][i] + ",";
		tmpDernierIdDesPaysParcourus = tabZoneGeoByZoneGmaps[idZoneGmaps][i];
	}
	if(curStrZonesGeoPrincipales.length > 0) {
		curStrZonesGeoPrincipales = curStrZonesGeoPrincipales.substring(0, curStrZonesGeoPrincipales.length-1);
	}

	curStrZonesGeoFrontalieres = '';
	for(var i=0 ; i<tabZonesGeoFrontalieresByZoneGeo[tmpDernierIdDesPaysParcourus].length ; i++) {
		if(!tabZoneGeoByZoneGmaps[idZoneGmaps].inArray(tabZonesGeoFrontalieresByZoneGeo[tmpDernierIdDesPaysParcourus][i])) {
			curStrZonesGeoFrontalieres += tabZonesGeoFrontalieresByZoneGeo[tmpDernierIdDesPaysParcourus][i] + ",";
		}
	}
	if(curStrZonesGeoFrontalieres.length > 0) {
		curStrZonesGeoFrontalieres = curStrZonesGeoFrontalieres.substring(0, curStrZonesGeoFrontalieres.length-1);
	}

	curIdTypeSejour = idTypeSelectionne;
	if(!modeFonctionnementOffresSimple) {
		curNbNuits = nuits;
		curPrixMin = prix_min;
		curPrixMax = prix_max;
		curDate = date;
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_pays_gmaps&lang='+curLang+'&listePays='+curStrZonesGeoPrincipales+'&listePaysFrontaliers='+curStrZonesGeoFrontalieres+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
	} else {
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_pays_gmaps&lang='+curLang+'&listePays='+curStrZonesGeoPrincipales+'&listePaysFrontaliers='+curStrZonesGeoFrontalieres+'&type='+curIdTypeSejour;
	}

	// Tableau permettant de connaître la liste des établissements de la zone géographique demandée
	// ET dont les filtres demandés sont OK
	tabListeEtablissementsZoneAvecFiltreOk = new Array;

	// Tableau permettant de connaître la liste des établissements de la zone géographique demandée
	// ET dont les filtres demandés ne sont pas OK
	tabListeEtablissementsZoneAvecFiltreKo = new Array;

	// Tableau permettant de connaître la liste des établissements appartenant à des zones frontalières à la zone géographique demandée
	// ET dont seuls les critères demandés sont OK (exclus : les filtres prix et date)
	tabListeEtablissementsFrontaliers = new Array;

	new AjaxP.Request(strRequeteAjax, {
		  method: 'get',
		  onSuccess: function(transport) {
			eval(transport.responseText);
		  },
		  asynchronous:false
	});

	// Les tableaux js de données sont à cet instant calculées => on affiche les points
	for(var i=0 ; i<tabListeEtablissementsZoneAvecFiltreOk.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsZoneAvecFiltreOk[i]['latitude'], tabListeEtablissementsZoneAvecFiltreOk[i]['longitude'], tabListeEtablissementsZoneAvecFiltreOk[i]['nom'], 0);
	}
	for(var i=0 ; i<tabListeEtablissementsZoneAvecFiltreKo.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsZoneAvecFiltreKo[i]['latitude'], tabListeEtablissementsZoneAvecFiltreKo[i]['longitude'], tabListeEtablissementsZoneAvecFiltreKo[i]['nom'], 2);
	}
	for(var i=0 ; i<tabListeEtablissementsFrontaliers.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsFrontaliers[i]['latitude'], tabListeEtablissementsFrontaliers[i]['longitude'], tabListeEtablissementsFrontaliers[i]['nom'], 3);
	}
}














// Affiche sur la carte les établissements de la (des) zone(s) géographique(s) donnée(s)
function afficherPointsEtablissementsInTabZoneGeoAndTabZonesGeoGrontalieres(tabZonesGeoPrincipales, tabZonesGeoFrontalieres) {
	curLang = langue;
	curStrZonesGeoPrincipales = idPaysSelectionne;

	curStrZonesGeoFrontalieres = '';
	for(var i=0 ; i<tabZonesGeoPrincipales.length ; i++) {
		if(tabZonesGeoPrincipales[i] != idPaysSelectionne) {
			curStrZonesGeoFrontalieres += tabZonesGeoPrincipales[i] + ",";
		}
	}
	for(var i=0 ; i<tabZonesGeoFrontalieres.length ; i++) {
		curStrZonesGeoFrontalieres += tabZonesGeoFrontalieres[i] + ',';
	}
	if(curStrZonesGeoFrontalieres.length > 0) {
		curStrZonesGeoFrontalieres = curStrZonesGeoFrontalieres.substring(0, curStrZonesGeoFrontalieres.length-1);
	}

	curIdTypeSejour = idTypeSelectionne;
	if(!modeFonctionnementOffresSimple) {
		curNbNuits = nuits;
		curPrixMin = prix_min;
		curPrixMax = prix_max;
		curDate = date;
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_pays_gmaps&lang='+curLang+'&listePays='+curStrZonesGeoPrincipales+'&listePaysFrontaliers='+curStrZonesGeoFrontalieres+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
	} else {
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_pays_gmaps&lang='+curLang+'&listePays='+curStrZonesGeoPrincipales+'&listePaysFrontaliers='+curStrZonesGeoFrontalieres+'&type='+curIdTypeSejour;
	}

	// Tableau permettant de connaître la liste des établissements de la zone géographique demandée
	// ET dont les filtres demandés sont OK
	tabListeEtablissementsZoneAvecFiltreOk = new Array;

	// Tableau permettant de connaître la liste des établissements de la zone géographique demandée
	// ET dont les filtres demandés ne sont pas OK
	tabListeEtablissementsZoneAvecFiltreKo = new Array;

	// Tableau permettant de connaître la liste des établissements appartenant à des zones frontalières à la zone géographique demandée
	// ET dont seuls les critères demandés sont OK (exclus : les filtres prix et date)
	tabListeEtablissementsFrontaliers = new Array;

	new AjaxP.Request(strRequeteAjax, {
		  method: 'get',
		  onSuccess: function(transport) {
			eval(transport.responseText);
		  },
		  asynchronous:false
	});

	// Les tableaux js de données sont à cet instant calculées => on affiche les points
	for(var i=0 ; i<tabListeEtablissementsZoneAvecFiltreOk.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsZoneAvecFiltreOk[i]['latitude'], tabListeEtablissementsZoneAvecFiltreOk[i]['longitude'], tabListeEtablissementsZoneAvecFiltreOk[i]['nom'], 0);
	}
	for(var i=0 ; i<tabListeEtablissementsZoneAvecFiltreKo.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsZoneAvecFiltreKo[i]['latitude'], tabListeEtablissementsZoneAvecFiltreKo[i]['longitude'], tabListeEtablissementsZoneAvecFiltreKo[i]['nom'], 2);
	}
	for(var i=0 ; i<tabListeEtablissementsFrontaliers.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsFrontaliers[i]['latitude'], tabListeEtablissementsFrontaliers[i]['longitude'], tabListeEtablissementsFrontaliers[i]['nom'], 3);
	}
}

// Affiche sur la carte les établissements de la destination courante
function afficherPointsEtablissementsForDestination() {
	curLang = langue;
	curIdDestination = idDestSelectionne;
	curIdTypeSejour = idTypeSelectionne;
	if(!modeFonctionnementOffresSimple) {
		curNbNuits = nuits;
		curPrixMin = prix_min;
		curPrixMax = prix_max;
		curDate = date;
		//strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_destination_gmaps&lang='+curLang+'&dest='+curIdDestination+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
		strRequeteAjax = '/RelaisChateaux/ajaxRechercheOffres/sejours_recherche_offres_js_liste_etablissements_destination_gmaps.php?lang='+curLang+'&dest='+curIdDestination+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate;
	} else {
		//strRequeteAjax = '/spip.php?page=sejours_recherche_offres_js_liste_etablissements_destination_gmaps&lang='+curLang+'&dest='+curIdDestination+'&type='+curIdTypeSejour;
		strRequeteAjax = '/RelaisChateaux/ajaxRechercheOffres/sejours_recherche_offres_js_liste_etablissements_destination_gmaps.php?lang='+curLang+'&dest='+curIdDestination+'&type='+curIdTypeSejour;
	}

	// Tableau permettant de connaître la liste des établissements de la destination demandée
	// ET dont les filtres demandés sont OK
	var tabListeEtablissementsDestinationAvecFiltreOk = new Array;

	// Tableau permettant de connaître la liste des établissements de la destination demandée
	// ET dont les filtres demandés ne sont pas OK
	var tabListeEtablissementsDestinationAvecFiltreKo = new Array;

	new AjaxP.Request(strRequeteAjax, {
		  method: 'get',
		  onSuccess: function(transport) {
			//$X('jsMapsDest').update(transport.responseText);
			eval(transport.responseText);
		  },
		  asynchronous:false
	});
	
	var latMini = -1000;
	var latMaxi = 1000;
	var lngMini = -1000;
	var lngMaxi = 1000;
	
	// Les tableaux js de données sont à cet instant calculées => on affiche les points
	//alert(tabListeEtablissementsDestinationAvecFiltreOk.length);
	for(var i=0 ; i<tabListeEtablissementsDestinationAvecFiltreOk.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsDestinationAvecFiltreOk[i]['latitude'], tabListeEtablissementsDestinationAvecFiltreOk[i]['longitude'], tabListeEtablissementsDestinationAvecFiltreOk[i]['nom'], 0);
		if(tabListeEtablissementsDestinationAvecFiltreOk[i]['latitude'] > latMini) {
			latMini = tabListeEtablissementsDestinationAvecFiltreOk[i]['latitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreOk[i]['latitude'] < latMaxi) {
			latMaxi = tabListeEtablissementsDestinationAvecFiltreOk[i]['latitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreOk[i]['longitude'] > lngMini) {
			lngMini = tabListeEtablissementsDestinationAvecFiltreOk[i]['longitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreOk[i]['longitude'] < lngMaxi) {
			lngMaxi = tabListeEtablissementsDestinationAvecFiltreOk[i]['longitude'];
		}
	}
	//alert(tabListeEtablissementsDestinationAvecFiltreKo.length);
	for(var i=0 ; i<tabListeEtablissementsDestinationAvecFiltreKo.length ; i++) {
		ajouterPointCarte(tabListeEtablissementsDestinationAvecFiltreKo[i]['latitude'], tabListeEtablissementsDestinationAvecFiltreKo[i]['longitude'], tabListeEtablissementsDestinationAvecFiltreKo[i]['nom'], 2);
		if(tabListeEtablissementsDestinationAvecFiltreKo[i]['latitude'] > latMini) {
			latMini = tabListeEtablissementsDestinationAvecFiltreKo[i]['latitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreKo[i]['latitude'] < latMaxi) {
			latMaxi = tabListeEtablissementsDestinationAvecFiltreKo[i]['latitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreKo[i]['longitude'] > lngMini) {
			lngMini = tabListeEtablissementsDestinationAvecFiltreKo[i]['longitude'];
		}
		if(tabListeEtablissementsDestinationAvecFiltreKo[i]['longitude'] < lngMaxi) {
			lngMaxi = tabListeEtablissementsDestinationAvecFiltreKo[i]['longitude'];
		}
	}

	// Choisir le meilleur zoom pour afficher tous les points
	var zoomOk = 10;

	var pointMin = new GLatLng(latMini, lngMini);
	var pointMax = new GLatLng(latMaxi, lngMaxi);

	while(currBounds = map.getBounds()) {
		if(currBounds.containsLatLng(pointMin) && currBounds.containsLatLng(pointMax)) {
			break;
		}
		// Dézoomer tant que la carte n'affiche pas tous les points
		zoomOk--;
		if (zoomOk==1)
		{
			//alert("pas bien");
			break;
		}
		map.setZoom(zoomOk);
	}
}











// Fonction appelée au clic sur un polygone
function clicPolygone(idZoneCliquee) {
	// Mise à jour de l'id de zone courant
	idZoneGmapsCourante = idZoneCliquee;

	clusterMultipleZonesGeo = '';

	// Sélection si possible du pays dans la liste déroulante
	$X('pays').selectedIndex = 0;
	if(tabNbZonesGeoByZoneGmaps[idZoneCliquee] == 1) {
		for(var i=0 ; i<$X('pays').options.length ; i++) {
			if($X('pays').options[i].value == tabZoneGeoByZoneGmaps[idZoneCliquee][0]) {
				$X('pays').selectedIndex = i;
				break;
			}
		}
		//alert('clic poly : capable de connaitre le pays => onclicpays');
		onClickListePays();
	} else {
		// Pas possible de sélectionner un pays => on recharge seulement la carte
		if(calcNbPolygonesFils(idZoneCliquee) > 0) {
			// La zone chargée a des clusters fils => on doit les afficher
			//alert('clic poly : a des clusters fils => les charger');
			loadMapByIdZoneGmapsForClusters(idZoneCliquee);

			// Cas où plusieurs zones géo sont associées au cluster
			clusterMultipleZonesGeo = idZoneCliquee;
			
			onClickClusterWithClustersFils(idZoneCliquee);
		} else {
			// La zone chargée correspond à plusieurs zones géo => afficher les établissements de ces zones
			//alert('clic poly : correspond à plusieurs zones géo => afficher leurs étab');

			// Cas où plusieurs zones géo sont associées au cluster
			clusterMultipleZonesGeo = idZoneCliquee;

			onClickClusterZonesGeoMultiples(idZoneCliquee);
			//loadMapByIdZoneGmapsForEtablissements(idZoneCliquee);
		}
	}
}

// Fonction de récupération du contenu de la bulle d'un établissement
function getContent(lat, lng) {
	curLang = langue;
	curIdTypeSejour = idTypeSelectionne;
	curDevise = devise;
	if(!modeFonctionnementOffresSimple) {
		curNbNuits = nuits;
		curPrixMin = prix_min;
		curPrixMax = prix_max;
		curDate = date;
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_get_content_etablissement&lang='+curLang+'&type='+curIdTypeSejour+'&nuits='+curNbNuits+'&prix_min='+curPrixMin+'&prix_max='+curPrixMax+'&date='+curDate+'&lat='+lat+'&lng='+lng+'&devise='+curDevise;
	} else {
		strRequeteAjax = '/spip.php?page=sejours_recherche_offres_get_content_etablissement&lang='+curLang+'&type='+curIdTypeSejour+'&lat='+lat+'&lng='+lng+'&devise='+curDevise;
	}

	new AjaxP.Request(strRequeteAjax, {
		  method: 'get',
		  onSuccess: function(transport) {
		  	descriptionEtablissement = transport.responseText;
		  },
		  asynchronous:false
	});
}



// Prépare la carte pour l'affichage de points d'établissements pour une zone gmaps :
// - nettoyage des éléments affichés sur la carte
// - retaillage éventuel de la carte
// - affichage des établissements pour la(les) zone(s) géo liée(s) à la zone gmaps voulue
function loadMapByIdZoneGmapsForEtablissements(idZoneGmaps) {
	// Suppression de tous les points et polygones affichés sur la carte
	map.clearOverlays();

	prepareMapBeforeZoneGmapsWrite(idZoneGmaps);

	var tabListeIdZonesGeoChargerEtabs = new Array;
	var tabZonesFrontalieres = new Array;

	var zonesFrontalieresCalculees = false;
	for(var idZoneGeo in tabZoneGmapsByZoneGeo) {
		if(tabZoneGmapsByZoneGeo[idZoneGeo] == idZoneGmaps) {
			// Il faut afficher les points pour la zone géographique qui appartient à la zone gmaps
			//alert('loadMapByIdZoneGmapsForEtablissements : afficher les étab de '+idZoneGeo);

			tabListeIdZonesGeoChargerEtabs[tabListeIdZonesGeoChargerEtabs.length] = idZoneGeo;

			if(!zonesFrontalieresCalculees) {
				//alert('je calcule les zones geo');
				tabZonesFrontalieres = tabZonesGeoFrontalieresByZoneGeo[idZoneGeo];
				zonesFrontalieresCalculees = true;
			}
		}
	}

	// - la liste des id des zones géo est calculée
	// - la liste des id des zones géo frontalières est calculée
	// => on peut afficher les points sur la carte
	afficherPointsEtablissementsInTabZoneGeoAndTabZonesGeoGrontalieres(tabListeIdZonesGeoChargerEtabs, tabZonesFrontalieres);
}

// Prépare la carte pour l'affichage de la destination :
// - nettoyage des éléments affichés sur la carte
// - retaillage éventuel de la carte
// - affichage du point de la destination et de son contenu
// - calcul du meilleur zoom possible ################################# à faire
// - appel à la fonction d'affichage des établissements liés à la destination courante
function loadMapByIdDestination() {
	// Suppression de tous les points et polygones affichés sur la carte
	map.clearOverlays();

	// Modification si besoin de la hauteur de carte pour les destinations
	hauteurCartePourDestinations = '400px';
	if(document.getElementById('SE_map2').style.height != hauteurCartePourDestinations) {
		document.getElementById('SE_map2').style.height = hauteurCartePourDestinations;
		init();
	}

	// Affichage du point correspondant à la destination choisie
	var photo = "<img src='/IMG/rubon" + idDestSelectionne + ".jpg' height=120 />";
	//MiP 20aout08: definition de l'icone et de sa taille dans le tableau et non directement dans la fonction
	//var icon = new GIcon(G_DEFAULT_ICON);
	//icon.image = "/RelaisChateaux/img/rc-google-bleu.png";
	var point = new GLatLng(tabCoordonneesDestinationByIdDestination[idDestSelectionne]['lat'], tabCoordonneesDestinationByIdDestination[idDestSelectionne]['lng']);
	var marker = new GMarker(point, icons[4]);
	GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(photo); });
	map.addOverlay(marker);

	map.setCenter(point, 10, G_PHYSICAL_MAP); //setCenter(center,  zoom?,  type?)

	// Affichage des points des établissements liés à la destination
	afficherPointsEtablissementsForDestination();
}

// Retourne le nombre de clusters fils de la zone gmaps dont l'id est donné
function calcNbPolygonesFils(idZoneGmaps) {
	// Chargement du fichier XML de données si ce n'est pas déjà fait
	initXml();

	var nbPolygonsTrouves = 0;
	var polygons = xml.documentElement.getElementsByTagName("polygon");
	for (var i = 0; i < polygons.length; i++) {
		if (polygons[i].getAttribute("ref")==idZoneGmaps) {
			nbPolygonsTrouves++;
		}
	}
	return nbPolygonsTrouves;
}

// Fait le chargement de la carte en fonction des paramètres courants (ex : pays renseigné)
function autoLoadMap() {
	if(idDestSelectionne != '') {
		// Une destination est choisie => on doit charger la carte au niveau de la destination
		loadMapByIdDestination();
		//alert('autoLoadMap : destination');
	} else if(idPaysSelectionne != '') {
		// Pas de destination sélectionnée mais une zone géographique est sélectionnée
		// => On sait déterminer quelle est la zone gmaps correspondante
		zoneGmapsAssociee = tabZoneGmapsByZoneGeo[idPaysSelectionne];

		// Mise à jour de la zone gmaps courante
		idZoneGmapsCourante = zoneGmapsAssociee;

		if(calcNbPolygonesFils(zoneGmapsAssociee) > 0) {
			// Si la zone contient des clusters fils, on appelle la fonction de préparation de carte pour les clusters
			//alert('autoLoadMap : pays sélectionné lancer l affichage des clusters');
			loadMapByIdZoneGmapsForClusters(zoneGmapsAssociee);
		} else {
			// Sinon on appelle la fonction de préparation de carte pour l'affichage d'établissements
			//alert('autoLoadMap : pays sélectionné lancer l affichage des établissements');
			loadMapByIdZoneGmapsForEtablissements(zoneGmapsAssociee);
		}
	} else {
		// Pas de paramètres particuliers => on charge la zone gmaps courante
		loadMapByIdZoneGmapsForClusters(idZoneGmapsCourante);
	}
}

// Fonction appelée dans le cas où on met à jour la carte pour une zone gmaps
// - soit on va afficher sur la carte des clusters
// - soit la zone gmaps n'a pas de clusters fils => on affiche alors une liste d'établissements
function prepareMapBeforeZoneGmapsWrite(idZoneGmaps) {
	// Chargement du fichier XML de données si besoin est
	initXml();

	var polygons = xml.documentElement.getElementsByTagName("polygon");
	for (var i = 0; i < polygons.length; i++) {
		if (polygons[i].getAttribute("id") == idZoneGmaps) {
			// Eventuellement on change la hauteur de la carte
			if(polygons[i].getAttribute("height-map")) {
				nouvelleTaille = polygons[i].getAttribute("height-map")+'px';
			} else {
				nouvelleTaille = '323px';
			}
			if(document.getElementById('SE_map2').style.height != nouvelleTaille) {
				document.getElementById('SE_map2').style.height = nouvelleTaille;
				init();
			}

			// Modification du type de la carte
			if(polygons[i].getAttribute("type-map")) {
				map.setMapType(eval(polygons[i].getAttribute("type-map")));
			} else {
				map.setMapType(G_NORMAL_MAP);
			}

			// Coordonnees du centre de la carte
			map.setCenter(new GLatLng(parseFloat(polygons[i].getAttribute("center-lat")), parseFloat(polygons[i].getAttribute("center-lng"))), parseInt(polygons[i].getAttribute("zoom")));

			break;
		}
	}
}

// Prépare la carte pour l'affichage des clusters
// - le xml doit être parsé car il contient les données des clusters
// - les éventuels éléments affichés sur la carte sont nettoyés
// - la carte est éventuellement retaillée
// - le type de carte est éventuellement modifié
// - le point central et le zoom sont initialisés
// - la fonction de dessin des polygones de la zone courante est appelé
function loadMapByIdZoneGmapsForClusters(idZoneGmaps) {
	// Suppression de tous les points et polygones affichés sur la carte
	map.clearOverlays();

	prepareMapBeforeZoneGmapsWrite(idZoneGmaps);

	// Ajout des polygones a la carte
	nbPolygonesDessines = creationPolygones(idZoneGmaps);
	if(nbPolygonesDessines == 0) {
		// Pas de polygones dessinés => il faut dessiner les points correspondants aux établissements
		//afficherPointsEtablissements(idZoneGmaps);
		afficherPointsEtablissementsForZoneGmapsAvecPaysMultiples(idZoneGmaps);
	}
}


// Initialisation de la carte
// Appelée uniquement au chargement de la page
// OU
// Quand la carte change de taille
function init() {
	if (!GBrowserIsCompatible()) {
		return;
	}

	// Chargement du fichier XML de données
	//initXml();

	// Chargement de la carte
	map = new GMap2(document.getElementById("SE_map2"));

	// Contrôles de la carte
	map.addControl(new GSmallMapControl());
	map.addControl(new GHierarchicalMapTypeControl());
	map.addMapType(G_PHYSICAL_MAP);

	// Centrage par défaut de la carte
	map.setCenter(new GLatLng(53.12040528310657, 1.40625), 1);
}

