/*Script para Google Maps en la disponibilidad de hoteles*/

// Icono para los marcadores
var icono = '';

// Intervalos de precios.
var intervalos = 4;
var precio_medio = 0;
var precio_aux = 0;
var precio_min = 0;
var precio_max = 0;

var inicio = true;
var globos = '';
var div_mapa = '';
var tipo = '';
var latitud_center = null;
var longitud_center = null;
var filtro_precios = {"grupo_1": [], "grupo_2": [], "grupo_3": [], "grupo_4": [], "grupo_5": []};

// Rutas donde encontrar las páginas e imagenes.
var ruta_img_gmaps = '';
var ruta_hoteles = '';
var ruta_scripts = '';

function init_rutas(ruta, nacional, googlemaps, lat, lng) {
	ruta_img_gmaps = 'http://' + ruta + '/sites/all/images';
	ruta_hoteles = 'http://' + ruta + '/sites/all/hoteles';
	ruta_scripts = 'http://' + ruta + '/sites/all/scripts';
	
	latitud_center = lat;
	longitud_center = lng;
	
	initMapa(nacional, googlemaps);
}

// Inicializa el precio mínimo y el máximo.
function init_precios_mapa(minimo, maximo) {
	if ((minimo > 0) && (maximo > 0)) {
		precio_medio = ((maximo - minimo) / intervalos);
		
		precio_medio = Math.floor(precio_medio);
		precio_min = Math.floor(minimo) + precio_medio;
		precio_max = Math.floor(maximo) - precio_medio;
		
		precio_medio = Math.floor((precio_max - precio_min) / (intervalos - 1));
	} else {
		precio_medio = (375 / intervalos);
	}
}

// Inicialización del mapa y su carga.
function initMapa(nacional, googlemaps) {
	// Se muestra el botón si el destino es nacional y la opción de Google Maps está activa.
	if ((nacional == 'OK') && (googlemaps == 'S')) {
		$(document).unload("GUnload");
		$("#bt_mapa").show();
		// Asignamos el evento para el primer click
		$("#bt_mapa a").one("click", carga_mapa);
	}else{
		$("#bt_mapa").remove();
		$("#maps").remove();
	}
}

// Crea los globos de texto y llama a la carga de datos.
function carga_mapa() {
	// Si es la primera vez que se lanza la función se carga el script de google.
	// Si no es la primera vez que se lanza, se ejecuta todo el proceso del mapa.
	if (inicio) {
		// Cargamos los scripts necesarios.
		var script = document.createElement("script");
		script.type = 'text/javascript';
		script.charset = 'utf-8';
		script.src = 'http://www.google.com/jsapi?key=' + key + '&callback=carga_gmaps';
		document.getElementsByTagName("head")[0].appendChild(script);
	} else {
		var id_destino = $("#mapa_destino").val();
		$("#bt_mapa a").toggle(function(){
			ocultaMapa();
		},function(){
			muestraMapa();
		});
	
		var url = ruta_hoteles + "/googleMaps.jsp?destino=" + id_destino;
		ajax (url, {onComplete: cargaDatos});
	}
	return false;
}

// Carga los js de Google Maps
function carga_gmaps() {
	$("#bt_mapa a").html("Cargando mapa...").append("<img src='" + ruta_img_gmaps + "/loader_circular_mini.gif' alt='Cargando...'/>");
	google.load("maps", "2", {"callback" : carga_script});
}

// Carga el js para los marcadores numerados.
function carga_script() {
	var script2 = document.createElement('script');
	script2.type = 'text/javascript';
	script2.src = ruta_scripts + '/labeledmarker.js';
	document.getElementsByTagName("head")[0].appendChild(script2);
	
	// Cuando el segundo escript se carga completamente se procede a llamar por segunda vez a la carga del mapa.
	// Para IE.
	script2.onreadystatechange = function () {
		if (script2.readyState == 'loaded') {
			inicio = false;
			carga_mapa();
		}
	}
	
	// Para Firefox.
	script2.onload = function () {
		inicio = false;
		carga_mapa();
	}
}

// Hace visible el mapa.
function muestraMapa() {
	$("#maps").show();
	$("#bt_mapa a").html("Ocultar mapa").removeClass("selected");
	$("#bt_mapa img").remove();
}

// Oculta el mapa.
function ocultaMapa() {
	$("#maps").hide();
	$("#bt_mapa a").html("Mostrar mapa").addClass("selected");
	$("#bt_mapa img").remove();
}

