
// --------------------------------------------------------------------
// INICIALIZACIÓN

var mapa; // Instancia del mapa
var mapa_geocoder; // Almacenará el objeto de georeferenciación
var mapa_iconos; // Almacenará los objetos de iconos del mapa
var mapa_busqueda; // Almacenará el objeto de búsqueda
var mapa_busqueda_punto; // Almacenará las coordenadas (punto) de la busqueda
var mapa_oficina_activa; // Almacena la oficina activa
var mapa_oficinas = new Array(); // Almacena el listado de oficinas
var mapa_ruta; // Almacenará el objeto de la ruta del mapa
var mapa_ruta_visible = false; // Indica si se está mostrando una ruta
var mapa_ico_posicion; // Icono de posición
var oficina_activar = ""; // Flag de activación de oficina
var busqueda_sabados = false; // Flag para la búsqueda de oficinas de sábados

// Inicialización del mapa
function mapaInicializar() {
	// Comprobamos si el navegador es compatible con Google Maps
	if (GBrowserIsCompatible()) {
		debugMsg("mapaInicializar() -> Iniciando...");
		// Iniciamos el mapa
		mapa = new GMap2(document.getElementById("mapa_lienzo"));
		// Configuración del mapa
		mapa.enableScrollWheelZoom();
		mapa.addControl(new GLargeMapControl3D());
		mapa.addControl(new GMenuMapTypeControl());
		mapa.addControl(new GOverviewMapControl());
		mapa.setCenter(new GLatLng(mapa_ini_lat, mapa_ini_lng), mapa_ini_zoom);
		// Definición de iconos
		mapa_iconos = new Array();
		// Icono de posición
		mapa_iconos["posicion"] = new GIcon();
		mapa_iconos["posicion"].image = "img/ico-posicion.png";
		mapa_iconos["posicion"].shadow = "img/ico-posicion-sombra.png";
		mapa_iconos["posicion"].iconSize = new GSize(35, 35);
		mapa_iconos["posicion"].shadowSize = new GSize(51, 40);
		mapa_iconos["posicion"].iconAnchor = new GPoint(16, 35);
		mapa_iconos["posicion"].infoWindowAnchor = new GPoint(16, 4);
		mapa_iconos["posicion"].printImage = "img/ico-posicion.gif";
		mapa_iconos["posicion"].mozPrintImage = "img/ico-posicion.gif";
		mapa_iconos["posicion"].printShadow = "img/ico-posicion-sombra.gif";
		// Oficinas de particulares
		mapa_iconos["particulares"] = new Array();
		mapa_iconos["particulares"][0] = new GIcon();
		mapa_iconos["particulares"][0].image = "img/ico-particulares-vacio.png";
		mapa_iconos["particulares"][0].shadow = "img/ico-particulares-sombra.png";
		mapa_iconos["particulares"][0].iconSize = new GSize(32, 54);
		mapa_iconos["particulares"][0].shadowSize = new GSize(56, 54);
		mapa_iconos["particulares"][0].iconAnchor = new GPoint(16, 54);
		mapa_iconos["particulares"][0].infoWindowAnchor = new GPoint(16, 4);
		mapa_iconos["particulares"][0].printImage = "img/ico-particulares-vacio.gif";
		mapa_iconos["particulares"][0].mozPrintImage = "img/ico-particulares-vacio.gif";
		mapa_iconos["particulares"][0].printShadow = "img/ico-particulares-sombra.gif";
		for (var i=1; i<=20; i++) {
			mapa_iconos["particulares"][i] = new GIcon(mapa_iconos["particulares"][0]);
			mapa_iconos["particulares"][i].image = "img/ico-particulares-" + i + ".png";
			mapa_iconos["particulares"][i].printImage = "img/ico-particulares-" + i + ".gif";
			mapa_iconos["particulares"][i].mozPrintImage = "img/ico-particulares-" + i + ".gif";
		}
		// Oficinas de empresas
		mapa_iconos["empresas"] = new Array();
		mapa_iconos["empresas"][0] = new GIcon();
		mapa_iconos["empresas"][0].image = "img/ico-empresas-vacio.png";
		mapa_iconos["empresas"][0].shadow = "img/ico-empresas-sombra.png";
		mapa_iconos["empresas"][0].iconSize = new GSize(32, 54);
		mapa_iconos["empresas"][0].shadowSize = new GSize(56, 54);
		mapa_iconos["empresas"][0].iconAnchor = new GPoint(16, 54);
		mapa_iconos["empresas"][0].infoWindowAnchor = new GPoint(16, 4);
		mapa_iconos["empresas"][0].printImage = "img/ico-empresas-vacio.gif";
		mapa_iconos["empresas"][0].mozPrintImage = "img/ico-empresas-vacio.gif";
		mapa_iconos["empresas"][0].printShadow = "img/ico-empresas-sombra.gif";
		for (var i=1; i<=20; i++) {
			mapa_iconos["empresas"][i] = new GIcon(mapa_iconos["empresas"][0]);
			mapa_iconos["empresas"][i].image = "img/ico-empresas-" + i + ".png";
			mapa_iconos["empresas"][i].printImage = "img/ico-empresas-" + i + ".gif";
			mapa_iconos["empresas"][i].mozPrintImage = "img/ico-empresas-" + i + ".gif";
		}
		// Cajeros
		mapa_iconos["cajeros"] = new Array();
		mapa_iconos["cajeros"][0] = new GIcon();
		mapa_iconos["cajeros"][0].image = "img/ico-cajeros-vacio.png";
		mapa_iconos["cajeros"][0].shadow = "img/ico-cajeros-sombra.png";
		mapa_iconos["cajeros"][0].iconSize = new GSize(32, 54);
		mapa_iconos["cajeros"][0].shadowSize = new GSize(56, 54);
		mapa_iconos["cajeros"][0].iconAnchor = new GPoint(16, 54);
		mapa_iconos["cajeros"][0].infoWindowAnchor = new GPoint(16, 4);
		mapa_iconos["cajeros"][0].printImage = "img/ico-cajeros-vacio.gif";
		mapa_iconos["cajeros"][0].mozPrintImage = "img/ico-cajeros-vacio.gif";
		mapa_iconos["cajeros"][0].printShadow = "img/ico-cajeros-sombra.gif";
		for (var i=1; i<=20; i++) {
			mapa_iconos["cajeros"][i] = new GIcon(mapa_iconos["cajeros"][0]);
			mapa_iconos["cajeros"][i].image = "img/ico-cajeros-" + i + ".png";
			mapa_iconos["cajeros"][i].printImage = "img/ico-cajeros-" + i + ".gif";
			mapa_iconos["cajeros"][i].mozPrintImage = "img/ico-cajeros-" + i + ".gif";
		}
		// Agentes financieros
		mapa_iconos["agentes"] = new Array();
		mapa_iconos["agentes"][0] = new GIcon();
		mapa_iconos["agentes"][0].image = "img/ico-agentes-vacio.png";
		mapa_iconos["agentes"][0].shadow = "img/ico-agentes-sombra.png";
		mapa_iconos["agentes"][0].iconSize = new GSize(32, 54);
		mapa_iconos["agentes"][0].shadowSize = new GSize(56, 54);
		mapa_iconos["agentes"][0].iconAnchor = new GPoint(16, 54);
		mapa_iconos["agentes"][0].infoWindowAnchor = new GPoint(16, 4);
		mapa_iconos["agentes"][0].printImage = "img/ico-agentes-vacio.gif";
		mapa_iconos["agentes"][0].mozPrintImage = "img/ico-agentes-vacio.gif";
		mapa_iconos["agentes"][0].printShadow = "img/ico-agentes-sombra.gif";
		for (var i=1; i<=20; i++) {
			mapa_iconos["agentes"][i] = new GIcon(mapa_iconos["agentes"][0]);
			mapa_iconos["agentes"][i].image = "img/ico-agentes-" + i + ".png";
			mapa_iconos["agentes"][i].printImage = "img/ico-agentes-" + i + ".gif";
			mapa_iconos["agentes"][i].mozPrintImage = "img/ico-agentes-" + i + ".gif";
		}
		// Instanciamos el geocoder
		mapa_geocoder = new GClientGeocoder();
		// Eventos de control
		GEvent.addListener(mapa, "moveend", mapaOficinasBuscar);
		// Comprobamos la búsqueda por código de oficina
		if (mapa_codigo != "0") {
			mapaBuscar("oficina:" + mapa_codigo);
		} else if (mapa_listado_sabados) {
			mapaListadoSabados();
		}
		debugMsg("mapaInicializar() -> OK.");
	} else {
		// El navegador no es compatible con Google Maps
		window.location = "?incompatible";
	}
}

