/*
Funciones relacionadas con la api 2.0 de google maps

2007 - 2008 Javier Crespo - Ayuntamiento de Manzanares

*/

	//Definición de variables globales
	var map;
	var geocoder;
	//Valores de aproximadamente el centro del pueblo utilizado para inicializar el mapa
	var latCentro = 38.999090;
	var lngCentro = -3.370340;
	var zoomInicial = 16;
	var urlIconos = '../../img/maps/';
	//var urlRutas = '../docs/maps/';
	var urlRutas = 'http://www.manzanares.es/docs/maps/';
	var defaultIco = 'icoayto.png';
	var htmlInfo;
	var xmlDoc;
	
	//Restriciones de coordenadas y zoom
	var zoomMinimo = 13;
	var zoomMaximo = 17;
	var coordXMin;  //39.036586, -3.327398
	var coordXMax;	//39.036586, -3.327398
	var coordYMin;  //38.975690, -3.352990
	var coordYMax;	//38.975690, -3.352990
	//Limites permitidos
	var allowedBounds = new GLatLngBounds(new GLatLng(38.975577, -3.398290), new GLatLng(39.036386, -3.352118));
	
	
	function initialize() {
	      if (GBrowserIsCompatible()) {
			map = new GMap2(document.getElementById("mapamanzanares"));
			//Restriccion de los niveles de zoom
			//En caso de poner otros tipos de mapa,
			//hay que incluir su definición como tipo de mapa nuevo
			G_NORMAL_MAP.getMinimumResolution = function () { return zoomMinimo }; 
			G_NORMAL_MAP.getMaximumResolution = function () { return zoomMaximo }; 
			
			map.setCenter(new GLatLng(latCentro, lngCentro), zoomInicial);
			//map.addControl(new GSmallMapControl());
	        	map.addControl(new GLargeMapControl());		
			map.addControl(new GOverviewMapControl());
			//map.disableDragging(); //;)
	      }
	  
	  //Añadimos un listener para detectar movimiento
	  GEvent.addListener(map, "move", function() {
        checkLimits();
      });
	  
    }

//Chequea que la imagen se encuentre dentro de los limites permitidos
function checkLimits() {
	
	// chequea, y retorna si todo esta OK
        if (allowedBounds.contains(map.getCenter())) {
          return;
        }
		
	// si no es así, busca el punto cercano y mueve hasta el
        var C = map.getCenter();
        var X = C.lng();
        var Y = C.lat();

        var AmaxX = allowedBounds.getNorthEast().lng();
        var AmaxY = allowedBounds.getNorthEast().lat();
        var AminX = allowedBounds.getSouthWest().lng();
        var AminY = allowedBounds.getSouthWest().lat();

        if (X < AminX) {X = AminX;}
        if (X > AmaxX) {X = AmaxX;}
        if (Y < AminY) {Y = AminY;}
        if (Y > AmaxY) {Y = AmaxY;}
        map.setCenter(new GLatLng(Y,X));
	
}

//Muestra la información relevante en la capa "infoDiv" debajo del mapa
function infoDiv (text)
	{
		document.getElementById('infoDiv').innerHTML = text;		
	}	

function info2Div (text,divCaller)
	{
		document.getElementById(divCaller).innerHTML = text;		
	}	

//Extrae la descripción del archivo kml y lo manda a la función infoDiv para ser mostrada
function descriptionKmlToDiv (fileKml)
	{
		infoDiv (fileKml.getElementsByTagName("description")[0].childNodes[0].nodeValue);
	}

/*
Funciones relacionadas con los puntos de interes (poi)
*/


