/*
 * JAVASCRIPT DEL COMPORTAMIENTO DE LA GENERACION DEL PERFIL Y OTROS WEB SERVICES
 */

// Variables con los puntos de muestras y las alturas
// - Puntos
//		- distance: Distancia al inicio
//		- elevation: Altura en ese punto
//		- location: LatLng del punto
var ptos = [];
// Numero de muestras
var muestras = 256;
//Numero máximo de ptos GPX
var max_ptos_GPX = 256;
// Altura maxima
var alturaMaxima;
// Altura minima
var alturaMinima;
// Desnivel positivo
var desnivel_pos;
// Desnivel negativo
var desnivel_neg;
// Maxima distancia al centro de los pueblos para ser incluidos
var DISTANCIA_AL_PUEBLO = 2000;
// AJAX request
var myRequest;
// Steps de la ruta en los cuales se buscan pueblos
var arraySteps = [];
// Indice de la busqueda de pueblos en los steps
var indiceBusqueda = 0;
// Indice de la busqueda en el path
var indiceBusquedaPath = 0;
// Nombres de los pueblos, utilizado para no ser repetidos
var nombresPueblos = [];
// Array de pueblos con la siguiente estructura
// - nombre
// - elevation
// - location
// - distance
var arrayPueblos = [];
// Variable booleana con la opción de mostrar pueblos o no
var mostrarPueblos = false;

/*
 * Funcion que genera el perfil de ruta
 * 1 - Recoge las alturas del los puntos de ruta
 * 2 - Muestra las alturas en la ventana emergente
 */
function genera_perfil (){
	// Si el estado no es adecuada, se sale de la rutina
	if (estado_ruta < DISTANCIA_OBTENIDA || tipoDeRuta == ID_INFORMADO){
		return;
	}
	// Servicio de alturas de google
	var elevator = new google.maps.ElevationService();
	var path = get_path();
	
    var pathRequest = {
		'path': path,
		'samples': muestras
   	};
    // Initiate the path request.
    elevator.getElevationAlongPath(pathRequest, obtieneAlturas);
    action_on_server("perfil");  
}

/*
 * Funcion que obtiene las alturas del camino solicitado
 */
