onload = gmLoad;
tabDivAffiche = new Array();
function gmLoad()
{
	if (GBrowserIsCompatible())
	{
		// DECLARATION DE LA MAP ET DE SA CONFIGURATION
		var map = new GMap2(document.getElementById(div_map));
		map.setUIToDefault();
		map.setCenter(new GLatLng(gm_lat_defaut, gm_lng_defaut), gm_zoom_defaut);
		
		// DEFINITION DU MARKER CLASSIQUE
		var iconSimple = new GIcon();
		iconSimple.image = imgIcon;
		iconSimple.shadow = imgShadow;
		iconSimple.iconAnchor = new GPoint(15, 30);
		map.iconPointOptions = { icon : iconSimple };
		
		// CREATION DE MON MANAGER DE MAP
		Mgr = new MyMapManager(map);
		
		// CREATION D'UN GEOCODER POUR LA RECHERCHE D'ADRESSE
		geocoder = new GClientGeocoder();
		geocoder.setBaseCountryCode('FR');//permet de lancer la recherche de localisation de base en France
		
		// DECLARATION DES EVENEMENTS SUR LA MAP
		Mgr.addMapEvent('moveend',mapChange);
		
		// DECLARATION DES EVENEMENTS SUR LES MARKERS SIMPLES
		Mgr.addMarkerEvent('click',markerClick);
		Mgr.addMarkerEvent('mouseover',illumineInfoByMarker);
		Mgr.addMarkerEvent('mouseout',illumineInfoByMarker);
		
		// DECLARATION DES EVENEMENTS SUR LES MARKERS DE REGROUPEMENT
		Mgr.addMarkerGrpEvent('click',clusterClick);
		Mgr.addMarkerGrpEvent('mouseover',illumineInfoByMarker);
		Mgr.addMarkerGrpEvent('mouseout',illumineInfoByMarker);
		
		// REDEFINITION DU PARAMETRE DE COULEUR DE FOND POUR LE FLATMARKER DU REGROUPEMENT DE POINT
		Mgr.iconOptionsGrp.primaryColor = markerGrpPrimaryColor;
		
		// PREMIERE REQUETE
		mapChange();
	} else {
		alert(errorGoogleMap);
	}
}
function mapChange()
{
	wait_start();
	getMarkers();
}
/* Requete AJAX pour récupérer un objet Json correspondant à la liste des marqueurs à affichés */
function getMarkers()
{
	// on récupère les coordonnées extérieur NE et SW de la map affichée
	var bounds = Mgr._map.getBounds();
	pointNE = bounds.getNorthEast();// coin en haut a droite
	pointSW = bounds.getSouthWest();//coin en bas a gauche
	/* Lancement d'une requete AJAX pour récupérer tous les points fesant partie de la map affichée, 
					 *  c'est a dire dont les coordonnées sont comprises entre les extrémités de la map affichée */
	var req = new Ajax.Request(urlAjaxGetPoint, {
		parameters : { ptNEx : pointNE.lat(), ptNEy : pointNE.lng(), ptSWx : pointSW.lat(), ptSWy : pointSW.lng(), id_langue : idLangue },
		onSuccess: function(response){
			var json = eval(response.responseText.evalJSON(true));
			refresh(json);
		}
	});
}
function refresh(json)
{
	if(json.total > 0)
	{
		var tmp = json.total > 1 ? trad_resultats : trad_resultat;
		$(span_result).update(tmp + json.total);
		totalJson = json.total;
		remplirPointJson(json.Points);
		Mgr.recalculPoint();
		Mgr.refreshMap();
		refreshDivInfo();
		goToPage(1);
	}
	else if (Mgr._map.getZoom()!=0)// si le zomm est déjà a 0, inutile de dézoomer encore plus loin, c'est qu'il n'y a aucun point
	{
//GLog.write('cette recherche ne retourne aucun point de vente, la map va etre dézommé afin de trouver le ou les points de ventes le(s) plus proche(s)');
		var ptCenter = Mgr._map.getCenter();
		var mapSize = Mgr._map.getSize();
		// envoi d'une requete ajax pour déterminer le niveau de zoom adapté pour avoir au moins un point affiché
		new Ajax.Request(urlAjaxGetZoom, {
			parameters : { ptClat : ptCenter.lat(), ptClng : ptCenter.lng(), mapWidth : mapSize.width, mapHeight: mapSize.height, zoom: Mgr._map.getZoom() },
			onSuccess: function(response){		
				if (!isNaN(parseInt(response.responseText))) 
				{
					Mgr._map.setZoom(parseInt(response.responseText));
				}
			}
		});
	}
	wait_stop();
}
function remplirPointJson(points)
{
	Mgr.clearPoints(); // on vide le tableau actuel des points pour le mettre à jour
	for (var i=0; i < points.length; i++)
	{
		if(points[i])
		{
			var pt = new Point(points[i].lat,points[i].lng);
			pt.titre = points[i].titre;
			pt.ville = points[i].ville;
			pt.photo = points[i].photo;
			pt.adresse = points[i].adresse;
			pt.cp = points[i].code_postal;
			Mgr.addPoint(pt);
		}
	}
}
function refreshDivInfo()
{
	html = '';
	for ( var i=0; i < Mgr.getPoints().length; i++)
	{
		if (Mgr.getPoints()[i])
			html += getHtml(Mgr.getPoints()[i],i);
	}
	$(div_info_content).update(html);
}
function refreshPaging()
{
	// CALCUL DU NOMBRE DE PAGE
	var nbPage = totalJson/nbPtAff;
	var nbPageEntier = Math.floor(nbPage);
	if(nbPageEntier<nbPage)
		nbPageEntier++;// ajout de la dernier page pour les derniers points
	var nbAvant = Math.floor(nbPageAff / 2);
	var nbStart,nbFin;
	// on test où se situe la page dans la liste des pages, pour ne pas afficher toutes les pages si il y en a trop
	if (numPageEnCours <= nbAvant)
	{
		nbStart = 1;
		nbFin = nbPageEntier > nbPageAff ? nbPageAff+1 : nbPageEntier;
	}
	else if (numPageEnCours >= (nbPageEntier-nbAvant))
	{
		nbStart = nbPageEntier > nbPageAff ? nbPageEntier - nbPageAff : 0;
		nbFin = nbPageEntier;
	}
	else
	{
		nbStart = numPageEnCours - nbAvant;
		nbFin = numPageEnCours + nbAvant - 1;
	}
	
	var html = '';
	if(numPageEnCours!=1)
		html = '<a href="#" onClick="goToPage(1);return false;">'+trad_premierePage+'</a>';
	for(var i = nbStart; i <= nbFin; i++)
	{
		if ( i == numPageEnCours)
			html += ' <span class="gm_span_page_encours">' + i + '</span>';    
		else
			html += ' <a href="#" onClick="goToPage('+i+');return false;">' + i + '</a>';            
	}
	if ( numPageEnCours != nbPageEntier && nbPageEntier!=0)
		html += '<a href="#" onClick="goToPage('+nbPageEntier+');return false;">'+trad_dernierePage+'</a>';
	$(div_pagination).update(html);
}