/*
Recibe como parametro un punto en formato xml y lo añade en el mapa
*/	
	function addPoi (poiXml) {
		
			var latPoi = poiXml.getElementsByTagName("lat")[0].childNodes[0].nodeValue;
			var lngPoi = poiXml.getElementsByTagName("lng")[0].childNodes[0].nodeValue;
			var txtnombrePoi = poiXml.getElementsByTagName("txtnombre")[0].childNodes[0].nodeValue;
			var txtdireccPoi = poiXml.getElementsByTagName("txtdirecc")[0].childNodes[0].nodeValue;
			var txtcpPoi = poiXml.getElementsByTagName("txtcp")[0].childNodes[0].nodeValue;
			var txttfnoPoi = poiXml.getElementsByTagName("txttfno")[0].childNodes[0].nodeValue;		

			if (poiXml.getElementsByTagName("ico")[0].hasChildNodes())
				{
					var icoPoi = poiXml.getElementsByTagName("ico")[0].childNodes[0].nodeValue;
				}

			if (poiXml.getElementsByTagName("txtemail")[0].hasChildNodes())
				{
					var txtemailPoi = poiXml.getElementsByTagName("txtemail")[0].childNodes[0].nodeValue;
				}
				
			if (poiXml.getElementsByTagName("txturl")[0].hasChildNodes())
				{
					var txturlPoi = poiXml.getElementsByTagName("txturl")[0].childNodes[0].nodeValue;
				}
				
			poiInfo2Html (icoPoi,txtnombrePoi,txtdireccPoi,txtcpPoi,txttfnoPoi,txtemailPoi,txturlPoi);
		
			var coordenadas = new GLatLng (latPoi,lngPoi);
			//Crear icono	
			/*var aytomanzIcon = new GIcon();
			aytomanzIcon.image = "icoescudo.png";
			aytomanzIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
			aytomanzIcon.iconSize = new GSize(25,25);
			aytomanzIcon.shadowSize = new GSize(36,33);
			aytomanzIcon.iconAnchor = new GPoint(10,32);*/
			var marker = new GMarker(coordenadas);
			//var marker = new GMarker(coordenadas, {icon: aytomanzIcon});
			marker.setPoint(coordenadas);
			
			//Prueba para que no queden marcadores fuera
			//marker.autoPan = true;
			
			GEvent.addListener(marker, "click", function() {
					marker.openInfoWindowHtml(htmlInfo);
					});

			map.addOverlay(marker);
			map.panTo(coordenadas);
			infoDiv("");
			}
			
			
	//Limpia todas las capas del mapa dejandolo limpio como al inicializar
	function clearPois() {
		map.clearOverlays();
	}
			
	//Llama a las funciones clearPois y addPoi para cambiar el punto de interés
	function changePoi(poiXml) {
		clearPois();
		addPoi (poiXml);
		infoDiv("");
	}
	
	//Añade un grupo de puntos relacionados entre sí. Creado para la semana santa y no está muy probado
	function addGrpPois (GrpPoisXml) {
		
		var xmlDoc = GrpPoisXml;
		var markers = xmlDoc.documentElement.getElementsByTagName("marker");		
		
		for (var i = 0; i < markers.length; i++) {
			// obtain the attribues of each marker
		        var lat = parseFloat(markers[i].getAttribute("lat"));
		        var lng = parseFloat(markers[i].getAttribute("lng"));
		        var point = new GLatLng(lat,lng);
		        var html = markers[i].getAttribute("infowindow");
		        // create the marker
			var marker = createMarker(point,html);
			map.addOverlay(marker);
			}
		
		infoDiv("Para mayor información haga click con el ratón en los puntos seleccionados o en el itinerario de la procesión.");
		
		function createMarker(point,html) {
			var marker = new GMarker(point);
			GEvent.addListener(marker, "click", function() {
			  marker.openInfoWindowHtml(html);
			});
			return marker;
		  }
	}
	
	//Crea un html con la informacion del poi que muestra cuando se pincha en el
	function poiInfo2Html (icono, nombre,direcc,cp,tfno,email,url) {
		
		htmlInfo = "<!-- comment -->";
		htmlInfo = htmlInfo + "<div><center><justify>";
		//htmlInfo = htmlInfo + "<table width="100%" border="0"><tr><td>";
		if (icono != null) {
			htmlInfo = htmlInfo + "<img src='" + urlIconos + icono + "'>";
		}
		else {
			htmlInfo = htmlInfo + "<img src='" + urlIconos + defaultIco + "'>";
		}
		
		htmlInfo = htmlInfo + "<b> " + nombre + "</b>";
		htmlInfo = htmlInfo + "<br>" + direcc;
		htmlInfo = htmlInfo + "<br><center>C.P. " + cp + " Manzanares (C.Real)";
		
		if (tfno != null) {
			htmlInfo = htmlInfo + "<br><center>Tfno: " + tfno + "</center>";
		}
		if (email != null) {
			htmlInfo = htmlInfo + "<br>E-mail: " + "<a href=\"mailto:" + email + "\">" + email + "</a>";
		}
		if (url != null)  	{
			htmlInfo = htmlInfo + "<br><center>web: " + "<a href=\"http://" + url + "\" target=\"_blank\">" + url + "</a></center>";
		}
		htmlInfo = htmlInfo + "</justify></center></div>";

		return htmlInfo;
	}
	


