//clase que permite gestionar rutas en el mapa
GestorComoLlegar = function(datosGestor)
{
	var gestor = this;
	
	gestor.contenedorDatos = datosGestor.contenedorDatos;
	gestor.contenedorIndicaciones = datosGestor.jContenedorIndicaciones;
	gestor.contenedorMapa = datosGestor.contenedorMapaComoL;
	gestor.contenedorDatosRuta = datosGestor.contenedorDatosRuta;
	
	gestor.gestorMapa = datosGestor.gestorMapa;
	gestor.instanciaMapa = gestor.gestorMapa.getInstanciaMapa();
	

	//objeto que se encarga de gestionar el cálculo de la ruta
	var gestorDirecciones = new google.maps.DirectionsService();
	
	//objeto que se encarga de repesentar la ruta en pantalla
	var rendererOptions = {
		draggable: true
	};

	var trazador = new google.maps.DirectionsRenderer(rendererOptions);
		
	//el objeto trazador necesita una instancia de mapa para representar la ruta
	//en este caso, será la misma que muestra el mapa con la localización original 
	
	trazador.setMap(gestor.instanciaMapa);
	trazador.markerOptions = {draggable:true};
	


	//método de la clase que calculará la ruta, mediante el trazador automático de google
	gestor.calcularRutaAutomatica = function(datosRuta) 
	{

		
		  var origenEtapa = datosRuta.origenEtapa;
		  var destinoEtapa = datosRuta.destinoEtapa;
		  var latitudEtapa = datosRuta.latitudEtapa;
		  var longitudEtapa = datosRuta.longitudEtapa;
		  var localidadEtapa = datosRuta.localidadEtapa;
		  var provinciaEtapa = datosRuta.provinciaEtapa;
		  var cpEtapa = datosRuta.cpEtapa;
		  
		  var geocodificador;
	  
	  	  //funcion que creará una ruta con la respuesta obtenida del procesamiento de la dirección o coordenadas
		  function crearRuta(resultadoDestino,tipo)
		  {
			  //mostramos el contenedor del mapa y de la ruta que está escondido por defecto
			  gestor.contenedorDatos.css('display','block');
  
			  //objeto con los parámetros necesarios para el cálculo de la ruta
			  var request = {
				  origin: origenEtapa, 
				  destination: resultadoDestino,
				  travelMode: google.maps.DirectionsTravelMode['DRIVING']
			  };
		  
			  //metodo del objeto gestor para calcular la ruta y gestionar los posibles errores
			  gestorDirecciones.route(request, function(response, status) 
			  {
				//si obtenemos respuesta correcta para las direcciones enviadas
				if (status == google.maps.DirectionsStatus.OK) 
				{
				  //el trazador standard de google permite trazar las rutas en el mapa de forma automatica
				  //mediante el metodo setdirections, al que se pasa la respuesta del gestor de direcciones
				  
				  //el mapa crea un marcador en el centro por defecto, así que lo eliminamos
				  gestor.gestorMapa.borrarMarcadores();
				  gestor.contenedorMapa.show();
				  trazador.setDirections(response);
				  gestor.gestorMapa.reescalarMapa();
				  //la respuesta incluye las indicaciones del recorrido, que pueden insertarse en un div
				  //mediante el metodo setPanel
				  trazador.setPanel(jQuery('#indicacionesComoLlegar').show().get(0));
				  
				  //comprobaremos si la ruta se está calculando con una dirección aproximada
				  //y si es así, mostraremos un mensaje de aviso para el usuario
				  switch(tipo)
				  {
					case 'aproximada':	
				  	jQuery('#indicacionesComoLlegar').prepend('<div id="aviso_ruta_aproximada"><p>La dirección suministrada como destino de la ruta, <span id="aviso_ruta_direccion">\"'+destinoEtapa+'\"</span>, no figura aún en la base de datos de Google.</p><p>Para el cálculo, de la ruta, se ha empleado la dirección más cercana suministrada por el servicio de Google.</p></div>');
					break;
				  }
				}
				else if (status == google.maps.DirectionsStatus.ZERO_RESULTS || status == 'NOT_FOUND') 
				{
					gestor.contenedorMapa.hide();
					jQuery('#indicacionesComoLlegar').prepend('<div id="aviso_ruta_aproximada">La dirección suministrada como origen de la ruta, no ha podido ser procesada por el servicio de Google.<br />Introduzca una nueva dirección, asegurándose de hacerlo con el formato \"dirección, código postal, localidad y pais\", separados por comas.<br />Si no recibe respuesta, inténtelo con una dirección próxima.<br />Disculpen las molestias.</div>').show();
				}
				
				
			  });//route
			 
		  }//creartura
		  
		  //funcion que se ejecuta cuando no es posible crear la ruta ni por dirección ni por coordenadas
		  function anularRuta()
		  {
			   //ocultamos el mapa
			   gestor.contenedorMapa.hide();
			   //mostramos el contenedor de los datos de la ruta
			   gestor.contenedorDatos.show();
			   //mostramos un aviso
			   gestor.contenedorIndicaciones.show().html('<div id="aviso_sin_ruta">La dirección suministrada como destino de la ruta no ha devuelto resultados válidos al ser procesada.<br />Rogamos se pongan en contanto con el administrador para dar cuenta del error.<br />Gracias.</div>')
			   
		  }
		  
		  //es necesario realizar una solicitud a google para comprobar si existe la direccion del usuario
		  //si no existe, se usaran las coordenadas proporcionadas para buscar 
		  //una dirección alternativa próxima a las coordenadas
		  //si no hay respuesta con las coordenadas, se usará la dirección más próxima que haya proporcionado
		  //la dirección postal
		  function geocodificar() {
			  
			geocodificador = new google.maps.Geocoder();
			var latlng = new google.maps.LatLng(latitudEtapa, longitudEtapa);
			
			var direccionProcesada = "";//un array compuesto de ['tipoderespuesta','direccionrespuesta'];
			var coordenadasProcesadas = "";
			
			var resultadoDirecciones = {};//objeto que contendrá las posibles direcciones devueltas por el geocode de google
			
			//creamos un escuchador para el evento que lanzará el geocodificador cuando devuelva la respuesta
			jQuery(geocodificador).bind("DIRECCION_POSTAL_OK",function(e)
			{
				//comprobamos que tipo de respuesta hemos recibido
				switch(direccionProcesada[0])
				{
					//si no hay direccion, comprobamos las coordenadas
					case false:
						geocodificador.geocode( {latLng: latlng}, function(results, status) 
						{
							//si obtenemos respuesta
							if (status == google.maps.GeocoderStatus.OK) 
							{
								//creamos la ruta con la respuesta
								var direccionResultado = results[0].formatted_address;
								crearRuta(direccionResultado,'aproximada');
							}
							//si no hay dirección aproximada para las coordenadas, anulamos la ruta
							else
							{
								//creamos la ruta con la respuesta obtenida de la dirección postal
								anularRuta();
							}
						});
					break;
					
					//si es aproximada, porque la dirección no existe, comprobamos las coordenadas
					case 'APPROXIMATE':
						geocodificador.geocode( {latLng: latlng}, function(results, status) 
						{
							//si obtenemos respuesta
							if (status == google.maps.GeocoderStatus.OK) 
							{
								//creamos la ruta con la respuesta
								var direccionResultado = results[0].formatted_address;
								crearRuta(direccionResultado,'aproximada');
							}
							//si no
							else
							{
								//creamos la ruta con la respuesta obtenida de la dirección postal
								crearRuta(direccionProcesada[1],'aproximada');
							}
						});
					break;
					
					default:
						crearRuta(direccionProcesada[1],'correcta');
					break;
				}
				

			});
			
			//en primer lugar, geocodificamos la dirección postal
			if (geocodificador) 
			{
			  geocodificador.geocode( { 'address': destinoEtapa}, function(results, status) 
			  {
				if (status == google.maps.GeocoderStatus.OK) 
				{
					//filtraremos los resultados por el código postal, para obtener una dirección bastante aproximada
					//si hay codigo postal, claro
					//si no coincide la localidad, lo haremos por localidad y provincia
					
					if(cpEtapa != '')
					{
						var resultadosCp = jQuery.map(results,function(resultado)
						{													
						  var direccionResultado = resultado.address_components;
						  var localidad;//locality
						  var provincia;
						  var codigoPostal;//[postal_code];
						  
						  var resultadoCp = jQuery.map(direccionResultado,function(direccion)
						  {
							  var tipoDireccion = direccion.types[0];
							  if (tipoDireccion == 'postal_code' && direccion.long_name == cpEtapa)
							  {
								  return direccionResultado;
							  }
						  });
						  
						  if(resultadoCp.length > 0)
						  {
							  return resultado;
						  }
						  
						});
						
						if (resultadosCp.length > 0)
						{
							var tipoResultado = resultadosCp[0].geometry.location_type;
							var direccionResultado = resultadosCp[0].formatted_address;
							direccionProcesada = [tipoResultado,direccionResultado];
							//y lanzaremos un evento que determina el final de la carga
							jQuery(geocodificador).trigger("DIRECCION_POSTAL_OK");	
						}
						else 
						{
						  //si no hay resultados, marcamos la dirección resultante como false
						  direccionProcesada = [false,false];
						  //y lanzamos el evento de final de carga
						  jQuery(geocodificador).trigger("DIRECCION_POSTAL_OK");	
						}
						
					}//if cpetapa
				} 
				else 
				{
				  //si no hay resultados, marcamos la dirección resultante como false
				  direccionProcesada = [false,false];
				  //y lanzamos el evento de final de carga
				  jQuery(geocodificador).trigger("DIRECCION_POSTAL_OK");	
				}
			  });
			}//if
			
			
			
		  }
		  
		  geocodificar();
	    
	}//calcularruta
	

}//gestorrutas