function goToPage(numPage)
{
	debut = numPage * nbPtAff - nbPtAff;
	var tabBlock = $$('.gm_div_info_block_souspoint');// récupération de tous les div_infos
	// on cache supprime les div affiché précédement
	for(var k=0;k<tabDivAffiche.length;k++)
		tabDivAffiche[k].hide();
	// on vide le tableau
	tabDivAffiche.clear();
	for(var i=0;i<tabBlock.length;i++)
	{
		if (i >= debut && i < debut + nbPtAff)
			tabDivAffiche.push(tabBlock[i]);
		if ( i > debut + nbPtAff ) break;//on sort de la boucle si on les a tous déjà trouvé, pour ne pas finir le parcours de la boucle pour rien
//GLog.write($w(tabBlock[i].classNames().element.className)[1]);
	}
	// on affiche les div contenu dans le tableau a afficher
	for(var y=0;y<tabDivAffiche.length;y++)
		tabDivAffiche[y].show();
	numPageEnCours = numPage;
	refreshPaging();
}
function getHtml(point,num)
{
	if(!point.isCluster)
	{
		var html = '<div class="gm_div_info_block_souspoint gm_div_info_block_souspoint_'+num+'"'
			+ '  style="display:none;"'
			+ ' onMouseOver="this.toggleClassName(\'gm_div_info_block_souspoint_hover\');divInfoSurvolOver(' + point.numMarker + ')"'
			+ ' onMouseOut="this.toggleClassName(\'gm_div_info_block_souspoint_hover\');divInfoSurvolOut(' + point.numMarker + ')" '
			+ ' onDblClick="divInfoClick(' + point.getLat()+','+point.getLng()+');return false;">';
		html += '<b>' + point.titre + '</b><br />';
		html += point.adresse + '<br />';
		html += point.cp + ' ';
		html += point.ville;
		html += '</div>';
		point.div_info = "gm_div_info_block_souspoint_" + num;
	}else
	{
		var html = '';
		point.div_info = "gm_div_info_block_souspoint_" + num;
		for(var i = 0; i < point.sousPoint.length; i++)
			html += getHtml(point.sousPoint[i],num);
	}
	return html;
};

/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* -------------------------------------------------------------- METHODES DE RECHERCHE -------------------------------------------------------------- */
function rechercheAdresse()
{
	var texte = $(tb_rech).getValue();
	if (texte != '') geocoder.getLocations(texte,afficherAdresse);
}