function obtieneAlturas(results, status) {
	// Si el resultado es correcto, se crea el array de puntos y se dibuja la grafica
	// El array de puntos contiene
	// - Puntos
	//		- Distancia al inicio
	//		- Altura en ese punto
	//		- LatLng del punto
	
	if (status == google.maps.ElevationStatus.OK) {
		ptos = [];
  	    for (var i=0; i<results.length ; i++) {
  	    	var pto = new Object();
  	    	pto.distance =  redondear((distance * i)/(1000 * (muestras - 1)));
  	    	pto.location = results[i].location;
  	    	pto.elevation = results[i].elevation;
  	    	ptos[i] = pto;      	    	
  	    }
  	    
  	    // Se borran pueblos anteriores
  	    borraMarkersPueblos();
  	    // Se buscan los pueblos
  	    if (mostrarPueblos){
  	    	busquedaPueblos();
  	    } 	    
  	    // Se obtienen los datos de las alturas
  	    datos_alturas(ptos);
  	    // Se muestran los datos
  	    muestraDatosPerfil(true);
  	    // Genera la grafica
  	    draw("graph",ptos,alturaMaxima,alturaMinima);
  	    
  	    // Se añade texto e imágenes a la gráfica
  	    switch (tipoDeRuta) {
			case INICIO_FIN:
				// Se muestran markers inicio y fin
				addImagen (MARKER_INICIO, 20, 34,ptos[0].distance,ptos[0].elevation);
				addImagen (MARKER_FIN, 20, 34,ptos[ptos.length-1].distance,ptos[ptos.length-1].elevation);
				break;
				
			case IDA_VUELTA:
				// Se muestran markers inicio y fin
				addImagen (MARKER_INICIO_FIN, 20, 34,ptos[0].distance,ptos[0].elevation);
				addImagen (MARKER_INICIO_FIN, 20, 34,ptos[ptos.length-1].distance,ptos[ptos.length-1].elevation);
				// Se muestra el marker intermedio
				var indiceMedio = buscarPointsEnArrayMuestra (destino.getPosition(),0, false);	
				addImagen (MARKER_MITAD, 20, 34,ptos[indiceMedio].distance,ptos[indiceMedio].elevation);
				break;
				
			case MULTIPLES_PUNTOS:
				// Se muestra el marker 0
				addImagen ("./recursos/markers/marker0.png", 20, 34,ptos[0].distance,ptos[0].elevation);
				// Se muestran los markers intermedios
				var indice = 0;
				for ( var int = 1; int < arrayMarkers.length-1; int++) {
					indice = buscarPointsEnArrayMuestra (arrayMarkers[int].getPosition(), indice, false);	
					addImagen ("./recursos/markers/marker"+int+".png", 20, 34,ptos[indice].distance,ptos[indice].elevation);				
				}
				// Se muestra el ultimo marker
				addImagen ("./recursos/markers/marker"+(arrayMarkers.length-1)+".png", 20, 34,ptos[ptos.length-1].distance,ptos[ptos.length-1].elevation);
				break;
				
			case RUTA_GPX:
				// Se muestran markers inicio y fin
				addImagen (MARKER_INICIO, 20, 34,ptos[0].distance,ptos[0].elevation);
				addImagen (MARKER_FIN, 20, 34,ptos[ptos.length-1].distance,ptos[ptos.length-1].elevation);
				break;
				
			default:
				break;
		}
  	    
		// Muestra la grafica
  	  	   maximize();
  	  	   estado_ruta = DATOS_DE_PERFIL;
  	    
  	// Si es erroneo se muestra un mensaje en la parte superior
	}else{
		if (idioma=="en"){
			muestraInfoSuperior("Error retrieving elevation data");
		} else {			
			muestraInfoSuperior("Error al recuperar las alturas de la ruta");
		}		
	}
}

/*
 * Funcion que calcula los datos de las alturas
 */
function datos_alturas(ptos){
	alturaMaxima = 0;
	alturaMinima = 9999;
	desnivel_neg = 0;
	desnivel_pos = 0;
	for(var i=0; i<ptos.length ; i++){
	  if (ptos[i].elevation >alturaMaxima){
		  alturaMaxima = ptos[i].elevation;
	  }
	  if(ptos[i].elevation < alturaMinima){
		  alturaMinima = ptos[i].elevation;
	  }
	  if (i>0){
		  if(ptos[i].elevation > ptos[i-1].elevation){
			  desnivel_pos += ptos[i].elevation - ptos[i-1].elevation;
		  }else{
			  desnivel_neg += ptos[i-1].elevation - ptos[i].elevation;
		  }		  
	  }
	}
}

/*
 * Función para inicializar las variables globales asociadas con la busquda de pueblos
 */

function busquedaPueblos(){
	// Sólo para rutas que siguen los caminos
	if (!seguirCaminos){
		return;
	}	
	// Se emplean los steps de la ruta para buscar los pueblos de la ruta
	// Los principales pueblos estarán asociados a direcciones en la ruta
	// Emplear dichos puntos reduce el número de iteraciones si es comparado con recorrer toda la ruta
	switch (tipoDeRuta) {
		case INICIO_FIN:
			arraySteps = directionsDisplay.getDirections().routes[0].legs[0].steps;
			break;
		case IDA_VUELTA:
			arraySteps = directionsDisplay.getDirections().routes[0].legs[0].steps.concat(directionsDisplay.getDirections().routes[0].legs[1].steps);
			break;
		case MULTIPLES_PUNTOS:
			arraySteps = directionsDisplay.getDirections().routes[0].legs[0].steps;
			break;
		default:
			break;
	}
	// Se inicializan las variables globales de búsqueda
	indiceBusqueda = 0;
	indiceBusquedaPath = 0;
	nombresPueblos = [];
	arrayPueblos = [];
	buscaSiguientePuebloDeLaRuta(false);	
}