/*
Reservado para los servicios de geolocalización
*/

/* 
Se le pasa un string con la calle a buscar.
*/
function getGeoLoc (street)
{
	if (street.length > 2)
		{
			localizacion = humanizaLoc (street);
			
			var codigoPostal = 13200;
			var ciudad = "Manzanares";
			var provincia = "Ciudad Real";
			var pais = "Spain";
			
			var direccionCompleta = localizacion + " " + codigoPostal + " " + ciudad + " " + provincia + " " + pais;
			
				geocoder = new GClientGeocoder();
				geocoder.getLocations(direccionCompleta, function(response) {
					if (response.Status.code == G_GEO_SUCCESS) {
						place = response.Placemark[0];
						address = place.address;
						var commaPosition = address.indexOf(',',0);
						address = address.substring(0,commaPosition);
						point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
						map.clearOverlays();
						var marker = new GMarker(point);
						GEvent.addListener(marker, "click", function() {
								marker.openInfoWindowHtml(address);
								});
						map.addOverlay(marker); 
						map.panTo(point);
						map.setCenter(point, zoomInicial);
						
						infoDiv("Resultado: " + address);
		
					}
					else {
						
						if (getGeoLocLatLng(street)) {
								//Esto ocurre si se ha encontrado un punto metido a mano
								//que no existe en el geolocalizador de google
						}
						else {
								infoDiv("No se ha podido recuperar la dirección:\n" + street);
			
								//probamos a llamar al script de php para escribir el log para comprobar si nos falta por meter alguna calle
								doAjax('../../php/logwriter.php','errorMap=' + street,'makeNull','get','0');
						}
						
					}
				});
		}
	else {
			infoDiv("Debe escribir un nombre válido de calle.");
			//alert ("Debe escribir un nombre válido de calle.");
	}
}

/*
Cambio valores conocidos en el pueblo, por valores válidos en el geolocalizador
*/
function humanizaLoc (street) {

	normalizaLoc (street);

	var entrada = new Array();
	var salida = new Array();	
	entrada[0] = 'empedrada';
	salida[0] = 'emperadors';
	 
	entrada[1] = 'divina';
	salida[1] = 'camino ancho';
	 
	entrada[2] = 'nuevo';
	salida[2] = 'virgen de fatima';	 	 
	
	entrada[3] = 'pradillo';
	salida[3] = 'monjas';	
	
	entrada[4] = 'cabilas';
	salida[4] = 'isaac peral';	

	entrada[5] = 'asuncion';	 
	salida[5] = 'plaza constitución';	 	

	entrada[6] = 'feria';
	salida[6] = 'cristobal colón';	 	

	entrada[7] = 'ayuntamiento';
	salida[7] = 'plaza constitución';	

	entrada[8] = 'poligono';
	salida[8] = 'calle I';
	
	entrada[9] = 'asturias';
	salida[9] = 'cristobal colón';

	entrada[10] = 'lanza';
	salida[10] = 'oaros';

	entrada[11] = 'daimiel';
	salida[11] = 'duleiz';
	
	entrada[12] = 'libia';
	salida[12] = 'maestra de liera';

	entrada[13] = 'piña';
	salida[13] = 'cipres';
	
	entrada[14] = 'palomas';
	salida[14] = 'plaza constitución';	

	entrada[15] = 'camarena';
	salida[15] = 'clérigos camarenas';
	
	for (i=0;i<entrada.length;i++)
		{
			if (street.toLowerCase().search(entrada[i]) != -1)
				{
					street = salida[i];
				}
		}
	return (street);	
}


