//Variables de configuration du site
//var longitudeDepart = 2.35;
//var latitudeDepart = 46.80;
var longitudeDepart = 1.60;
var latitudeDepart = 46.90;
var zoomDepart = 5;
var urlIconeSimple = "images/simple2.png";
var urlIconeMulti= "images/multi2.png";
var nomWMS = "OpenLayers WMS";
var adresseServeurWMS = "http://www.geosignal.org/cgi-bin/wmsmap?";

//Définition des variables nécessaires à la manipulation de la carte
var map, layer, markers;

//variable booleenne permettant la verification des conditions de recherche de l'utilsateur
var testMarker = false;

//Ce marqueur correspond au pointeur utilisé lors de la recherche
var markerRecherche;

//Ces tableaux permettent de classer les entreprises par localisation
var tabLon = new Array;
var tabLat = new Array;

//Permet de stocker l'indice courant de tabLon et tabLat
var indiceTab = 0;

//Tableau permettant de stocker les objets Entreprise
var tabEntreprise = new Array();

//Ce tableau est utilisé pour grouper les entreprises par ville (identifié par le code Postal) et contient des tableaux d'objets de classe Entreprise
var tabEntrepriseClassees = new Array;

//On sauvegarde la position Top de la div map au départ
var topDeDepart=0;

/*--------------------------------------------------- Fonctions générales --------------------------------------------------*/

/*
Constructeur de la classe Entreprise
	Entrée :
		- i : identifiant de l'entreprise,
		- n : nom de l'entreprise
		- a : adresse de l'entreprise
		- cp : code postal de la ville ou est située l'entreprise
		- v : ville ou est localisée l'entreprise
		- w : Site web de l'entreprise
		- la,lo : cordonnées GPS de la ville ou est située l'entreprise
		- d : descriptif de l'entreprise
*/
function Entreprise(i,n,a,cp,v,w,t,d,k,la,lo) {

	//Définition des attributs 
	this.id = i;
	this.nom = n;
	
	this.adresse = a;
	this.cp = cp;
	this.ville = v;
	
	this.web = w;	
	this.tit = t;
	this.des = d;
	this.key = k;
	
	this.la = la;			
	this.lo = lo;	
	
	//l'attribut largeur Popup permet de définir la largeur de la popup en fonction de la taille des informations affichées
	this.largeurPopup;
	this.hauteurPopup;	

	/* on crée le contenu du popup */
	this.info = "<b>" + n + "</b><br />";
	this.info += a + "<br />";
	this.info += cp + " " + v + "<br />";
	this.info += "<a href="+w+" target='_blank'>"+w+"</a>";

	/* On affiche ce contenu dans un "popup" temporaire */
	var dv = document.getElementById("temp");
	dv.style.display='';
	dv.innerHTML=this.info;

	/* On récupère la largeur idéale et la hauteur lui correspondant */
	if(dv.offsetWidth>260) 
	{
		//largeur
		dv.style.width="260px";
		this.largeurPopup=260;
		//hauteur
		dv.style.height="60px";
		this.hauteurPopup=60;
	}
	else
	{
		//largeur
		this.largeurPopup=dv.offsetWidth;
		//hauteur
		this.hauteurPopup=dv.offsetHeight;
	}

	/* On efface le popup temporaire */
	dv.innerHTML='';
	dv.style.display='none';
}




/* Fonction contains
	Entrée :
		- tab : Tableau d'objet de type o
		- terme : objet de type o
	Sortie ;
		- Renvoie un entier, soit l'indice du tableau contenant l'objet terme ou soit -1 (L'objet n'est pas contenu dans le tableau) 
	But :	Dire si la variable terme est contenu dans le tableau tab
*/
function contains (tab,terme) {
	for (j=0;j<tab.length;j++) {
		if (terme == tab[j]) {
			return j;
		}
	}
	return -1;
}

/*--------------------------------------------------- Fonctions portant sur les composants de la page autre que la carte  --------------------------------------------------*/