/*
 * Funcion que busca asíncronamente los pueblos de la ruta
 * Utiliza los Steps de la ruta
 * Trata de obtener los pueblos relacionados con los Steps
 * Busca el punto más cercano en la ruta a cada Step
 * Emplea las variables globales:
 * - arraySteps. Array de steps de la ruta
 * - indiceBusqueda. Indice del siguiente pueblo a buscar
 */
function buscaSiguientePuebloDeLaRuta (lejano){
	
	// No se tienen en cuenta pasos de distancia acumulada menores a la distancia minima si el anterior pueblo fue encontrado
	var distanciaAcumulada = 0;
	if (lejano && (indiceBusqueda > 0) && (indiceBusqueda < arraySteps.length)){
		while ((indiceBusqueda < arraySteps.length) && ((distanciaAcumulada + arraySteps[indiceBusqueda].distance.value) < DISTANCIA_AL_PUEBLO)){
			distanciaAcumulada += arraySteps[indiceBusqueda].distance.value;
			indiceBusqueda++;
		}
	}
	refrecaProgressBar();
	// Se termina si se ha alcanzado el final del array
	if (indiceBusqueda >= arraySteps.length){
		return;
	}
	
	// Se genera la llamada XTLHTTPRequest
	myRequest = new XMLHttpRequest();
	var myLatLng = arraySteps[indiceBusqueda].end_location;
	var url = "pueblo.php?lat="+myLatLng.lat()+"&lng="+myLatLng.lng(); 
	myRequest.open("GET",url,true);
	myRequest.onreadystatechange= respuestaAjaxPueblo;
	myRequest.send(null);
}

/*
 * Funcion que maneja la respuesta AJAX de un pueblo 
 */
function respuestaAjaxPueblo(){
	if (myRequest.readyState == 4){
		if (myRequest.status == 200){
			var puebloAniadido = false;
			var resp = eval('(' + myRequest.responseText + ')');
	          if (resp.google.results[1] && resp.google.status=="OK") {
		            // Se busca el nombre de la localidad
		            for ( var int = 0; int < resp.google.results[1].address_components.length; int++) {
						if (resp.google.results[1].address_components[int].types[0]=="locality" || resp.google.results[1].address_components[int].types[0]=="sublocality"){
							
							//var ptoCamino = new google.maps.LatLng(resp.original.lat,resp.original.lng);
							var ptoPueblo = new google.maps.LatLng(resp.google.results[1].geometry.location.lat,resp.google.results[1].geometry.location.lng);
							
							// Se busca el pto más cercano al centro del pueblo en la ruta
							var indicePtoCercano = buscarPointsEnArrayMuestra (ptoPueblo, indiceBusquedaPath, true);
							if (indicePtoCercano > -1){
								// Se comprueba que el nombre del pueblo no ha sido añadido ya
								if (buscaElementoEnArray(resp.google.results[1].address_components[int].long_name,nombresPueblos) == -1){
									// Se añade el nombre al array de nombres de pueblos
									nombresPueblos.push(resp.google.results[1].address_components[int].long_name);
									
									// Se añade información en el array de pueblos
									var pueblo_guardar = new Object();
									pueblo_guardar.nombre = resp.google.results[1].address_components[int].long_name;
									pueblo_guardar.elevation = ptos[indicePtoCercano].elevation;
									pueblo_guardar.location = ptos[indicePtoCercano].location;	
									pueblo_guardar.distance = ptos[indicePtoCercano].distance;
									arrayPueblos.push (pueblo_guardar);
									
									// Texto para marker y gráfica
									var txt = resp.google.results[1].address_components[int].long_name + " " + Math.round(ptos[indicePtoCercano].elevation) + "m";									
									// Se añade marker en el mapa
									addMarkerPueblo(ptos[indicePtoCercano].location,txt);
									// Se muestra en la grafica
									addTextoVertical("-" + txt,
											ptos[indicePtoCercano].distance,ptos[indicePtoCercano].elevation);
									puebloAniadido = true;	
									// Se establece el indice busqueda path para reducir el numero de iteraciones
									// No se aplica si el camino es de IDA y VUELTA
									if (tipoDeRuta!=IDA_VUELTA){
										indiceBusquedaPath = indicePtoCercano;
									}
								}									
							}							
							break;
						}
					}			       
			        // Se trata de buscar el siguiente pueblo
			        indiceBusqueda++;
			        buscaSiguientePuebloDeLaRuta(puebloAniadido);
		      }	else if(resp.google.status!="OK"){
			    	// Se muestra un status NO OK si lo hubiese
		    	  	if (idioma == "en"){
		    	  		muestraInfoSuperior ("Error retrieving localities: " + resp.google.status);
		    	  	} else{
		    	  		muestraInfoSuperior ("Error obteniendo las localidades: " + resp.google.status);
		    	  	}
			    	 
		      } 	
		}
	}	
}

