// Recoger coordenadas en Google Map javascript:void(prompt(gApplication.getMap().getCenter()));
// Generar KEY del API: http://code.google.com/intl/es/apis/maps/signup.html
// Para debug usar: GLog.write("xxx");

// Variables globales para el objeto Google map
var map = null;
var directions = null;
var idDiv = "";      // Identificador del div donde se quiera mostrar el mapa (importante que ese div tenga el width y el height asignados)
var latitud = "";    // Coordenada de Latitud del centro del mapa
var longitud = "";   // Coordenada de Longitud del centro del mapa
var zoom = "";       // Zoom del mapa
var buscador = "";   // true o false, para incluir un campo de buscador en el mapa
var barraZoomLarga = ""; // true o false, para indicar si la barra de zoom debe ser larga o no
var mapaPequeno = ""; // true o false, para indicar si se debe mostrar o no el mapa pequeño guía inferior del mapa grande

// Variables del evento seleccionar punto en el mapa
var seleccion = false; // true o false, si el evento está activado o no
var puntoUnico = true; 

// Datos del punto seleccionado en el mapa
var puntoSeleccionado =  {
		bocadillo: "",
		imagenIcono: "",
		imagenAncho: "",
		imagenAlto: "",
		inputLatitud1: "",
		inputLongitud: ""
} ;

// Arrays de almacenamiento de datos a dibujar en el Google Map
// Array contenedor de los puntos a pintar en el mapa
var arrayPuntos = [ {
	latitud: "",
	longitud: "",
	texto: "",
	bocadillo: "",
	imagenIcono: "",
	imagenAncho: "",
	imagenAlto: ""
} ] ;

// Array contenedor de las líneas a pintar en el mapa
var arrayLineas = [ {
	latitud1: "",
	longitud1: "",
	latitud2: "",
	longitud2: "",
	color: "",
	grosor: "",
	transparencia: ""
} ] ;

// Array contenedor de los polígonos a pintar en el mapa
var arrayPoligonos = [{
	listadoCoords: "",
	colorBorde: "",
	grosorBorde: "",
	transparenciaBorde: "",
	colorRelleno: "",
	transparenciaRelleno: ""
}];

// Array contenedor de las rutas indicadas mediante direcciones a pintar en el mapa
var arrayRutasDirecciones = [{
	idRuta: "", 
	desde: "",
	hasta: "",
	centrarRuta: ""
}];

// Array contenedor de las rutas indicadas mediante coordenadas a pintar en el mapa
var arrayRutasCoordenadas = [{
	idRuta: "",
	listadoCoords: "",
	centrarRuta: ""
}];

	
// Inicializar el Objeto Google Map
// Crea el mapa centrandolo en las coordenadas pasadas
// Cada vez que se haga un load de la página se recarga el mapa y en el unload un GUnload
// Parámetros de entrada:
//		idDiv = identificador del div donde se quiera mostrar el mapa (importante que ese div tenga el width y el height asignados)
//		latitud = Coordenada de Latitud
//		longitud = Coordenada de Longitud
//		zoom = Zoom del mapa
//		buscador = true o false, para incluir un campo de buscador en el mapa
//      barraZoomLarga = true o false, para indicar si la barra de zoom debe ser larga o no
//		mapaPequeno = true o false, para indicar si se debe mostrar o no el mapa pequeño guía inferior del mapa grande
// Ejemplo:
// 		inicializacion('map', '42.86005', '-2.67695', 15, false);
function inicializacion(idDiv1, latitud1, longitud1, zoom1, buscador1, barraZoomLarga1, mapaPequeno1){
	idDiv = idDiv1;
	latitud = latitud1;
	longitud = longitud1;
	zoom = zoom1;
	buscador = buscador1;
	if (barraZoomLarga1 == null) {
		barraZoomLarga = true;
	} else {	
		barraZoomLarga = barraZoomLarga1;
	}
	if (mapaPequeno1 == null) {
		mapaPequeno = true;
	} else {
		mapaPequeno = mapaPequeno1;	
	}
	
	// Creamos unos eventos para el load y el unload de la página
	// En el load se llama a la función load que crea el mapa con todos
	// sus puntos, líneas, poligonos, rutas, eventos... almacenados
	GEvent.addDomListener(window, "load", load);
	GEvent.addDomListener(window, "unload", GUnload); 	
}

