var map; 
var geocoder;
var gdir;
var marker_manuel;
var gmarkers = [];
var poly = 0;
var numero;
var mapc;
var mapdb;

// Initialise la carte dans la page et appelle la fonction creerlisteEtape
// Qui va afficher les différentes etapes du parcours
function initialiser(nb, appel) {
  map = new GMap2(document.getElementById("map_canvas"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GOverviewMapControl());
  
  
  //createMapEvents();
    
  
  map.setCenter(new GLatLng(45, 0), 5);
  geocoder = new GClientGeocoder();
  gdir = new GDirections(map, document.getElementById("distance"));
  creerlisteEtape(appel);
  if (appel=="load") {
    raffraichirMap(appel);
  }
  if (appel=="new") {
    modifierParcours();
  }
}

function createMapEvents() {
  var timeouts = [];
  if (!mapc) {
  mapc = GEvent.addListener(map, "click", function(overlay,point) {
 // alert(gmarkers.length);
  if (!overlay) {
    document.getElementById("change").value = 1;
    timeouts.push(setTimeout( function(){
      if(gmarkers.length >= 25) {
        alert(alert_MAX_MARKER)
      }
      else { 
      
          gmarkers.push(new GMarker(point, {draggable: true}));
          var nb = parseInt(document.getElementById("num").value);
          var nbbis = nb + 1;
          var adresse = "Etape_"+point.lat()+"_"+point.lng()+"_0_1";
          var adresse_hid = document.createElement("input");
          adresse_hid.setAttribute("type", "hidden");
          adresse_hid.setAttribute("id", "adresse_hid_"+nb);
          adresse_hid.setAttribute("value", adresse);
          
          document.monform.appendChild(adresse_hid);
                  
          var mark = gmarkers[gmarkers.length-1];
          document.getElementById("num").value = nbbis;
					GEvent.addListener(mark, 'dragstart', function() {
						map.closeInfoWindow();
						
					});
					GEvent.addListener(mark, 'dragend', function() {
						document.getElementById("change").value = 1;
						//alert(nb);
            var point = mark.getPoint();
					  var adresse = document.getElementById("adresse_hid_"+nb);
					  var ad = adresse.value.split('_');
					  //alert(point.lat()+"_"+point.lng());
					  adresse.value = ad[0]+"_"+point.lat()+"_"+point.lng()+"_"+ad[3]+"_1";
          });
					
					GEvent.addListener(mark, 'click', function(point) {
						mark.openInfoWindowHtml('<font color="#0000FF"><a href="javascript:supprimer(\''+nb+'\')">Supprimer l\'étape</a></font>');
					});
					map.addOverlay(mark);
      }
    }, 300)); }
    });
  }
  if(!mapdb) {
  // Permet d'éviter de placer des points en double cliquant (réservé au zoom sur la carte)
  mapdb = GEvent.addListener(map, "dblclick", function(){
  clearTimeout(timeouts[timeouts.length-2]);
  clearTimeout(timeouts[timeouts.length-1]);
   

  });
  }
}

function removeMapEvents() {
  if (mapc && mapdb) {
    GEvent.removeListener(mapc);
    GEvent.removeListener(mapdb);
  }
  mapc=0;
  mapdb=0;
}

function supprimer(nb) {
  document.getElementById('change').value = 1;
	var adresse = document.getElementById("adresse_hid_"+nb);
	var ad = adresse.value.split('_');
	document.getElementById("adresse_hid_"+nb).value = ad[0]+"_"+ad[1]+"_"+ad[2]+"_"+ad[3]+"_2";
	map.removeOverlay(gmarkers[nb]);
	//gmarkers.splice(nb, 1);
}

function afficher(nb) {
  map = new GMap2(document.getElementById("map_canvas"));
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GOverviewMapControl());
  map.setCenter(new GLatLng(45, 0), 5);
  geocoder = new GClientGeocoder();
  gdir = new GDirections(map, document.getElementById("distance"));
  
  var nb = parseInt(document.getElementById("num").value);
  var chemin = '';
  var str ='';
  //alert(nb);
  // Boucle de recuperation des adresses/lat/lng des différentes etapes pour tracer le parcours
  for (i=0; i<nb; i++) {
    //alert("i: "+i);
    var etape = document.getElementById('adresse_hid_'+i).value.split("_");
    var lat_lng = etape.innerHTML;
    
        if(chemin=="") {
          chemin = "from: "+etape[1]+","+etape[2];
        }
        else {
          chemin = chemin + " to: "+etape[1]+","+etape[2];
        }
  }
  if (nb > 1) {
    // Affichage du parcours proprement dit, attention limité à 10 000 utilisations/jour
    gdir.load(chemin, {getSteps:true},	{ "locale": "fr" });
    gdir.addoverlay;
  }
}