function refrecaProgressBar(){
	var myValue = (indiceBusqueda / arraySteps.length) * 100;
	if (myValue < 100){
		$("#progressbar").fadeIn(500);
		$("#progressbar").progressbar({ value: myValue });	
	}else{
		$("#progressbar").fadeOut(500);	
	}
}

/*
 * Función busca en el array de muestras (ptos con distancias, alturas y LatLng) el punto a localizar (latlng)
 * La función devuelve la posición del array más cercana al punto o -1 si no es encontrado 
 */
function buscarPointsEnArrayMuestra (myLatLng, indiceInicial, limitarDistanciaPueblo){
	var distance = 9999;
	var aux;
	var indice;
	for ( var int = indiceInicial; int < ptos.length; int++) {
		aux =  google.maps.geometry.spherical.computeDistanceBetween(ptos[int].location,myLatLng);
		if(aux < distance){
			distance = aux;
			indice = int;
		}
	}
	if (limitarDistanciaPueblo && distance > DISTANCIA_AL_PUEBLO){
		indice = -1;
	}
	return indice;
}
/*
 * Función que busca los elementos en un array
 * parecido a IndexOf
 */
function buscaElementoEnArray(elemento,myArray){
	var a = -1;
	for ( var int = 0; int < myArray.length; int++) {
		if (myArray[int] == elemento){
			a = int;
			break;
		}
	}
	return a;
}
/*
 * Función que establece mostrar pueblos o no
 */
function mostrar_pueblos(){
	if (document.getElementById("mostrar_pueblos").checked==true){
		mostrarPueblos = true;
	}else{
		mostrarPueblos = false;
	}
	
	// Se vuelve a generar perfil si se hubiese generado
	if (estado_ruta == DATOS_DE_PERFIL){
		genera_perfil ();
	}
}

/*
 * Función que permite salvar la imagen del canvas.
 * 1. Envia la info de la imagn al servidor
 * 2. El servidor crea un archivo que el usuario puede bajar en modo attachtment
 */
function guardar_perfil(){
	// Si el estado no es adecuado, se sale de la rutina
	if (estado_ruta < DATOS_DE_PERFIL){
		return;
	}
	
	var canvasData = canvas.toDataURL("image/png");
	myRequest = new XMLHttpRequest();
	myRequest.open("POST",'saveImage.php',false);
	myRequest.setRequestHeader('Content-Type', 'application/upload');
	myRequest.onreadystatechange= respuestaGuardarPerfil;
	myRequest.send(canvasData);  
	action_on_server("image");
}