// Llama a la cración del mapa.
function cargaDatos(request) {
	if (!cargado) {
		globos = request.responseText;
		muestraMapa();
		gMap(globos);
		cargado = true;
	}	
}

// Genera el mapa y posiciona los marcadores.
function gMap(globos) {
	// Comprueba si el navegador es compatible.
	if (google.maps.BrowserIsCompatible()) {		
		//Definimos los limites de España.
		var suroeste = new google.maps.LatLng(27.594718, -18.27301);
		var noreste = new google.maps.LatLng(43.945372, 4.817505);
		var limites_espana = new google.maps.LatLngBounds(suroeste, noreste);
		
		// Creamos el mapa en el div elegido.
		map = new google.maps.Map2(document.getElementById("map_canvas"));
		
		// Centramos el mapa según las coordenadas.
		zoom = map.getBoundsZoomLevel(limites_espana);
		var lat = (limites_espana.getNorthEast().lat() + limites_espana.getSouthWest().lat())/2;
		var lng = (limites_espana.getNorthEast().lng() + limites_espana.getSouthWest().lng())/2;
		map.setCenter(new google.maps.LatLng(lat,lng), zoom);
		
		// Definimos el tipo de mapa inicial
		map.setMapType(G_NORMAL_MAP);
		
		// Añadimos los controles de zoom y tipo de mapa.
		map.addControl(new google.maps.LargeMapControl());
		map.addControl(new google.maps.MapTypeControl());
		
		// Activamos los modos de zoom
		map.enableDoubleClickZoom();
		map.enableContinuousZoom();

		// Creamos un icono personalizado.
		icono = new google.maps.Icon();
		icono.image = ruta_img_gmaps + '/ico_maps_hot1.png';
		icono.shadow = ruta_img_gmaps + '/shadow_map.png';
		icono.iconSize = new google.maps.Size(27, 43);
		icono.shadowSize = new google.maps.Size(44, 43);
		icono.iconAnchor = new google.maps.Point(12, 40);
		icono.infoWindowAnchor = new google.maps.Point(11, 10);
		
		geocoder = new google.maps.ClientGeocoder();
		bounds = new google.maps.LatLngBounds();
		
		// Comprobamos que no haya ocurrido ningún error con los globos.
		if (globos.indexOf('ERROR') == -1) {
			// Guardamos la información por separado.
			var info = globos.split('#');

			var n = 0;
			var id = '';
			var idx = '';
			var globo = '';
			var precio = 0;
			var latitud = '';
			var posicion = 0;
			var longitud = '';
			var direccion = '';
			
			var limites = new google.maps.LatLngBounds();
			
			var km = 130;
			if (((latitud_center == null) || (latitud_center == '')) && ((longitud_center == null) || (longitud_center == ''))) {
				km = 2000;
			}
			
			var km_grado_lat = 69.047 * 1.609344;
			var km_grado_lng = 53 * 1.609344;
			var distancia_lat = parseFloat(km/km_grado_lat);
			var distancia_lng = parseFloat(km/km_grado_lng);
			
			// Limites de dibujo de puntos.
			if (((latitud_center != null) && (latitud_center != '')) && ((longitud_center != null) && (longitud_center != ''))) {
				lat_lat = parseFloat(latitud_center) - parseFloat(distancia_lat);
				lng_lat = parseFloat(longitud_center) - parseFloat(distancia_lng);
				lat_lng = parseFloat(latitud_center) + parseFloat(distancia_lat);
				lng_lng = parseFloat(longitud_center) + parseFloat(distancia_lng);
				punto_lat = new google.maps.LatLng(parseFloat(lat_lat), parseFloat(lng_lat));
				punto_lng = new google.maps.LatLng(parseFloat(lat_lng), parseFloat(lng_lng));
				
				// Definimos los limites.
				limites.extend(punto_lat);
				limites.extend(punto_lng);
			} else {
				limites = limites_espana;
			}
			
			// Creamos los marcadores mientras tengamos información.
			while ((info[n] != null) && (info[n] != '') && (n < (info.length-1))) {
				id = info[n];
				posicion = info[++n];
				precio = info[++n];
				latitud = info[++n];
				longitud = info[++n];
				direccion = info[++n];
				globo = info[++n];
				idx = '<span class="identificador">' + posicion + '</span>';
				
				precio_aux = Math.floor(precio / precio_medio);
				
				if (precio_aux > intervalos) {
					icono.image = ruta_img_gmaps + '/ico_maps_hot5.png';
					tipo = 'grupo_5';
				} else if (precio_aux < 1) {
					icono.image = ruta_img_gmaps + '/ico_maps_hot1.png';
					tipo = 'grupo_1';
				} else {
					icono.image = ruta_img_gmaps + '/ico_maps_hot'+precio_aux+'.png';
					tipo = 'grupo_' + precio_aux;
				}

				if (((latitud != '0.0') && (latitud != null)) && ((longitud != '0.0') && (longitud != null))) {
					point = new google.maps.LatLng(parseFloat(latitud),parseFloat(longitud));
					if (limites.containsLatLng(point)) {
						map.addOverlay(crea_marcador(point, globo, idx, tipo));
						bounds.extend(point);
					}
				} else if (direccion != '') {
					geocoder.getLatLng(direccion, function(point){
						if (point && (limites.containsLatLng(point))) {
							map.addOverlay(crea_marcador(point, globo, idx, tipo));
							bounds.extend(point);
						}
					});
				}

				n++
			}

			map.setZoom(map.getBoundsZoomLevel(bounds));
			lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat())/2;
			lng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng())/2;
			map.setCenter(new google.maps.LatLng(lat,lng));
			
			div_mapa = document.getElementById('map_canvas');
			var div = document.createElement('div');
			div.className = 'boxleyenda';
			var leyenda = '<ul class="listaintervalos">';
			for (var i = 0; i < (intervalos + 1); i++) {
				if (i == 0) {
					leyenda += '<li>';
					leyenda += '<span class="leyenda interval'+(i+1)+'">';
					leyenda += '<label for="grupo_'+(i+1)+'">';
					leyenda += '<input type="checkbox" id="grupo_'+(i+1)+'" onclick="filtrado(\'grupo_'+(i+1)+'\')" checked="checked" /> &lt;';
					leyenda += precio_min + ' &euro;';
					leyenda += '</label>';
					leyenda += '</span>';
					leyenda += '</li>';
				} else if (i == intervalos) {
					leyenda += '<li>';
					leyenda += '<span class="leyenda interval'+(i+1)+'">';
					leyenda += '<label for="grupo_'+(i+1)+'">';
					leyenda += '<input type="checkbox" id="grupo_'+(i+1)+'" onclick="filtrado(\'grupo_'+(i+1)+'\')" checked="checked" /> +';
					leyenda += Math.floor(precio_min + (precio_medio * (intervalos - 1))) + ' &euro;';
					leyenda += '</label>';
					leyenda += '</span>';
					leyenda += '</li>';
				} else {
					leyenda += '<li>';
					leyenda += '<span class="leyenda interval'+(i+1)+'">';
					leyenda += '<label for="grupo_'+(i+1)+'">';
					leyenda += '<input type="checkbox" id="grupo_'+(i+1)+'" onclick="filtrado(\'grupo_'+(i+1)+'\')" checked="checked" /> ';
					leyenda += Math.floor(precio_min + (precio_medio * (i - 1))) + '-' + Math.floor(precio_min + (precio_medio * i)) + ' &euro;';
					leyenda += '</label>';
					leyenda += '</span>';
					leyenda += '</li>';
				}
			}
			leyenda += '</ul>';
			
			div.innerHTML = leyenda;
			div_mapa.appendChild(div);
			
			$("#map_canvas").unblock();

		} else {
			localizacion($("#mapa_destino_txt").val());
		}

		if ((idAux != null) && (idAux != '')) {
			cargado = true;
			mostrar_mapa(idAux);
		}
	}
}