function afficherAdresse(reponse)
{
	if(reponse.Placemark != null)
	{
		if  (reponse.Placemark.length == 1)// si il y a qu'un seul resultat
		{
			// UN SEUL RESULTAT
			// redirection de la map vers ce point
			moveMapToAdresse(reponse.Placemark[0].Point.coordinates[1],reponse.Placemark[0].Point.coordinates[0],reponse.Placemark[0].AddressDetails.Accuracy);
		}else if(reponse.Placemark.length > 1)// il y a plusieurs résultats
		{
			// PLUSIEURS RESULTAT POUR CETTE ADRESSE
			tabRecherche = reponse.Placemark;
			var htmlAffiche = '';
			for( var i = 0; i < tabRecherche.length; i++)
			{
				var func = 'moveMapToAdresse(' + reponse.Placemark[i].Point.coordinates[1] + ',' 
											+ reponse.Placemark[i].Point.coordinates[0] + ',' 
											+ reponse.Placemark[i].AddressDetails.Accuracy + ');';
				htmlAffiche += '<a href="#" onclick="' + func + ';hideBox();return false;">' + tabRecherche[i].address + '</a><br />';
			}
			//affichage du choix
			popupRecherche(htmlAffiche);
		}
	}else
	{
		popupRecherche(trad_rechercheVide);
	}
}
function moveMapToAdresse(lat,lng,acu)
{
	Mgr.deplacerMap(lat,lng,acu);
}
function popupRecherche(html)
{
	$('iframePopBox').update(html);
	$('overlayPopBox').setStyle({
		width: document.body.clientWidth+'px',
		height: (document.body.clientHeight+20)+'px'
	});
	showBox();
}
function showBox()
{
	$('overlayPopBox').style.visibility = "visible";
	$('boxPopBox').style.visibility = "visible";
	
	/* redéfinition de la fonction resizeBox du fichier popbox.js */
	center('overlayPopBox');
	$('boxPopBox').setStyle({
		left: getOffsetleft($('gm_tb_rech'),0),
		top: (Element.positionedOffset($('gm_tb_rech'))[1] + Element.getHeight($('gm_tb_rech'))) + 'px'
	});
	//Form.focusFirstElement($('boxPopBox'));
	Event.observe(window,'resize',windowResize);

	setTimeout("showFrame()", 0);
}
function windowResize()
{
	$('boxPopBox').setStyle({
		left: getOffsetleft($('gm_tb_rech'),0)
	});
}
//recherche de l'offsetLeft de la textbox de recherche pour placer la popbox juste en dessous
function getOffsetleft(objet, offset){
	if(objet.parentNode != null){
		var newOffset = objet.offsetLeft;
		return(getOffsetleft(objet.parentNode, offset+newOffset));
	}else{
		return(offset);
	}
}

/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* ----------------------------------------- METHODES GESTIONS INTERACTIONS INFOS-MARKERS ----------------------------------------- */
function markerClick()
{
	Mgr._map.setCenter(this.getPoint(), Mgr._map.getZoom()+1);
}
function clusterClick()
{
	// on centre la map au milieu de tous les points du cluster
	Mgr._map.setCenter(this.getPoint(), Mgr._map.getZoom()+1);
}
function illumineInfoByMarker()
{
	if(this.point && this.point.div_info)
	{	
		//version1
		//$$('.'+this.point.div_info).each(function(div) { div.toggleClassName(class_div_info_over) });
		//version2
		var classInfo = this.point.div_info;
		tabDivAffiche.each(function(div)
			{
				if (div.hasClassName(classInfo)) div.toggleClassName(class_div_info_over);
			});
	}
}
function divInfoSurvolOver(id)
{
	if(Mgr.tabMarker[id].isCluster)
	{
		Mgr.tabMarker[id].hide();
		// on crée un marker temporaire à la place du cluster
		var tinyIcon = new GIcon();
		tinyIcon.image = imgIconGrpSurvol;
		tinyIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
		tinyIcon.shadowSize = new GSize(22, 20);
		tinyIcon.iconAnchor = new GPoint(15, 20);
		tinyIcon.infoWindowAnchor = new GPoint(5, 1);

		markerTempCluster = new GMarker(Mgr.tabMarker[id].getLatLng(),{ icon : tinyIcon });
		Mgr._map.addOverlay(markerTempCluster);
	}else
	{
		Mgr.tabMarker[id].setImage(imgIconSurvol);
	}
}
function divInfoSurvolOut(id)
{
	if(Mgr.tabMarker[id].isCluster)
	{
		markerTempCluster.hide();
		Mgr.tabMarker[id].show();
	}else
	{
		Mgr.tabMarker[id].setImage(imgIcon);
	}
}
function divInfoClick(lat,lng)
{
	var zoom = Mgr._map.getZoom() + 1;
	var center = new GLatLng(lat,lng);
	Mgr._map.setCenter(center, zoom);
}
function resizeBox(){}

/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// */
/* ----------------------------------------------------------------- METHODES ANNEXES ------------------------------------------------------------------ */
function wait_start()
{
	$('gm_div_wait').setStyle({
		top: $('gm_div_rech').positionedOffset()[1]-10,
		left: $('gm_div_rech').positionedOffset()[0]
	});
	$('gm_img_wait').setStyle({
		top: $('gm_div_wait').getHeight()/2,
		left: $('gm_div_wait').getWidth()/2
	});
	$('gm_div_wait').show();
}
function wait_stop()
{
	$('gm_div_wait').hide();
}