// --------------------------------------------------------------------
// NÚCLEO DE LA APLICACIÓN

// Ejecuta una búsqueda desde el formulario
function mapaBuscar(busqueda) {
	debugMsg("mapaBuscar('" + busqueda + "') -> Iniciando...");
	// Mostramos el valor en la caja de búsqueda
	$("#busqueda").val(busqueda);
	// Mostramos los textos de progreso
	$("#resultados_ayuda").css("display", "none");
	$("#resultados_busqueda").html("<div id=\"resultados_msg\">Buscando. Por favor, espere..</div>");
	$("#seguimiento").load("?seguimiento");
	$("#resultados_listado").html("");
	// Eliminamos la ruta
	mapaRutaCerrar();
	// Reseteamos la posición
	mapaPosicionResetear();
	// Reseteamos la oficina activa
	mapa_oficina_activa = undefined;
	// Buscamos palabras clave
	if (busqueda.indexOf(":") != -1) {
		var pos = busqueda.indexOf(":");
		var clave = busqueda.substring(0, pos);
		if (clave.toLowerCase() == "oficina") {
			// Búsqueda de oficina por por código
			var codigo = busqueda.substring(pos+1, busqueda.length);
			$("#resultados_listado").load("?oficina&id=" + escape(codigo));
			return;
		}
	}
	// Lanzamos la búsqueda de Google Maps
	debugMsg("mapaBuscar('" + busqueda + "') -> OK.");
	try {
		debugMsg("Lanzando búsqueda de '"+busqueda+"' en API de Google Maps (getLocations)...");
		mapa_geocoder.getLocations(busqueda + ",ES", mapaBuscarResultado);
	} catch (error) {
		if (error.description){
			debugMsg("Error en API de Google Maps (getLocations): " + error.description);
		}else{
			debugMsg("Error en API de Google Maps (getLocations): " + error);
		}
	}
}