// Crea el marcador.
function crea_marcador(punto, globo, id, tipo) {
	// Opciones para los marcadores del mapa.
	var opciones = {
		"icon": icono,
		"labelText": id,
		"labelOffset": new google.maps.Size(-11, -25)
	};
	
	var marker = new LabeledMarker(punto, opciones);
	filtro_precios[tipo].push(marker);
	google.maps.Event.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(globo);
	});
	return marker;
}

// Función de búsqueda por dirección.
function localizacion(destino) {
	var ZOOM_DEFECTO = 16;
	var direccion = '';
	if (destino == 'BUSQ') {
		direccion = $("#direccion").val();
	} else {
		direccion = destino;
	}
	
	if (direccion != '') {
		if (geocoder) {
			geocoder.getLatLng(direccion, function(point) {
				if (!point) {
					mostrarVelo("localizador");
				} else {
					var marker = new google.maps.Marker(point);
					map.setCenter(point, ZOOM_DEFECTO);
					map.addOverlay(marker);
				}
			});
		}
	}
}

// Señala en el mapa un hotel seleccionado.
function mostrar_mapa(id) {
	var ZOOM_DEFECTO = 16;
	// Llevamos la página arriba del todo.
	scroll(0,0);
	
	if (!cargado) {
		idAux = id;
		carga_mapa();
	} else {
		muestraMapa();
		
		var pos = globos.indexOf(id+'#');
		
		if (pos != -1) {
			var datos = globos.substring(pos);
			var info = datos.split('#');

			var cod = info[0];
			var posicion = info[1];
			var precio = info[2];
			var latitud = info[3];
			var	longitud = info[4];
			var	direccion = info[5];

			if (((latitud != '0.0') && (latitud != null)) && ((longitud != '0.0') && (longitud != null))) {
				map.setCenter(new google.maps.LatLng(parseFloat(latitud),parseFloat(longitud)), ZOOM_DEFECTO);
			} else if (direccion != '') {
				geocoder.getLatLng(direccion, function(point){
					if (point) {
						map.setCenter(point, ZOOM_DEFECTO);
					}
				});
			} else {
				mostrarVelo();
			}
		} else {
			mostrarVelo();
		}
	}
}

