/*
	Fichero en javascript que contiene las funciones para poder trabajar con mapas
*/
	
	var map = null;
	var myMap = null;
	var geocoder = null;
	var searchControl = null;
	var localSearch = null;
    var app = null;	
	var idioma = null;
    var vectorMarkers = null;

	//Funcion para cargar un mapa (si se pasan cadenas vacias se centra en Madrid)
	function cargaMapa(Lat, Lng, zoom) {
		//Si no le pasamos coordenadas lo centramos en madrid
		if ((Lat == "") || (Lng == "") || (zoom == "")) {
			Lat = 40.41754764334817;
			Lng = -3.7041091918945312;
			zoom = 14;
		} else {
			//Como le hemos pasado cadenas lo convertimos en un numero
			Lat = parseFloat(Lat)
			Lng = parseFloat(Lng)
			zoom = parseFloat(zoom)
		}
		//Comprobamos que el navegador es compatible
		if (GBrowserIsCompatible()) {
			//Crea un mapa
	     	map = new GMap2(document.getElementById("map"));
			//Para poder poner una direccion y que la busque
			geocoder = new GClientGeocoder();
			//Le anado los controles para moverse y de zoom
			var controles = new GLargeMapControl();
			map.addControl(controles);
			map.addControl(new GMapTypeControl());
            //Para que me aparezcan las coordenadas y el zoom al poner una nueva marca
			GEvent.addListener(map, "click", function(marker, point) {
  				if (marker) {
    				map.removeOverlay(marker);
  				} else {
                    map.clearOverlays();
    				map.addOverlay(new GMarker(point));
					//document.getElementById("message").innerHTML = point.toString();
					document.getElementById("latitud").value = point.y.toString();
					document.getElementById("longitud").value = point.x.toString();
					zoom = map.getZoom();
					document.getElementById("zoom").value = zoom;
  				}
			});
            //Para que se modifique el nivel de zoom en el formulario al acceder a los controles
            GEvent.addListener(map, "zoomend", function(oldZoom, newZoom) {
				document.getElementById("zoom").value = newZoom;
			});
			//lo centra en las coordenadas que le proporcionamos
			var point = new GLatLng(Lat, Lng);
	     	map.setCenter(point, zoom);
			//pintamos un marcador para senalar
			var marker = new GMarker(point);
	        map.addOverlay(marker);
			//document.getElementById("message").innerHTML = point.toString();
			document.getElementById("latitud").value = point.y.toString();
			document.getElementById("longitud").value = point.x.toString();
			var zoom = map.getZoom();
			document.getElementById("zoom").value = zoom;
			
	   	}
	}
	
	
	//Funcion para cargar un mapa inicializado para el usuario
	function cargaMapaInicializado(Lat, Lng, zoom, mini, nombreDiv) {
		//Como le hemos pasado una cadena lo convertimos en un numero
		Lat = parseFloat(Lat)
		Lng = parseFloat(Lng)
		zoom = parseFloat(zoom)
		
		//Comprobamos que el navegador es compatible
    	if (GBrowserIsCompatible()) {
 			//Crea un mapa
      		map = new GMap2(document.getElementById(nombreDiv));
			//Para poder poner una direccion y que la busque
			geocoder = new GClientGeocoder();
			//Le anado los controles para moverse y de zoom
            if (mini == false) {
			    map.addControl(new GLargeMapControl());
			    map.addControl(new GMapTypeControl());
            } else {
                map.addControl(new GSmallMapControl());
            }
			//lo centra en las coordenadas que le proporcionamos
			var point = new GLatLng(Lat, Lng);
			map.setCenter(point, zoom);
			//pintamos un marcador para senalar
			var marker = new GMarker(point);
	        map.addOverlay(marker);
    	}
  	}
	
	//Funcion para cargar un mapa inicializado para el usuario
	function cargaMapaInicializadoNombre(nombre, zoom) {
		//Como le hemos pasado una cadena lo convertimos en un numero
		zoom = parseFloat(zoom);
		
		//Comprobamos que el navegador es compatible
    	if (GBrowserIsCompatible()) {
			//Dirección

			var direccion = nombre + ", Spain";
			var divMapa = document.getElementById ("map");
		
 			//Crea un mapa
      		map = new GMap2(divMapa);
			//Para poder poner una direccion y que la busque
			geocoder = new GClientGeocoder();
			//Le anado los controles para moverse y de zoom
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			
			geocoder.getLatLng(direccion,
    			function(point) {
					if (!point) {
					}
					else {
						var gIcono = new GIcon (G_DEFAULT_ICON, '/imagenes/comun/arrow-white.gif');
					    map.setCenter(point, zoom);
					    var marker = new GMarker(point, gIcono);
					    map.addOverlay(marker);
					}
				}
			);
    	}
  	}	
	 
	//Para poder pasarle una direccion y que nos devuelva las coordenadas 
	function showAddress(address, zoom) {
		 zoom = parseFloat(zoom)
	     if (geocoder) {
		 	//Cogemos las coordenadas de la direccion
	        geocoder.getLatLng(
	          address,
	          function(point) {
			  	//si no tenemos : error
	            if (!point) {
	            	alert(address + " no encontrada");
				//si tenemos
	            } else {
					//centramos el punto en el mapa
	              	map.setCenter(point, zoom);
				  	//pintamos un marcador para senalar
	              	var marker = new GMarker(point);
	              	map.addOverlay(marker);
	              	//marker.openInfoWindowHtml(address);
					document.getElementById("latitud").value = point.y.toString();
					document.getElementById("longitud").value = point.x.toString();
					var zoom = map.getZoom();
					document.getElementById("zoom").value = zoom;
	            }
	          }
	       );
	    }
	 }


	/***** Funciones para la búsqueda local en los mapas *****/
	//Función a la que se llamará al iniciar la página de la búsqueda local: crea la aplicación App,la 
	//cuál inicializará el mapa contenedor de las búsquedas, así como los controles de búsqueda.
	function OnLoad(ciudad, idiomaActual) {
		if (idiomaActual != null)
			idioma = idiomaActual;
		if (ciudad != null)
			var miCiudad = ciudad;
			
		app = new App(miCiudad);
	}

	//Función que inicializa el mapa contenedor de las búsquedas, los controles de la búsqueda, y los 
	//eventos asociados a los controles.
	function App(ciudad) {
	  this.markerList = new Array();
	  
	  //Creamos el mapa
	  myMap = new GMap2(document.getElementById("localMapPagUno"));
	  myMap.addControl(new GSmallMapControl());
  
	  //nos posicionamos en la ciudad deseada
	  var direccion = ciudad + ", Spain";
	  var geocoder = new GClientGeocoder();
	  geocoder.getLatLng(direccion,
 		  function(point) {
		      myMap.setCenter(point, 14);
		      var marker = new GMarker(point);
		      myMap.addOverlay(marker);
		  }
	  );	  

	  // Create a search control
	  searchControl = new GSearchControl();
	
	  // Add in a full set of searchers
	  localSearch = new GlocalSearch();
	  var options = new GsearcherOptions();
	  options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
	  searchControl.addSearcher(localSearch, options);
	  searchControl.setResultSetSize(GSearch.LARGE_RESULTSET);
	
	  // Set the Local Search center point
	  localSearch.setCenterPoint(myMap);
	  // tell the searcher to draw itself and tell it where to attach
	  searchControl.draw(document.getElementById("searchcontrol"));

	  // tell the search control to call be on start/stop
	  searchControl.setSearchCompleteCallback(this, App.prototype.OnSearchComplete);
	  searchControl.setSearchStartingCallback(this, App.prototype.OnSearchStarting);
	  searchControl.setOnKeepCallback(this, App.prototype.OnKeep, "view on map");
	}

	//Función que se ejecuta al completarse una búsqueda: muestra en el mapa todos los resultados de las
	//búsquedas almacenados en "results", y además pinta dichos resultados en un div a la derecha del mapa.
	App.prototype.OnSearchComplete = function(sc, searcher) {
	  // if we have local search results, put them on the map
	  if ( searcher.results && searcher.results.length > 0) {
	  	vectorMarkers = new Array ();
		var nodoTitulo = document.createElement ("h3");
 		var divResultadosPagUno = document.getElementById ("pagUno");
 		var divResultadosPagDos = document.getElementById ("pagDos");
		divResultadosPagUno.innerHTML = "";
		divResultadosPagDos.innerHTML = "";
		divResultadosPagUno.style.display = "block";
		divResultadosPagDos.style.display = "none";
						
		//Vamos pintando todos los resultados, tanto en el mapa como en el div
		var total = searcher.results.length;
	    for (var i = 0; i < searcher.results.length; i++) {
	      var result = searcher.results[i];
	
	      // if this is a local search result, then proceed...
	      if (result.GsearchResultClass == GlocalSearch.RESULT_CLASS ) {
		  	//Inicializamos el marker del mapa
	        var markerObject = new Object();
	        markerObject.result = result;
	        markerObject.latLng = new GLatLng(parseFloat(result.lat), parseFloat(result.lng));
	        markerObject.gmarker = new GMarker(markerObject.latLng);
			//Asignamos evento al marker
	        var clickHandler = method_closure(this, App.prototype.OnMarkerClick, [markerObject]);
	        GEvent.bind(markerObject.gmarker, "click", this, clickHandler);
	        GEvent.bind(markerObject.gmarker, "mouseover", this, clickHandler);
	        this.markerList.push(markerObject);
			
			vectorMarkers.push (markerObject);
	        
			myMap.addOverlay(markerObject.gmarker);		//Pintamos el marker sobre el mapa
	        result.__markerObject__ = markerObject;
			
			//Pintamos el resultado en el panel de resultados
			var mensajePintado = false;
			if (i<4 && i<total) {
				var resultado = result.html.cloneNode (true);
				
				/* Código para se centre el mapa en el item destacado al pasar el ratón por encima de dicho item */
				var codigoOnMouseOver = "var lat = vectorMarkers[" + i + "].latLng.lat ();";
				codigoOnMouseOver = codigoOnMouseOver + "var long = vectorMarkers[" + i + "].latLng.lng();";
				codigoOnMouseOver = codigoOnMouseOver + "var point = new GLatLng(lat, long);";
				codigoOnMouseOver = codigoOnMouseOver + "myMap.setCenter(point, 14);";
				codigoOnMouseOver = codigoOnMouseOver + "var htmlNode = vectorMarkers[" + i + "].result.html.cloneNode(true);"
				codigoOnMouseOver = codigoOnMouseOver + "vectorMarkers[" + i + "].gmarker.openInfoWindowHtml(htmlNode);";
				resultado.childNodes[0].setAttribute ("onmouseover", codigoOnMouseOver);
				/* */
				
				divResultadosPagUno.appendChild (resultado);
				resultado = document.createElement ("br");
				divResultadosPagUno.appendChild (resultado);
				
				//Si pintamos el último resultado de la primera página, y quedan más por pintar, 
				//además, pintamos el botoncito
				if (i==3 && i<total) {
					var mensaje = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
					mensaje = mensaje + "<h3>1-4 / 8</h3>";
					mensaje = mensaje + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
					mensajePintado = true;
					
					var resultados = "<input type='image' src='/imagenes/comun/sig.gif' alt='Pulse para ver mÃ¡s resultados' ";
					resultados = resultados + "onclick='divUno=getElementById (\"pagUno\"); divDos=getElementById (\"pagDos\"); divUno.style.display=\"none\"; divDos.style.display=\"block\";' />";
					divResultadosPagUno.innerHTML = divResultadosPagUno.innerHTML + mensaje + resultados;
				}
			}
			else if (i>=4 && i<total) {
				var resultado = result.html.cloneNode (true);

				/* Código para se centre el mapa en el item destacado al pasar el ratón por encima de dicho item */
				var codigoOnMouseOver = "var lat = vectorMarkers[" + i + "].latLng.lat ();";
				codigoOnMouseOver = codigoOnMouseOver + "var long = vectorMarkers[" + i + "].latLng.lng();";
				codigoOnMouseOver = codigoOnMouseOver + "var point = new GLatLng(lat, long);";
				codigoOnMouseOver = codigoOnMouseOver + "myMap.setCenter(point, 14);";
				codigoOnMouseOver = codigoOnMouseOver + "var htmlNode = vectorMarkers[" + i + "].result.html.cloneNode(true);"
				codigoOnMouseOver = codigoOnMouseOver + "vectorMarkers[" + i + "].gmarker.openInfoWindowHtml(htmlNode);";
				resultado.childNodes[0].setAttribute ("onmouseover", codigoOnMouseOver);
				/* */
				
				divResultadosPagDos.appendChild (resultado);
				resultado = document.createElement ("br");
				divResultadosPagDos.appendChild (resultado);

				//Si pintamos un sólo resultado de ésta segunda página, pintamos el botoncito
				if (i==total-1 && i>=4) {
					mensaje = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
					mensaje = mensaje + "<h3>4-8 / 8</h3>";
					mensaje = mensaje + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
					
					var resultados = "<input type='image' src='/imagenes/comun/ant.gif' alt='Pulse para ver los resultados anteriores' ";
					resultados = resultados + "onclick='divUno=getElementById (\"pagUno\"); divDos=getElementById (\"pagDos\"); divUno.style.display=\"block\"; divDos.style.display=\"none\";' />";
					divResultadosPagDos.innerHTML = divResultadosPagDos.innerHTML + resultados + mensaje;
				}
			}
	      }
	    }
	    this.OnMarkerClick(this.markerList[0]);
	  }
	  else alert ("Su bÃºsqueda no tuvo resultados");
	}

	//Función que se ejecuta al iniciar una búsqueda: limpia los resultados de la búsqueda anterior,
	//si las hubiese.
	App.prototype.OnSearchStarting = function(sc, searcher, query) {
	  var buscando = "";

	  switch (idioma) {
	  	case '1':	buscando = "Buscando..."; break;
		case '2':	buscando = "Searching..."; break;
		case '3':	buscando = "En recherchant..."; break;
		case '4':	buscando = "Suchen..."; break;
	  }
	  // close the info window and clear markers
	  myMap.closeInfoWindow();
	  for (var i=0; i < this.markerList.length; i++) {
	    var markerObject = this.markerList[i];
		myMap.removeOverlay(markerObject.gmarker);
	  }
	  this.markerList = new Array();
	  var divResultadosPagUno = document.getElementById ("pagUno");
	  var divResultadosPagDos = document.getElementById ("pagDos");
	  divResultadosPagUno.innerHTML = "<img src='/imagenes/comun/ajax-loader.gif' alt='" + buscando + "' style='margin-left: 25px;' />&nbsp;&nbsp;&nbsp;<h3 style='display:inline;'>" + buscando + "</h3>";
	  divResultadosPagUno.style.display = "block";
	  divResultadosPagDos.innerHTML = "";
	  divResultadosPagDos.style.display = "none";
	}
	
	App.prototype.OnKeep = function(result) {
	  if (result.__markerObject__) {
	    markerObject = result.__markerObject__;
	    this.OnMarkerClick(markerObject);
	  }
	}
	
	App.prototype.OnMarkerClick = function(markerObject) {
	  myMap.closeInfoWindow();
	  var htmlNode = markerObject.result.html.cloneNode(true);
	  markerObject.gmarker.openInfoWindow(htmlNode);
	}
	
	
	function method_closure(object, method, opt_argArray) {
	  return function() {
	    return method.apply(object, opt_argArray);
	  }
	}
	
	//Ésta función inicializa la cadena de búsqueda empleada, y ejecuta la búsqueda
	function buscar (ciudad, categoria) {
		var nombreCategoria = "";
		switch (categoria) {
			case '1': nombreCategoria = "Turismo de " + ciudad; break;
			case '2': nombreCategoria = "Agencia de viajes|Agencias de viaje"; break;
			case '3': nombreCategoria = "Centro comercial|Centros comerciales"; break;
			case '4': nombreCategoria = "Supermercados"; break;
			case '5': nombreCategoria = "Restaurante|Restaurantes"; break;
			case '6': nombreCategoria = "CafeterÃ­a|CafeterÃ­as|Cafeteria|Cafeteria"; break;
			case '7': nombreCategoria = "Correos"; break;
			case '8': nombreCategoria = "Banco"; break;
			case '9': nombreCategoria = "Farmacia|Farmacias"; break;
			case '10': nombreCategoria = "Cinemas"; break;
			case '11': nombreCategoria = "Teatros"; break;
			case '12': nombreCategoria = "Bar|Bares"; break;
			case '13': nombreCategoria = "Pub|Pubs"; break;
			case '14': nombreCategoria = "Discotecas"; break;
			case '15': nombreCategoria = "Gasolineras"; break;
		}
		OnLoad (ciudad, idioma);
		localSearch.setCenterPoint(ciudad + ", Spain");
		searchControl.execute (nombreCategoria);
	}			
	
	//GSearch.setOnLoadCallback(OnLoad);			//ES AQUI!

	