// Función llamada al recibir la respuesta de la búsqueda en Google Maps
function mapaBuscarResultado(respuesta) {
	debugMsg("mapaBuscarResultado() -> Iniciando...");
	debugMsg("Status.code de getLocations: " + respuesta.Status.code);
	if (respuesta.Status.code == 200) {
		// Se encontraron resultados
		if (respuesta.Placemark.length == 1) {
			debugMsg("mapaBuscarResultado() -> OK (1 resultado).");
			// Sólo hay un resultado
			var dir = respuesta.Placemark[0].address;
			$("#resultados_busqueda").html("<div id=\"resultados_direccion\" onclick=\"mapaIconosPosicionActivar();\"><p>Esta es su búsqueda:</p><h3>" + dir + "</h3></div>");
			// Mostramos el resultado de la búsqueda
			mapaBuscarResultadoMostrar(respuesta.Placemark[0]);
		} else {
			debugMsg("mapaBuscarResultado() -> OK (varios resultados).");
			// Hay varios resultados, mostramos las opciones para que el usuario elija
			$("#resultados_busqueda").html("<div id=\"resultados_texto\"><p><strong>Se encontraron " + respuesta.Placemark.length + " coincidencias.</strong> Por favor elija, la que más se ajuste a su búsqueda:</p></div>");
			var salida = "<ul class=\"opciones_lista\">";
			for (var i=0; i<respuesta.Placemark.length; i++) {
				var dir = respuesta.Placemark[i].address;
				salida += "<li><strong>&gt;</strong> <a href=\"javascript:mapaBuscar('" + addslashes(dir) + "');\" title=\"" + addslashes(dir) + "\">" + dir + "</a></li>";
			}
			salida += "</ul>";
			$("#resultados_listado").html(salida);
			debugMsg("mapaBuscarResultado() -> Varios resultados mostrados.");
		}
	} else if (respuesta.Status.code == 602 || respuesta.Status.code == 603) {
		debugMsg("mapaBuscarResultado() -> OK (sin resultados).");
		// No se encontraron resultados
		$("#resultados_busqueda").html("<div id=\"resultados_texto\"><p>No se encontró ningún resultado que se ajuste a su búsqueda.</p></div>");
		// Volvemos a mostrar la ayuda
		$("#resultados_ayuda").css("display", "block");
		// Reseteamos las oficinas
		mapaOficinasResetear();
	} else {
		debugMsg("mapaBuscarResultado() -> KO.");
		// La búsqueda no finalizó correctamente
		debugMsg("Error en la búsqueda.");
		$("#resultados_busqueda").html("<div id=\"resultados_texto\"><p>Error en la búsqueda (" + respuesta.Status.code + "). Por favor, vuelva a intentarlo.</p></div>");
		// Reseteamos las oficinas
		mapaOficinasResetear();
	}
}

// Muestra el resultado de una búsqueda
function mapaBuscarResultadoMostrar(pm) {
	debugMsg("mapaBuscarResultadoMostrar() -> Iniciando...");
	// Definimos la marca del mapa
	mapa_busqueda = pm;
	// Definimos las coordenadas del punto de la búsqueda
	mapa_busqueda_punto = new GLatLng(mapa_busqueda.Point.coordinates[1], mapa_busqueda.Point.coordinates[0]);
	// Establecemos el centro del mapa
	mapa.setCenter(mapa_busqueda_punto, mapa_zooms[mapa_busqueda.AddressDetails.Accuracy]);
	// Mostramos el icono de posición
	mapaIconosPosicionDibujar();
	// Reseteamos las oficinas
	mapaOficinasResetear();
	// Buscamos las oficinas próximas
	mapaOficinasBuscar();
	debugMsg("mapaBuscarResultadoMostrar() -> OK.");
}