// Muestra un velo con información.
function mostrarVelo(tipo) {
	var msg = "Lo sentimos. Actualmente no disponemos de la localización de este hotel.";
	var msg_localizador = "Lo sentimos. No podemos identificar la dirección introducida. Por favor, especifique tipo de vía, calle, número y código postal.";

	if (tipo=="localizador") {
		msg = msg_localizador;
	}

	$("#map_canvas").unblock();
	$("#map_canvas").block('<h4 style="color:#6695FF"><img src="'+ruta_img_gmaps+'/ico_error.gif" alt="No se encuentra el hotel">'+msg+'</h4><h6 style="color:#6695FF">Introduzca manualmente la direcci?n y pulse Buscar Direcci?n</h6>');
	setTimeout("ocultarVelo()",4000);
}

// Oculta el velo con información.
function ocultarVelo(){
	$("#map_canvas").unblock();
}

// Función que filtra los resultados.
function filtrado(tipo) {
	for (var i = 0; i < filtro_precios[tipo].length; i++) {
		var marker = filtro_precios[tipo][i];
		if (marker.isHidden()) {
			marker.show();
		} else {
			marker.hide();
		}
	} 
}

// Recupera la ruta de carga para el JSP de GoogleMaps
function getRootURL() {		    		  
	var direccion = location.href;
	var posicion = direccion.indexOf("?");
	var anterior = 0;
	direccion = direccion.substring(0,posicion);
	posicion = 0;
	while (posicion!=-1) {
		anterior = ++posicion;
		posicion = direccion.indexOf("/",posicion);						    
	}			
	direccion = direccion.substring(0,anterior);
	return direccion;			
}

// Muestra un mapa genérico.
function mostrar_mapa_generico(datos) {
	var ZOOM_DEFECTO = 16;
	// Llevamos la página arriba del todo.
	scroll(0,0);
	
	// Opciones para los marcadores del mapa.
	var opciones = {
		"icon": icono,
		"labelText": "",
		"labelOffset": new google.maps.Size(-12, -49)
	};

	if (!cargado) {
		carga_mapa();
	} else {
		muestraMapa();
		
		var info = datos.split('#');
		var cod = info[0];
		var posicion = info[1];
		var precio = info[2];
		var latitud = info[3];
		var	longitud = info[4];
		var	direccion = info[5];
		
		point = new google.maps.LatLng(parseFloat(longitud),parseFloat(latitud));
		var marker = new LabeledMarker(point, opciones);
		if (((latitud != '0.0') && (latitud != null)) && ((longitud != '0.0') && (longitud != null))) {
			map.setCenter(new google.maps.LatLng(parseFloat(longitud),parseFloat(latitud)),ZOOM_DEFECTO);
			map.addOverlay(marker);
		} else if (direccion != '') {
			geocoder.getLatLng(direccion, function(point) { if (point) { map.setCenter(point, ZOOM_DEFECTO); } } );
		} else {
			mostrarVelo();
		}
	}
}

// Recarga el mapa al cambiar la ordenación.
function refresca_mapa() {
	cargado = false;
	carga_mapa();
	$('#map_canvas').block('<h3 style="font-family:Arial,Helvetica,sans-serif;color:#6695ff">Actualizando resultados...</h3><img src="' + ruta_img_gmaps + '/loader_barra.gif" alt="Actualizando"/>', { border: '3px solid #6695ff' });
}