function respuestaGuardarPerfil(){
	if (myRequest.readyState == 4){
		if (myRequest.status == 200){
			var resp = eval('(' + myRequest.responseText + ')');
			location.href="retrieveImagePerfil.php?id="+resp.id;
		}
	}
}

// Método para compartir el perfil (usado por compartir Facebook y compartir link)
// - Se guardan en la BBDD los parámetros que permiten reproducir la ruta
// - Se guarda en servidor una imagen de tamaño pequeño del perfil para ser usada en Facebook
function compartirPerfil(type){ 
	// Si el estado no es adecuado, se sale de la rutina
	if (estado_ruta < DATOS_DE_PERFIL || tipoDeRuta == ID_INFORMADO){
		return;
	}	  
	setLoading (true);
	// Variable que recibirá el ID único de la ruta
	var id = 0;   	     		          		          	   	
	myRequest = new XMLHttpRequest();
	var params = 
		"puntos_ruta="+JSON.stringify(ptos)+
		"&distancia="+distance+
		"&altMax="+alturaMaxima+
		"&altMin="+alturaMinima+
		"&desnivelPos="+desnivel_pos+
		"&desnivelNeg="+desnivel_neg+
		"&pueblosAnalizados="+JSON.stringify(arrayPueblos); 
	if (type=="facebook"){
		try {
			params+="&imagen="+document.getElementById("graph").toDataURL(); 
		} catch(error){
			params+="&imagen=null" ; 
		}		
	}else{
		params+="&imagen=null" ;
	}

	var url = "shareRoute.php";
	myRequest.open("POST", url, true);
	//Send the proper header information along with the request
	myRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	myRequest.onreadystatechange=function(){
	if(myRequest.readyState == 4 && myRequest.status == 200) {
			setLoading (false);
			id = myRequest.responseXML.getElementsByTagName("id")[0];
			var numId = 0;
			if (typeof(id.textContent)!='undefined'){
				numId = id.textContent;
			}else{
				numId = id.text;
			}
			if (type=="facebook"){
				var popUp;
				var bloqueado = false;
				try{
					popUp = window.open("http://www.facebook.com/sharer.php?u=http://www.perfilderuta.es/perfil.php%3Fid%3D"+numId+"%26lng%3D"+idioma+"&src=sp","","toolbar=no,width=650,height=450");
					if (popUp==null || typeof(popUp)=='undefined'){
						bloqueado = true;
					}
			      }
				catch(err){
				   bloqueado = true;
				}
				if (bloqueado){
					switch (idioma) {
					case "es":
						alert("Desactive el bloqueo de popups para este sitio");
						break;
					case "en":
						alert("Please disable the pop-up blocker for this site before continuing");
						break;
					default:
						break;
					}			    			    
				} 		
			}else{
				if (idioma == "es" || idioma == "es#" ){
					muestraInfoSuperior("Link a esta ruta: <a href='http://www.perfilderuta.es/perfil.php?id="+numId+"&lng=es'>http://www.perfilderuta.es/perfil.php?id="+numId+"&lng=es</a> (envíanos tu <a href='http://www.perfilderuta.es/comentar.php?lng=es'>comentario</a> en caso de fallo)");
				}else{
					muestraInfoSuperior("Link to this route: <a href='http://www.perfilderuta.es/perfil.php?id="+numId+"&lng=en'>http://www.perfilderuta.es/perfil.php?id="+numId+"&lng=en</a> (please, send us your <a href='http://www.perfilderuta.es/comentar.php?lng=en'>comments</a> in case of failure)");
				}				
			}
		 }
	};
	myRequest.send(params);
	action_on_server(type);
}

/*
 * Función que comprueba al principio si ID está inicializado y si se corresponde con una ruta válida
 */