/*
En caso de no encontrarse en el geolocalizador pero existir, tratamos
de introducir sus coordenadas a mano.
*/
function getGeoLocLatLng (street)
{
	street = normalizaLoc (street);
	
	var latLoc;
	var lngLoc;
	
	
	switch (street) {

	case 'isla verde':
			latLoc = "38.992238";
			lngLoc = "-3.379111";
       break

    case 'vega azuer':
			latLoc = "38.99017";
			lngLoc = "-3.373597";
       break

    case 'roberto muñoz':
			latLoc = "39.006061";
			lngLoc = "-3.368493";
       break

    case 'pineda':
			latLoc = "38.992891";
			lngLoc = "-3.377218";
       break
	   
    case 'maria pineda':
			latLoc = "38.992891";
			lngLoc = "-3.377218";
       break

    case 'cordoba':
			latLoc = "38.993722";
			lngLoc = "-3.378468";
		break

    case 'paseo cordoba':
			latLoc = "38.993722";
			lngLoc = "-3.378468";
       break

    case 'espigadoras':
			latLoc = "38.992832";
			lngLoc = "-3.369171";
       break

    case 'maria zambrano':
			latLoc = "38.995220";
			lngLoc = "-3.365050";
       break

	default:
		return false;

	} 
	
	map.clearOverlays();
	var coordenadas = new GLatLng (latLoc,lngLoc);
	var marker = new GMarker(coordenadas);
	marker.setPoint(coordenadas);
	map.addOverlay(marker);
	map.panTo(coordenadas);	

	infoDiv("No encontrado: " + street + ". Se muestra punto aproximado.");
	return true;	
				
}

// Elimina caracteres conflictivos para hacer la búsqueda limpia
function normalizaLoc (street)
{
	street = street.toLowerCase();
	street = street.replace(/(á|à|â|ä)/gi,'a'); 
	street = street.replace(/(é|è|ê|ë)/gi,'e'); 
	street = street.replace(/(í|í|î|ï)/gi,'i');
	street = street.replace(/(ó|ó|ô|ö)/gi,'o');
	street = street.replace(/(ú|ú|û|ü)/gi,'u');

	return (street);

}







/*
Reservado para funciones relacionadas con las rutas y archivos kml o kmz
*/

/*	
function getActivesKml ()
	{
		var descripcionRuta = new Array();
		var archivoRuta = new Array ();
		
		descripcionRuta[0] = 'Cabalgata de Reyes 2008';
		archivoRuta[0] = 'CabalgataReyes.kml';
		
		
		
		
	}*/


// Añade una ruta basada en un archivo kml
function addKml(kmlFile)
	{
		archivoKml = urlRutas + kmlFile
		var gx = new GGeoXml(archivoKml);
		map.setCenter(gx.getDefaultCenter(),(zoomInicial - 1));
		map.addOverlay(gx);
		gx.gotoDefaultViewport(map);
		infoDiv("");
	}

// Limpia una ruta y añade otra
function chgKml(kmlFile)
	{
		archivoKml = urlRutas + kmlFile
		map.clearOverlays();
		var gx = new GGeoXml(archivoKml);
		map.setCenter(gx.getDefaultCenter(),(zoomInicial - 1));
		map.addOverlay(gx);
		gx.gotoDefaultViewport(map);
		infoDiv("");			
		
	}
		