
/*
 * Funcion para facilitar la gestión de rutas en los mapas
 */

function comoLlegar(datos)
{
	var objeto = this;

	//datos que se pasan como parametros	
	
	//datosDireccion es un array con objetos de datos que contien los datos de una direccion
	//nombre, direccion, latitud, longitud, etc...)
	//cuando no exista esta propiedad, se cargaran los datos de un php en funcion del usuario de la pagina
	objeto.datosDireccion = datos.datosDireccion || []; 
	//el resto de campos contienen los id's de los elementos HTML que se van a usar
	//div para el mapa de situacion
	objeto.contenedorMapaSituacion = datos.mapaSituacion;
	//div para los datos de la ruta
	objeto.contenedorDatosRuta =  datos.contenedorDatosRuta;
	//div para el mapa con la ruta de como llegar
	objeto.contenedorMapaComoLlegar = datos.mapaComoLlegar;
	//div con las indicaciones de la ruta para las direcciones establecidas
	objeto.contenedorIndicacionesComoLlegar = datos.indicacionesComoLlegar;
	//select que contiene las direcciones de destino cuando hay varias
	objeto.selectDatosDestino = datos.selectDatosDestino || false;
	//input que contiene la direccion introducida por el usuario
	objeto.inputDatosOrigen = datos.inputDatosOrigen;
	//boton que envia el formulario para calcular la ruta
	objeto.botonEnviar = datos.botonEnviar;

	
	//atributos que almacenan los elementos de HTML anteriores como objetos jquery
	objeto.jMapaSit = jQuery('#'+objeto.contenedorMapaSituacion);
	objeto.jContenedorDatos = jQuery('#'+objeto.contenedorDatosRuta);
	objeto.jMapaComol = jQuery('#'+objeto.contenedorMapaComoLlegar);
	objeto.jContenedorIndicaciones = jQuery('#'+objeto.contenedorIndicacionesComoLlegar);
	objeto.jInputDatosOrigen = jQuery('#'+objeto.inputDatosOrigen);
	objeto.jboton = jQuery('#'+objeto.botonEnviar);
	
	//si hay varias direcciones de destino
	if(jQuery('#'+objeto.selectDatosDestino).length > 0) 
	{
		objeto.jSelectDatosDestino = jQuery('#'+objeto.selectDatosDestino);
	}
	
	
	//alto y ancho del mapa que muestra la localización del municipio
	objeto.anchoMapaSit = objeto.jMapaSit.width();
	objeto.altoMapaSit = objeto.jMapaSit.height();
	//alto y ancho del mapa que contendrá la ruta de cómo llegar
	objeto.anchoMapaComol = objeto.jMapaComol.width();
	objeto.altoMapaComol = objeto.jMapaComol.height();
	

	//funcion que inicializa los mapas y crea los marcadores
	function inicializarMapas()
	{
		var datosInicio = {};
		
		//se puede establecer un parámetro para la dirección de destino 'a mano'
		//si no hay ese parámetro, usaremos los datos del usuario mediante el php correspondiente
		if(objeto.datosDireccion.length == 0)
		{
		  objeto.datosDireccion[0] = {};
			
		  //función que carga los datos del municipio mediante ajax, y una vez cargados
		  //crea el mapa donde se muestra la situación del municipio
		  jQuery.ajax({
			  url: '/cgi-bin/varios/datos_usuario.shtml',
			  success: function(data) {
				  
			  var xml;
			  
				if (jQuery.browser.msie) 
				{
					xml = new ActiveXObject("Microsoft.XMLDOM");
					xml.loadXML(data);
				} 
				else 
				{
					xml = data;
				};
			  
				var nombreXML = jQuery(xml).find('razon');
				objeto.datosDireccion[0].datosnombre = nombreXML.text();
				var latitudXML = jQuery(xml).find('latitud');
				objeto.datosDireccion[0].latitud = latitudXML.text();
				var longitudXML = jQuery(xml).find('longitud');
				objeto.datosDireccion[0].longitud = longitudXML.text();
				var direccionXML = jQuery(xml).find('direccion');
				objeto.datosDireccion[0].direccion = direccionXML.text();
				var provinciaXML = jQuery(xml).find('provincia');
				objeto.datosDireccion[0].provincia = provinciaXML.text();
				var paisXML = jQuery(xml).find('pais');
				objeto.datosDireccion[0].pais = paisXML.text();
				var localidadXML = jQuery(xml).find('localidad');
				objeto.datosDireccion[0].localidad = localidadXML.text();
				var codigopostalXML = jQuery(xml).find('cp');
				objeto.datosDireccion[0].codigopostal = codigopostalXML.text();
				var telefonoXML = jQuery(xml).find('telefono1');
				objeto.datosDireccion[0].telefono = telefonoXML.text();
				
			
				jQuery(window).trigger('DATOSUSUARIO_OK',[objeto.datosDireccion[0]]);
			  }
		   });
		}//direccion != false
		
		else 
		{
			//para inicializar el mapa, podemos coger los datos del primer marcador 
			//como el array datosDireccion puede tener elementos no definidos, pues los indices se pueden crear en funcion del id de cada oficina, en lugar de en orden correlativo, hay que tener seleccionar el primer elemento del array que exista
			var datosInicio;
			
			jQuery(objeto.datosDireccion).each(function(i)
			{
			  var elemento = objeto.datosDireccion[i];
			  if (elemento)
			  {
				  datosInicio = this;
				  return false;
			  }
			  else
			  {
			    return true;
			  }
			});

		
		    //hay que comprobar las coordenadas de latitud y longitud. Si no existen, trataremos de obtenerlas
			if (!datosInicio.latitud && !datosInicio.longitud)
			{
				geocoder = new google.maps.Geocoder();
				//limpiamos la direccion (para casos como 'calle, nº - loquesea')
				var direccionLimpia;
				if (datosInicio.direccion.indexOf('-') != -1)
				{
					direccionLimpia = datosInicio.direccion.split('-');
				    direccionLimpia = direccionLimpia[0];
				}
				else
				{
					direccionLimpia = datosInicio.direccion;
				};
		        geocoder.geocode({'address': direccionLimpia+','+datosInicio.codigopostal+','+datosInicio.localidad+','+datosInicio.provincia+','+datosInicio.pais}, function(results, status) 
		        {
		          if (status == google.maps.GeocoderStatus.OK)
		          {
			        if (results[0]) 
			        {
				      datosInicio.latitud = results[0].geometry.location.lat();
			          datosInicio.longitud = results[0].geometry.location.lng();
					  jQuery(window).trigger('DATOSUSUARIO_OK',[datosInicio]);
			        }; 
		          } 
				  else 
		          {
			        return false;
		          };
		        });
			}
			//si hay latitud y longitud
			else
			{
				jQuery(window).trigger('DATOSUSUARIO_OK',[datosInicio]);
			};
		};//else
			
	};//inicializarMapa
	
	function anadirMarcador(datos)
	{
		var datosMarcador;
		if (datos)
		{
		  datosMarcador = {
			id:datos.id,
			nombre:datos.nombre,
			descripcion:"<div class='googlemap_cont_desc'><p>"+datos.direccion+"</p><p>"+datos.codigopostal+" - "+datos.localidad+"</p><p>"+datos.provincia+" - "+datos.pais+"</p><p>Tlf.: "+datos.telefono+"</p></div>",
			size:datos.tamano,
			imagen:datos.imagen,
			coordenadas:datos.coordenadas
		  };
		  		
		  objeto.mapaSituacion.crearMarcadores(datosMarcador);
        };
	};
		
	function crearMapas(datosInicio)
	{
	
	  /**
	   * datos del mapa de situacion								
	   */
	 
		var datosMapa = {
			contenedor:objeto.contenedorMapaSituacion,
			zoomMapa:16,
			latMapa:datosInicio.latitud,
			longMapa:datosInicio.longitud,
			tituloMapa:datosInicio.nombre,
			ancho:objeto.anchoMapaSit,
			alto:objeto.altoMapaSit,
			marcadorInicio:false
		};
	
		//creamos la instancia de la clase googleMapClass que contendrá el mapa donde mostramos la situación
		objeto.mapaSituacion = new googleMapClass(datosMapa);	

		//cuando el mapa de google termina de cargarse se lanza un evento que podemos recoger para comenzar a crear los marcadores
		jQuery(objeto.mapaSituacion).bind('mapaCargado',function(e)
		{
			
			var objetoMapa = this;
	
			var marcador = [];
			var index = 0;
			//iremos creando los diferentes marcadores
			for (datosMarcador in objeto.datosDireccion)
			{
				var datos = {};
				var objetoDatos = objeto.datosDireccion[datosMarcador];	
				
				
				datos.id = 'marcador_'+[index];
				datos.nombre = objetoDatos.nombre;
				datos.latitud = objetoDatos.latitud;
				datos.longitud = objetoDatos.longitud;
				datos.provincia = objetoDatos.provincia;
				datos.pais = objetoDatos.pais ;
				datos.localidad = objetoDatos.localidad;
				datos.codigopostal = objetoDatos.codigopostal;
				datos.telefono = objetoDatos.telefono;
				datos.direccion = objetoDatos.direccion;//peazo garrulo, no le pongas el mismo nombre!!!!
				datos.imagen = objetoDatos.imagenIcono;
				datos.tamano = objetoDatos.tamano || 32;//por defecto, el tamaño del icono será de 32
				
				//si no hay latitud y longitud
				if (!datos.latitud && !datos.longitud)
			    {
				  geocoder = new google.maps.Geocoder();
				  //limpiamos la direccion (para casos como 'calle, nº - loquesea')
				  var direccionLimpia;
				  if (datos.direccion.indexOf('-') != -1)
				  {
					  direccionLimpia = datos.direccion.split('-');
					  direccionLimpia = direccionLimpia[0];
				  }
				  else
				  {
					  direccionLimpia = datos.direccion;
				  };
				  geocoder.geocode({'address': direccionLimpia+','+datos.codigopostal+','+datos.localidad+','+datos.provincia+','+datos.pais}, function(results, status) 
				  {
					if (status == google.maps.GeocoderStatus.OK)
					{
					  if (results[0]) 
					  {
						datos.latitud = results[0].geometry.location.Pa;
						objeto.datosDireccion[datosMarcador].latitud = datos.latitud;
						datos.longitud = results[0].geometry.location.Qa;
						objeto.datosDireccion[datosMarcador].latitud = datos.longitud;
						datos.coordenadas = new google.maps.LatLng(datos.latitud,datos.longitud);
						//console.log(datos.direccion+' '+datos.coordenadas)
						anadirMarcador(datos);
					  }; 
					} 
					else 
					{
					  datos.coordenadas = false;
					  jQuery('option[value="'+datosMarcador+'"]',objeto.jSelectDatosDestino).attr('disabled','disabled');
					  //console.log(datos.direccion+' '+datos.coordenadas)
					};
				  });
			    } 
				//si hay latitud y longitud
				else
				{
                   datos.coordenadas = new google.maps.LatLng(datos.latitud,datos.longitud);
  				   //console.log(datos.direccion+' '+datos.coordenadas)
				   anadirMarcador(datos);
				};
				
				index++;
			  };//for
				
		});//bind mapacargado
		
		
	  /* *
	   * datos del mapa de como llegar	
	   * si tenemos un mapa con varias direcciones posibles de destino, 
	   * existirá un select donde cada opción se correspondera con los valores
	   * del objeto que contiene los datos de las direcciones
	   */	
	 
	
	  //cuando hagamos click en el botón
	  objeto.jboton.click(function(e)
	  {								   
		  e.preventDefault();
		  
		  //borramos el posible contenido que pueda existir en la información de la ruta
		  objeto.jContenedorIndicaciones.html('');
		  
		  //si hay varias direcciones, existir? un select donde cada opci?n se correspondera con los valores
		  //del objeto que contiene los datos de las direcciones
		  var idPuntoDestino = parseFloat(objeto.jSelectDatosDestino.val());
		  //sino, ser? la opci?n 0
		  if (idPuntoDestino == '')
		  {
			  idPuntoDestino = 0;
		  }
		  

		  var direccionDestino = objeto.datosDireccion[idPuntoDestino].direccion+','+objeto.datosDireccion[idPuntoDestino].codigopostal+','+objeto.datosDireccion[idPuntoDestino].localidad+', '+objeto.datosDireccion[idPuntoDestino].provincia+','+objeto.datosDireccion[idPuntoDestino].pais;
		  var latitudDestino = objeto.datosDireccion[idPuntoDestino].latitud;
		  var longitudDestino = objeto.datosDireccion[idPuntoDestino].longitud;
		  var tituloDestino = objeto.datosDireccion[idPuntoDestino].nombre;
		  //var direccionDestino = objeto.datosDireccion[idPuntoDestino].direccion;
			  
		  //valores de la localidad, provincia y codigo postal que figuran en la base de datos del usuario
		  //con lo que se comparar?n los resultados del geocodificador de google
		  var provinciaDestino = objeto.datosDireccion[idPuntoDestino].provincia;
		  var localidadDestino = objeto.datosDireccion[idPuntoDestino].localidad;
		  var cpDestino = objeto.datosDireccion[idPuntoDestino].codigopostal;
		  
		  var datosMapaComoLlegar = {
			  contenedor:objeto.contenedorMapaComoLlegar,
			  zoomMapa:16,
			  latMapa:latitudDestino,
			  longMapa:longitudDestino,
			  tituloMapa:tituloDestino,
			  ancho:objeto.anchoMapaComol,
			  alto:objeto.altoMapaComol,
			  marcadorInicio:false
		  };
		  
		  //creamos la instancia de la clase googleMapClass que contendrá el mapa donde aparecerá la ruta
		  objeto.mapaComollegar = new googleMapClass(datosMapaComoLlegar);	
  
		  
		  var datosGestorRutas = 
		  {
			  jContenedorIndicaciones:objeto.jContenedorIndicaciones,
			  contenedorMapaComoL:objeto.jMapaComol,
			  contenedorDatos:objeto.jContenedorDatos,
			  contDescripcionRuta:objeto.jContenedorIndicaciones,
			  gestorMapa:objeto.mapaComollegar
		  };
		  
		  //creamos la instancia del gestor de rutas
		  objeto.mapaComollegar.gestorComoLlegar = new GestorComoLlegar(datosGestorRutas);
		  
		  //texto introducido en el input por el usuario con la dirección del punto de partida
		  var puntoPartidaForm = objeto.jInputDatosOrigen.val();
		  
		  if (puntoPartidaForm == '')
		  {
			  return false;
		  }
		  else
		  {
			  var datosEtapa = 
			  {
			   origenEtapa:puntoPartidaForm, 
			   destinoEtapa:direccionDestino, 
			   latitudEtapa:latitudDestino, 
			   longitudEtapa:longitudDestino,
			   provinciaEtapa:provinciaDestino, 
			   localidadEtapa:localidadDestino, 
			   cpEtapa:cpDestino
			  };
			  
			  objeto.mapaComollegar.gestorComoLlegar.calcularRutaAutomatica(datosEtapa);
		  };
	  });//objeto.jboton.click
	
	}//crearmapas;
	
	

	jQuery(window).bind('DATOSUSUARIO_OK',function(e,objeto)
	{
		crearMapas(objeto);
	});
	
	inicializarMapas();


}; //comollegar
