// JavaScript Document

   var depart = null;
   var terminus = null;
   var points = new Array();
   var tabMarkersRech = new Array();
   var cptLine = 0;
   var GDir1;
   var GDir2;
   var normalProj;
   var waypoints=[];
   var gpolys=[];
   var routeNodes=[];
   var init_route=[];
   var myNode;
   var markerDragged;
   var isDragged;
   var lastIndex;
   var prevIndex;
   var current_point_geoloc = 0;
   var newMarkers = [];
   var latLngs = [];
   var icons = [];
   var pointsToReverseGeoloc = [];
   var searchDepartDone = 0;
   var searchTerminusDone = 0;
   var markerDepart = null;
   var markerTerminus = null;
   var markerToMove = null;
   var lastFieldChanged = 0;
   var tabMarkersTmp = [];
   var prop_trajet = 1;
   
   var boundsMapGlobal = null;
   var boundsMapGlobalGpe = null;
   
   //Pour la validation du terminus et du parcours entre depart terminus dans le cas du passager
   var validerRecherche = 0;
   //Pour ne pas afficher le tracé dans le cas du passager
   var hidePolyLine = 0;
 //Avec form=0 pour formTrajet et form=1 pour formRech
   var formToSubmit = 0;
    function load() 
	{
       if (GBrowserIsCompatible())
	   {
			map = new GMap2(document.getElementById("map"));
			
			map.disableDoubleClickZoom();
			map.disableContinuousZoom();
			map.disableGoogleBar();
			map.addControl(new GLargeMapControl3D());
			map.removeControl(GScaleControl);
			map.enableScrollWheelZoom();
			normalProj = G_NORMAL_MAP.getProjection();			
			map.setCenter(new GLatLng(47.368594,2.988281),6);
			GEvent.addListener(this.map,"zoomend", function(oldLevel, newLevel)
			{				
				//self.ZoomEvent(oldLevel, newLevel);
				var gp = GDir1.getPolyline()
				//console.log("Gp : "+gp);

				if(gp)
				{
					//alert(gp.isHidden());
				}
			}); 
			
			boundsMapGlobal = new GLatLngBounds();
			boundsMapGlobalGpe = new GLatLngBounds();
			
			GDir1 = new GDirections(); // for extending route to additional point
			GDir2 = new GDirections(); // for recalculating of route when dragging line
			
			//GEvent.addListener(map, 'mousemove', getProximity); // for detecting if mouse is above displayed route
			GEvent.addListener(map, "zoomend", function() 
			{
				routeNodes = []; // clear cached coordinates in pixels of displayed route vertexes, the coordinates have to be recalculated on new zoom level
			});
			
			iconNode = new GIcon();	iconNode.image = web_path + '/images/etape-trajet.png';
			iconNode.shadow = ''; iconNode.iconSize = new GSize(10,10); iconNode.shadowSize = new GSize(0,0);
			iconNode.iconAnchor = new GPoint(5,5); iconNode.infoWindowAnchor = new GPoint(5,5);
			//iconNode.dragCrossImage = web_path + '/images/empty.gif'; 
			iconNode.dragCrossSize = GSize(1, 1); 
			iconNode.maxHeight = 1; 
			
			myNode = new GMarker(map.getCenter(), {icon:iconNode, draggable:true, bouncy:false, zIndexProcess:function(marker,b) {return 1;}});
			map.addOverlay(myNode);
			myNode.show(); // sometimes .hide() does not work without .show() at first ???
			myNode.hide(); // hide this marker initially
			
			GEvent.addListener(myNode, "drag", function() 
			{ // mouse was over displayed route and user drags the displayed marker
				myNode.show();
				
				if (isDragged == 2) { // already waiting for GDir2.load to complete - so just remember that marker was dragged again
					markerDragged = myNode; // remember which marker was dragged
					return;
				}
				
				if (myNode.MyIndex < waypoints.length) {
					isDragged = 2; // tag that GDir2.load is started
					markerDragged = false;
					
					lastIndex = myNode.MyIndex;	
					prevIndex = -1;
					// recalculate route between waypoints before and after myNode on the displayed line
					//GDir2.loadFromWaypoints([waypoints[lastIndex].getPoint(), myNode.getPoint().toUrlValue(6), waypoints[lastIndex + 1].getPoint()], {preserveViewport:true, getSteps:true,getPolyline:true});
					isDragged = 0;
				}
			});
			
			GEvent.addListener(myNode, "dragend", function() { // when user finished dragging the line, create new waypoint with permanent marker at the location
				
				document.getElementById("customTrajet").value = 1;
				
				var point = myNode.getPoint();
				tabMarkersTmp.push(point);
				var marker = new GMarker(point, {icon:iconNode, draggable:true, dragCrossMove:true, bouncy:true, autoPan:false, zIndexProcess:function(marker,b) {return 1;}});
				waypoints.splice(myNode.MyIndex + 1, 0, marker); //insert new waypoint into waypoints array
				
				for (var i = myNode.MyIndex; i < waypoints.length; i++) // reindex next waypoints
					waypoints[i].MyIndex = i;
				
				var dummy = new GPolyline([point]); // insert empty segment into route segments array - GDir2.load will replace it with new route segment
				map.addOverlay(dummy);
				gpolys.splice(myNode.MyIndex + 1, 0, dummy); 
				
				// add event listeners for marker of new waypoint - so route will be recalculated when user drags waypoint
				GEvent.addListener(marker, "dragstart", function() { isDragged = 1; myNode.hide(); });
				GEvent.addListener(marker, "dragend", function() { isDragged = 0; } );
				GEvent.addListener(marker, "drag", dragMarker);
				
				map.addOverlay(marker);
				
				if (myNode.MyIndex < waypoints.length) {
					lastIndex = myNode.MyIndex + 1; 
					prevIndex = lastIndex - 1;
					
					// recalculate route between previous and next waypoints going through new inserted waypoint
					var tbTmp = [];
					//tabMarkersTmp
					tbTmp.push(terminus);
					for(var c = 0; c < tabMarkersTmp.length;c++)
						tbTmp.push(tabMarkersTmp[c]);
					tbTmp.push(depart);
					
					GDir2.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
				}
			});	
			
			GEvent.addListener(GDir1, "error", function () {
				alert('gmap error');
			});
			GEvent.addListener(GDir1, "load", function() 
			{
				show('blocInfosPtGris');
				var route = GDir1.getRoute(0);
				var gp = GDir1.getPolyline();

				if (hidePolyLine == 1)
					gp.hide();
				//gp.setStrokeStyle({'opacity':'0.6','weight':'9'});
				
				if(document.getElementById("pointsTrajet"))
				{
					document.getElementById("pointsTrajet").value = '';					
					for(var i = 0; i < gp.getVertexCount();i++)
					{							
						document.getElementById("pointsTrajet").value = document.getElementById("pointsTrajet").value +';'+gp.getVertex(i);
					}
				}		
				//alert(document.getElementById("pointsTrajet").value);
				document.getElementById("lineDistance").value = GDir1.getDistance().meters;
				
				tabDirections.push(GDir1);

				var point = gp.getVertex(gp.getVertexCount() - 1); // snap to last vertex in the polyline
				
				markerToMove = new GMarker(point, {icon:iconNode, draggable:true, dragCrossMove:true, bouncy:true, autoPan:false, zIndexProcess:function(marker,b) {return 1;}});
				
				if (waypoints.length == 0) {	
					markerToMove.title = GDir1.getRoute(0).getStartGeocode().address;
					//waypoints[0] = markerToMove;
					waypoints.push(markerToMove);
				}
				else {
					waypoints[waypoints.length-1].title = GDir1.getRoute(0).getStartGeocode().address;
					markerToMove.title = GDir1.getRoute(0).getEndGeocode().address;
					//waypoints[1] = markerToMove;
					waypoints.push(markerToMove);
				}
				
				GEvent.addListener(markerToMove, "dragstart", function() { isDragged = 1; myNode.hide(); });
				GEvent.addListener(markerToMove, "drag", dragMarker); 
				GEvent.addListener(markerToMove, "dragend", function() { isDragged = 0; }); 
				
				markerToMove.MyIndex = waypoints.length;
				
				//map.addOverlay(markerToMove);
				//alert("ici2");
				if(waypoints)
				{
					if (waypoints.length > 1) 
					{ // if this was not the first waypoint - display the route to this waypoint
							map.addOverlay(gp);
						gpolys.push(gp);
						routeNodes = [];
						getProximity();
						//Zoom lors de la saisie
						map.setCenter(GDir1.getBounds().getCenter()); 
						map.setZoom(map.getBoundsZoomLevel(GDir1.getBounds()) - 1);
						//zoomfit();
					}
				}
				
				if (validerRecherche == 1){					
					prochainsDeparts(formToSubmit);
				}
			});
		
			GEvent.addListener(GDir2, "load", function() 
			{
				var gp = GDir2.getPolyline();
				gp.setStrokeStyle({'opacity':'0.6','weight':'9'});

				var route = GDir2.getRoute(0);
			
				
				if(document.getElementById("pointsTrajet"))
				{
					document.getElementById("pointsTrajet").value = '';

					for(var i = 0; i < gp.getVertexCount();i++)
					{							
						document.getElementById("pointsTrajet").value = document.getElementById("pointsTrajet").value +';'+gp.getVertex(i);
					}
				}		
				//alert(document.getElementById("pointsTrajet").value);
				document.getElementById("lineDistance").value = GDir2.getDistance().meters;
				tabDirections.push(GDir2);
				
				map.removeOverlay(gpolys[lastIndex]);
				
				if (prevIndex >= 0) { // not the last waypoint was dragged
					map.removeOverlay(gpolys[lastIndex-1]);
		
					var minD, minI, points=[];
					var p0 = waypoints[lastIndex].getPoint();
							
					for (var i = 0; i < gp.getVertexCount(); i++) { // search closest vertex to dragged waypoint for splitting received route at it into two routes between waypoints
						var p = gp.getVertex(i);
						points.push(p);
					
						var d = p0.distanceFrom(p);
					
						if (i == 0 || minD > d) {
							minD = d;
							minI = i;
						}	
					}
		
					gpolys[lastIndex - 1] = new GPolyline(points.slice(0, minI + 1)); //+1,  because slice extracts up to, but not including, the 'end' element
					gpolys[lastIndex] = new GPolyline(points.slice(minI, points.length));
					
					map.addOverlay(gpolys[lastIndex - 1]);
					
					waypoints[lastIndex-1].title = GDir2.getRoute(0).getStartGeocode().address;
					waypoints[lastIndex].title = GDir2.getRoute(0).getEndGeocode().address;
					waypoints[lastIndex+1].title = GDir2.getRoute(1).getEndGeocode().address;
				}
				else { // last waypoint was dragged
					gpolys[lastIndex] = gp;
					waypoints[lastIndex].title = GDir2.getRoute(0).getStartGeocode().address;
					waypoints[lastIndex+1].title = GDir2.getRoute(0).getEndGeocode().address;
				}
				
				map.addOverlay(gpolys[lastIndex]);
				map.setCenter(GDir2.getBounds().getCenter()); 
				map.setZoom(map.getBoundsZoomLevel(GDir2.getBounds())); 
				
				routeNodes = [];
				getProximity();
				
				isDragged = 0; // tag that there is no dragged waypoints or waiting for GDir to complete 
				//StoreToURL(waypoints);
				
				if (markerDragged) { // marker was dragged again until GDir2 was loaded
					isDragged = 1; // tag that there is dragged waypoint
					setTimeout(function() {GEvent.trigger(markerDragged, 'drag');}, 200); // trigger recalculation of route
				}				
			});			
	      }
		  
		  function onGDirectionsAddOverlay()
		  {
			 var gdir = GDir1;			  
			  for (var i=0; i<newMarkers.length; i++){
				map.removeOverlay(newMarkers[i]);
			  }			
			  // Loop through the markers and create draggable copies
			  for (var i=0; i<=gdir.getNumRoutes(); i++)
			  {
				var originalMarker = gdir.getMarker(i);
				latLngs[i] = originalMarker.getLatLng();
				icons[i] = originalMarker.getIcon();
				newMarkers[i] = new GMarker(latLngs[i],{icon:icons[i], draggable:true, dragCrossMove:true, bouncy:true, autoPan:false, title:'Draggable'});
				map.addOverlay(newMarkers[i]);
			
				// Get the new waypoints from the newMarkers array and call loadFromWaypoints by dragend
				GEvent.addListener(newMarkers[i], "dragend", function()
				{
				  pointsToReverseGeoloc = [];
				  for (var i=0; i<newMarkers.length; i++)
				  {
					pointsToReverseGeoloc[i] = newMarkers[i].getLatLng();
				  }				  
				  getAddress(pointsToReverseGeoloc[0]);				  
				  gdir.loadFromWaypoints(pointsToReverseGeoloc);
				});
			
				//Bind 'click' event to original markers 'click' event
				copyClick(newMarkers[i],originalMarker);
			
				// Now we can remove the original marker safely
				map.removeOverlay(originalMarker);
			  }			
			  function copyClick(newMarker,oldMarker){
				GEvent.addListener(newMarker, 'click', function(){
				  GEvent.trigger(oldMarker,'click');
				});
			  }
			}
       }

	function mapZoom(latitude, longitude)
	{
    	var point = new GLatLng( parseFloat(latitude), parseFloat(longitude));
    	map.setCenter(point,14, G_HYBRID_MAP );
    }
	
	var erreurDepart = 0;
	var erreurArrivee = 0;
    var coordDepart = null;
    var coordArrivee = null;
    var myLine = 0;
    //var pointsTrajetPassager = '';
    
    function drawTrajetPassager (){
    		tabArrets = document.getElementById('coordDepart').value.split("//");
	    	if (tabArrets != ''){
			coordDepart = new GLatLng(tabArrets [0], tabArrets[1]);
			tabArrets = document.getElementById('coordTerminus').value.split("//");
			coordArrivee = new GLatLng(tabArrets [0], tabArrets[1]);
			var tabPoints = new Array();
			//pointsTrajetPassager = document.getElementById("pointsTrajet").value;
			pointsTab = document.getElementById("pointsTrajet").value.substring(1, document.getElementById("pointsTrajet").value.length - 1).split(";");		
			for (i=0;i<pointsTab.length;i++){
				latlng = pointsTab[i].substr(1, pointsTab[i].length - 2).split(",");
				tabPoints[i] = new GLatLng(latlng[0], latlng[1]);
			}		
			var polyline =  new GPolyline(tabPoints);
			map.addOverlay(polyline);		
	    	searchTerminusDone = 1;
			searchDepartDone = 1;					
			markDepartArrivee();
    	}
    }
    
  //Trace un trajet avec comme coordonnés en paramètre la chaine "43.524910//5.454144"
    function traceTrajet(coordDepart, coordArrivee){    	
    	var tabDepart = coordDepart.split("//");
    	var tabArrivee = coordArrivee.split("//");
    	var departLatLng = new GLatLng(tabDepart[0], tabDepart[1]);
    	var arriveeLatLng = new GLatLng(tabArrivee[0], tabArrivee[1]);
    	//avec paramètre map => affiche dans le conteneur map défini de l'application Quivaou
    	var direction = new GDirections(map);
    	var tabPoints = new Array();
    	tabPoints.push(departLatLng);
    	tabPoints.push(arriveeLatLng);
    	directions.loadFromWaypoints(tabPoints, {preserveViewport:false, getSteps:true,getPolyline:true});
    }
    
    //Afficher un trajet uniquement selon son départ et son arrivée
    function traceTrajet (infoRechPassager){    	
    	tabArrets = document.getElementById('coordDepart').value.split("//");
		coordDepart = new GLatLng(tabArrets [0], tabArrets[1]);
		tabArrets = document.getElementById('coordTerminus').value.split("//");
		coordArrivee = new GLatLng(tabArrets [0], tabArrets[1]);
		var tbTmp = [];
		if (infoRechPassager == 1)
			directions = GDir1;
		else
			directions = new GDirections();
		depart = coordDepart;
		tbTmp.push(coordDepart);
		tbTmp.push(coordArrivee);
		GEvent.addListener(directions, "load", function() {
			markDepartArrivee();
			var route = directions.getRoute(0);
			var gp = directions.getPolyline();
			if(infoRechPassager == 1)
				gp.hide();
			document.getElementById("lineDistance").value = directions.getDistance().meters;
			document.getElementById("pointsTrajet").value = '';					
			for(var i = 0; i < gp.getVertexCount();i++)				
				document.getElementById("pointsTrajet").value = document.getElementById("pointsTrajet").value +';'+gp.getVertex(i);
			map.addOverlay(directions.getPolyline());			
			if(infoRechPassager == 1 && document.getElementById('infosDistance')){
				var dist = document.getElementById('lineDistance').value/1000;
				dist = dist.toFixed();
				
				//Calcul du Co2
				var co2 = dist * 0.140;
				co2 = co2.toFixed();
				
				var prix = dist/10;
				prix = Math.ceil(prix);
				document.getElementById('infosDistance').innerHTML += dist+"km, "+ co2 +"kg de CO&sup2;";
				document.getElementById('infosPrix').innerHTML += prix+" euro(s)";					
				document.getElementById("prixpassager").value=prix;
			}						
			GDir1.clear();
			
			map.removeOverlay(GDir1);
			map.removeOverlay(GDir2);
			for(var i =0; i< gpolys.length;i++)
			{
				gpolys[i].remove();	
			}
			gpolys = [];
			routeNodes = [];
			//Test si le zoom est géré par la création des marqueurs lorsqu'il y a des résultats de trajets compatibles
			if (document.getElementById("id_traj") &&document.getElementById("id_traj").value != ''){
				if (infoRechPassager == 1)
					createTrajetsMap(1, 0);
				else
					createTrajetsMap(1, 1);
			}
			if (tabResults == null || tabResults.length == 0){
				var bounds = new GLatLngBounds();				
				bounds.extend(coordDepart);
				bounds.extend(coordArrivee);				
				map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds) - 1);
			}
		});
		directions.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
		searchTerminusDone = 1;
		searchDepartDone = 1;
		
    }
    
    //Affiche un trajet avec selon ses points stockés dans la table trajets_points
	function drawTrajet (){
		points = document.getElementById('pointsTrajet').value;
		pointsTab = points.split("/");
		var tab = new Array();
		for (i=0;i<pointsTab.length;i++){
			latlng = pointsTab[i].split(";");
			tab[i] = new GLatLng(latlng[0], latlng[1]);
		}		
		var polyline = new GPolyline(tab);
		map.addOverlay(polyline);
		myLine = polyline;
		
		tabArrets = document.getElementById('coordDepart').value.split("//");
		coordDepart = new GLatLng(tabArrets [0], tabArrets[1]);
		tabArrets = document.getElementById('coordTerminus').value.split("//");
		coordArrivee = new GLatLng(tabArrets [0], tabArrets[1]);
		searchTerminusDone = 1;
		searchDepartDone = 1;
	}
	
	function centerMap(coordDepart, coordArrivee){
		var bounds = new GLatLngBounds();		
		bounds.extend(dep);
		bounds.extend(arr);
		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds) - 1);
	}
	
	function markDepartArrivee(){
		var Icon = new GIcon(); 
		Icon.image = web_path + "/images/icone_depart_trajet.png"; 
		Icon.iconSize = new GSize(32, 32); 
		Icon.shadowSize = new GSize(22, 20); 
		Icon.iconAnchor = new GPoint(16, 32); 
		Icon.infoWindowAnchor = new GPoint(6, 1); 
		Icon.infoShadowAnchor = new GPoint(13, 13); 
	    markerDepart = new GMarker(coordDepart,Icon, {zIndexProcess:0});	    
	    map.addOverlay(markerDepart);	    
	    Icon = new GIcon();
		Icon.image = web_path + "/images/icone_arrivee_trajet.png";  
		Icon.iconSize = new GSize(32, 32); 
		Icon.shadowSize = new GSize(22, 20); 
		Icon.iconAnchor = new GPoint(16, 32); 
		Icon.infoWindowAnchor = new GPoint(6, 1); 
		Icon.infoShadowAnchor = new GPoint(13, 13); 
		markerTerminus = new GMarker(coordArrivee,Icon, {zIndexProcess:0});
		map.addOverlay(markerTerminus);
		show('toolBarMap');
	}
	
    function searchDepart(fromHome)
	{	
		var adresse = document.getElementById("depart_adresse").value;		
				
		// Recherche des coordonnées d'un point dont on connait l'adresse :
		if(adresse.length>0)
		{
			//alert(adresse);
			adresse += " , FRANCE";
			hide("blocInfosHomeLeft2");
			hide("blocInfosHomeLeft1");
			$("#blocInfosHomeLeft1").removeShadow();
			hide("blocInfosHomeRight1");
			hide("blocInscription");
			
			hide("blocCovoiturage");
			hide("blocLegende");
			if(searchDepartDone == 1 && erreurDepart == 0)
			{
				if(newMarkers[0])
					map.removeOverlay(newMarkers[0]);
				if(markerToMove)
					map.removeOverlay(markerToMove);
				map.removeOverlay(GDir1);
				map.removeOverlay(GDir2);
				for(var i =0; i< gpolys.length;i++)
				{
					gpolys[i].remove();	
				}
				
				gpolys = [];
				routeNodes = [];
			}
				geocoder.getLatLng(adresse, function (coord) {
													  
					if(coord == null)
					{						
						erreurDepart = 1;
						show("messErreurDepart");
						
						return false;
					} else
					{
						erreurDepart = 0;
						hide("messErreurDepart");
					}
					
					if(fromDDMenuGroupe==1)
					{
						fromDDMenuGroupe = 0;
						searchDepart();
						return false;
					}
					
					// Et centrage de la map sur les coordonnées renvoyées par Google :
					map.setCenter(coord, 15);
					document.getElementById("coordDepart").value = coord.lat()+"//"+coord.lng();
	
					var Icon = new GIcon(); 
					Icon.image = web_path + "/images/icone_depart_trajet.png"; 
					Icon.iconSize = new GSize(32, 32); 
					Icon.shadowSize = new GSize(22, 20); 
					Icon.iconAnchor = new GPoint(16, 32); 
					Icon.infoWindowAnchor = new GPoint(6, 1); 
					Icon.infoShadowAnchor = new GPoint(13, 13); 
					if (coordDepart != null)						
						markerDepart = new GMarker(coordDepart,Icon);					
					else						
						markerDepart = new GMarker(coord,Icon);		
				    map.addOverlay(markerDepart);
				    tabMarkersRech.push(markerDepart);
								   
				    depart = coord;
				    points[0] = coord;
					   
					latLngs[0] = markerDepart.getLatLng();
					icons[0] = markerDepart.getIcon();
					newMarkers[0] = new GMarker(latLngs[0],{icon:icons[0], draggable:true, dragCrossMove:true, bouncy:true, autoPan:false, title:''});
					map.addOverlay(newMarkers[0]);
					
					boundsMapGlobal.extend(markerDepart.getLatLng());
					
					// Get the new waypoints from the newMarkers array and call loadFromWaypoints by dragend
					GEvent.addListener(newMarkers[0], "dragend", function()
					{							
					  pointsToReverseGeoloc = [];
					  pointsToReverseGeoloc[0] = newMarkers[0].getLatLng();
					  depart = newMarkers[0].getLatLng();
					  
					  current_point_geoloc = 0;
					  getAddress(pointsToReverseGeoloc[0]);
					  
					  for(var i =0; i< gpolys.length;i++)
					  {
						map.removeOverlay(gpolys[i]);	
					  }
					  
					  gpolys = [];
					  routeNodes = [];
					  map.removeOverlay(markerToMove);
					  
						if (waypoints.length == 0) 
						{
							//GDir1.loadFromWaypoints([pointsToReverseGeoloc[0].toUrlValue(6), pointsToReverseGeoloc[0].toUrlValue(6)], {preserveViewport:false, getSteps:true,getPolyline:true});
						} 
						else {
							//if(waypoints.length>1)
								waypoints.pop();

							//alert(waypoints.length);
							//for(var i = 0; i< waypoints.length;i++)
							//{
							//	alert(waypoints[i].getPoint());
							//}
							var tbTmp = [];
							//tabMarkersTmp
							tbTmp.push(terminus);
							for(var c = 0; c < tabMarkersTmp.length;c++)
								tbTmp.push(tabMarkersTmp[c]);
							
							if(pointsToReverseGeoloc[0])
							{
								tbTmp.push(pointsToReverseGeoloc[0].toUrlValue(6));
								GDir1.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
							}
						}		  
					});
				
					map.removeOverlay(markerDepart);
					
					if (waypoints.length == 0 || (waypoints.length==1 && searchDepartDone==1 && !terminus))
					{
						//#NICO
						//alert("ici");						
						GDir1.loadFromWaypoints([coord.toUrlValue(6), coord.toUrlValue(6)], {preserveViewport:false, getSteps:true,getPolyline:true});
					} 
					else 
					{
						if(waypoints.length>1)
						{
							GDir1.clear();	
						}
						
						if(lastFieldChanged == 1)
						{
							waypoints.pop();
						}
						
						if(pointsToReverseGeoloc[0])
						{
							var tbTmp = [];
							tbTmp.push(terminus);
							for(var c = 0; c < tabMarkersTmp.length;c++)
								tbTmp.push(tabMarkersTmp[c]);

							tbTmp.push(pointsToReverseGeoloc[0].toUrlValue(6));	
							GDir1.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});	
						} else {
							var tbTmp = [];
							tbTmp.push(terminus);
							for(var c = 0; c < tabMarkersTmp.length;c++)
								tbTmp.push(tabMarkersTmp[c]);
							
							tbTmp.push(depart);	
							GDir1.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
						}
					}
					
					if(fromHome)
					{					
						//map.setCenter(new GLatLng(47.368594,2.988281),5);
						//searchTerminus(1);
					}
					
					lastFieldChanged = 1;	   
				});			
			searchDepartDone = 1;			
		}
	}    
	
	function searchTerminus(fromHome)
	{	
		//alert("function searchTerminus(fromHome)");
		//Return si l'adresse de départ n'est pas valide
		if (erreurDepart == 1)
			return;	
		var adresse = document.getElementById("terminus_adresse").value;
		
		// Recherche des coordonnées d'un point dont on connait l'adresse :
		if(adresse.length>0)
		{	
			adresse += " , FRANCE";
			if(searchTerminusDone == 1 && erreurArrivee==0)
			{
				if(newMarkers[1])
					map.removeOverlay(newMarkers[1]);
				if(markerToMove)
					map.removeOverlay(markerToMove);
				
				map.removeOverlay(GDir1);
				map.removeOverlay(GDir2);
				for(var i =0; i< gpolys.length;i++)
				{
					gpolys[i].remove();	
				}
				gpolys = [];
				routeNodes = [];
			}
			
			geocoder.getLatLng(adresse, function (coord) 
			{		
					if(coord == null)
					{
						//alert("Coordonnées nulles");
						erreurArrivee = 1;
						show("messErreurTerminus");
						return false;
					} else
					{
						//alert("Coordonnées trouvées");
						hide("messErreurTerminus");
						erreurArrivee = 0;
					}
					
					if(fromDDMenuGroupe==1)
					{
						fromDDMenuGroupe = 0;
						searchTerminus();
						return false;
					}
					
					// Et centrage de la map sur les coordonn�es renvoy�es par Google :
					//map.setCenter(coord, 16);
					//alert("nico");
					  //Mise à jour du formulaire avec les coordonnées
					  document.getElementById("coordTerminus").value = coord.lat()+"//"+coord.lng();
					
					  //Création d'un icone 
					  var Icon = new GIcon(); 
					  Icon.image = web_path + "/images/icone_arrivee_trajet.png"; 
					  //Icon.shadow = "path to your icon shadow"; 
					  Icon.iconSize = new GSize(32, 32); 
					  Icon.shadowSize = new GSize(22, 20); 
					  Icon.iconAnchor = new GPoint(16, 32); 
					  Icon.infoWindowAnchor = new GPoint(6, 1); 
					  Icon.infoShadowAnchor = new GPoint(13, 13); 
					
					  //Affichage de l'icone
					  if (coordArrivee != null)
						  markerTerminus = new GMarker(coordArrivee,Icon);
					  else
						  markerTerminus = new GMarker(coord,Icon);					 
					  map.addOverlay(markerTerminus);
					  
					  tabMarkersRech.push(markerTerminus);
					  
					  terminus = coord;
					  
					  boundsMapGlobal.extend(markerTerminus.getLatLng());
					   
					  latLngs[1] = markerTerminus.getLatLng();
					  icons[1] = markerTerminus.getIcon();
					  newMarkers[1] = new GMarker(latLngs[1],{icon:icons[1], draggable:true, dragCrossMove:true, bouncy:true, autoPan:false, title:''});
					  map.addOverlay(newMarkers[1]);
					  
					  //Gestion du déplacement de l'icone sur la carte
					  GEvent.addListener(newMarkers[1], "dragend", function()
					  {
						 pointsToReverseGeoloc = [];
						 pointsToReverseGeoloc[1] = newMarkers[1].getLatLng();
						 
						 terminus = newMarkers[1].getLatLng();
						 
						 current_point_geoloc = 1;
						 getAddress(pointsToReverseGeoloc[1]);
						 
						 for(var i =0; i< gpolys.length;i++)
						 {
							map.removeOverlay(gpolys[i]);	
						 }
						 
						 gpolys = [];
						 routeNodes = [];
						 map.removeOverlay(markerToMove);
					  
						 if (waypoints.length == 0) {
							//GDir1.loadFromWaypoints([pointsToReverseGeoloc[1].toUrlValue(6), pointsToReverseGeoloc[1].toUrlValue(6)], {preserveViewport:false, getSteps:true,getPolyline:true});
						} 
						else {							
							waypoints.pop();

							var tbTmp = [];
							//tabMarkersTmp
							tbTmp.push(depart);
							for(var c = 0; c < tabMarkersTmp.length;c++)
								tbTmp.push(tabMarkersTmp[c]);
							tbTmp.push(pointsToReverseGeoloc[1].toUrlValue(6));
						
							GDir1.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
						}						  
					});
					
					map.removeOverlay(markerTerminus);   
					var test = waypoints;
					if (waypoints.length == 0)
					{
						GDir1.loadFromWaypoints([coord.toUrlValue(6), coord.toUrlValue(6)], {preserveViewport:false, getSteps:true,getPolyline:true});
					} 
					else 
					{
						if(waypoints.length>1)
						{
							GDir1.clear();
						}

						if(lastFieldChanged == 2)
						{
							waypoints.pop();
						}

						//Ajout Nico
						//Rajout de code pour éviter l'erreur "[waypoints[waypoints.length-1]" is not defined
						if (waypoints.length!= 0)
						{
							GDir1.loadFromWaypoints([waypoints[waypoints.length-1].getPoint(), coord.toUrlValue(6)], 
						                         {preserveViewport:false, getSteps:true,getPolyline:true});
						}
						
					}
					lastFieldChanged = 2;
					
					/*if(fromHome)
						map.setCenter(new GLatLng(47.368594,2.988281),5);*/
					if (formToSubmit != "")
						document.getElementById(formToSubmit).submit();
				});
			searchTerminusDone = 1;			
		}
		show('toolBarMap');
	} 
	
	function searchTerminusPassager(validForm)
	{
		if(activeFormHome == 1 && validForm==1)
			var adresse = document.getElementById("terminus_adresse1").value;
		else
			var adresse = document.getElementById("terminus_adresse").value;	
			
		if(document.getElementById('terminus_adresseDem'))
		{
			document.getElementById('terminus_adresseDem').value = document.getElementById('terminus_adresse').value;
		}
			
		adresse += " , FRANCE";
			
		// Recherche des coordonnÈes d'un point dont on connait l'adresse :
		geocoder.getLatLng(adresse, function (coord) {
											  
				if(!coord)
				{
					erreurArrivee = 1;
					show("messErreurTerminus");
					return false;
				} else
				{
					hide("messErreurTerminus");
					erreurArrivee = 0;
				}
						
				if(fromDDMenuGroupe==1)
				{
					fromDDMenuGroupe = 0;
					searchTerminus();
					return false;
				}
						
				// Et centrage de la map sur les coordonnÈes renvoyÈes par Google :
				//map.setCenter(coord, 16);
				
				if(activeFormHome == 1)
					document.getElementById("coordTerminus1").value = coord.lat()+"//"+coord.lng();
				else
					document.getElementById("coordTerminus").value = coord.lat()+"//"+coord.lng();
				
				  var Icon = new GIcon(); 
				  Icon.image = web_path+"/images/icone_arrivee_trajet.png"; 
				  //Icon.shadow = "path to your icon shadow"; 
				  Icon.iconSize = new GSize(32, 32); 
				  Icon.shadowSize = new GSize(22, 20); 
				  Icon.iconAnchor = new GPoint(16, 32); 
				  Icon.infoWindowAnchor = new GPoint(6, 1); 
				  Icon.infoShadowAnchor = new GPoint(13, 13);
				
				  if(markerTerminus!=null) 
				   	map.removeOverlay(markerTerminus);
				
				  markerTerminus = new GMarker(coord,Icon);
				  
				  boundsMapGlobal.extend(markerTerminus.getLatLng());
				  
					map.addOverlay(markerTerminus);
				   tabMarkersRech.push(markerTerminus);
				   terminus = coord;
				   
				   searchTerminusDone = 1;					
			});
	} 
	
	function StoreToURL(waypoints) 
	{
		var s = [];
		
		for (var i = 0; i < waypoints.length; i++) {
			s.push(waypoints[i].getPoint().toUrlValue(6));
		}
		
		window.location.hash = "#" + s.join(",");
	}
	
	function dragMarker() 
	{ // when waypoint marker is being dragged, start calculation of new route
		if (isDragged == 2) { // exit if already waiting for GDir2.load to complete 
			markerDragged = this;
			return; 
		}				
		isDragged = 2; // tag that calculation of new route is started
		
		if (markerDragged) { //determine which marker triggered the recalculation
			marker = markerDragged;
			markerDragged = false;
		}
		else {
			marker = this;
		}
		
		lastIndex = marker.MyIndex;
		var point = marker.getPoint();
				
		if (lastIndex > 0) {
			if (lastIndex < waypoints.length - 1) {
				prevIndex = lastIndex - 1;	
				GDir2.loadFromWaypoints([waypoints[lastIndex - 1].getPoint(),point.toUrlValue(6),waypoints[lastIndex + 1].getPoint()],{preserveViewport:false, getSteps:true,getPolyline:true});	
			}
			else {
				prevIndex = -1; lastIndex = lastIndex - 1; // recalculate path to this point
				GDir2.loadFromWaypoints([waypoints[lastIndex].getPoint(),point.toUrlValue(6)],{getPolyline:true});
			}
		}
		else if (waypoints.length > 1) {
			prevIndex = -1;
			GDir2.loadFromWaypoints([point.toUrlValue(6),waypoints[1].getPoint()],{preserveViewport:false, getSteps:true,getPolyline:true});
		}
	}

	function getProximity(mouseLatLng) 
	{ 
	// displays myNode marker at closest point from mouseLatLng to polylines contained in gpolys array
	
		var zoom, point;
		
		if (routeNodes.length == 0) { // cache is empty
		// convert to pixels and cache coordinates of displayed polylines for better performance
			var dist = 0;
			zoom = map.getZoom();
			
			for (var i = 0; i < gpolys.length; i++) {
				dist += gpolys[i].getLength();
				
				var last_point;			
				
				for (var j = ((i == 0) ? 0 : 1); j < gpolys[i].getVertexCount(); j++) {
					var point = normalProj.fromLatLngToPixel(gpolys[i].getVertex(j), zoom)
					
					if (j==0 || last_point.x != point.x || last_point.y != point.y) {
						routeNodes.push(point.x);
						routeNodes.push(point.y);
						routeNodes.push(i); // store the index of polyline containing this node
						last_point = point;
					}
				}
			}
			
			var panel;
			
			if (routeNodes.length > 0 && (panel = document.getElementById('distance'))) { 
				panel.innerHTML = (dist/1000).toFixed(1) + " km";
			}		
		}
		
		var l = routeNodes.length;
				
		if (!mouseLatLng || l <= 1 || isDragged > 0) // no route is displayed or route is already being dragged
			return;

		zoom = map.getZoom();
		var mousePx = normalProj.fromLatLngToPixel(mouseLatLng, zoom);
		var mouseX = mousePx.x;
		var mouseY = mousePx.y;
		
		var x = routeNodes[0];
		var y = routeNodes[1];
		var minX = x; // we will search closest point on the line to mouse position for displaying marker there available for dragging
		var minY = y;
		var minDist = 99999;
		
		for (var n = 3; n < l; n +=3) {
			var x0 = x;
			var y0 = y;
			x = routeNodes[n];
			y = routeNodes[n+1];
			
			if ((x < mouseX-50 && x0 < mouseX-50) || (x > mouseX+50 && x0 > mouseX+50)) {
				continue;
			}
			if ((y < mouseY-50 && y0 < mouseY-50) || (y > mouseY+50 && y0 > mouseY+50)) {
				continue;
			}
			
			var dx = x - x0; 
			var dy = y - y0;
			var d = dx*dx + dy*dy; // lenght^2 of segment n			
	
			var u = ((mouseX - x) * dx + (mouseY - y) * dy) / d; // a bit of vector algebra :)
			var x2 = x + (u*dx); // x,y coordinates in pixels of closest point to mouse in segment n
			var y2 = y + (u*dy);
			
			var dist = (mouseX - x2)*(mouseX - x2) + (mouseY - y2)*(mouseY - y2); // distance^2 from mouse to closest point in segment n
	
			if (minDist > dist) { // closest point in segment n is closest point overall so far
				var d1 = (mouseX - x0)*(mouseX - x0) + (mouseY - y0)*(mouseY - y0); // distance^2 from mouse to end of segment n in pixels
				var d2 = (mouseX - x)*(mouseX - x) + (mouseY - y)*(mouseY - y)
	
				if ((d1 - dist) + (d2 - dist) > d) { // closest point is outside the segment, so the real closest point is either start or end of segment
					if (d1 < d2) {
						dist = d1; 
						x2 = x0;
						y2 = y0;
					}
					else {
						dist = d2; 
						x2 = x;
						y2 = y;
					}				
				}
			}
	
			if (minDist > dist) { // closest point in segment n is closest point overall so far
				minDist = dist;
				minX = x2;
				minY = y2;
				myNode.MyIndex = routeNodes[n+2]; // remember index of segment closest to mouse
			}
		}
		
		if (minDist > 2500) { // mouse is not close enough to the displayed line
			myNode.hide(); // do not display marker for dragging the polyline
		}	
		else {	
			for (n = waypoints.length; --n >= 0;) { // check if mouse is not too close to existing waypoints markers
				var markerPx = normalProj.fromLatLngToPixel(waypoints[n].getPoint(), zoom);
				
				dx = markerPx.x - minX;
				dy = markerPx.y - minY;
				
				if (dx*dx + dy*dy < 25) { // mouse is too close to existing marker
					myNode.hide(); // do not show additional marker for dragging the line - the user is about to drag existing waypoint
					return;
				}	
			}
			
			myNode.setPoint(normalProj.fromPixelToLatLng(new GPoint(minX, minY), zoom));
			if(editionTrajet==1)
			{
				myNode.hide();
			} else
				myNode.show(); // display marker for dragging the polyline
		}
	}
	
	function getAddress(latlng)
	{
      if (latlng != null) {
        address = latlng;
        geocoder.getLocations(latlng, showAddress);
      }
    }
	
	function showAddress(response) {
     
      if (!response || response.Status.code != 200) {
        alert("Status Code:" + response.Status.code);
      } else {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1],
                            place.Point.coordinates[0]);
        /*marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(
        '<b>orig latlng:</b>' + response.name + '<br/>' + 
        '<b>latlng:</b>' + place.Point.coordinates[1] + "," + place.Point.coordinates[0] + '<br>' +
        '<b>Status Code:</b>' + response.Status.code + '<br>' +
        '<b>Status Request:</b>' + response.Status.request + '<br>' +
        '<b>Address:</b>' + place.address + '<br>' +
        '<b>Accuracy:</b>' + place.AddressDetails.Accuracy + '<br>' +
        '<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);*/
		if(current_point_geoloc==0)
		{
			document.getElementById("depart_adresse").value = place.address;
			//current_point_geoloc = 1;
			//getAddress(pointsToReverseGeoloc[1]);
		}
		else if(current_point_geoloc==1)
		{
			document.getElementById("terminus_adresse").value = place.address;	
			current_point_geoloc = 0;
		}
	  }
    }
	
	var formToSubmit = "";
	function prochainsDeparts(form)
	{
		var errorForm = 0;
		if (!(searchDepartDone == 1 && $("#depart_adresse").attr("value") != ""))
		{
			$("#depart_adresse").addClass("errorForm");
			errorForm = 1;
		}
		else
		{
			$("#depart_adresse").removeClass("errorForm");
		}
		
		if (!(searchTerminusDone == 1 && document.getElementById("terminus_adresse").value != ""))
		{		
			$("#terminus_adresse").addClass("errorForm");
			errorForm = 1;
		}
		else
		{
			$("#terminus_adresse").removeClass("errorForm");
		}
		
		if (errorForm == 1)
		{
			return;
		}
		
		if (searchTerminusDone == 0 && $("#terminus_adresse").attr("value") != "")
		{
			terminusInsere = 0;
			arriveeValChanged = 1;
			hidePolyLine = 1;
			if (form == 1)
				formToSubmit = "formRech";
			else
				formToSubmit = "formTrajet";
			searchTerminus();
			return;
		}
		
		if (errorForm == 0)
			if (form == 0)
				document.formTrajet.submit();
			else if (form == 1)
				document.formRech.submit();
	}
	
	
	function goProchainsDeparts(formToSubmitVal){
		formToSubmit = formToSubmitVal;
		adresseDepart = document.getElementById('depart_adresse').value;
		adresseTerminus = document.getElementById('terminus_adresse').value;
		if (document.getElementById('depart_adresse').value == '' && document.getElementById('terminus_adresse').value == '' ){			
			document.getElementById('depart_adresse').className = "errorForm";
			document.getElementById('terminus_adresse').className = "errorForm";
		}
		else if (searchDepartDone == 1 && searchTerminusDone == 1){
			prochainsDeparts(formToSubmit);
		}
		else{
			//validerRecherche à 1 pour dire à SearchTerminus() de faire prochainsDeparts()				
			arriveeValChanged = 1;
			validerRecherche = 1;
			searchTerminus();
		}
	}
	
	//Affichage de la recherche d'un trajet retour passager
	function voirRetour(){
		temp = document.getElementById('depart_adresse').value;
		document.getElementById('depart_adresse').value = document.getElementById('terminus_adresse').value;
		document.getElementById('terminus_adresse').value = temp;
		temp = document.getElementById('coordDepart').value;
		document.getElementById('coordDepart').value = document.getElementById('coordTerminus').value;
		document.getElementById('coordTerminus').value = temp;	
		document.getElementById('trouver_trajet').value = 1;
		document.formRech.submit();
	}
	
	function validFormTrajetRetourPoints(){
		error = 0;
		if ($("#coordDepart").val() == ""){
			error = 1;
			$("#depart_adresse").addClass("errorForm");
		}
		else
			$("#depart_adresse").removeClass("errorForm");
		if ($("#coordTerminus").val() == ""){
			error = 1;
			$("#terminus_adresse").addClass("errorForm");
		}
		else
			$("#terminus_adresse").removeClass("errorForm");
		return error;
	}
	
	function getTrajetRetourPoints(validForm, conducteur){
		if (validFormTrajetRetourPoints() == 1) 
			return;
		var tbTmp = [];
		departTab = document.getElementById("coordDepart").value.split("//");
		depart = new GLatLng(departTab [0], departTab[1]);
		terminusTab = document.getElementById("coordTerminus").value.split("//");
		terminus = new GLatLng(terminusTab [0], terminusTab[1]);
		GDirRetour = new GDirections();
		tbTmp.push(terminus);
		tbTmp.push(depart);		
		directions = new GDirections();
		GEvent.addListener(directions, "load", function() {			
			var route = directions.getRoute(0);
			var gp = directions.getPolyline();
			document.getElementById("lineDistanceRetour").value = directions.getDistance().meters;			
			document.getElementById("pointsTrajetRetour").value = '';			
			for(var i = 0; i < gp.getVertexCount();i++)				
				document.getElementById("pointsTrajetRetour").value = document.getElementById("pointsTrajetRetour").value +';'+gp.getVertex(i);
			if (conducteur == 1)
				ajouterTrajetConducteur(validForm);
			else
				ajoutDemandeTrajet();
		});
	    directions.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
	}
	
	function modifierTrajetPassager(id_trajet,id_depart)
	{
		hide('resultsTrajets');
		hide('noResultsTrajets');
		hide('formTypeTrajets');
		hide('btnEnrDemAller');
		show('btnEnrModifier');
		//show('formNewDemande');
		show('formEditionTrajetUpdate');
		//manageFormNewDemande(7);
		hide('btnEnrDemAller');
		show('btnEnrModifier');
		hide('blocCheckTrajet');
		show('divBtnModifierTrajet');
	}
	/*
	function getLatitudeLongitude(adresse, idToUpdate)
	{
	  //Cette fonction va effectuer la géolocalisation d'un point
	  // Recherche des coordonnées d'un point dont on connait l'adresse :
	  if(adresse.length>0)
	  {
	    //alert(adresse);
		adresse += " , FRANCE";
		geocoder.getLatLng(adresse, function (coord)
		{
		  if(coord != null)
		  {
		    $(idToUpdate).val(coord.lat()+"//"+coord.lng());
		  }
		});
	  }
	}
	*/
	
    function getDistanceEtPoints (idLatLongDepart, idLatLongTerminus, idDistanceToUpdate, idPointsToUpdate)
    {
      /* Cette fonction permet de renseigner une liste de points entre 2 couples latitude / longitude */
      //alert("go");
      tabArrets = $(idLatLongDepart).val().split("//");
	  coordDepart = new GLatLng(tabArrets [0], tabArrets[1]);
	  tabArrets = $(idLatLongTerminus).val().split("//");
	  coordArrivee = new GLatLng(tabArrets [0], tabArrets[1]);
	  
	  var directions = new GDirections();
	  
	  var tbTmp = [];
      tbTmp.push(coordDepart);
	  tbTmp.push(coordArrivee);
		
	  GEvent.addListener(directions, "load", function() {
		  //alert("go2");
        var route = directions.getRoute(0);
	    var gp = directions.getPolyline();
	    $(idDistanceToUpdate).val(directions.getDistance().meters);
	    $(idPointsToUpdate).val("");				
	    for(var i = 0; i < gp.getVertexCount();i++)
	    {
	      $(idPointsToUpdate).val($(idPointsToUpdate).val()+';'+gp.getVertex(i));
	    }
	    prochainsDeparts(0);
	  });
	  directions.loadFromWaypoints(tbTmp, {preserveViewport:false, getSteps:true,getPolyline:true});
    }
    
    //function getCoordonneesPointsDistance(idDepartAdresse = "#depart_adresse",idTerminusAdresse = "#terminus_adresse",idUpdateCoordDepart = "#coordDepart",idUpdateCoordTerminus = "#coordTerminus",idUpdatePointsTrajet = "#pointsTrajet",idUpdateLineDistance = "#lineDistance")
    function getCoordonneesPointsDistanceAndSubmit(idDepartAdresse,idTerminusAdresse,idUpdateCoordDepart ,idUpdateCoordTerminus ,idUpdatePointsTrajet ,idUpdateLineDistance )
    {
      // Recherche des coordonnées d'un point dont on connait l'adresse :
  	  if($(idDepartAdresse).val().length>0)
  	  {
  	    var adresse = $(idDepartAdresse).val();
  		adresse += " , FRANCE";
  		geocoder.getLatLng(adresse, function (coord)
  		{
  		  if(coord != null)
  		  {
  		    $(idUpdateCoordDepart).val(coord.lat()+"//"+coord.lng());
  		  }
  		  var adresse = $(idTerminusAdresse).val();
   		  adresse += " , FRANCE";
   		  geocoder.getLatLng(adresse, function (coord)
   		  {
   		    if(coord != null)
   		  	{
   		  	  $(idUpdateCoordTerminus).val(coord.lat()+"//"+coord.lng());
   		  	}
   		    getDistanceEtPoints(idUpdateCoordDepart, idUpdateCoordTerminus, idUpdateLineDistance, idUpdatePointsTrajet);
   		    //traceTrajet();
  		  });
  		});
  	  }
    }
    