// parcours_route.js	

		 function arrondir(nb,n){
			 return Math.round(nb*Math.pow(10,n))/Math.pow(10,n);
			}
		
		 function init(parcours,zoom,titre,code){
				clearMap();
				var slat=0;
				var slng=0;
				var couples=parcours.split(";");	
				var points = [];
				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]);
				};
				
				//alert(points.length);
				// centrer la carte
				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);
				
				//enregistrements des points		en laissant du temps à dirn5	!
				var dirn5=new GDirections();	
				var compteur=0;	
				var max_points=points.length;	
				dessine_morceau(compteur);
				
				GEvent.addListener(dirn5,"load", function() {
				 dessine(dirn5);
				 compteur++;
				 if (compteur<max_points){	
					 dessine_morceau(compteur);
					} 
    });
								
				function		dessine_morceau(compteur){
					var point=points[compteur];
				 if (firstpoint) {
       dirn5.loadFromWaypoints([point.toUrlValue(6),point.toUrlValue(6)],{getPolyline:true});
     } else {
       dirn5.loadFromWaypoints([gmarkers[gmarkers.length-1].getPoint(),point.toUrlValue(6)],{getPolyline:true});
     };
				}
				
				
				// on complète la présentation et l'initialisation	
				document.forme1.address.value="";	
				var div_titre = document.getElementById("titre_parcours");	
				div_titre.innerHTML=code+" : "+titre;	
				document.formu1.titre1.value=titre;
				document.formu1.code1.value=code;
				document.forme.titre.value=titre;
				document.forme.code.value=code;
				$("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;
				return true;
			}// fin function init		
			
			// définit la chaîne parcours à partir du tableau gmarkers
			function init_parcours(){
			 var parcours="";
				 for(var i = 0; i < gmarkers.length; i++) {	
					 if (i>0)	{parcours+=";"};
						var lat=arrondir(gmarkers[i].getLatLng().lat(),6);
						var lng=arrondir(gmarkers[i].getLatLng().lng(),6);
			   parcours+=lat+","+lng;
			  };	
				return parcours;
			}	
			
			function imprime()	{	
				if(gmarkers.length>0){	
				 var parcours=init_parcours();	
					//alert(parcours);
				 document.formu.parcours.value=parcours;
			  document.formu.submit();//force le submit		
			 };
			}	
			
		 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 du point départ
					var point=new GLatLng(gpolys[0].getVertex(0).lat(),gpolys[0].getVertex(0).lng());	
				 points_profil.push(point);
					
					//init variables
					var dist=0;
					var old_dist=0;
					var old_i=0;
					var old_j=0;
					var num_borne=1;
									
					//ajout des points	
					//alert("gpolys.length : "+gpolys.length);
					for (var i=0; i<gpolys.length; i++) {		
					 if(gpolys[i].getVertexCount()>0) {
						//alert("gpolys["+i+"].getVertexCount() : "+gpolys[i].getVertexCount());
							for(var j=1; j<gpolys[i].getVertexCount();j++) {	
								var p2=gpolys[i].getVertex(j);// point courant
								var p1=gpolys[old_i].getVertex(old_j);	//point précédent
								var old_dist=dist;
								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)	
								old_i=i;
								old_j=j;
							};	//fin 	for(var j=1; j<gpolys[i].getVertexCount();j++)
						};	// fin if(gpolys[i].getVertexCount()>0)	
					}; // fin for (var i=0; i<gpolys.length; i++)	
					
					//ajout du point arrivée	
					var der_poly=gpolys[gpolys.length-1];
					var point=new GLatLng(der_poly.getVertex(der_poly.getVertexCount()-1).lat(),der_poly.getVertex(der_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();	
				};
			}
			// fin function calcule_profil(cpt)	
			
			/*
			function calcule_unite_profil(longueur_poly_km){
			 var unite=Math.ceil(longueur_poly_km/10)*100;	
				if (unite>1000) {unite=1000;};
				//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 profil :  "+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(gmarkers.length>0){	
				 parcours="";		
					unite_profil=calcule_unite_profil(longueur_poly_km);
					$("profil").style.display="block";
		   ajoute_bornes_profil(unite_profil);	
				 calcule_profil(0);
			 };
			}

			function sauvegarde(option)	{	
			 if (document.forme.titre.value=="")
			 { 
			  alert("erreur ,le  champ 'titre' est à compléter");
			  document.forme.titre.focus();
			  return;
			 };
				if(gmarkers.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		
			 };
			}	
			
			//efface la carte et réinitialise les variables
			function clearMap() {
				firstpoint = true;
			 map.clearOverlays();
			 gpolys.length = 0;
			 gmarkers.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="";	
				$("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="";
			}
			 									
			// pour centrer la carte sur une ville						
			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();
			}
							
			//Efface ou rétablit les icônes	
			function clearIcon() {
			 if (icone_visible){
				 icone_visible=false;
					for(var i=0; i<gmarkers.length; i++){	
					 gmarkers[i].hide();
					};
				}
				else {
				 icone_visible=true;
					for(var i=0; i<gmarkers.length; i++){	
					 gmarkers[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();
					};
				};
			}
			
							
			function dessine(dirn0){		
			  var n = dirn0.getPolyline().getVertexCount();
     var p=dirn0.getPolyline().getVertex(n-1);	//pour lire le dernier point "routier"
     var marker=new GMarker(p,{icon:icon,draggable:true});	
					// on définit ici la valeur de MyIndex
     marker.MyIndex=gmarkers.length;							
					//Evénement déplacement du marker			
     GEvent.addListener(marker, "dragend", function() {
			    //alert("dragend");
       lastIndex = marker.MyIndex;
       var point = marker.getPoint();
       if (lastIndex>0) {
         // recalculate the polyline preceding this point
         dirn2.loadFromWaypoints([gmarkers[lastIndex-1].getPoint(),point.toUrlValue(6)],{getPolyline:true});
       }
       if (lastIndex<gmarkers.length-1) {
         // recalculate the polyline following this point
         dirn3.loadFromWaypoints([point.toUrlValue(6),gmarkers[lastIndex+1].getPoint()],{getPolyline:true});
       }
     });
					
					//Evénement click sur le marker
					GEvent.addListener(marker, "click", function() {
			    //alert("click");
       index_supp = marker.MyIndex;
							m_fin=gmarkers.length-1;
							p_fin=gpolys.length-1;
							map.removeOverlay(gmarkers[index_supp]);	// le point est effacé		
							
							if(m_fin==0){	// un seul point
							 gmarkers.splice(m_fin,1);
								firstpoint = true;
							}	else {																
        if (index_supp>0 && index_supp<m_fin) {		
								  for(var i=index_supp; i<m_fin; i++){	
										 gmarkers[i]=gmarkers[i+1];
											gmarkers[i].MyIndex=i;
										};
									 gmarkers.splice(m_fin,1);	
										map.removeOverlay(gpolys[index_supp-1]);
				      map.removeOverlay(gpolys[index_supp]);
          dirn4.loadFromWaypoints([gmarkers[index_supp-1].getPoint(),gmarkers[index_supp].getPoint()],{getPolyline:true});
										
										GEvent.addListener(dirn4,"load", function() {	//nécessaire pour tracer la ligne	et la mémoriser	, on connait index_supp var globale	
						     map.addOverlay(dirn4.getPolyline());
											gpolys[index_supp-1]=dirn4.getPolyline();	
           for(var i=index_supp; i<p_fin; i++){	
											 gpolys[i]=gpolys[i+1];
											};
											gpolys.splice(p_fin, 1);
											calculateDistance();
						    });		
        };
								
								if (index_supp==0) {
									for(var i=0; i<m_fin; i++){	
									 gmarkers[i]=gmarkers[i+1];
										gmarkers[i].MyIndex=i;
									};
								 gmarkers.splice(m_fin,1);	
									map.removeOverlay(gpolys[0]);
									for(var i=0; i<p_fin; i++){	
									 gpolys[i]=gpolys[i+1];
									};
								 gpolys.splice(p_fin,1); 
									calculateDistance();
        };	
								
        if (index_supp==m_fin) {
         map.removeOverlay(gpolys[p_fin]);
									gmarkers.splice(m_fin,1);
									gpolys.splice(p_fin,1);
									calculateDistance();	 
        };
											
							};// fin if(m_fin==0)
     });	// fin GEvent.addListener(marker, "click"	
					
					// enregistrement et affichage du marker		
					map.addOverlay(marker);
					gmarkers.push(marker);
     if (!firstpoint) {
      map.addOverlay(dirn0.getPolyline());
      gpolys.push(dirn0.getPolyline());
      calculateDistance();
     } else {
					 firstpoint = false;
					};     
			}//fin function dessine(dirn0)		
			
			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);	
						break;
					case "arrivee":
					 icon.image="arrivee.png";	
					 icon.iconSize = new GSize(10, 10);	
					 icon.iconAnchor = new GPoint(5,5);	
						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);
		  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 du marker départ
				var point=new GLatLng(gpolys[0].getVertex(0).lat(),gpolys[0].getVertex(0).lng());	
			 ajoute_marker_km(point,"depart");
				
				//init variables
				var dist=0;
				var old_dist=0;
				var old_i=0;
				var old_j=0;
				var num_borne=1;
								
				//ajout des markers km		
				//alert("gpolys.length : "+gpolys.length);
				for (var i=0; i<gpolys.length; i++) {		
				 if(gpolys[i].getVertexCount()>0) {
					//alert("gpolys["+i+"].getVertexCount() : "+gpolys[i].getVertexCount());
						for(var j=1; j<gpolys[i].getVertexCount();j++) {	
							var p2=gpolys[i].getVertex(j);// point courant
							var p1=gpolys[old_i].getVertex(old_j);	//point précédent
							var old_dist=dist;
							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)	
							old_i=i;
							old_j=j;
						};	//fin 	for(var j=1; j<gpolys[i].getVertexCount();j++)
					};	// fin if(gpolys[i].getVertexCount()>0)	
				}; // fin for (var i=0; i<gpolys.length; i++)	
				
				//ajout du marker arrivée	
				var der_poly=gpolys[gpolys.length-1];
				var point=new GLatLng(der_poly.getVertex(der_poly.getVertexCount()-1).lat(),der_poly.getVertex(der_poly.getVertexCount()-1).lng());	
			 ajoute_marker_km(point,"arrivee");
							
			}// fin 	function ajoute_bornes_km()
	
			function calculateDistance() {	
			 // calcule distance et bornes km
     var dist = 0;
     for (var i=0; i<gpolys.length; i++) {
       dist+=gpolys[i].getLength();
     }
					longueur_poly_km=dist/1000;
     report.innerHTML="Longueur du parcours : "+longueur_poly_km.toFixed(3)+" km. ";	
					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();
						};
					};
   }			
		
   
				
  