// Fonction servant à afficher/raffraichir la map
// Le paramètre Appel définit si une action doit être appelée à la fin de l'affichage de la map
function raffraichirMap(appel) {
  //alert(appel);
  var nb = parseInt(document.getElementById("num").value);
  if (nb>1) {
    

    
    
    
    
    var chemin = '';
    var str ='';
    var nber = parseInt(document.getElementById("num").value);
    //alert(nb);
    // Boucle de recuperation des adresses/lat/lng des différentes etapes pour tracer le parcours
    for (i=0; i<nber; i++) {
      //alert("i: "+i);
      var etape = document.getElementById('adresse_hid_'+i).value.split("_");
      var lat_lng = etape.innerHTML;
      
          if(chemin=="") {
            chemin = "from: "+etape[1]+","+etape[2];
          }
          else {
            chemin = chemin + " to: "+etape[1]+","+etape[2];
          }
    }
    if (nber > 1) {
      // Affichage du parcours proprement dit, attention limité à 10 000 utilisations/jour
      gdir.load(chemin, {getSteps:true},	{ "locale": "fr" });
      // Initialisation des variables pour calculer les distances du parcours
      var distance = 0;
      var distanceStep = 0;
      var time = setTimeout( function(){ alert(alert_BAD_POINT)}, 1000);
      // On ajoute un listener sur l'événement load de l'objet gdir
      var myListener = GEvent.addListener(gdir,"load", function() {
      //alert('appel');
      clearTimeout(time);
      if(gdir.getStatus()['code'] == 200) {
      removeMapEvents();
        if(poly!=0) {
          map.removeOverlay(poly);
          poly=0;
        }
      } 
      document.getElementById("distance").innerHTML ="";
          for (k=0; k<gdir.getNumRoutes(); k++) {
            if(k>0) {
              str +=';';
            }
            // On récupére une etape
            var route = gdir.getRoute(k);
            var geocode = route.getStartGeocode();
            var point = route.getStep(0).getLatLng();
            
            // On récupère les steps de l'etape pour calculer un dénivelé plus précis
            for (m=0; m < route.getNumSteps(); m++) {
              var distanceS = parseInt(route.getStep(m).getDistance().meters);
              
              var pointll = route.getStep(m).getLatLng().toUrlValue(4).split(','); 
              if (m > 0) {
                str += ';';
              }
              str += distanceStep+"_"+pointll[0]+"_"+pointll[1];
              distanceStep = distanceStep + distanceS;
            }
            
            // calcul de la distance pour ce step
            routeD = parseInt(route.getDistance().meters);
            distance = distance + routeD;
        }
        // Mise à jour de la distance totale du parcours
        document.getElementById("distance_par").setAttribute("value", distance); 
        var num = parseInt(document.getElementById("num").value);
        var ok = num-1;
        //alert("nb :"+ok);
        var latlng = document.getElementById("adresse_hid_"+ok).value.split('_');
        str += ';'+distance+'_'+latlng[1]+'_'+latlng[2];
        
        // Mise à jour de la chaine décrivant le dénivelé/distance
        document.getElementById("str_step").setAttribute("value", str);
        //recupererAltitude();
        
        // On verifie s'il y a des actions supplémentaire a effectuer
        if (appel!="") {
          // Si demande de sauvegarde alors ...
          if (appel=="save") {
            document.getElementById("etapes").style.display = "none";
            document.getElementById("saving").style.display = "";
            if(gdir.getStatus()['code']==200) {
            appel="";
            sauvegardeParcours();} else { alert ('error') ;}
          }
        }
        // on supprime les anciens markers pour qu'ils ne se chevauchent pas
        for (t = 0; t<gmarkers.length; t++) {
          map.removeOverlay(gmarkers[t]);
        }
        poly = gdir.getPolyline();
        map.addOverlay(poly);
        document.getElementById("bouton_aff").style.display = "none";
        document.getElementById("bouton_mod").style.display = "";
        document.getElementById("aff_info").style.display = "none";
        document.getElementById("mod_info").style.display = "";
        
        GEvent.removeListener(myListener);
        //gdir.clear();       
      }); 
    }
    if(gdir.getStatus()['code']==200) {
      creerlisteEtape("dir");
    }
    else {
     // alert("Error : one or more points aren't well placed and route can not be calculated");
    }
  }
}


function modifierParcours() {
  createMapEvents();
  gdir.clear();
  if (poly) {
    map.addOverlay(poly);
  }
  for (i=0; i<gmarkers.length; i++) {
  //alert("hello");
    map.addOverlay(gmarkers[i]);
  }
  document.getElementById("bouton_aff").style.display = "";
  document.getElementById("bouton_mod").style.display = "none";
  document.getElementById("aff_info").style.display = "";
  document.getElementById("mod_info").style.display = "none";
}