var http; // Notre objet XMLHttpRequest

function createRequestObject()
{
	if(window.XMLHttpRequest)
	{ 
		// Mozilla, Safari, ...
		http = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{ 
		// Internet Explorer
	   try {
				http = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				http = new ActiveXObject("Microsoft.XMLHTTP");
			}
	}
	else
		alert("navigateur incompatible");
	return http;
}


/* -------------- Fonction Ajax qui permet de faire une pause en javascript -------------- */

function sleep(temps)
{
	http = createRequestObject();
	http.open('get', 'package/php/sleep.php?temps='+ temps, true);
	http.onreadystatechange = finaliserResultatErreur; /* A chaque changement d'état de la requete AJAX la fonction de traitement de résultat sera exécutée*/
	http.send(null);
}


/* ------------- Fonctions Ajax pour la signalisation d'une erreur par l'utilisateur -------------- */

function envoiErreur(idEntr, motsSaisis, pertinence, erreur)
{
	document.getElementById('frm_signalErreur').style.display='none';
	document.getElementById('msg_signalErreur').innerHTML = '<center><i>envoi en cours...</i></center>';
	http = createRequestObject();
	http.open('get', 'package/php/envoi-erreur.php?idEntr='+ idEntr +'&motsSaisis='+ motsSaisis + '&pertinence=' + pertinence + '&erreur=' + erreur, true);
	http.onreadystatechange = traiterResultatErreur; /* A chaque changement d'état de la requete AJAX la fonction traiterResultatRequete() sera exécutée*/
	http.send(null);
}

function traiterResultatErreur()
{
	if(http.readyState == 4)
	{
		if(http.status == 200) {
			document.getElementById("msg_signalErreur").innerHTML = http.responseText;
			sleep(1);
		}
		else
			document.getElementById("msg_signalErreur").innerHTML.innerHTML = "<strong>N/A</strong>";
	}
}

function finaliserResultatErreur()
{
	if(http.readyState == 4)
	{
		if(http.status == 200) {
			fermerSignalErreur();
		}
		else
			document.getElementById('signalErreur').style.display="none";
	}
}



/* -------------- Fonction Ajax permettant de gérer les recherches les plus saisies -------------- */

function gestion_bestSearch(mots)
{
	http = createRequestObject();
	http.open('get', 'package/php/bestSearch.php?mots='+ mots, true);
	http.send(null);
}


/*--------------------------------------------------- Fonctions permettant l'interaction avec la carte --------------------------------------------------*/

/*
Fonction load
But :	Charger la carte dans le conteur et définir ses propriétés
*/
function load() {

	//On cache la div de chargement
	document.getElementById("divload").style.display="none";
	document.getElementById("fieldmap").style.display="";

	var options = {
					//resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125],
                    //resolutions: [1.40625,1.353125,1.3015625,1.25578125,1.207890625,1.1539453125],
                    //minScale: 50000000,
                    //maxResolution: "auto",
                    //maxExtent: new OpenLayers.Bounds(-180, -90, 90, 180),
                    //maxResolution: 0.17578125,
                    // maxScale: 10000000,
                    //minResolution: "auto",
                    //minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
                    //minResolution: 0.0439453125,
					transitionEffect:'resize',
					numZoomLevels: 12,
					//minZoomLevel: 5,
					//maxZoomLevel: 12,
                    //units: "degrees",
		controls: [new OpenLayers.Control.Navigation(),new OpenLayers.Control.PanZoom()]
	};
	//Définition de la carte
	map = new OpenLayers.Map( $('map'),options);

	//déclaration des différentes couches du serveur WMS
/*
	var layer1000 = new OpenLayers.Layer.WMS("OpenLayers WMS","http://www.geosignal.org/cgi-bin/wmsmap?",{layers: 'RASTER1000k',transparent: "false", format:"image/png"}, options);
	layer500 = new OpenLayers.Layer.WMS(nomWMS,adresseServeurWMS, {layers: 'RASTER500K'} );
	layer250 = new OpenLayers.Layer.WMS(nomWMS,adresseServeurWMS, {layers: 'RASTER250K'} );
	layer100 = new OpenLayers.Layer.WMS(nomWMS,adresseServeurWMS, {layers: 'RASTER100K'} );
	layer50 = new OpenLayers.Layer.WMS(nomWMS,adresseServeurWMS, {layers: 'RASTER50K'} );
	var layer25 = new OpenLayers.Layer.WMS(nomWMS,adresseServeurWMS, {layers: 'RASTER25K'} );
*/
	//Par défaut on charge le layer 1000
	//layer = layer25;
    var layer = new OpenLayers.Layer.Google("GMaps");
	//var layer = new OpenLayers.Layer.WMS( "NASA Global Mosaic", "http://wms.jpl.nasa.gov/wms.cgi", {layers: "modis,global_mosaic"});
	//var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
	//var layer = new OpenLayers.Layer.KaMap( "Satellite","/world/index.php", {g: "satellite", map: "world"});

	//on ajoute le layer à la carte
    map.addLayer(layer);
	//On centre et on zoome sur la carte sur les paramètres par défaut
    map.setCenter(new OpenLayers.LonLat(longitudeDepart, latitudeDepart), zoomDepart);
	
/*
	map.addControl(new OpenLayers.Control.MouseToolbar());
	map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
	map.addControl(new OpenLayers.Control.MousePosition());
	map.addControl(new OpenLayers.Control.OverviewMap());
*/

	//enregistrement d'un écouteur sur la carte, cet écouteur permettra de réaliser des actions lors d'un changement de zoom
	map.events.register("zoomend",map,zoomLayer);

	//on crée le container des marqueurs et on l'ajoute à la carte
	markers = new OpenLayers.Layer.Markers("Marqueur");
	map.addLayer(markers);
	//on ajoute un écouteur pour détecter une click sur la carte
	map.events.register("click",map,clickCarte);
	
	topDeDepart=map.viewPortDiv.offsetTop;
}


/* 
	Fonction clickCarte
	But : Suite à un clic sur la carte, on ajoute un marqueur à l'endroit cliqué, il ne peut y avoir qu'un marqueur, si il y en a déja un, on le supprime avant
	Entrée :
		- e : un événement, ici, un clic sur la carte
*/
function clickCarte(e) {
	//Définition de l'icône
	var size = new OpenLayers.Size(15,25);
	var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
	var icon = new OpenLayers.Icon('images/recherche2.png',size,offset);
	//Récupération des coordonnées
	
	/* On corrige un bug de l'api lorsque la carte est placée dans une div en position "fixed"
	ATTENTION cette correction ne doit se faire que si la map est dans une div en position fixe !!
	Cette correction est également réalisée dans openlayers.js dans le control.mousedefaults*/
	e.xy.y=e.xy.y-document.documentElement.scrollTop; 

	var lonlat = map.getLonLatFromPixel(e.xy);

	//On remplit les champs cachés du formulaire pour envoyer les coordonnées en méthode POST
	document.getElementById("hid_lat").value=lonlat['lat'];
	document.getElementById("hid_long").value=lonlat['lon'];

	//si il y avait déjà un marqueur alors on le supprime
	if (testMarker == true) {
		markers.removeMarker(markerRecherche);
	}
	//création du nouveau marker
	markerRecherche = new OpenLayers.Marker(lonlat,icon);
	//ajout du marqueur
	markers.addMarker(markerRecherche);
	testMarker = true;
	Event.stop(e);
}



/*
	Fonction changerLayer
	Entrée ;
		- newlayer : nouvelle couche à afficher dans la carte
	But : changer de couche de layer
*/
function changeLayer(newlayer) {
	//on enleve la couche courante de la carte
	map.removeLayer(layer);
	//on sauvegarde le nouveau layer
	layer = newlayer;
	//on l'ajoute à la carte
	map.addLayer(layer);
}

/*
	Fonction zoomLayer
	But : action réalisée lors du changement de zoom
*/
function zoomLayer() {
	
	//On actualise la position de tous les popup
	for (i=0;i<tabEntrepriseClassees.length;i++) {
		if (tabEntrepriseClassees[i].length==1) {
			tabEntrepriseClassees[i].marker.popup.updatePosition();
		} else {
			for (j=0;j<tabEntrepriseClassees[i].length;j++) {
				tabEntrepriseClassees[i].marker.popup[j].updatePosition();	
			}
		}
	}

	/* Détermine, suivant le niveau de zoom, le layer à afficher. (INUTILE AVEC GOOGLE MAP) */
	/*

	//récupération du niveau de zoom
	var zoom = map.getZoom();

	if (zoom <= 8) {
		if (layer == layer1000) {}
		else {changeLayer(layer1000);}
	}
	if (zoom > 8 && zoom <= 10) {
		if (layer == layer500) {}
		else {changeLayer(layer500);}
	}
	if (zoom == 11) {
		if (layer == layer250) {}
		else {changeLayer(layer250);}
	}
	if (zoom == 12) {
		if (layer == layer100) {}
		else {changeLayer(layer100);}
	}
	if (zoom == 13) {
		if (layer == layer50) {}
		else {changeLayer(layer50);}
	}
	if (zoom >= 14) {
		if (layer == layer25) {}
		else {changeLayer(layer25);}
	}
	*/
}
		
	

/* Fonction classerEntreprise
	But : On classe les entreprises par localisation. On les regroupe par (longitude, latitude) afin de créer
	des popup à onglets lorsque plusieurs entreprises sont au même endroit.
	
	Attention il n'est pas judicieux de regrouper les entreprises par ville pour 2 raisons :
		- Plusieurs localisations dans une ville : Dans une grande ville des entreprises situées à deux extrémités se retrouveraient
												   sur un même point au centre de la ville. FONCTIONNEL mais dommage de ne pas mieux
												   exploiter la base.
		- Plusieurs villes pour une localisation : Par manque de précision de la base, 
												   des petites communes peuvent être localisée au même endroit. Du coup, un regroupement
												   par ville provoquerait le placement de plusieurs marqueurs au même endroit de la carte.
												   On ne pourrait accéder alors qu'au dernier marqueur superposé. NON FONCTIONNEL !!

	Il n'est pas judicieux non plus de regrouper les entreprises par codes postaux pour les mêmes raisons.
		- Certains codes postaux ont les mêmes coordonnées géographiques (par manque de précision de la base). Seul le dernier marqueur
		  superposé serait alors accessible. NON FONCTIONNEL !!
		- Pour un même code postal plusieurs villes pouvant être localisées différemment, se retrouveraient regroupées en un popup.
		  FONCTIONNEL mais dommage de ne pas mieux exploiter la base.
*/
function classerEntreprise () {
	//variable permettant de stocker temporairement le code postal
	var lon;
	//variable permettant de récupérer le résultat de la fonction contains
	var indice;	
	//on parcourt le tableau tabEntreprise
	for (i=0;i<tabEntreprise.length;i++) {
		//on récupère le code postal de l'entreprise courante
		lon = tabEntreprise[i].lo;
		//on regarde si ce code postal est contenu dans le tableau tapCP 
		indice = contains(tabLon,lon);
		if (indice!=-1 && tabLat[indice]==tabEntreprise[i].la) {
			//Si oui cela veut dire qu'il y a deja une entreprise à cette localisation, il faut donc seulement rajouter l'entreprise à la suite
			tabEntrepriseClassees[indice].push(tabEntreprise[i]);
		}
		else {
			//Sinon, on enregistre donc le code postal, et on crée un nouveau tableau dans le tableau tabEntrepriseClassees
			tabLon[indiceTab] = lon;
			tabLat[indiceTab] = tabEntreprise[i].la;
			tabEntrepriseClassees[indiceTab] = [tabEntreprise[i]]; 
			indiceTab++;
		}
	}
}

/*
	Fonction recentrage
	But : recentrer la carte
	Entrée : 
		- lat, lon : coordonnées du point central
		- zoom : niveau de zoom désiré
*/
function recentrage(lat,lon,zoom) {
	//on recentre la carte
	map.setCenter(new OpenLayers.LonLat(lon,lat),zoom);
}


/*
	Fonction de remise à zéro de la carte
	But : supprimer tous les éléments de la carte, popup, marqueurs, réinitialisation des variables...
	parametre : booleen : true : supprime aussi le marqueur de recherche
						  false : sinon le laisse sur la carte
*/
function raz(markerSearch) {
	//On supprime tous les popups
	for (i=0;i<tabEntrepriseClassees.length;i++) {
		if (tabEntrepriseClassees[i].length==1) {
			tabEntrepriseClassees[i].marker.popup.destroy();
		} else {
			for (j=0;j<tabEntrepriseClassees[i].length;j++) {
				tabEntrepriseClassees[i].marker.popup[j].destroy();	
			}
		}
	}
	if(markerSearch==false && testMarker==true)
		var lonlat=markerRecherche.lonlat;

	for (i=0;i<markers.length;i++) {
			markers[i].destroy();
	}

	markers.destroy();
	markers = new OpenLayers.Layer.Markers("Marqueur");
	map.addLayer(markers);

	if(markerSearch==false && testMarker==true) {
		var size = new OpenLayers.Size(15,25);
		var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
		var icon = new OpenLayers.Icon('images/recherche2.png',size,offset);
		markerRecherche = new OpenLayers.Marker(lonlat,icon); //création du nouveau marker
		markers.addMarker(markerRecherche); //ajout du marqueur
		testMarker = true;
	}
	else
		testMarker = false;

	tabLon = null;
	tabLon = new Array();
	tabLat = null;
	tabLat = new Array();
	indiceTab = 0;
	tabEntreprise = null;
	tabEntreprise = new Array();
	tabEntrepriseClassees = null;
	tabEntrepriseClassees = new Array();
}


/*
	Fonction placerMarqueurs
	But : Afficher les entreprises contenues dans le tableau TabEntrepriseClassees via des marqueurs,
		  selon que le tableau contient une ou plusieurs entreprises, on procède différement
*/
function placerMarqueurs() {
	//Variable temporaire pour l'entreprise courante
	var eTemp;
	//Variable temporaire pour le feature
	var fTemp;
	//variable temporaire pour le marker
	var mTemp;
	//variable stockant l'url de l'icone des marqueurs
	var urlIcon;
	
	var compt=1;
	var larg;
	var haut;

	//on parcourt le tableau de classement des entreprises
	for (indiceTableau=0;indiceTableau<tabEntrepriseClassees.length;indiceTableau++) {

		
		//récupération de l'objet entreprise
		eTemp = tabEntrepriseClassees[indiceTableau][0];		
		larg=-1;
		haut=-1
	
		//définition de l'icone du marqueur
		var size = new OpenLayers.Size(15,25);
		var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
		if (tabEntrepriseClassees[indiceTableau].length==1)
		{
			urlIcon = urlIconeSimple;
		}
		else
		{
			urlIcon = urlIconeMulti;
		}
		var icon = new OpenLayers.Icon(urlIcon,size,offset);
		
		//définition du marqueur
		tabEntrepriseClassees[indiceTableau].marker = new OpenLayers.Marker(new OpenLayers.LonLat(eTemp.lo,eTemp.la),icon);
		
		//ajout du marqueur dans le conteneur
		mTemp = tabEntrepriseClassees[indiceTableau].marker;

		//ajout du marqueur sur la carte
		markers.addMarker(mTemp);	
	
		if (tabEntrepriseClassees[indiceTableau].length==1) {				
			//Définition de la popup
			mTemp.popup = new OpenLayers.Popup(
				eTemp.nom,
				new OpenLayers.LonLat(eTemp.lo,eTemp.la),
                new OpenLayers.Size(eTemp.largeurPopup+19,eTemp.hauteurPopup+35),
                "<div class='popup-contenu'>" + eTemp.info + "</div>",
                true);
			//par défaut on cache la popup
			mTemp.popup.hide();
			
			//construction du contenu de la popup
			var contenu = construirePopup(indiceTableau,eTemp,0,compt);
			//Ajout du contenu
			mTemp.popup.setContentHTML(contenu);
			
			//on ajoute la popup à la carte
			markers.map.addPopup(mTemp.popup);
			mTemp.popup.setBorder("14px");
			//on ajoute un écouteur au marqueur pour afficher la popup
			mTemp.events.register("mousedown",mTemp,afficherPopup);
		}
		else {
			//Cette fois l'attribut popup est un tableau, 
			mTemp.popup = new Array();

			/* on choisit une largeur adaptée : la même pour tous les onglets du popup : la largeur la plus importante sur l'ensemble des onglets */
			for (m=0;m<tabEntrepriseClassees[indiceTableau].length;m++) {
				eTemp = tabEntrepriseClassees[indiceTableau][m];

				if (larg<eTemp.largeurPopup) {
					larg=eTemp.largeurPopup;
				}
				if (haut<eTemp.hauteurPopup) {
					haut=eTemp.hauteurPopup;
				}
			}

			//on parcourt toutes les entreprises qui sont situées à indiceTableau
			for (m=0;m<tabEntrepriseClassees[indiceTableau].length;m++) {

				eTemp = tabEntrepriseClassees[indiceTableau][m];
				//Définition de la popup
				
				/*on ajoute 10 + 2 + 7 à la largeur (correspond au padding du "popup-contenu", au border
				et à la prise en compte du tableau utilisé pour afficher les informations de l'entreprise)
				-  null correspond à une hauteur automatique (s'adapte au contenu) */
				mTemp.popup[m] = new OpenLayers.Popup(
					eTemp.nom,
					new OpenLayers.LonLat(eTemp.lo,eTemp.la),
					new OpenLayers.Size(larg+19,haut+35),
					mTemp.info,true
				);
				//par défaut on masque la popup
				mTemp.popup[m].hide();
				//construction du contenu de la popup
				var contenu = construirePopup(indiceTableau,eTemp,m,compt);
				//Ajout du contenu
				mTemp.popup[m].setContentHTML(contenu);
				//ajout de la popup sur la carte
				markers.map.addPopup(mTemp.popup[m]);
			}
			//enregistrement d'un écouteur sur la carte pour afficher la popup
			mTemp.events.register("mousedown",mTemp,afficherPopup);	
		}
		//on compte le nombre d'entreprises traitées
		compt+=tabEntrepriseClassees[indiceTableau].length;
	}
}

/*
	Fonction construirePopup
	Entrée :
		- indiceTableau : indice du tableau
		- ETemp : information sur l'entreprise
		-indice Popup : indice de la popup 
*/
function construirePopup (indiceTableau,eTemp,indicePopup,compt) {
	//définition de l'entete
	//var tempS="<html><head></head><body>";	
	var tempS = "<div class='menu1'>";
	//On ajoute un lien au descriptif permettant de switcher entre les popups
	for (n=0;n<tabEntrepriseClassees[indiceTableau].length;n++) {
		if (n == indicePopup) 
			tempS = tempS + "<span class='onglet-actif'>"+ (compt+n) +"</span>";
		else
			tempS = tempS + "<span class='onglet' onmouseover='this.style.cursor=\"pointer\";' onclick='switcherOnglets("+n+","+indicePopup+","+indiceTableau+","+ compt +");'>"+ (compt+n) +"</span>";
			//tempS = tempS + "<a class='onglet' href='#' onClick='switcherOnglets("+n+","+indicePopup+","+indiceTableau+");'>"+tabEntrepriseClassees[indiceTableau][n].nom+"</a>&nbsp;";
	}
	tempS= tempS + "</div>";
	tempS= tempS + "<div class='popup-contenu'>" + eTemp.info + "</div>";
	//tempS = tempS + "</body></html>";
	return tempS;
}


/*
	Fonction switcherOnglets
	entrée :
		- nouvelOnglet : nouvel onglet (popup) à afficher
		- ancienOnglet : ancien onglet (popup) à afficher
		- indiceTab : indice du tableau
*/
function switcherOnglets(nouvelOnglet,ancienOnglet,indiceTab,compt) {
	var tempS = construirePopup(indiceTab,tabEntrepriseClassees[indiceTab][nouvelOnglet],nouvelOnglet,compt);
	tabEntrepriseClassees[indiceTab].marker.popup[nouvelOnglet].setContentHTML(tempS);
	tabEntrepriseClassees[indiceTab].marker.popup[ancienOnglet].hide();		
	tabEntrepriseClassees[indiceTab].marker.popup[nouvelOnglet].show();	
	tabEntrepriseClassees[indiceTab].marker.popup[nouvelOnglet].updatePosition();
}



/*
	Fonction getCoordRecentrage
	entrée :
		- popup : OpenLayers.Popup : popup à recentrer
*/
function getCoordRecentrage(popup) {

	var newlonlat = new OpenLayers.LonLat(0,0);


	/* ---------- Si on doit déplacer vers la gauche ou vers le haut ---------- */

	//on récupère les coordonnées en pixel du point en haut à gauche du popup
	var pxpopup=map.getPixelFromLonLat(new OpenLayers.LonLat(popup.lonlat.lon,popup.lonlat.lat));

	//on récupère les coordonnées en pixel du point en bas à droite du popup
	var lola=map.getLonLatFromPixel(new OpenLayers.Pixel((pxpopup.x+popup.size.w),(pxpopup.y+popup.div.offsetHeight)));

	/* taille du popup en coordonnées (lon, lat) */
	var largpopup=lola.lon - popup.lonlat.lon;
	var hautpopup=popup.lonlat.lat - lola.lat;

	/* Récupération des longitudes et latitudes max affichées actuellement sur la carte */
	var lonmax=map.getLonLatFromPixel(new OpenLayers.Pixel(map.getCurrentSize().w,0));
	var latmin=map.getLonLatFromPixel(new OpenLayers.Pixel(0,map.getCurrentSize().h));

	/* Calcul de la partie visible du popup */
	var largvisible=lonmax.lon-popup.lonlat.lon;
	var hautvisible=popup.lonlat.lat - latmin.lat;

	//on récupère le centre en pixel
	var pxcenter=map.getPixelFromLonLat(new OpenLayers.LonLat(map.getCenter().lon, map.getCenter().lat));

	/* Récupération du point utilisé pour les marges droites et bas */
	var lonlatcenter=map.getLonLatFromPixel(new OpenLayers.Pixel((pxcenter.x-10), (pxcenter.y-10)));
	var margeH=map.getCenter().lon - lonlatcenter.lon;
	var margeV=lonlatcenter.lat - map.getCenter().lat;

	/* Calcul des décalages à faire pour le recentrage */
	var decalH=largpopup-largvisible + margeH;
	var decalV=hautpopup-hautvisible + margeV; /* +(coefflong/20) pour laisser une marge */ 


	if(decalH>0)
		newlonlat.lon=(map.getCenter().lon + decalH);
	else
		newlonlat.lon=map.getCenter().lon;

	if(decalV>0)
		newlonlat.lat=(map.getCenter().lat - decalV);
	else
		newlonlat.lat=map.getCenter().lat;



	/* ---------- Si on doit déplacer vers la droite ou vers le bas ---------- */

	var lonlatmarge=map.getLonLatFromPixel(new OpenLayers.Pixel(40, 10));

	if(map.getPixelFromLonLat(popup.lonlat).x<40){ // on laisse 40 pixels de marge à gauche (prise en compte de l'outil de zoom)
		newlonlat.lon = map.getCenter().lon + (popup.lonlat.lon - lonlatmarge.lon);
	}
	if(map.getPixelFromLonLat(popup.lonlat).y<10){ // on laisse 10 pixels de marge en haut
		newlonlat.lat = map.getCenter().lat + (popup.lonlat.lat - lonlatmarge.lat);
	}


	/* on retourne le nouveau centre de la carte */
	return newlonlat;
}



/*
	function afficherPopup
	But : Afficher une popup pour un marker
	Entrée
		evt : evenement gérant la détection du clic
*/
function afficherPopup(evt) {

	var newlonlat;

	//on cherche si l'un des onglets est déjà visible
	var visible=-1;
	for(k=0;k<this.popup.length;k++){
		if(this.popup[k].visible()==true)
			visible=k;
	}

	//On efface toutes les popups qui auraient pu être affichés auparavant
	for (i=0;i<tabEntrepriseClassees.length;i++) {
		if (tabEntrepriseClassees[i].length==1) {
			if (tabEntrepriseClassees[i].marker.popup!=this.popup)
				tabEntrepriseClassees[i].marker.popup.hide();
		} else {
			for (j=0;j<tabEntrepriseClassees[i].length;j++) {
				if (tabEntrepriseClassees[i].marker.popup[j]!=this.popup[visible])
					tabEntrepriseClassees[i].marker.popup[j].hide();	
			}
		}
	}

	//test pour savoir si le marqueur ne contient qu'une seule popup (marqueur une entreprise) ou plusieurs 
	if(!this.popup.length) {
		//si la popup est affiché on la cache sinon on l'affiche
		if (this.popup.visible()==false) {
			this.popup.show();
			this.popup.updatePosition();
			
			newlonlat = getCoordRecentrage(this.popup);
			
			/* on recentre avec les coordonnées adaptées */
			recentrage(newlonlat.lat,newlonlat.lon,map.getZoom());

		} else {
			this.popup.hide();
		}
	}
	else {
		if (visible==-1) {
			this.popup[0].show();
			this.popup[0].updatePosition();

			newlonlat = getCoordRecentrage(this.popup[0]);
			
			/* on recentre avec les coordonnées adaptées */
			recentrage(newlonlat.lat,newlonlat.lon,map.getZoom());
		} else
			this.popup[visible].hide();
	}

	Event.stop(evt);
} 



/*
	Fonction afficherInfoBulle
	But : Afficher l'infoBulle d'un marqueur
	Entrée :
		- id : identifiant de l'entreprise
*/
function afficherInfoBulle(id) {

	var newlonlat;

	//On efface toutes les popups qui auraient pu être affichés auparavant
	for (i=0;i<tabEntrepriseClassees.length;i++) {
		
		if (tabEntrepriseClassees[i].length==1) {
			tabEntrepriseClassees[i].marker.popup.hide();
			if (tabEntrepriseClassees[i][0].id==id) 
			{
				tabEntrepriseClassees[i].marker.popup.show();
				newlonlat = getCoordRecentrage(tabEntrepriseClassees[i].marker.popup);
				/* on recentre avec les coordonnées adaptées */
				recentrage(newlonlat.lat,newlonlat.lon,map.getZoom());
			}
		}
		else {
			for (j=0;j<tabEntrepriseClassees[i].length;j++) {
				tabEntrepriseClassees[i].marker.popup[j].hide();
				if (tabEntrepriseClassees[i][j].id==id)
				{
					tabEntrepriseClassees[i].marker.popup[j].show();
					newlonlat = getCoordRecentrage(tabEntrepriseClassees[i].marker.popup[j]);
					
					/* on recentre avec les coordonnées adaptées */
					recentrage(newlonlat.lat,newlonlat.lon,map.getZoom());
				}
			}
		}
	}
}