function compruebaID(){
	if (vars["id"]){
		// Se recupera la ruta correspondiente al ID
		// el servidor devuelve -1 si el ID no es correcto
		// Se genera la llamada XTLHTTPRequest
		myRequest = new XMLHttpRequest();
		var url = "retrieveInfoID.php?id="+vars["id"]; 
		myRequest.open("GET",url,true);
		// Función de vuelta
		myRequest.onreadystatechange= function (){
			if (myRequest.readyState == 4){
				if (myRequest.status == 200){
					var resp = eval('(' + myRequest.responseText + ')');
					// La búsqueda es correcta si el ID es diferente de -1
					if (resp.id != -1){
						// Se informan los datos de la ruta distancias, alturas, etc.
						distance = resp.distance;
						alturaMaxima = resp.altMax;
						alturaMinima = resp.altMin;				
						desnivel_pos = resp.desnivelPos;	
						desnivel_neg = resp.desnivelNeg;
						// Establece el tipo de ruta guarda y el estado
						tipoDeRuta = ID_INFORMADO;
						estado_ruta = MOSTRADA_RUTA;
						// Se muestra la polilinea en el mapa
						dibujaCaminoGuardado (resp.ptos);
						// Se dibuja el perfil de ruta
				  	    draw("graph",resp.ptos,resp.altMax,resp.altMin);
				  	    // Se muestran los marcadores de inicio - fin
				  	    addImagen (MARKER_INICIO, 20, 34,resp.ptos[0].distance,resp.ptos[0].elevation);
				  	    addImagen (MARKER_FIN, 20, 34,resp.ptos[resp.ptos.length - 1].distance,resp.ptos[resp.ptos.length - 1].elevation);
				  	    // Se muestran los pueblos
				  	    for ( var int = 0; int < resp.pueblos.length; int++) {
							var pueblo = resp.pueblos[int];
							// Texto para marker y gráfica
							var txt = pueblo.nombre + " " + Math.round(pueblo.elevation) + "m";									
							// Se añade marker en el mapa
							var lat = 0;
							var lng = 0;
							for (var myValues in pueblo.location){	
								if (lat == 0){
									lat = pueblo.location[myValues];
								}else if (lng == 0){
									lng = pueblo.location[myValues];
								}		
							}
							var myLatLng = new google.maps.LatLng(lat,lng);
							addMarkerPueblo(myLatLng,txt);
							// Se muestra en la grafica
							addTextoVertical("-" + txt,pueblo.distance,pueblo.elevation);			
						}
				  	    // Se muestra la gráfica
				  	    maximize();
				  	    // Se muestran los datos de la ruta
				  	    ocultarOpciones(true);
				  		muestraDistancia(true);
				  		muestraDatosPerfil(true);				  		
					}
				}
			}
		};
		myRequest.send(null);		
	}
}
/*
* Funcion ejecutada en la carga de los ficheros GPX
* Envia el fichero GPX al servidor para poder ser descargado como XML
*/
function enviar_GPX(){
	nuevaRuta();
	if (navigator.appName == 'Microsoft Internet Explorer'){
    	if (idioma == "es"){
    		muestraInfoSuperior("Esta acción no está disponible para Internet Explorer");
    	}else{
    		muestraInfoSuperior("This function is not available for Internet Explorer");
    	}
		return;
	}
	var file = document.getElementById("upload_input").files[0];
	var reader = new FileReader();
	reader.onload = function(e) {
	  var bin = e.target.result;
	  myRequest = new XMLHttpRequest();
	  myRequest.open("POST", "uploadGPX.php");
	  myRequest.overrideMimeType('text/plain; charset=x-user-defined-binary');
	  myRequest.onreadystatechange = cargar_GPX;
	  myRequest.send(bin);
	  action_on_server("gpx");
	};
	reader.readAsBinaryString(file);
	setLoading (true);
}
/*
 * Función que carga el fichero GPX, recorre los nodos y presenta la ruta
 */
