(function(){
	// Si les namespaces/classes nécessaires ne sont pas chargées : exception
	if(!window.ev){throw new Error("Le namespace 'ev' doit exister");}
	if(!ev.rjs){throw new Error("Le namespace 'ev.rjs' doit exister");}
	// On s'assure que le namespace ev.me existe
	if(!ev.me){ ev.me={}; }
	//Si la classe ev.me.GmapME est définie on sort
	if(ev.me.GmapME){return;}

	ev.me.GmapME=function(){

		/**
		 * attribut correspondant a la google map
		 */
		this.googleMap=null;

		this.mapStreet;

		/**
		 * liste contenant les marqueurs pour affihage sur googlemap
		 */
		this.markersList = new Array();


		/**
		 * focntion permettant d'initialiser la google map
		 */
		this.mapLoad = function() {
			if (typeof(GBrowserIsCompatible) != "undefined" && GBrowserIsCompatible() && document.getElementById("mapMEH") != null) {
				 this.googleMap = new GMap2(document.getElementById("mapMEH"));
				 this.googleMap.setUIToDefault();

				 //this.googleMap.addControl(new GLargeMapControl());  // Zoom avec zoom slider
				 //this.googleMap.addControl(new GSmallMapControl());  // Zoom sans zoom slider
				 //this.googleMap.addControl(new GScaleControl());  // echelle
				 //this.googleMap.addControl(new GMapTypeControl());  // Bouttons Plan, Satelitte, Mixte
				 //this.googleMap.addControl(new GOverviewMapControl());   //Creates a collapsible overview mini-map in the corner of the main map for reference location and navigation (through dragging)
				 //this.googleMap.enableGoogleBar();//ajoute un champs de recherche google sur la map
				 //var point = new GLatLng(48.875961, 2.297542);//coord de paris par defaut
				 //this.googleMap.setCenter(point, 10);
				 var point = new GLatLng(0, 0);
				 this.googleMap.setCenter(point, 0);

				 //initialisation de google Street View
				 //if(document.getElementById("mapStreetMEH") != null){
				 	//this.mapStreet = new GStreetviewPanorama(document.getElementById("mapStreetMEH"));

					//methode appele si on a essaye d' afficher la street view et que google ne peut pas fournir de vue pour le point donne
					//GEvent.addListener(this.mapStreet, "error", function() {
				  //	alert("Pas de Street view pour ce point");
					//});


					//GStreetviewClient()

					/*svOverlay = new GStreetviewOverlay();
					this.googleMap.addOverlay(svOverlay);
					GEvent.addListener(this.googleMap,"click", function(overlay,latlng) {
						 mapStreet.setLocationAndPOV(latlng);
					});*/
				 //}

			}else{ //Si le navigateur n'est pas compatible avec l'API de Google Maps ...
				if(typeof(log)=='function') log('Desole, mais votre navigateur n\'est pas compatible avec Google Maps', 'warn');
	 		}
		};

		/**
		 * focntion permettant d'initialiser la google map pour l'hotel passï¿½ en param
		 */
		this.mapHotelLoad = function(_indexHotel) {
			if (GBrowserIsCompatible()) {
				var mapHotelDiv=display.prefixeHS+"mapHotel"+_indexHotel;
				this.googleMap = new GMap2(document.getElementById(mapHotelDiv));
				this.googleMap.setUIToDefault();
				//this.googleMap.addControl(new GSmallMapControl());  // Zoom sans zoom slider
				//this.googleMap.addControl(new GScaleControl());  // echelle
				//this.googleMap.addControl(new GMapTypeControl());  // Bouttons Plan, Satelitte, Mixte
				//this.googleMap.addControl(new GOverviewMapControl());   //Creates a collapsible overview mini-map in the corner of the main map for reference location and navigation (through dragging)
				var point = new GLatLng(48.875961, 2.297542);  // coord de paris par defaut
				this.googleMap.setCenter(point, 10);
			} else { //Si le navigateur n'est pas compatible avec l'API de Google Maps ...
				if(typeof(log)=='function') log('Desole, mais votre navigateur n\'est pas compatible avec Google Maps', 'warn');
	 		}
		};

		/**
		 * focntion permettant d'ajouter un marker pour l'hotel passï¿½ en param
		 */
		this.addMarkerOnMapHotel = function(lat,lng) {
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;
			var point = new GLatLng(lat, lng);
			this.googleMap.setCenter(point, 15);  // le zoom max etant egal a 17.
	 		var marker = new GMarker(point);
			this.markersList[lat+lng] = marker;
			this.googleMap.addOverlay(marker);
		};

		/**
		 * fct permettant d'ajouter un point correspondant a un aeroport sur la google map
		 * @param {Object} lat
		 * @param {Object} lgt
		 * @param {Object} nomAeroport
		 */
		this.addAeroportOnMap = function(lat, lgt, nomAeroport){
			// Si la google map n'a pas été initialisée, on sort
			if(!this.googleMap) return;

			var point = new GLatLng(lat, lgt, 10);

			var icon = new GIcon();
			icon.image = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/markerAvion.png";
			icon.iconSize = new GSize(26, 34);
			icon.shadowSize = new GSize(26, 34);
			icon.iconAnchor = new GPoint(10, 29);
			icon.infoWindowAnchor = new GPoint(10, 10)

			var marker = new GMarker(point, {icon:icon, title:nomAeroport});
			this.markersList[lat+lgt] = marker;
			this.googleMap.addOverlay(marker);
	   		//this.zoomToFit();
		};

		/**
		 * fct permettant d'ajouter un point correspondant a un Point d'Interet sur la google map dans le detail hotel
		 * @param {Object} lat
		 * @param {Object} lgt
		 * @param {Object} typePOI
		 * @param {Object} nomPOI
		 */
		this.addPOIOnMapHotel = function(lat, lgt, typePOI, nomPOI){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var point = new GLatLng(lat, lgt, 10);

			var icon = new GIcon();
			icon.image = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/markerPoi.png";
			icon.iconSize = new GSize(26, 34);
			icon.shadowSize = new GSize(26, 34);
			icon.iconAnchor = new GPoint(10, 29);
			icon.infoWindowAnchor = new GPoint(10, 10)

			var marker = new GMarker(point, {icon:icon, title:nomPOI});
			this.markersList[typePOI+lat+lgt] = marker;
			this.googleMap.addOverlay(marker);
	   		//this.zoomToFit();
		};

		/**
		 * fct permettant d'ajouter un point correspondant au centre ville sur la google map
		 * on passe en parametre la longitude, la latitude ainsi que le type de POI afin de pouvoir differencier les images des marqueurs
		 * @param {Object} lat
		 * @param {Object} lgt
		 * @param {Object} typePOI
		 * @param {Object} nomPOI
		 */
		this.addCVOnMap = function(lat, lgt, typePOI, nomPOI){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var point = new GLatLng(lat, lgt, 10);
			var urlIcon = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/markerCV_Off.png";
			var marker = this.creerPOIMarker(point, nomPOI, urlIcon);
			this.markersList[typePOI+lat+lgt] = marker;
			this.googleMap.addOverlay(marker);
			//this.googleMap.setCenter(marker.getPoint(), this.googleMap.getZoom());
		};

		/**
		 * fct permettant d'ajouter un point correspondant a un Point d'Interet sur la google map
		 * on passe en parametre la longitude, la latitude ainsi que le type de POI afin de pouvoir differencier les images des marqueurs
		 * @param {Object} lat
		 * @param {Object} lgt
		 * @param {Object} typePOI
		 * @param {Object} nomPOI
		 */
		this.addPOIOnMap = function(lat, lgt, typePOI, nomPOI){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var point = new GLatLng(lat, lgt, 10);

			var urlIcon;
			if(typePOI == ev.meh.POI.Type.CENTREVILLE)
				urlIcon = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/markerCV_On.png";
			else
				urlIcon = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/marker_Poi.png";

			var marker = this.creerPOIMarker(point, nomPOI, urlIcon);
			this.markersList[typePOI+lat+lgt] = marker;
			this.googleMap.addOverlay(marker);
			//this.googleMap.setCenter(marker.getPoint(), this.googleMap.getZoom());
		};

		/**
		 * permet de creer un marqueur a partir d'un point
		 * le parametre type de POI permet de pouvoir differencier les images des marqueurs
		 * @param {Object} point
		 * @param {Object} nomPOI
		 * @param {Object} urlIcon
		 */
		this.creerPOIMarker = function(point, nomPOI, urlIcon) {
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return null;

			var icon = new GIcon();
			icon.image = urlIcon;
			icon.iconSize = new GSize(26, 34);
			icon.shadowSize = new GSize(26, 34);
			icon.iconAnchor = new GPoint(10, 29);
			icon.infoWindowAnchor = new GPoint(10, 10)

			var marker = new GMarker(point, {icon:icon, title:nomPOI});

			//fct declenchee quand on clique sur un marqueur de la gmap
			GEvent.addListener(marker, "click", function() {
				var z = gmap.googleMap.getZoom()+1;
				if(z>22) z=22;  //22 est le zoom max des cartes google (peut changer...)
				gmap.googleMap.setCenter(marker.getPoint(),z);
			});

			return marker;
		};

		/**
		 * fct permettant d'ajouter un point correspondant a un hotel sur la google map
		 * @param {Object} hotel
		 * @param {Object} index
		 */
		this.addHotelOnMap = function(hotel , index){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var point = new GLatLng(parseFloat(hotel.latitude), parseFloat(hotel.longitude), 10);
			var marker = this.creerHotelMarker(point, hotel, index);
			this.markersList[hotel.idHotelEasy] = marker;
			this.googleMap.addOverlay(marker);
			//map.setCenter(marker.getPoint(),map.getZoom());
		};

		/**
		 * permet de creer un marqueur a partir d'un point, d'un hotel
		 * le parametre index est la position de l'hotel dans la liste de resultats et permet de recuperer la bonne image a afficher (marqueur sur carte Gmap avec numero)
		 * @param {Object} point
		 * @param {Object} hotel
		 * @param {Object} index
		 */
		this.creerHotelMarker = function(point, hotel, index) {
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return null;

			var icon = new GIcon();
			icon.image = ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/marker"+index+".gif";
			icon.iconSize = new GSize(22, 34);
			icon.shadowSize = new GSize(22, 34);
			icon.iconAnchor = new GPoint(10, 29);
			icon.infoWindowAnchor = new GPoint(10, 10)

			var marker = new GMarker(point, {icon:icon, title:hotel.nom + "   " + hotel.prixTTC});
			marker.value = hotel.idHotelEasy;


			var map = gmap.googleMap;
			var self = this;

			//fct declenchee quand on clique sur un marqueur de la gmap
			GEvent.addListener(marker, "click", function() {




				//interaction avec google Street View
				if(typeof(self.mapStreet) != "undefined"){
					var fenwayPark = marker.getPoint();
					var myPOV = {yaw:370.64659986187695,pitch:-20};
					self.mapStreet.setLocationAndPOV(fenwayPark, myPOV);
				}


				//affichage de l'info bulle
				self.getInfosBulle(map, marker, hotel, index);
				//self.getPhotos(map, marker, hotel);

			});

			//fct declenchee quand on referme la bulle d'info d'un marqeur de la gmap
			GEvent.addListener(marker, 'infowindowclose', function() {
	        self.zoomToFit();
				//map.setCenter(marker.getPoint(), 12);
			});

			//fct declenchee quand on passe  la souris sur un marqueur de la gmap
			GEvent.addListener(marker, "mouseover", function() {
				marker.setImage(ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/markerOver"+index+".gif");
				display.viewMarqListeMouseOver(index);
			});

			//fct declenchee quand on retire la souris d'un marqueur
			GEvent.addListener(marker, "mouseout", function() {
				marker.setImage(ev.me.URL_IMAGE+"/base/imgs/icons/iconsGMap/marker"+index+".gif");
				display.viewMarqListeMouseOut(index);
			});

			return marker;
		};

		/**
		 * Permet d'afficher les infos dans la bulle de la gmap
		 * Avant d'afficher une bulle d'informations
		 *
		 * @param {Object} point
		 * @param {Object} hotel
		 * @param {Object} index
		 */
		this.getInfosBulle = function(map, marker, hotel, index) {
			display.getInfosBulle(map, marker, hotel, index);
		};


		/**
		 * Recuperer les photos de l'hotel
		 * Avant d'afficher une bulle d'informations
		 *
		 * @param {Object} point
		 * @param {Object} hotel
		 * @param {Object} index
		 */
		this.getPhotos = function(map, marker, hotel) {
			display.getPhotos(map, marker, hotel);
		};

		/**
		 * Creer la bulle d'infos lorsque les photos ont ete recues
		 */
		this.photosReceived = function (map, marker, hotel) {

				map.setCenter(marker.getPoint(),12);

				//la variable message contient le texte qui va apparaitre dans l'info bulle
				var message =
					'<div>'
					+ '<a id="previousPhotoLink" href="javascript:display.showPreviousPhoto('+hotel.idHotelEasy+')"><img class="fleche" src="'+ev.me.URL_IMAGE+'/base/imgs/but_diapo_g.gif"/></a>'
					+ '<img id="hotelPhotoMap" src="' + hotel.urlPhoto +'" height="60" width="60" onMouseOver="display.showImage(' + hotel.idHotelEasy + ')"; onMouseOut="display.hidePhoto()">'
					+ '<div id="realSizeDiv" style="display:none; float:right"><img id="realSizePhoto" src="'+ev.me.URL_IMAGE+'/base/imgs/whitespace.gif"/></div>'
					+ '<a id="nextPhotoLink" href="javascript:display.showNextPhoto('+hotel.idHotelEasy+')"><img class="fleche" src="'+ev.me.URL_IMAGE+'/base/imgs/but_diapo_d.gif"/></a>'
					+ '<br/>'
					+ hotel.nom
					+ '  <img alt="' + hotel.etoiles +' etoile(s)" src="'+ev.me.URL_IMAGE+'/base/imgs/default/meh/sstar'+ hotel.etoiles+'.gif">'
					+ '<br/>'
					+ '<div class="hotelPriceMap">' + hotel.prixTTC + ' &euro;</div>'
					+ '<br/><br/><br/>'
					+ '<a href="#" onclick="display.affichDetailsHotel(' + hotel.idHotelEasy + ');return false;" >Details</a>'
					+ '</div>';

				marker.openInfoWindowHtml(message);
		};

		/**
		 * permet de selectionner un hotel sur la carte, de centrer la carte dessus et d'afficher l'info bulle correspondante
		 * @param {Object} idHotelEasy
		 */
		this.viewOnMap = function(idHotelEasy){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			if(typeof(this.markersList[idHotelEasy]) != "undefined"){//on teste si le marqueur existe , si il existe , on fait le traitement
				//on affiche la map
				//unfold(document.getElementById("mapMEH"));
				//on place la vue au niveau de la carte
				window.location="#";
				//map.closeInfoWindow();
				var marker = this.markersList[idHotelEasy];
				//recentre la carte sur l'hotel selectionne
				this.googleMap.setCenter(marker.getPoint(),12);
				//permet d'ouvrir l'info bulle
				GEvent.trigger(marker, "click");
			}
		};

		/**
		 * evenement mouseover sur un marqueur
		 * @param {Object} idHotelEasy
		 */
		this.viewOnMapMouseOver = function(idHotelEasy){
			if (typeof(this.markersList[idHotelEasy]) != "undefined"){//on teste si le marqueur existe , si il existe , on fait le traitement
				//map.closeInfoWindow();
				var marker = this.markersList[idHotelEasy];
				GEvent.trigger(marker, "mouseover");
			}
		};

		/**
		 * evenement mouseout sur un marqueur
		 * @param {Object} idHotelEasy
		 */
		this.viewOnMapMouseOut = function(idHotelEasy){
			if (typeof(this.markersList[idHotelEasy]) != "undefined"){//on teste si le marqueur existe , si il existe , on fait le traitement
				//map.closeInfoWindow();
				var marker = this.markersList[idHotelEasy];
				GEvent.trigger(marker, "mouseout");
			}
		};

		/**
		 * "surcharge de la fonction removeOverlay de google
		 * @param {Object} marker
		 */
		this.removeMarker = function(marker){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return null;

			return this.googleMap.removeOverlay(marker);
		};


		/**
		 * ci-dessous les focntions permettant de calculer le centre et le zoom de la google map
		 */

		/**
		 * Cette fonction permet de calculer les latitudes min et max des points listes
		 * un tableau (variable globale) de marqueurs : markersList stockees dans une structure MinMax.
		 * Dans le cas ou cette variable ne contiendrait aucun point, la fonction retourne les latitudes -90 a 90.
		 */
		this.getLatMinMax = function() {

			var tailleMarkersList=0;
			for (var i in this.markersList){
				tailleMarkersList++;
			}

			if(tailleMarkersList==0){// Si markersList est vide
				return new ev.me.MinMax(-90.0,90.0);
			}
			// toute valeur de latitude (par definition inferieure a 90) diminuera latMin
			var latMin=90;
			for (var i in this.markersList){
				if (this.markersList[i].getLatLng().lat()<latMin) {
					latMin=parseFloat(this.markersList[i].getLatLng().lat());
				}
			}
			// Meme principe pour latMax que pour latMin
			var latMax=-90;
			for (var i in this.markersList){
				if (this.markersList[i].getLatLng().lat()>latMax) {
					latMax=parseFloat(this.markersList[i].getLatLng().lat());
				}
			}
			// Si le tableau markersList etait vide latMin=90, latMax=-90, et la moyenne vaut bien zero.
			return new ev.me.MinMax(latMin,latMax);
		};

		this.triNum =  function(a,b) {
			return a-b;
		};


		/**
		 * Cette fonction permet de calculer les longitudes min et max des points listes
		 * un tableau (varible globale) de marqueurs : markersList. Dans le cas ou cette variable ne
		 * contiendrait aucun point, la fonction retourne les latitudes -180 a 180.
		 */
		this.getLngMinMax = function() {

			var tailleMarkersList=0;
			for (var i in this.markersList){
				tailleMarkersList++;
			}

			if(tailleMarkersList==0){
				return new ev.me.MinMax(-180,180);
			}
			if(tailleMarkersList==1){
				for (var i in this.markersList){
					return new ev.me.MinMax(this.markersList[i].getLatLng().lng(),this.markersList[i].getLatLng().lng());
				}
			}
			var lngSortedArray=new Array();
			for (var i in this.markersList){
				lngSortedArray.push(parseFloat(this.markersList[i].getLatLng().lng()));
			}
			lngSortedArray.sort(this.triNum);
			// On va chercher l'index du delta maximal, i.e. le point dont l'elongation angulaire est
			// maximale avec son predecesseur.
			var indexDeltaMax=0;
			var deltaMax=lngSortedArray[0]-lngSortedArray[lngSortedArray.length-1]+360;
			for(var i=1;i<lngSortedArray.length;i++){
				var delta=lngSortedArray[i]-lngSortedArray[i-1];
				if(delta>deltaMax){
					deltaMax=delta;
					indexDeltaMax=i;
				}
			}
			var lngMin=lngSortedArray[indexDeltaMax];
			var lngMax;
			if(indexDeltaMax!=0){
				lngMax=lngSortedArray[indexDeltaMax-1];
			}
			else{
				lngMax=lngSortedArray[lngSortedArray.length-1];
			}
			if(lngMin>lngMax){
				lngMax+=360;
			}
			return new ev.me.MinMax(lngMin,lngMax);
		};

		/**
		 * Cette fonction permet de definir le zoom optimal en fonction de l'ecart des
		 * longitudes maximums et minimums
		 * @param {Object} lngMinMax
		 */
		this.getZoomX =  function(lngMinMax,widthMarker) {
			//var width=document.getElementById("mapMEH").clientWidth;
			var width=document.getElementById("mapMEH").clientWidth-(widthMarker*2);
			return Math.log(width*180/40.93/lngMinMax.getDelta()/Math.PI)/Math.LN2;
		};

		/**
		 * Cette fonction permet de definir le zoom optimal en fonction de l'ecart des
		 * latitudes maximums et minimums
		 * @param {Object} latMinMax
		 */
		this.getZoomY =  function(latMinMax,heightMarker) {
			//var height=(document.getElementById("mapMEH").clientHeight);
			var height=(document.getElementById("mapMEH").clientHeight)-heightMarker;
			return Math.log(height*180*Math.cos(latMinMax.getMean()*Math.PI/180)/40.93/latMinMax.getDelta()/Math.PI)/Math.LN2;
		};

		/**
		 * Cette fonction definit le niveau de zoom en prenant la plus petite valeur entre
		 * les zooms optimals des longitudes et latitudes
		 * @param {Object} lngMinMax
		 * @param {Object} latMinMax
		 */
		this.getZoom = function(lngMinMax,latMinMax) {
			//dimensions du marqueur (en pixel)
			var widthMarker=26;
			var heightMarker=34;

			var Zx=this.getZoomX(lngMinMax,widthMarker);
			var Zy=this.getZoomY(latMinMax,heightMarker);
			return Math.floor(Math.min(Zx,Zy));
		};

		/**
		 * Cette fonction calcule le centre et le zoom de la carte
		 * apres que tous les markers ont ete places
		 */
		this.zoomToFit = function(){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var latMinMax=this.getLatMinMax();
			var lngMinMax=this.getLngMinMax();
			if (!isNaN(latMinMax.getMean()) && !isNaN(lngMinMax.getMean())){
				var zoom = this.getZoom(lngMinMax,latMinMax);
				if(zoom == Infinity) zoom = 11;
				this.googleMap.setCenter(new GLatLng(latMinMax.getMean(),lngMinMax.getMean()),zoom);
			}
		};

		/**
		 * Cette fonction permet de recalculer la carte si on redimensionne le conteneur de la carte
		 */
		this.checkResize = function(){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;
			this.googleMap.checkResize();
			var latMinMax=this.getLatMinMax();
			var lngMinMax=this.getLngMinMax();
			this.googleMap.setCenter(new GLatLng(latMinMax.getMean(),lngMinMax.getMean()));
		};

		/**
		 * "surcharge" de la fonction setCenter de google
		 * @param {Object} Lat
		 * @param {Object} Long
		 * @param {Object} zoom
		 */
		this.updateCenter = function(lat,lng, zoom){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

			var gLatLng = new GLatLng(lat,lng);
			this.googleMap.setCenter(gLatLng, zoom);
		};

		/**
		 * Fonction permettant de cacluler la distance entre deux points dont les
		 * corrdonnees sont passees en parametres en utilisant l'API Google
		 * @param {Object} lat1
		 * @param {Object} lgt1
		 * @param {Object} lat2
		 * @param {Object} lgt2
		 */
		this.calculDistance = function(lat1, lng1, lat2, lng2){
			/*if (typeof(GLatLng) != "undefined") {
				//on construit le point correspondant au coordonnees passees en parametres
				var point = new GLatLng(lat1, lgt1);
				//on construit le point correspondant au POI
				var pointRef = new GLatLng(lat2, lgt2);
				//on calcul la distance entre les 2 points (la methode distanceFrom() appartient a l'API gmap)
				var distance = point.distanceFrom(pointRef); //la distance retournee et en metres

				if(!window.lang){
					window.lang="fr_FR";
				}
				if (window.lang == "en_GB") {
					return Math.round((distance / 100)*0.62) / 10;
				}
				//on convertie la distance en km et on la retourne
				return Math.round(distance / 100) / 10;
			}
			return "n.c";
			*/
			return CalculDistance().compute(lat1, lng1, lat2, lng2);
		};


		/**
		 * permet de dessiner un cercle sur la gmap
		 * @param {Object} centre
		 * @param {Object} rayon : Rayon du cercle en kilometre(s)
		 * @param {Object} cercleCouleur : Couleur du cercle
		 * @param {Object} cercleEpaisseur : Epaisseur du trait tracant le cercle (en pixel)
		 * @param {Object} cercleOpacite : Opacite du trait tracant le cercle (de 0 a 1)
		 * @param {Object} disqueCouleur : Couleur du disque
		 * @param {Object} disqueOpacite : Opacite du disque (de 0 a 1)
		 */
		this.drawCircle = function(centre, rayon, cercleCouleur, cercleEpaisseur, cercleOpacite, disqueCouleur, disqueOpacite  ){
			// Si la google map n'a pas ete initialisee, on sort
			if(!this.googleMap) return;

	  	//Nombre de segments composant le cercle
	  	var segment = 60;

			var latConv = centre.distanceFrom(new GLatLng(parseFloat(centre.lat())+0.1, parseFloat(centre.lng())))/100;
			var lngConv = centre.distanceFrom(new GLatLng(parseFloat(centre.lat()), parseFloat(centre.lng())+0.1))/100;
			var points = [];
			var step = parseInt(360/segment)||10;
			for(var i=0; i<=360; i+=step){
				var point = new GLatLng(parseFloat(centre.lat()) + (rayon/latConv * Math.cos(i * Math.PI/180)), parseFloat(centre.lng()) + (rayon/lngConv * Math.sin(i * Math.PI/180)));
				points.push(point);
			}
			var cercle = new GPolygon(points, cercleCouleur, cercleEpaisseur, cercleOpacite, disqueCouleur, disqueOpacite);

            if (genericNavigator.navigator.id == SAFARI && genericNavigator.os.os == MAC_OS_X_INTEL) {
				ev.log.info('nav = safari et os = mac')
            }
            else {//on n'affiche pas les cercles sur Safari car a fait bugger la carte (cf Redmine #170)
                this.googleMap.addOverlay(cercle);
            }
		};

	};
	ev.me.GmapME.prototype = new ev.me.MapME();

})();