// Fonction qui récupère le contenu des champs hidden contenant les adresses/lat/lng/alt des étapes 
// et qui écrit ces valeurs dans le tableau
function creerlisteEtape(appel) {
  var nbetapes = parseInt(document.getElementById("num").value);
  var table = document.getElementById("etapes_liste");
  var tbody = document.createElement("tbody");
  tbody.setAttribute("id", "etapes_tab");
  num = nbetapes;
  
  for (i = 0; i<gmarkers.length; i++) {
    GEvent.clearListeners(gmarkers[i], "click");
    GEvent.clearListeners(gmarkers[i], "dragstart");
    GEvent.clearListeners(gmarkers[i], "dragend");
    map.removeOverlay(gmarkers[i]);
  }
  
  gmarkers = [];
  numero = 0;
  document.getElementById("num").value=0;
  //recupererAltitude();
  for (i = 0; i< nbetapes; i++) {
    var adtest = document.getElementById("adresse_hid_"+i).value;
    var nb_a = parseInt(document.getElementById("num").value);
    //alert(nb_a);
    var adtab = adtest.split('_');
    
    if (adtab[4]!="2") {
    //alert("ok");
    var point = new GPoint(adtab[2], adtab[1]);
    var mark  = new GMarker(point, {draggable: true});
    gmarkers.push(mark);
    //var mark = gmarkers[gmarkers.length-1];
    //map.addOverlay(mark);
    document.getElementById("adresse_hid_"+i).setAttribute("id", "adresse_hid_"+numero);
    
    var nb = parseInt(document.getElementById("num").value);
    //var nbbis = nb + 1;
    //document.getElementBy Id("num").value = nbbis;
    createEvents(mark, numero);
		
		//map.addOverlay(mark);
		
    numero++;
    document.getElementById("num").value = numero;
  }
  else {
      document.monform.removeChild(document.getElementById("adresse_hid_"+i));
      //var number = parseInt(document.getElementById("num").value);
      //document.getElementById("num").value = number - 1;
    
    } 
  }
  
  
}

function createEvents(mark, num) {
  GEvent.addListener(mark, 'dragstart', function() {
			map.closeInfoWindow();
		});
		GEvent.addListener(mark, 'dragend', function() {
			var point = mark.getPoint();
			document.getElementById('change').value = 1;
      	var adresse = document.getElementById("adresse_hid_"+num);
		  var ad = adresse.value.split('_');
		  //alert(num);
		  document.getElementById("adresse_hid_"+num).value = ad[0]+"_"+point.lat()+"_"+point.lng()+"_"+ad[3]+"_1";
    });
		
		GEvent.addListener(mark, 'click', function(point) {
			mark.openInfoWindowHtml('<font color="#0000FF"><a href="javascript:supprimer(\''+num+'\')">'+msg_suppr_etape+'</a></font>');
		});
}


// Fonction qui va sauvegarder le parcours en base de données + recuperation altitude etc...
function sauvegardeParcours() {
  
  // Recuperation de données diverses et variées
  var type_save = document.getElementById("action").value;
  var id = document.getElementById("id_par").value;
  var titre = document.getElementById("titre_par").value;
  var distance = document.getElementById("distance_par").value;
  var steps = document.getElementById("str_step").value;
  var changed = document.getElementById("change").value;
  if (titre!="") {
  // Première requête ajax pour sauvegarder dans la table parcours
  var myAjax = new Ajax.Request(
      'inclusion/sauvegarde.inc.php',
      {
        method: 'post',
        postBody: $H({action: 'sauver_parcours', type: type_save, id_par: id, titre_par: titre, distance_par: distance, steps_par: steps, change: changed}).toQueryString(),
        onComplete: function(transport) {
          var nb = parseInt(document.getElementById("num").value);
          var adresse_str ='';
          var lat_lng = '';
          var height = '';
          for(i=0; i<nb; i++) {
            if(i>0) {
              adresse_str+=';';
              lat_lng+=';';
              height+=';';
            }
            ad_comp = document.getElementById("adresse_hid_"+i).value.split("_");
            adresse_str += ad_comp[0];
            lat_lng += ad_comp[1]+"_"+ad_comp[2];
            height += ad_comp[3];
          }
          if(isNaN(transport.responseText)==false) {
          var id_etape = transport.responseText;
          // Deuxième requête ajax pour sauvegarder les etapes du parcours.
            new Ajax.Request(
              'inclusion/sauvegarde.inc.php',
              {
                method: 'post',
                postBody: $H({action: 'sauver_etape', type: type_save, etape_id: id_etape, etapes: adresse_str, etape_ll: lat_lng, etape_hg: height}).toQueryString(),
                onComplete: function(transport) {
                  if (isNaN(transport.responseText)==false) {
                    
                    document.getElementById("action").setAttribute("value", "update");
                    document.getElementById("id_par").setAttribute("value", id_etape);
                    document.getElementById("change").setAttribute("value", "0");
                    document.getElementById("etapes").style.display = "";
                    document.getElementById("saving").style.display = "none";
                    alert(alert_SAVE_OK);
                  }
                  else {
                    document.getElementById("etapes").style.display = "";
                    document.getElementById("saving").style.display = "none";                  
                    alert(alert_SAVE_ABORTED);
                  }
                }
              });
          }
          else {
            document.getElementById("etapes").style.display = "";
            document.getElementById("saving").style.display = "none";
            alert(alert_SAVE_ABORTED);
          }
              
        }
        
  });
  }
  else {
    alert(alert_TITLE_MISSING);
    document.getElementById("etapes").style.display = "";
    document.getElementById("saving").style.display = "none";
    document.getElementById("titre_par").focus();
  }
  return false;
}