// Resetea el listado de oficinas
function mapaOficinasResetear() {
	debugMsg("mapaOficinasResetear() -> Iniciando...");
	// Desactivamos la oficina activa
	mapa_oficina_activa = undefined;
	// Eliminamos los iconos del mapa
	for (var id in mapa_oficinas) {
		// Quitamos todos los iconos de oficina
		if (mapa_oficinas[id].marcador != undefined) {
			// Quitamos el icono
			mapa.removeOverlay(mapa_oficinas[id].marcador);
		}
	}
	// Reseteamos el listado de oficinas
	mapa_oficinas = new Array();
	debugMsg("mapaOficinasResetear() -> OK.");
}

// Resetea la posición del mapa
function mapaPosicionResetear() {
	// Borramos la marca del mapa
	mapa_busqueda = undefined;
	// Borramos las coordenadas del punto de la búsqueda
	mapa_busqueda_punto = undefined;
	// Borramos el icono de posición
	mapaIconosPosicionEliminar();
}

// Lanza la búsqueda de Oficinas
function mapaOficinasBuscar() {
	if (!mapa_ruta_visible) {
		debugMsg("mapaOficinasBuscar() -> Iniciando...");
		// Desactivado mientras se muestre una ruta
		var zoom = mapa.getZoom();
		if (zoom >= mapa_zoom_umbral) {
			debugMsg("mapaOficinasBuscar() -> Dentro de umbral...");
			// Estamos dentro del umbral para mostrar oficinas
			var recuadro = mapa.getBounds();
			// Lanzamos la búsqueda de oficinas
			$("#resultados_listado").html("Buscando Oficinas. Por favor, espere...");
			// Lanzamos la búsqueda
			if (mapa_busqueda_punto != undefined) {
				debugMsg("mapaOficinasBuscar() -> OK: Lanzando búsqueda centrada en posición.");
				// Ya se ha realizado una búsqueda (centrar en la búsqueda)
				$("#resultados_listado").load("?buscar&tipo=" + mapa_busqueda_tipo + "&bounds=" + escape(recuadro) + "&lat=" + mapa_busqueda_punto.lat() + "&lng=" + mapa_busqueda_punto.lng() + "&zoom=" + zoom + "&resp=" + mapa_respuesta);
			} else {
				debugMsg("mapaOficinasBuscar() -> OK: Lanzando búsqueda centrada en mapa.");
				// Aun no se realizó una búsqueda (centrar en el centro del mapa)
				var centro = mapa.getCenter();
				$("#resultados_listado").load("?buscar&tipo=" + mapa_busqueda_tipo + "&bounds=" + escape(recuadro) + "&lat=" + centro.lat() + "&lng=" + centro.lng() + "&zoom=" + zoom + "&resp=" + mapa_respuesta);
			}
		} else {
			debugMsg("mapaOficinasBuscar() -> OK: Fuera de umbral.");
			// Estamos fuera del umbral para buscar oficinas
			$("#resultados_listado").html("<strong>Oficinas ocultadas</strong>. <a href=\"javascript:mapaReducir();\" title=\"Aumentar nivel de zoom del mapa\">Aumente el nivel de zoom</a> para verlas.");
			// Reseteamos las oficinas
			mapaOficinasResetear();
		}
	}
}

// Redibuja todos los iconos de las oficinas en el mapa
function mapaOficinasDibujar(general) {
	debugMsg("mapaOficinasDibujar() -> Iniciando...");
	// Dibujamos las oficinas según el array de resultados
	for (var id in mapa_oficinas) {
		mapaIconosOficinaDibujar(mapa_oficinas[id].num, mapa_oficinas[id].id, mapa_oficinas[id].lat, mapa_oficinas[id].lng, mapa_oficinas[id].nombre, general);
	}
	debugMsg("mapaOficinasDibujar() -> OK.");
	if (oficina_activar != "") {
		// Activación automática de oficina al buscar por código
		mapaOficinaElegir(oficina_activar);
		oficina_activar = "";
	} else {
		// Marcamos el listado
		mapaListadoActivar(mapa_oficina_activa);
	}
}