// Configurar el Objeto Google Map
// Redefinir variables del mapa para centrarlo en las coordenadas pasadas
// Parámetros de entrada:
//		latitud = Coordenada de Latitud
//		longitud = Coordenada de Longitud
//		zoom = Zoom del mapa
//		buscador = true o false, para incluir un campo de buscador en el mapa
// Ejemplo:
// 		setCentrarMapa('42.86005', '-2.67695', 15, false);
function setCentrarMapa(latitud1, longitud1, zoom1, buscador1){
	latitud = latitud1;
	longitud = longitud1;
	zoom = zoom1;
	buscador = buscador1;
}

// Capturar datos del mapa en curso
// Tres funciones que devuelven la latitud, longitud del centro del mapa y el zoom
// Sin parámetros de entrada
// Ejemplo:
// 		alert(getLatitudActualMapa());
function getLatitudActualMapa(){
	var center = map.getCenter();	
	return center.lat();
}
function getLongitudActualMapa(){
	var center = map.getCenter();	
	return center.lng();
}
function getZoomActualMapa(){
	return map.getZoom();
}

// Función para añadir un punto en el mapa
// Parámetros de entrada:
//		latitud = Coordenada de Latitud del punto a añadir
//		longitud = Coordenada de Longitud del punto a añadir
//		texto = texto que aparece en el bocadillo que se muestra al pinchar en el punto,
//			    el texto puede recibir código HTML para poder añadir un div con imagen, etc.
//				si no se quiere que aparezca un bocadillo al pinchar en el punto pasar vacio = ""
//		bocadillo = pasar true o false, según si se quiere que aparezca el bocadillo visible desde el principio o no
//		imagenIcono = Se puede pasar una imagen para el icono del punto añadido, en caso de querer que aparezca
//					  la chincheta de google maps por defecto pasar vacio = ""
//		imagenAncho = Ancho de la imagen icono si se ha pasado imagen
//		imagenAlto = Alto de la imagen icono si se ha pasado imagen
// Ejemplo:
// 		addPunto('42.8555', '-2.67695', '<div style="float:left; padding-right:10px;"><img src="images/loc_logo.jpg"></div><p style="font-size:0.75em;><strong>SPIRAL</strong><br />C/ Barcelona, 18-20<br />01010 Vitoria-Gasteiz (&Aacute;lava), España</p>', false, 'images/gaden.jpg', '16', '16');
function addPunto(latitud1, longitud1, texto1, bocadillo1, imagenIcono1, imagenAncho1, imagenAlto1){
	arrayPuntos[arrayPuntos.length] = {
		latitud: latitud1,		
		longitud: longitud1,
		texto: texto1,
		bocadillo: bocadillo1,
		imagenIcono: imagenIcono1,
		imagenAncho: imagenAncho1,
		imagenAlto: imagenAlto1
	};
}

// Función para añadir una línea entre dos puntos
// No marca los puntos, unicamente pinta la línea
// Parámetros de entrada:
//		latitud1 = Coordenada de Latitud del primer punto
//		longitud1 = Coordenada de Longitud del primer punto
//		latitud2 = Coordenada de Latitud del primer punto
//		longitud2 = Coordenada de Longitud del primer punto
//		color = Color de la línea
//		grosor = Grosor de la línea
//		transparencia = Transparencia del color de la línea
// Ejemplo:
// 		addLinea('42.86005', '-2.67695', '42.8555', '-2.68095', "#0000dd", "4", "0.4");
function addLinea(latitud11, longitud11, latitud12, longitud12, color1, grosor1, transparencia1) {
	arrayLineas[arrayLineas.length] = {
		latitud1: latitud11,		
		longitud1: longitud11,
		latitud2: latitud12,
		longitud2: longitud12,
		color: color1,
		grosor: grosor1,
		transparencia: transparencia1
	};
}

