//parcours_ligne.js
			function arrondir(nb,n){
			 return Math.round(nb*Math.pow(10,n))/Math.pow(10,n);
			}	
			
			//fonction delai en millisec
			function sleep(delai){	
			 var date_debut=new Date();
				var max=date_debut.getTime()+delai;	
				var date_cour=new Date();
				while(date_cour.getTime()<max){
					date_cour=new Date();
				};
			}
						
			// définit la chaîne parcours à partir du tableau markers
			function init_parcours(){
			 var parcours="";
				 for(var i = 0; i < markers.length; i++) {	
					 if (i>0)	{parcours+=";"};
						var lat=arrondir(markers[i].getLatLng().lat(),6);
						var lng=arrondir(markers[i].getLatLng().lng(),6);
			   parcours+=lat+","+lng;
			  };	
				return parcours;
			}	
			
			function patientez() {	
			 report.innerHTML = "Parcours en cours de chargement; Patientez !";	
				document.forme.titre.value="En attente; Patientez !";
			};	
			
			function ajoute_marker_attente() {
			 var icon = new GIcon(); 
				icon.image="image/patientez.gif";	
				icon.iconSize = new GSize(200, 50);
				icon.iconAnchor = new GPoint(100, 25);	
				var point=map.getCenter();
		  marker_attente = new GMarker(point,{icon:icon, draggable:false, bouncy:false, dragCrossMove:false});
		  map.addOverlay(marker_attente);
			}	
			
			function montre_image_load(code) {
			 var img_load="img_load_"+code;
			 $(img_load).src="image/loading1.gif";	
			}	
			
			function cache_image_load(code) {
			 var img_load="img_load_"+code;
			 $(img_load).src="";	
			}
			
			var marker_attente=null;
			
			function init(parcours,zoom,titre,code,temps){
			 //temps permet d'afficher le marker d'attente	
			 if (temps=="debut") {
				 ajoute_marker_attente();
					patientez();
					//Si le titre contient ', il faut le protéger
					var titre=escape(titre);	
					//alert(titre);
					//relance de init	
					setTimeout("init('"+parcours+"',"+zoom+",'"+titre+"',"+code+",'suite')",0);	
				}	else {	
					// si apostrophe, titre a été modifié
				 titre=unescape(titre);
				 clearMap();	
					patientez();// pour FF
					var points = new Array();
					var slat=0;
					var slng=0;
					var couples=parcours.split(";");
					var bounds = new GLatLngBounds();
					for(var i = 0; i < couples.length; i++) {	
					 var couple=couples[i].split(",");																												
						points[i]=new GLatLng(couple[0],couple[1]);
						slat+=Number(couple[0]);
						slng+=Number(couple[1]);
						bounds.extend(points[i]);
					};	
					
					// centrer la carte
					if (zoom!=0) {// centrer la carte	avec zoom	connu
						var	lat_m=Math.round(slat*1000/points.length)/1000;	
						var	lng_m=Math.round(slng*1000/points.length)/1000;		
						var point_moyen=new GLatLng(lat_m,lng_m);
						map.setCenter(point_moyen,zoom);	
					}	else {	// avec import_gpx		zoom est égal à 0 . On utilise bounds
					 map.setZoom(map.getBoundsZoomLevel(bounds));
					 map.setCenter(bounds.getCenter());	
					};
					
					// construction des markers
					for(var i = 0; i < points.length; i++) {	
					 ajoute_marker1(points[i]);
					};	
												
					// affichage du parcours
					drawOverlay();
					
					var maxi=500;
					/*	
					// ajout des markers sur le map		(maxi 500)
					var j=Math.ceil(markers.length/maxi);// pour définir l'intervalle entre deux indices de marker	
					//alert("nb marker : "+markers.length+" ; inter marker : "+j);
					for(var i = 0; i < markers.length; i++) {
					 if (i%j==0) {	
					  map.addOverlay(markers[i]);
						};
					};		
					*/
					
					// ajout des markers sur le map		(maxi 500) ou à la demande
					var nb_markers=markers.length;	
					if (nb_markers<maxi) {
					 for(var i = 0; i < nb_markers; i++) {
					  map.addOverlay(markers[i]);
					 };		
					} else {	
					 /*
					 if (confirm('Le marquage des points en grand nombre (ici supérieur à 500) peut provoquer un blocage du navigateur en particulier avec Internet Explorer.\n Désirez-vous que les points soient marqués ?')){
						 for(var i = 0; i < nb_markers; i++) {
						  map.addOverlay(markers[i]);
						 };		
						};
						*/	
					};
					
					// initialisation des formulaires
					document.forme1.address.value="";	
					var div_titre = document.getElementById("titre_parcours");
					if(code!=1){// code est égal à 1 avec import_gpx	
					 div_titre.innerHTML=code+" : "+titre;		
						document.formu3.titre3.value=titre;	
						document.formu3.code3.value=code;
					 document.formu2.titre2.value=titre;	
					 document.forme.titre.value=titre;	
						document.forme.code.value=code;
					 document.formu1.code1.value=code;
						document.formu1.titre1.value=titre;
						$("formu1").target="";
					 var span_maj = document.getElementById("maj");
					 span_maj.style.display="inline";// pour faire apparaître les boutons modifier et supprimer		
						
						//Chargement du profil
						var alea=Math.random();
						var adr_profil="profil/profil"+code+".png?"+alea;
						var img_profil = document.getElementById("img_profil");	
			   img_profil.src=adr_profil;	
					} else {	
					 div_titre.innerHTML=""+titre;	
						document.forme.titre.value="";
					};
					// effacement marker attente
					map.removeOverlay(marker_attente);
					
				} // fin if(temps=="debut")	
			}	// fin 	function init(parcours,zoom,titre,code)
			
			function sauvegarde(option)	{
			 var titre=document.forme.titre.value;	
			 if (titre=="")
			 { 
			  alert("erreur ,le  champ 'titre' est à compléter");
			  document.forme.titre.focus();
			  return;
			 };
				
				if (titre.indexOf("\"")>=0 )
			 { 
			  alert("erreur ,le  champ 'titre' ne peut pas contenir de guillemets");
			  document.forme.titre.focus();
			  return;
			 };
				
				if(markers.length>0){	
				 var parcours=init_parcours();
				 document.forme.parcours.value=parcours;
				 document.forme.auteur.value=adr;	// auteur est en fait une adresse internet donc unique
					document.forme.zoom.value=map.getZoom();	
					if(option=="ajout"){document.forme.code.value="";};
					if(option=="supp"){document.forme.supp.value="V";};
			  document.forme.submit();//simule un clic sur le bouton submit		
			 };
			}	
			
			function imprime()	{	
				if(markers.length>0){	
				 var parcours=init_parcours();	
					//alert(parcours);
				 document.formu.parcours.value=parcours;
			  document.formu.submit();//force le submit		
			 };
			}
			
			function export_gpx()	{	
				if(markers.length>0){	
				 var parcours=init_parcours();	
					//alert(parcours);
				 document.formu2.parcours2.value=parcours;
			  document.formu2.submit();//force le submit		
			 };
			}
			
			function parcours_ign()	{	
			 var parcours="";
				if(markers.length>0){	
				 parcours=init_parcours();				 
			 };	
				document.formu3.parcours3.value=parcours;
				//alert("centre google : "+map.getCenter().lng()+" , "+ map.getCenter().lat());
				document.formu3.centre3.value=map.getCenter().lng()+","+ map.getCenter().lat();
				//alert("zoom google : "+map.getZoom());			
				document.formu3.zoom3.value=map.getZoom();
			 document.formu3.submit();//force le submit		
			}
			
			var fen_import;	
			
			function import_gpx(){	
			 fen_import=window.open("import_gpx2.php","","width=800px,height=400px,left=50px,top=230px,scrollbars=no");
			}	
			
			function ferme_fen_import(){	
			 fen_import.close();
				setTimeout(location='parcours_ligne.php?code=1',1);
				//setTimeout(document.URL('parcours_ligne.php?code=1'),1);
			}
			
			function requete_altitude_geonames(lat,lng){	
			 var requete = null;	
				
				//var url="http://ws.geonames.org/gtopo30?lat="+lat+"&lng="+lng;			
				var url="http://ws.geonames.org/astergdem?lat="+lat+"&lng="+lng;
				
				var proxy="proxy.php?url="+encodeURIComponent(url);
				
				// création objet requete suivant navigateur
				if(window.XMLHttpRequest) // Firefox
				   requete = new XMLHttpRequest();
				 else if(window.ActiveXObject) // Internet Explorer
				   requete = new ActiveXObject("Microsoft.XMLHTTP");
				 else { // XMLHttpRequest non supporté par le navigateur
				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
				   return;
				};
				// appel url à l'aide du proxy
				requete.open("GET",proxy, false);
				requete.send(null);
				if(requete.readyState == 4) {	
					var alt=Number(requete.responseText);
					if(alt<0){alt=0;};								
				 return alt;	
				};
			}
			
			function requete_altitude_geoportail(lat,lng){
				var requete = null;	
				var url="calcule_alt_local_geoportail3.php?lat="+lat+"&lng="+lng;
				if(window.XMLHttpRequest) // Firefox
				   requete = new XMLHttpRequest();
				 else if(window.ActiveXObject) // Internet Explorer
				   requete = new ActiveXObject("Microsoft.XMLHTTP");
				 else { // XMLHttpRequest non supporté par le navigateur
				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
				   return;
				}
				// appel url 
				requete.open("GET",url, false);
				requete.send(null);
				if(requete.readyState == 4) {
				 var alt=Number(requete.responseText);	
					return alt;
				};
			}	
			
			
			function ajoute_bornes_profil(unite){
				// construction du tableau points_profil
				points_profil.length=0;
					
				//ajout point de départ
				var point=new GLatLng(poly.getVertex(0).lat(),poly.getVertex(0).lng());	
			 points_profil.push(point);
				
				//ajout des points profil
				var dist=0;
				var old_dist=0;	
				var num_borne=1;
				
				if(poly.getVertexCount()>0) {
					for(var j=1; j<poly.getVertexCount();j++) {	
					 old_dist=dist;
						var p2=poly.getVertex(j);
						var p1=poly.getVertex(j-1);
						dist+=p2.distanceFrom(p1);
						if (dist>num_borne*unite) {	
						 while(dist>num_borne*unite){
								var coeff=(num_borne*unite - old_dist)/(dist-old_dist);
								var lat=Number(p1.lat()) + Number((p2.lat() - p1.lat())*coeff);		
								var lng=Number(p1.lng()) + Number((p2.lng()-p1.lng())*coeff);
								//alert(lat+"      "+lng);
								var point=new GLatLng(lat,lng);
								points_profil.push(point);
								num_borne++;	
							};	// fin while(dist>km*unite)
						};// fin if (dist>km*unit)
					};	//fin 	for(var j=1; j<poly.getVertexCount();j++)	
				}; // fin 	if(poly.getVertexCount()>0)	
				
				// ajout point d'arrivée
				point=new GLatLng(poly.getVertex(poly.getVertexCount()-1).lat(),poly.getVertex(poly.getVertexCount()-1).lng());	
			 points_profil.push(point);	
				
			}// fin 	function ajoute_bornes_profil()
			
			
			function calcule_profil(cpt){	
				var lat,lng,alt,point,dist;
				$("profil_cpt").style.width=Math.round(150*(cpt/points_profil.length))+"px";
			 if (cpt>0)	{parcours+=";"};	
				
				// calcul de alt
			 point=points_profil[cpt];
			 lat=arrondir(point.lat(),6);
			 lng=arrondir(point.lng(),6);	
				
				// recherche alt soit en local (table geoportail_rgf93)soit sur geonames.org
				alt=requete_altitude_geoportail(lat,lng);
				if (alt!=-999){// -999 code erreur avec géoportail
			  hors_france="F";
				} else {
				 alt=requete_altitude_geonames(lat,lng);	
					hors_france="V";
				};
					
				// calcul de dist
				if (cpt==0) {
				 dist=0;
				};
			 if (cpt>0 && cpt<points_profil.length-1){	
				 dist=cpt*unite_profil/1000;		
				};
				if (cpt==points_profil.length-1) {
				 dist=longueur_poly_km.toFixed(1);
				};	
					
			 //construction parcours
			 parcours+=dist+","+alt+","+hors_france;	
				
				cpt++;	
				if (cpt < points_profil.length){
				 setTimeout("calcule_profil("+cpt+")",0);	
				}
				else {
					$("profil").style.display="none";	
					//alert("parcours : " + parcours);	
				 document.formu1.parcours1.value=parcours;
			  document.formu1.submit();	
				};
			}
				
			/*
			function calcule_unite_profil(longueur_poly_km){
			 var unite=Math.ceil(longueur_poly_km*10);	
				alert(unite);
			 return unite;
			}
			*/
			
			
			function calcule_unite_profil(longueur_poly_km){
			 var unite=200;
			 if (longueur_poly_km>100) {	
				 unite=200+(longueur_poly_km-100)*1.8;
				};	
				//alert("unite : "+unite);
			 return unite;
			}
		
	  function appel_profil()	{	
			 // un programme déjà sauvegardé (cad dont le code existe) et qui vient d'être modifié doit avoir été sauvegardé avant le calcul de profil
			 if (document.formu1.code1.value	!="") {
				 if (confirm("Avertissement : Si votre parcours a été modifié,\n vous devez le sauvegarder avant d'en calculer le profil ! \n \n Voulez-vous continuer ?")) {	
					 profil();
					};
				} else {
				 profil();
				};	
			};	
			
			function profil()	{			
				if(markers.length>0){	
				 parcours="";
					$("profil").style.display="block";	
					unite_profil=calcule_unite_profil(longueur_poly_km);	
					ajoute_bornes_profil(unite_profil);	
					//alert("nb de points profil : "+points_profil.length);
				 calcule_profil(0);
			 };
			}
			
			// centrer la carte sur une adresse donnée
			function afficherAdresse(address) { 
			  geocoder.getLatLng(address, function(point) { 
			   if (!point) { 
			     alert(address + " introuvable"); 
			   } else { 
			     map.setCenter(point, zoom); 
			   }; 
			  });//fin geocoder.getLatLng(address, function(point) 
				clearMap();   
			}
					
			function ajoute_marker(point) {
			  // construction du marker	et de ses événements
			  var marker = new GMarker(point, {icon:icon, draggable:true, bouncy:false, dragCrossMove:true});			  
			
			  // Drag sur un marker		(déplacement)
			  GEvent.addListener(marker, "drag", function() {
			   drawOverlay();
			  });
			
			  //click sur un marker	(suuppression)
			  GEvent.addListener(marker, "click", function() {
			  // Find out which marker to remove
				  for(var n = 0; n < markers.length; n++) {
				   if(markers[n] == marker) {
				    map.removeOverlay(markers[n]);
				    break;
				   };
				  };
				  // modifie le tableau markers et redessine 	le parcours
				  markers.splice(n, 1);
				  if(markers.length> 0) {
				    drawOverlay();
				  } else {
						 // effacement bornes_km restantes
							for(var i=0;i<markers_km.length;i++) {
							 map.removeOverlay(markers_km[i]);
							};
							markers_km.length=0;
						};
			  });// fin GEvent.addListener(marker, "click"		
					
					map.addOverlay(marker);
			  markers.push(marker);	
			}// fin function ajoute_marker(point)
			
			function ajoute_marker1(point) {	
			  // version 1 pour fonction init	sans map.addOverlay(marker);
			  // construction du marker	et de ses événements
			  var marker = new GMarker(point, {icon:icon, draggable:true, bouncy:false, dragCrossMove:true});			  
			
			  // Drag sur un marker		(déplacement)
			  GEvent.addListener(marker, "drag", function() {
			   drawOverlay();
			  });
			
			  //click sur un marker	(suuppression)
			  GEvent.addListener(marker, "click", function() {
			  // Find out which marker to remove
				  for(var n = 0; n < markers.length; n++) {
				   if(markers[n] == marker) {
				    map.removeOverlay(markers[n]);
				    break;
				   };
				  };
				  // modifie le tableau markers et redessine 	le parcours
				  markers.splice(n, 1);
				  if(markers.length> 0) {
				    drawOverlay();
				  };
			  });// fin GEvent.addListener(marker, "click"		
					
					//map.addOverlay(marker);
			  markers.push(marker);	
			}// fin function ajoute_marker1(point)
			
			function ajoute_marker_km(point,nb) {
			  // construction de icon
					var icon = new GIcon();	
					switch(nb){
					 case "depart" :
						/*
						 icon.image="depart.png";	
						 icon.iconSize = new GSize(10, 10);	
						 icon.iconAnchor = new GPoint(5,5);
							*/	
							icon.image="image/depart1.png";	
							icon.iconSize = new GSize(20, 40);
							icon.iconAnchor = new GPoint(10, 43);	
							break;
						case "arrivee":
						 /*
						 icon.image="arrivee.png";	
						 icon.iconSize = new GSize(10, 10);	
						 icon.iconAnchor = new GPoint(5,5);		
							*/
							icon.image="image/arrivee1.png";	
							icon.iconSize = new GSize(20, 40);
							icon.iconAnchor = new GPoint(10, 43);	
							break;	
						default :
						 icon.image="km/"+nb+".png";	
							icon.iconSize = new GSize(30, 40);
							icon.iconAnchor = new GPoint(15, 40);	
					};
					//construction de marker	
			  var marker = new GMarker(point,{icon:icon, draggable:false, bouncy:false, dragCrossMove:false});
			  map.addOverlay(marker);
			  markers_km.push(marker);	
			}	
			
			function calcule_unite(longueur_poly_km){	
			 var unite;	
			 if(longueur_poly_km<20) {
				 unite=1000;
				} else {
				 if(longueur_poly_km<50) {
				  unite=2000;
					} else	{
					 unite=Math.ceil(longueur_poly_km/100)*5000;
					};
				};
				return unite;
			}
			
			function ajoute_bornes_km(unite){
				//effacement des markers km
				if (markers_km.length>0){
				 for(var i=0;i<markers_km.length;i++) {
					 map.removeOverlay(markers_km[i]);
					};
					markers_km.length=0;
				};
					
				//ajout point de départ
				var point=new GLatLng(poly.getVertex(0).lat(),poly.getVertex(0).lng());	
			 ajoute_marker_km(point,"depart");
				
				//ajout des markers km	
				var dist=0;
				var old_dist=0;	
				var num_borne=1;
				
				if(poly.getVertexCount()>0) {
					for(var j=1; j<poly.getVertexCount();j++) {	
					 old_dist=dist;
						var p2=poly.getVertex(j);
						var p1=poly.getVertex(j-1);
						dist+=p2.distanceFrom(p1);
						if (dist>num_borne*unite) {	
						 while(dist>num_borne*unite){
								var coeff=(num_borne*unite - old_dist)/(dist-old_dist);
								var lat=Number(p1.lat()) + Number((p2.lat() - p1.lat())*coeff);		
								var lng=Number(p1.lng()) + Number((p2.lng()-p1.lng())*coeff);
								//alert(lat+"      "+lng);
								var point=new GLatLng(lat,lng);
								ajoute_marker_km(point,num_borne*unite/1000);
								num_borne++;	
							};	// fin while(dist>km*unite)
						};// fin if (dist>km*unit)
					};	//fin 	for(var j=1; j<poly.getVertexCount();j++)	
				}; // fin 	if(poly.getVertexCount()>0)	
				
				// ajout point d'arrivée
				point=new GLatLng(poly.getVertex(poly.getVertexCount()-1).lat(),poly.getVertex(poly.getVertexCount()-1).lng());	
			 ajoute_marker_km(point,"arrivee");	
				
			}// fin 	function ajoute_bornes_km()
			
			function drawOverlay(){
			 //dessine la ligne polygonale	et affiche la longueur du parcours
				
				// efface la polyline
			 if(poly) { map.removeOverlay(poly); };
			 points.length = 0;
				
				//initialisation tableau points
			 for(i = 0; i < markers.length; i++) {
			  points.push(markers[i].getLatLng());
			 };
				
			 // construction de la polyline et affichage de la distance
			 poly = new GPolyline(points, lineColor, lineWeight, lineOpacity);
			 longueur_poly_km = poly.getLength()/1000;
			 report.innerHTML = "Longueur du parcours : " + longueur_poly_km.toFixed(3) + " km";
			 map.addOverlay(poly);	
				var unite=calcule_unite(longueur_poly_km);
				ajoute_bornes_km(unite);	
				if (!icone_visible_km) {
					for(var i=0; i<markers_km.length; i++){	
					 markers_km[i].hide();
					};
				};	
			} // fin 	function drawOverlay()
			
			
			function clearMap() {
			 // Clear current map and reset arrays
			 map.clearOverlays();
			 points.length = 0;
			 markers.length = 0;
			 report.innerHTML = "Longueur du parcours : ";
				document.forme.supp.value="F"	
				document.forme.code.value="";		
				document.forme.titre.value="";
				document.formu1.code1.value="";				
				document.formu1.titre1.value="";		
				document.formu3.code3.value="1";					
				document.formu3.titre3.value="";	
				$("formu1").target="_blank";
				var span_maj = document.getElementById("maj");
				span_maj.style.display="";// pour faire disparaître les boutons modifier et supprimer		
				var div_titre = document.getElementById("titre_parcours");	
				div_titre.innerHTML="";
				$("img_profil").src="";
				icone_visible=true;
			 icone_visible_km=true;
			}
			
			function clearIcon() {
			 if (icone_visible){
				 icone_visible=false;
					for(var i=0; i<markers.length; i++){	
					 markers[i].hide();
					};
				}
				else {
				 icone_visible=true;
					for(var i=0; i<markers.length; i++){	
					 markers[i].show();
					};
				};
			}	
			
			//Efface ou rétablit les icônes	km
			function clearIcon_km() {
			 if (icone_visible_km){
				 icone_visible_km=false;
					for(var i=0; i<markers_km.length; i++){	
					 markers_km[i].hide();
					};
				}
				else {
				 icone_visible_km=true;
					for(var i=0; i<markers_km.length; i++){	
					 markers_km[i].show();
					};
				};
			}
	