// Función llamada al elegir una oficina del listado o un icono
function mapaOficinaElegir(id) {
	if (id != mapa_oficina_activa) {
		debugMsg("mapaOficinaElegir("+id+") -> Iniciando...");
		// Desactivamos el item del listado anterior
		mapaListadoDesactivar(mapa_oficina_activa);
		// Cambiamos la oficina activa
		mapa_oficina_activa = id;
		// Marcamos el item del listado
		mapaListadoActivar(id);
		// Centramos el mapa en el icono de la oficina
		mapa.panTo(new GLatLng(mapa_oficinas[id].lat, mapa_oficinas[id].lng));
		// Mostramos la infowindow de la oficina y lanzamos la carga del contenido
		debugMsg("mapaOficinaElegir("+id+") -> OK.");
		if (mapa_oficinas[id].marcador != undefined) {
			mapa_oficinas[id].marcador.openInfoWindowHtml("Cargando información...");
			$("#oficina_info").load("index.php", {info: "", id: id, resp: mapa_respuesta}, mapaOficinaInfoMostrar);
		}
	}
}

// --------------------------------------------------------------------
// GESTIÓN DE ICONOS

// Dibuja el icono de búsqueda
function mapaIconosPosicionDibujar() {
	debugMsg("mapaIconosPosicionDibujar() -> Iniciando...");
	// Borramos el icono anterior
	mapaIconosPosicionEliminar();
	// Definimos el marcador de posición
	if (mapa_busqueda != undefined) {
		mapa_ico_posicion = new GMarker(mapa_busqueda_punto, {icon: mapa_iconos["posicion"], 
																													title: mapa_busqueda.address, 
																													zIndexProcess: zindex});
		// Añadimos el marcador al mapa
		mapa.addOverlay(mapa_ico_posicion);
		// Añadimos un evento click al marcador para seleccionar la posición
		GEvent.addListener(mapa_ico_posicion, "click", mapaIconosPosicionActivar);
		// Mostramos la infowindow de la posición
		mapa_ico_posicion.openInfoWindowHtml("<p>Esta es la dirección buscada:</p><p><strong>" + mapa_busqueda.address + "</strong></p>");
	}
	debugMsg("mapaIconosPosicionDibujar() -> OK.");
}

// Elimina el icono de búsqueda
function mapaIconosPosicionEliminar() {
	debugMsg("mapaIconosPosicionEliminar() -> Iniciando...");
	// Borramos el icono anterior
	if (mapa_ico_posicion != undefined) {
		mapa.removeOverlay(mapa_ico_posicion);
	}
	debugMsg("mapaIconosPosicionEliminar() -> OK.");
}

// Activa la infowindow del icono de posición
function mapaIconosPosicionActivar() {
	debugMsg("mapaIconosPosicionActivar() -> Iniciando...");
	// Desactivamos la oficina activa del listado
	if (mapa_oficina_activa != undefined) {
		mapaListadoDesactivar(mapa_oficina_activa);
	}
	// Reseteamos la oficina activa
	mapa_oficina_activa = undefined;
	// Centramos el mapa y mostramos la infowindow de la posición
	mapa.panTo(mapa_busqueda_punto);
	mapa_ico_posicion.openInfoWindowHtml("<p>Esta es la dirección buscada:</p><p><strong>" + mapa_busqueda.address + "</strong></p>");
	debugMsg("mapaIconosPosicionActivar() -> OK.");
}

// Dibuja un icono de oficina, o actualiza la imagen si es la oficina activa
function mapaIconosOficinaDibujar(num, id, lat, lng, nombre, general) {
	// Comprobamos si ya existe el marcador en el mapa
	if (mapa_oficinas[id].marcador == undefined) {
		// No existe, por lo que creamos el marcador
		var punto = new GLatLng(lat, lng);
		// Definimos el marcador de la oficina
		// Definimos el tipo de icono
		if (num > mapa_iconos_num) {
			var ico = mapa_iconos[mapa_busqueda_tipo][0];
		} else {
			var ico = mapa_iconos[mapa_busqueda_tipo][num];
		}
		mapa_oficinas[id].marcador = new GMarker(punto, {	icon: ico, 
																											title: nombre, 
																											id: id});
		// Añadimos el marcador al mapa
		mapa.addOverlay(mapa_oficinas[id].marcador);
		// Añadimos un evento click al marcador para seleccionar la oficina
		if (general) {
			GEvent.addListener(mapa_oficinas[id].marcador, "click", function() {
				mapaBuscar('oficina:'+this.id);
			});
		} else {
			GEvent.addListener(mapa_oficinas[id].marcador, "click", function() {
				mapaOficinaElegir(this.id);
			});
		}
	} else {
		// El marcador ya existe, cambiamos el número si es necesario
		// Definimos el tipo de icono
		if (num <= mapa_iconos_num) {
			// Icono numerado
			mapa_oficinas[id].marcador.setImage("img/ico-" + mapa_busqueda_tipo + "-" + num + ".png");
		} else {
			// Icono estandar
			mapa_oficinas[id].marcador.setImage("img/ico-" + mapa_busqueda_tipo + "-vacio.png");
		}
	}
}

// --------------------------------------------------------------------
// FUNCIONES DE GESTIÓN DE OFICINAS