function cargar_GPX(){
	if (myRequest.readyState == 4){
		if (myRequest.status == 200){
			setLoading (false);
			var resp = eval('(' + myRequest.responseText + ')');
		    var xmlhttp=new XMLHttpRequest();
		    xmlhttp.open("GET","./tracks/gpx"+resp.id+".xml",false);
		    xmlhttp.send();
		    var myXML = xmlhttp.responseXML;			    
		    try {
			    var nodeList = myXML.getElementsByTagName("gpx")[0].getElementsByTagName("trk")[0].getElementsByTagName("trkseg")[0].getElementsByTagName("trkpt");
		    	var arrayPtos = new Array(nodeList.length);
		    	for (var i = 0; i < nodeList.length; i++){
		    		arrayPtos[i] = nodeList[i];
		   		}
		   		
		    	distance = obtieneDistanciaCaminoGuardado(arrayPtos);			    	
		    	if (arrayPtos.length > max_ptos_GPX){
		    		arrayPtos = reducePuntosArray(arrayPtos,max_ptos_GPX);
			    	if (idioma == "en"){
			    		muestraInfoSuperior("The number of displayed points has been reduced");
			    	}else{
			    		muestraInfoSuperior("Se ha reducido el número de puntos mostrados");
			    	}
		    	}			    	
		    	tipoDeRuta = RUTA_GPX;		    	
		    	dibujaCaminoGPX (arrayPtos);			    	
		    	muestraDistancia(true);
		    	estado_ruta = DISTANCIA_OBTENIDA;				  	
		    } catch (e) {
		    	if (idioma == "es"){
		    		muestraInfoSuperior("Error cargando fichero GPX");
		    	}else{
		    		muestraInfoSuperior("Error loading GPX file");
		    	}	    	
		    }
		}
	}
}
function reducePuntosArray (myArray,numMax){
	while (myArray.length > numMax){
		// Numero aleatorio que no es ni el primero ni el ultimo elemento
		var numAux = Math.floor(Math.random() * (myArray.length - 2 )) + 1;
		// Se parte el Array por numAux
		myArray = (myArray.slice(0,numAux)).concat(myArray.slice(numAux + 1));
	}
	return myArray;
}
function action_on_server(action) {
	var xrl = new XMLHttpRequest();
	xrl.open("GET","server_perfil.php?rnd="+(Math.floor(Math.random()*111)+"&act="+action),true);
	xrl.send(null); 	
}

function downloadGPX() {
	// Si el estado no es adecuado, se sale de la rutina
	if (estado_ruta < DISTANCIA_OBTENIDA && tipoDeRuta != ID_INFORMADO){
		return;
	}
	
	setLoading (true);
	
	var myPtos = [];
	
	if (estado_ruta == DISTANCIA_OBTENIDA || tipoDeRuta == ID_INFORMADO){
		var myPath = get_path();
		for ( var i = 0; i < myPath.length; i++) {
			var pto = new Object();
			pto.latitude = myPath[i].lat();
			pto.longitude = myPath[i].lng();
			pto.elevation = 0;
			myPtos.push(pto);
		}		
	}else{
		for ( var i = 0; i < ptos.length; i++) {
			var pto = new Object();
			pto.latitude = ptos[i].location.lat();
			pto.longitude = ptos[i].location.lng();
			pto.elevation = ptos[i].elevation;
			myPtos.push(pto);
		}
	}
	var params = "ptos="+JSON.stringify(myPtos);	
	myRequest = new XMLHttpRequest();
	var url = "downloadGPX.php";
	myRequest.open("POST",url,true);
	myRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	myRequest.onreadystatechange= respuestaDownloadGPX; 
	myRequest.send(params);
}

function respuestaDownloadGPX(){
	if (myRequest.readyState == 4){
		if (myRequest.status == 200){
			action_on_server("gpx_down");
			var resp = eval('(' + myRequest.responseText + ')');
			location.href="retrieveGPX.php?id="+resp.id;			
		}
	}
	setLoading (false);
}	