// Función para dibujar un polígono con todos los puntos que se quiera
// Parámetros de entrada:
//		listadoCoords = Una cadena de texto con todos los puntos que lleve el polígono.
//						Las coordenadas de los puntos (Latitud1;Longitud1;Latitud2;Longitud2...) separadas por ;
//		colorBorde = Color de la línea del borde del polígono
//		grosorBorde = Grosor de la línea del borde del polígono
//		transparenciaBorde = Transparencia de la línea del borde del polígono
//		colorRelleno = Color de relleno del polígono
//		transparenciaRelleno = Transparencia del color de relleno
// Ejemplo:
// 		addPoligono('42.86315;-2.67695;42.86705;-2.67595;42.86405;-2.68195;42.86215;-2.68095', "#0000dd", "4", "0.4", "#996666", "0.4");
function addPoligono(listadoCoords1, colorBorde1, grosorBorde1, transparenciaBorde1, colorRelleno1, transparenciaRelleno1){
	arrayPoligonos[arrayPoligonos.length] = {
		listadoCoords: listadoCoords1,		
		colorBorde: colorBorde1,
		grosorBorde: grosorBorde1,
		transparenciaBorde: transparenciaBorde1,
		colorRelleno: colorRelleno1,
		transparenciaRelleno: transparenciaRelleno1
	};
}

// Función para calcular ruta desde dos puntos indicados por la dirección
// Parámetros de entrada:
//		idRuta = Identificador del div contenedor de las direcciones de la ruta, se puede dejar vacio = ""
//		desde = Dirección del punto desde el que sale la ruta
//		hasta = Dirección del punto hasta el que llega la ruta
//		centrarRuta = true o false, según si se quiere centrar el mapa a la ruta calculada
// Ejemplo:
// 		calcularRuta("direccionesRuta", "gorbeia, vitoria, españa", "portal de legutiano, vitoria, españa", true);
function rutaDirecciones(idRuta1, desde1, hasta1, centrarRuta1){
	arrayRutasDirecciones[arrayRutasDirecciones.length] = {
		idRuta: idRuta1,		
		desde: desde1,
		hasta: hasta1,
		centrarRuta: centrarRuta1
	};
}

// Función para calcular ruta desde dos puntos indicados por coordenadas
// Parámetros de entrada:
//		idRuta = Identificador del div contenedor de las direcciones de la ruta, se puede dejar vacio = ""
//		listadoCoords = Una cadena de texto con todos los puntos que lleve el polígono.
//						Las coordenadas de los puntos (Latitud1;Longitud1;Latitud2;Longitud2...) separadas por ;
//		centrarRuta = true o false, según si se quiere centrar el mapa a la ruta calculada
// Ejemplo:
// 		rutaCoordenadas("direccionesRuta", '42.86315;-2.67695;42.86705;-2.67595;42.86405;-2.68195;42.86215;-2.68095', true);
function rutaCoordenadas(idRuta1, listadoCoords1, centrarRuta1){
	arrayRutasCoordenadas[arrayRutasCoordenadas.length] = {
		idRuta: idRuta1,
		listadoCoords: listadoCoords1,
		centrarRuta: centrarRuta1
	};
}