// Añade una nueva oficina al array de oficinas (si no existía)
function mapaOficinasNueva(obj) {
	var id = obj.id;
	if (mapa_oficinas[id] == undefined) {
		// La oficina no existe aun, por lo que la añadimos
		mapa_oficinas[id] = obj;
	} else {
		// La oficina ya existe, actualizamos el número
		mapa_oficinas[id].num = obj.num;
	}
	// Hacemos visible la oficina
	mapa_oficinas[id].visible = true;
}

// --------------------------------------------------------------------
// FUNCIONES DE BÚSQUEDA DE OFICINAS POR CÓDIGO

// No se encontró la oficina
function mapaOficinaCodigo(codigo, tipo, lat, lng) {
	if (codigo == "") {
		// No se encontraron resultados
		$("#resultados_busqueda").html("<div id=\"resultados_texto\"><p>No se encontró ninguna Oficina con ese código.</p></div>");
		// Volvemos a mostrar la ayuda
		$("#resultados_ayuda").css("display", "block");
		// Reseteamos las oficinas
		mapaOficinasResetear();
	} else {
		var volver = "";
		if (busqueda_sabados) {
			volver = "<p><a href=\"javascript:mapaListadoSabados();\" title=\"Volver al listado\">&lt;&lt; Volver al listado</a></p>";
		}
		$("#resultados_busqueda").html("<div id=\"resultados_direccion\"><p>Esta es su búsqueda:</p><h3>Oficina " + codigo + "</h3>" + volver + "</div>");
		// Activamos el flag de activación de oficina
		oficina_activar = codigo;
		// Cambiamos el tipo de búsqueda
		mapa_busqueda_tipo = tipo;
		// Reseteamos las oficinas
		mapaOficinasResetear();
		// Definimos las coordenadas del punto de la búsqueda
		mapa_busqueda_punto = new GLatLng(lat, lng);
		// Establecemos el centro del mapa
		mapa.setCenter(new GLatLng(lat, lng), mapa_zooms[9]);
	}
}

// --------------------------------------------------------------------
// FUNCIONES DEL LISTADO

// Cambia el tipo de búsqueda
function mapaListadoCambiar(tipo) {
	debugMsg("mapaListadoCambiar('"+tipo+"') -> Iniciando...");
	// Cambiamos el tipo de búsqueda
	mapa_busqueda_tipo = tipo;
	// Reseteamos las oficinas
	mapaOficinasResetear();
	debugMsg("mapaListadoCambiar('"+tipo+"') -> OK.");
	// Lanzamos la búsqueda
	mapaOficinasBuscar();
}

// Desactiva un item del listado
function mapaListadoDesactivar(id) {
	if (id != undefined) {
		debugMsg("mapaListadoDesactivar("+id+") -> Iniciando...");
		$("#listado_item_"+id).css("border-color", "#cccccc");
		$("#listado_item_"+id).css("background-color", "#ffffff");
		debugMsg("mapaListadoDesactivar("+id+") -> OK.");
	}
}

// Activa un item del listado
function mapaListadoActivar(id) {
	if (id != undefined) {
		debugMsg("mapaListadoActivar("+id+") -> Iniciando...");
		$("#listado_item_"+id).css("border-color", "#14629e");
		$("#listado_item_"+id).css("background-color", "#e6f4f8");
		debugMsg("mapaListadoActivar("+id+") -> OK.");
	}
}

// Aumenta el radio de búsqueda disminuyendo el nivel de zoom (hasta el umbral de iconos)
function mapaAumentar() {
	debugMsg("mapaAumentar() -> Iniciando...");
	if (mapa.getZoom() > mapa_zoom_umbral) {
		mapa.setZoom(mapa.getZoom()-1);
	} else {
		$("#listado_aumentar").html("Radio de búsqueda ampliado al máximo.");
	}
	debugMsg("mapaAumentar() -> OK.");
}

// Reducir el radio de búsqueda aumentando el nivel de zoom
function mapaReducir() {
	debugMsg("mapaReducir() -> Iniciando...");
	mapa.setZoom(mapa.getZoom()+1);
	debugMsg("mapaReducir() -> OK.");
}

// --------------------------------------------------------------------
// FUNCIONES DE LAS INFOWINDOW

// Muestra la infowindow de una oficina
function mapaOficinaInfoMostrar() {
	if (mapa_oficina_activa != undefined) {
		debugMsg("mapaOficinaInfoMostrar() -> Iniciando...");
		// Mostramos la infowindow
		mapa_oficinas[mapa_oficina_activa].marcador.openInfoWindowHtml($("#oficina_info").html());
		// Añadimos el evento para desactivar la oficina en caso de que cierren la infowindow
		GEvent.addListener(mapa.getInfoWindow(), "closeclick", mapaOficinaInfoOcultar);
		debugMsg("mapaOficinaInfoMostrar() -> OK.");
	}
}