function afficherPointManuel() {
	var addresse = document.getElementById("addresse").value;
  if (geocoder) {
		geocoder.getLatLng(
			addresse,
			function(point) {
				if (!point) {
					alert(alert_ADDRESS_NOT_FOUND);
				} else {
				  var mark = new GMarker(point, {draggable: true});
					gmarkers.push(mark);
          var nb = parseInt(document.getElementById("num").value);
          var nbbis = nb + 1;
          var adresse = "Etape_"+point.lat()+"_"+point.lng()+"_0_1";
          var adresse_hid = document.createElement("input");
          adresse_hid.setAttribute("type", "hidden");
          adresse_hid.setAttribute("id", "adresse_hid_"+nb);
          adresse_hid.setAttribute("value", adresse);
          
          document.monform.appendChild(adresse_hid);
                  
          
          document.getElementById("num").value = nbbis;
					GEvent.addListener(mark, 'dragstart', function() {
						map.closeInfoWindow();
					
					});
					GEvent.addListener(mark, 'dragend', function() {
						document.getElementById('change').value = 1;
						var point = mark.getPoint();
					  var adresse = document.getElementById("adresse_hid_"+nb);
					  var ad = adresse.value.split('_');
					  //alert(point.lat()+"_"+point.lng());
					  adresse.value = ad[0]+"_"+point.lat()+"_"+point.lng()+"_"+ad[3]+"_1";
          });
					
					GEvent.addListener(mark, 'click', function(point) {
						mark.openInfoWindowHtml('<font color="#0000FF"><a href="javascript:supprimer('+nb+')">Supprimer l\'étape</a></font>');
					});
					map.addOverlay(mark);
					AfficheGPS(mark);
					creerlisteEtape();
					modifierParcours();
					document.getElementById("addresse").value ="";
				}
			}
		);
	}
}

function AfficheGPS(marker){
	var center = marker.getPoint();
	var gpscenter = center.toString();
	var TableauPositionMaxiCarte = gpscenter.split(',');
	var LatitudeCarteClick='';
	var LongitudeCarteClick='';
	var LatitudeCarteClick = TableauPositionMaxiCarte[0].replace('(', '');
	var LongitudeCarteClick = TableauPositionMaxiCarte[1].replace(')', '');
	//document.getElementById('message').innerHTML = '<u>Les Coordonnees GPS du marqueur sont</u> : <b>Latitude : </b>' + LatitudeCarteClick + ' - <b>Longitude : </b>' + LongitudeCarteClick;
	//document.getElementById('adresse_temp').value = LatitudeCarteClick+"_"+LongitudeCarteClick;
  window.setTimeout(function(){map.setCenter(new GLatLng(LatitudeCarteClick, LongitudeCarteClick),9);}, 1000);
}

function recupererAltitude() {
  var nb = parseInt(document.getElementById("num").value);
  //alert(nb);
  for (i=0; i<nb; i++) {
    var adresse = document.getElementById("adresse_hid_"+i);
    var ads = adresse.value.split('_');
    if (ads[4]=="1") {
      new Ajax.Request(
              'inclusion/parcours_xml.inc.php?type=elevation&lat='+ads[1]+'&lng='+ads[2]+'&ad='+i,
              {	method: 'get',
			         onComplete: function(transport) {
			           var result = transport.responseText.split('_');
			            //alert("adresse_hid_"+result[0]);
                  document.getElementById("adresse_hid_"+result[0]).setAttribute("value", ads[0]+"_"+result[1]+"_"+result[2]+"_"+result[3]+"_0");      
              }
            });
    }
  }
}