// Función para añadir un listener que provoque este evento al hacer click sobre el mapa. De esta manera,
// al detectar click se añade un marcador en ese punto
// Parámetros de entrada:
//		puntoUnico = Si es true cada vez que haga click en el mapa el anterior punto marcado desaparecerá,
//					 quedando unicamente un punto seleccionado en cada momento. Si es false se podrán marcar
//					 todos los puntos que se quiera
//		bocadillo = pasar true o false, según si se quiere que aparezca el bocadillo visible desde el principio o no,
//					en el bocadillo aparecerán los valores de latitud y longitud del punto seleccionado
//		imagenIcono = Se puede pasar una imagen para el icono del punto añadido, en caso de querer que aparezca
//					  la chincheta de google maps por defecto pasar vacio = ""
//		imagenAncho = Ancho de la imagen icono si se ha pasado imagen
//		imagenAlto = Alto de la imagen icono si se ha pasado imagen
//		inputLatitud = Nombre del campo que recoge la latitud del punto seleccionado
//		inputLongitud = Nombre del campo que recoge la longitud del punto seleccionado
// OBSERVACIONES: Las acciones que se quieran realizar cuando el usuario haga click en el mapa se deben programar
//				  en la función "accionPuntoSeleleccionado" la cual recibe como parámetros de entrada la latitud
//				  y longitud
// Ejemplo:
// 		seleccionarPunto(true, 'images/gaden.jpg', '16', '16');
function seleccionarPunto(puntoUnico1, bocadillo1, imagenIcono1, imagenAncho1, imagenAlto1, inputLatitud1, inputLongitud1){
	seleccion = true;
	puntoUnico = puntoUnico1;
	puntoSeleccionado = {
		bocadillo: bocadillo1,
		imagenIcono: imagenIcono1,
		imagenAncho: imagenAncho1,
		imagenAlto: imagenAlto1,
		inputLatitud: inputLatitud1,
		inputLongitud: inputLongitud1
	};
}


// Esta función es llamada por la función "seleccionarPunto" cada vez que se hace un click sobre el mapa.
// El objetivo de esta función es poder personalizarla en cada proyecto con las acciones que se necesiten 
// realizar al hacer click en el mapa
// Parámetros de entrada:
//		latitud = Coordenada de Latitud del punto seleccionado
//		longitud = Coordenada de Longitud del punto seleccionado
function accionPuntoSeleleccionado(latitud, longitud, inputLatitud, inputLongitud){
    capa1 = document.getElementById(inputLatitud);
	capa1.value = latitud;
    capa2 = document.getElementById(inputLongitud);
	capa2.value = longitud;	
}