// Oculta la infowindow de una oficina
function mapaOficinaInfoOcultar() {	
	if (mapa_oficina_activa != undefined) {
		debugMsg("mapaOficinaInfoOcultar() -> Iniciando...");
		// Ocultamos la infowindow
		mapa_oficinas[mapa_oficina_activa].marcador.closeInfoWindow();
		// Desactivamos el item del listado
		mapaListadoDesactivar(mapa_oficina_activa);
		// Deseleccionamos la oficina
		mapa_oficina_activa = undefined;
		debugMsg("mapaOficinaInfoOcultar() -> OK.");
	}
}

// --------------------------------------------------------------------
// FUNCIONES DE RUTA

// Lanza el cálculo de la ruta
function mapaRutaCalcular(id, modo) {
	debugMsg("mapaRutaCalcular("+id+",'"+modo+"') -> Iniciando...");
	// Comprobamos si hay oficina activa y búsqueda activa
	if ($("#busqueda").val().indexOf("oficina:") > -1) {
		alert("Para poder calcular una ruta debe indicar un punto de partida en la caja de búsqueda.");
		return;
	}
	if (mapa_oficina_activa != undefined && mapa_busqueda_punto != undefined) {
		// Eliminamos la ruta anterior
		mapaRutaCerrar();
		// Ocultamos la capa del listado
		$("#resultados_listado").css("display", "none");
		// Mostramos la capa de la ruta
		$("#resultados_recorrido").css("display", "block");
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\">Cargando ruta...</div>");
		// Opciones de la ruta
		if (modo == "andando") {
			// La ruta es andando
			var opts = {locale: "es", travelMode: G_TRAVEL_MODE_WALKING};
		} else {
			// La ruta es en coche
			var opts = {locale: "es"};
		}
		mapa_ruta = new GDirections(mapa, document.getElementById("resultados_recorrido"));
		mapa_ruta.load("from: " + mapa_busqueda.address + " to: " + mapa_oficinas[mapa_oficina_activa].direccion, opts);
		// Añadimos eventos de control de la ruta
		GEvent.addListener(mapa_ruta, "load", mapaRutaCargado);
		GEvent.addListener(mapa_ruta, "error", mapaRutaError);
	}
	debugMsg("mapaRutaCalcular("+id+",'"+modo+"') -> OK.");
}

// Función ejecutada tras la carga de la ruta
function mapaRutaCargado() {
	debugMsg("mapaRutaCargado() -> Iniciando...");
	// Activamos el flag de ruta
	mapa_ruta_visible = true;
	// Mostramos el texto en el listado
	$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Mostrando ruta en coche desde la búsqueda hasta la oficina solicitada.</strong></div>");
	$("#resultados_recorrido").append("<div id=\"recorrido_volver\"><a href=\"javascript:mapaRutaCerrar();\" title=\"Volver al listado de oficinas\">&lt; Volver al listado de oficinas</a></div>");
	// Ocultamos el icono de posición
	if (mapa_ico_posicion != undefined) {
		mapa.removeOverlay(mapa_ico_posicion);
	}
	debugMsg("mapaRutaCargado() -> OK.");
	// Ocultamos la infowindow de la oficina
	mapaOficinaInfoOcultar();
	// Eliminamos los iconos de oficinas
	mapaOficinasResetear();
}

// Función que controla el error en la carga de la ruta
function mapaRutaError() {
	debugMsg("mapaRutaError() -> Iniciando...");
	// Desactivamos el flag de ruta
	mapa_ruta_visible = false;
	if (mapa_ruta.getStatus().code == G_GEO_UNKNOWN_ADDRESS) {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />No se encontró la correspondencia geográfica con alguna de las direcciones geográficas. Esto puede ser debido a que alguna de las direcciones es relativamente nueva o incorrecta.</div>");
	} else if (mapa_ruta.getStatus().code == G_GEO_SERVER_ERROR) {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />En estos momentos no podemos calcular su ruta. Por favor, inténtelo más tarde.</div>");
	} else if (mapa_ruta.getStatus().code == G_GEO_MISSING_QUERY) {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />Petición incorrecta.</div>");
	} else if (mapa_ruta.getStatus().code == G_GEO_BAD_KEY) {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />Clave incorrecta.</div>");
	} else if (mapa_ruta.getStatus().code == G_GEO_BAD_REQUEST) {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />Petición incorrecta.</div>");
	} else {
		$("#resultados_recorrido").html("<div id=\"recorrido_msg\"><strong>Error al calcular la ruta (" + mapa_ruta.getStatus().code + "):</strong><br />Por favor, inténtelo más tarde.</div>");
	}
	$("#resultados_recorrido").append("<div id=\"recorrido_volver\"><a href=\"javascript:mapaRutaCerrar();\" title=\"Volver al listado de oficinas\">&lt; Volver al listado de oficinas</a></div>");
	debugMsg("mapaRutaError() -> OK.");
}

// Función que cierra el resultado de la ruta y lo elimina del mapa
function mapaRutaCerrar() {
	debugMsg("mapaRutaCerrar() -> Iniciando...");
	// Desactivamos el flag de ruta
	mapa_ruta_visible = false;
	// Ocultamos la capa de la ruta
	$("#resultados_recorrido").css("display", "none");
	// Mostramos la capa del listado
	$("#resultados_listado").css("display", "block");
	// Eliminamos la ruta del mapa
	if (mapa_ruta != undefined) {
		mapa_ruta.clear();
	}
	debugMsg("mapaRutaCerrar() -> OK.");
	// Volvemos a mostrar el icono de posición
	if (mapa_ico_posicion != undefined) {
		mapaIconosPosicionDibujar();
	}
	// Volvemos a mostrar la infowindow de la oficina
	mapaOficinaInfoMostrar();
}

// --------------------------------------------------------------------
// FUNCIONES DE RESPUESTA

// Llamada de respuesta
function mapaRespuesta(ent, nom_abr, via, num, loc, cp, tel) {
	if (mapa_respuesta) {
		var params = "sucur=" + ent + "&nom_abr=" + nom_abr + "&via=" + via + "&num_via=" + num + "&loc=" + loc + "&cp=" + cp + "&tel=" + tel;
		if (mapa_respuesta_url == "") {
			if (mapa_respuesta_entorno != "" && mapa_respuesta_idpagina != "") {
				var url = mapa_respuesta_entorno + "ContentServer?pagename=Banesto/Portales/Banesto/NoCache&c=Page&cid=" + mapa_respuesta_idpagina;
				//top.frames["frameoculto"].document.location.href = url + "&" + params;
				document.location.href = url + "&" + params;
			}
		} else {
			var url = mapa_respuesta_url;
			if (url.indexOf("?") != -1) {
				document.location.href = url + "&" + params;
			} else {
				document.location.href = url + "?" + params;
			}
		}
	}
}

// --------------------------------------------------------------------
// OFICINAS LOS SÁBADOS

// Listado de las oficinas que abren los sábados
function mapaListadoSabados() {
	busqueda_sabados = true;
	debugMsg("mapaListadoSabados() -> Iniciando...");
	// Mostramos los textos de progreso
	$("#resultados_ayuda").css("display", "none");
	$("#resultados_busqueda").html("<div id=\"resultados_msg\">Buscando. Por favor, espere..</div>");
	$("#resultados_listado").html("");
	// Eliminamos la ruta
	mapaRutaCerrar();
	// Reseteamos la posición
	mapaPosicionResetear();
	// Reseteamos la oficina activa
	mapa_oficina_activa = undefined;
	// Lanzamos la búsqueda de Google Maps
	debugMsg("mapaListadoSabados() -> OK.");
	$("#resultados_busqueda").html("<div id=\"resultados_direccion\"><p>Esta es su búsqueda:</p><h3>Oficinas abiertas los sábados</h3><p><a href=\"http://oficinas.banesto.es/\" title=\"Volver\">&lt;&lt; Volver</a></div>");
	$("#resultados_listado").load("?sabados");
	/*try {
		debugMsg("Lanzando búsqueda de '"+busqueda+"' en API de Google Maps (getLocations)...");
		mapa_geocoder.getLocations(busqueda + ",ES", mapaBuscarResultado);
	} catch (error) {
		if (error.description){
			debugMsg("Error en API de Google Maps (getLocations): " + error.description);
		}else{
			debugMsg("Error en API de Google Maps (getLocations): " + error);
		}
	}*/
}

// --------------------------------------------------------------------
// FUNCIONES DE DEPURACIÓN

// Muestra un mensaje en la ventana de depuración
function debugMsg(msg) {
	if ($("#debug_txt").length > 0) {
		var ahora = new Date();
		var time = ahora.getTime() - mapa_timer;
		$("#debug_txt").prepend("<div style=\"margin-top:3px;\">&gt; (" + time + "): " + msg + "</div>");
	}
}

// --------------------------------------------------------------------
// FUNCIONES DE APOYO

// Usada para establecer el zindex del marcador de posición
function zindex() { return 1000; }

// Escapa una cadena de texto
function addslashes(str) {
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +   improved by: Ates Goral (http://magnetiq.com)
	// +   improved by: marrtins
	// +   improved by: Nate
	// +   improved by: Onno Marsman
	// *     example 1: addslashes("kevin's birthday");
	// *     returns 1: 'kevin\'s birthday'
	return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
}