// Funciones para actuar con el Google Map
// Se pinta el mapa según los datos almacenados en las variables globales
function load(){
	//comprobamos si el navegador es compatible con los mapas de google
	if (GBrowserIsCompatible()) {
		
		// Instanciamos un mapa con GMap2, pasándole una referencia a la capa o <div> donde queremos mostrar el mapa
		map = new GMap2(document.getElementById(idDiv),{googleBarOptions:
			{onMarkersSetCallback:onMarkersSetCallback,	showOnLoad:true}
		})
		
		// Configuramos el mapa
		//centramos el mapa en una latitud y longitud deseadas
		map.setCenter(new GLatLng(latitud, longitud), zoom);
		//añadimos controles al mapa, para interacción con el usuario
		if (barraZoomLarga){
			map.addControl(new GLargeMapControl()); 
		} else {
			map.addControl(new GSmallMapControl());
		}
		map.addControl(new GMapTypeControl());
		
		// En caso de true se añade el mapa pequeño guía
		if (mapaPequeno){		
			map.addControl(new GOverviewMapControl());
		}
		
		// En caso de true se añade el buscador
		if (buscador){
			map.enableGoogleBar();
		}
		
		// Si hay puntos almacenados los pintamos
		if (arrayPuntos.length != null){

			for (var i = 1; i < arrayPuntos.length; i++) {		
				if (arrayPuntos[i].imagenIcono == "") {
					// Con chincheta común
					var icon = "";
					var point = new GLatLng(arrayPuntos[i].latitud, arrayPuntos[i].longitud);
				} else {		
					// Con icono personalizado
					var icon = new GIcon();
					icon.image = arrayPuntos[i].imagenIcono;
					icon.iconSize = new GSize(arrayPuntos[i].imagenAncho, arrayPuntos[i].imagenAlto);
					icon.iconAnchor = new GPoint(arrayPuntos[i].imagenAncho / 2, arrayPuntos[i].imagenAlto);
					icon.infoWindowAnchor = new GPoint(arrayPuntos[i].imagenAncho / 2, 0);
					var point = new GLatLng(arrayPuntos[i].latitud, arrayPuntos[i].longitud);		
				}
				marker = crearMarker(point, arrayPuntos[i].texto, icon, arrayPuntos[i].bocadillo);
				map.addOverlay(marker);				
				if (arrayPuntos[i].bocadillo) {
					marker.openInfoWindowHtml(arrayPuntos[i].texto);
				}				
			}
		}
	
		// Si hay líneas almacenadas las pintamos
		if (arrayLineas.length != null){
			for (var i = 1; i < arrayLineas.length; i++) {
				var puntoLinea1 = new GLatLng(arrayLineas[i].latitud1, arrayLineas[i].longitud1);
				var puntoLinea2 = new GLatLng(arrayLineas[i].latitud2, arrayLineas[i].longitud2);
				var polyline = new GPolyline([puntoLinea1, puntoLinea2], arrayLineas[i].color, arrayLineas[i].grosor, arrayLineas[i].transparencia);
				map.addOverlay(polyline);
			}
		}
		
		// Si hay polígonos almacenados los pintamos
		if (arrayPoligonos.length != null){
			for (var j = 1; j < arrayPoligonos.length; j++) {		
				arrayCoords = arrayPoligonos[j].listadoCoords.split (";");
				var listaPuntos = [];
				var latitudPoligono1 = arrayCoords[0];
				var longitudPoligono1 = arrayCoords[1];
				var puntoPoligono1 = new GLatLng(latitudPoligono1, longitudPoligono1);
				listaPuntos.push(puntoPoligono1);	
				for (var i = 2; i < arrayCoords.length; i = i + 2) {
					var latitudPoligono  = arrayCoords[i];
					var longitudPoligono  = arrayCoords[i + 1];
					var puntoPoligono = new GLatLng(latitudPoligono, longitudPoligono);
					listaPuntos.push(puntoPoligono);
				}
				listaPuntos.push(puntoPoligono1);
				
				var polygon = new GPolygon(listaPuntos, arrayPoligonos[j].colorBorde, arrayPoligonos[j].grosorBorde, arrayPoligonos[j].transparenciaBorde, arrayPoligonos[j].colorRelleno, arrayPoligonos[j].transparenciaRelleno);
				map.addOverlay(polygon);		
			}
		}
		
		// Si hay rutas por dirección almacenadas las pintamos
		if (arrayRutasDirecciones.length != null){
			for (var i = 1; i < arrayRutasDirecciones.length; i++) {
				directionsPanel = document.getElementById(arrayRutasDirecciones[i].idRuta);
				directions = new GDirections(map, directionsPanel);
				GEvent.addListener(directions, "error", function onDirectionsError() {
					if (directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
						document.getElementById(arrayRutasDirecciones[1].idRuta).innerHTML = "No se ha podido localizar la dirección indicada, compruebe que esté correctamente escrita y no sea ambigua";
					else if (directions.getStatus().code == G_GEO_SERVER_ERROR)
						document.getElementById(arrayRutasDirecciones[1].idRuta).innerHTML = "No se ha podido procesar con éxito el cálculo de la ruta.";
					else if (directions.getStatus().code == G_GEO_MISSING_QUERY)
						document.getElementById(arrayRutasDirecciones[1].idRuta).innerHTML = "La dirección de origen o de destino indicada no es válida.";
					else if (directions.getStatus().code == G_GEO_BAD_KEY)
						document.getElementById(arrayRutasDirecciones[1].idRuta).innerHTML = "La clave usada por el mapa no es válida o no corresponde con el dominio desde el que se esta utilizando.";
					else if (directions.getStatus().code == G_GEO_BAD_REQUEST)
						document.getElementById(arrayRutasDirecciones[1].idRuta).innerHTML = "La dirección de origen indicada no ha podido ser análizada sintácticamente.";
					else 
						document.getElementById(directarrayRutasDirecciones[1].idRutaionsPanel).innerHTML = "Ha ocurrido un error inesperado.";
				});
				directions.load("from: " + arrayRutasDirecciones[i].desde + " to: " + arrayRutasDirecciones[i].hasta, {preserveViewport:!arrayRutasDirecciones[i].centrarRuta} );
			}
		}
		
		// Si hay rutas por coordenadas almacenadas las pitamos
		if (arrayRutasCoordenadas.length != null){
			for (var j = 1; j < arrayRutasCoordenadas.length; j++) {		
				arrayRutasCoords = arrayRutasCoordenadas[j].listadoCoords.split (";");
				var arrayRutasPuntos = [];
				for (var i = 0; i < arrayRutasCoords.length; i = i + 2) {
					var latitudRutas  = arrayRutasCoords[i];
					var longitudRutas  = arrayRutasCoords[i + 1];
					var puntoRutas = new GLatLng(latitudRutas, longitudRutas);
					arrayRutasPuntos.push(puntoRutas);
				}

				directionsPanelCoordenadas = document.getElementById(arrayRutasCoordenadas[j].idRuta);
				directionsCoordenadas = new GDirections(map, directionsPanelCoordenadas);
				directionsCoordenadas.loadFromWaypoints(arrayRutasPuntos, {preserveViewport:!arrayRutasCoordenadas[j].centrarRuta} );			
			}
		}
		// En caso solicitarlo se añade el evento listener de click en el mapa
		// para poder marcar el punto seleccionado
		if (seleccion){
			GEvent.addListener(map, "click", function(overlay, latlng) {
				if (puntoUnico) {
					arrayPuntos.length = 1;
					map.clearOverlays();
				}
        		var center = map.getCenter();
        		latitud = center.lat();
				longitud = center.lng();
				zoom = map.getZoom();
				if (overlay) {
					map.removeOverlay(overlay);
				} else {
					if (puntoSeleccionado.bocadillo) {
						addPunto(latlng.lat(), latlng.lng(), "Latitud: " + latlng.lat() + "<br />Longitud: " + latlng.lng(), true, puntoSeleccionado.imagenIcono, puntoSeleccionado.imagenAncho, puntoSeleccionado.imagenAlto);
					} else {
						addPunto(latlng.lat(), latlng.lng(), "", false, puntoSeleccionado.imagenIcono, puntoSeleccionado.imagenAncho, puntoSeleccionado.imagenAlto);
					}
					accionPuntoSeleleccionado(latlng.lat(), latlng.lng(), puntoSeleccionado.inputLatitud, puntoSeleccionado.inputLongitud);
				}
				load();
			});
		}
	}
}

// Función que crea una marca para un punto, se llama  por cada punto
// a puntar. Se le puede llamar desde la función load
function crearMarker(point, texto, icono, bocadillo) {
	if (icono == ""){
	    	var marker = new GMarker(point);
	} else {
		var marker = new GMarker(point, icono);
	}

	if (texto != "") {
		GEvent.addListener(marker, "click", function() { 
			marker.openInfoWindowHtml(texto); 
		});
	}			
	return marker;
}	

// Función para resetar el mapa, se borran todos los puntos añadidos
// Se le puede llamar desde la función load
function resetear(){
	map.clearOverlays();
}

// Función del google maps que es llamada cuando se utiliza el buscador, lo que está
// programado es no añadir un marcador en la búsqueda realizada
function onMarkersSetCallback(search) {
	map.clearOverlays();
}

