/**
 * @author Julián Solanas
 * Canarias7 Digital
 */

var jgmap = jQuery.extend({
	
	// Indica si el mapa esta iniciado
	start : false,
	
	// Id de la capa del mapa
	map_id : 'gmap',

	// Objeto del mapa
	map :  null,
	
	// Latitud actual
	latitud : 28.1248227,
	
	// Longitud actual
	longitud : -15.4300065,
	
	// Zoom actual
	zoom : 13,
	
	// Icono del Marker
	icon_marker : null,
	
	// Tipo de mapa
	tipo : G_HYBRID_MAP,

	// Inicio el mapa
	init : function() {
		
		if (GBrowserIsCompatible()) {
			
			// Inicio el mapa
			jgmap.map = new GMap2(document.getElementById(jgmap.map_id));
			
			// Establezco las coordenadas y el zoom
			jgmap.map.setCenter(new GLatLng(jgmap.latitud, jgmap.longitud), jgmap.zoom);
			
			// Establezco el tipo de mapa
			jgmap.map.setMapType(jgmap.tipo);
			
		}
		
		jgmap.start = true;
		
		// Bindeo para que se quite la carga del mapa al cerrar la pagina
		jQuery(document).unload(function(){
		    
			GUnload();
		    
		});
		
	},
	
	// Establezco el icono del marcador
	setIconMarker : function(icono, iconow, iconoh, sombra, sombraw, sombrah) {

			// Defino el icono del marker
			jgmap.icon_marker = new GIcon();
			jgmap.icon_marker.image=icono;
			jgmap.icon_marker.iconSize = new GSize(iconow,iconoh);
			if (sombra) {
				jgmap.icon_marker.shadow = sombra;
				jgmap.icon_marker.shadowSize = new GSize(sombraw, sombrah);
			}
			jgmap.icon_marker.iconAnchor = new GPoint(iconow/2,iconoh); 
			jgmap.icon_marker.infoWindowAnchor = new GPoint(iconow/2,0);

	},
	
	//
	// Indico el tipo de mapa a mostrar, puede ser:  
	// 
	// 		* G_NORMAL_MAP: la vista predeterminada.
	// 		* G_SATELLITE_MAP: imágenes de satélite de Google Earth.
	// 		* G_HYBRID_MAP: mezcla de vistas normales y de satélite.
	// 		* G_DEFAULT_MAP_TYPES: una mezcla de estos tres tipos, útil para un procesamiento repetitivo.
	// 
	//
	setMapType: function(tipo) { jgmap.tipo = tipo; },
	
	
	// Añado alguno de los controles predeterminados, puede ser:
	//
	//		* GSmallMapControl(): Crea un control con botones para hacer desplazamientos en cuatro direcciones y para acercar y alejar la imagen.
	//		* GLargeMapControl(): Crea un control con botones para hacer desplazamientos en cuatro direcciones y para acercar y alejar la imagen, así como una barra deslizante para usar el acercamiento.
	//		* GSmallZoomControl(): Crea un control con botones para acercar y alejar la imagen.
	//		* GScaleControl(): Crea un control que muestra la escala del mapa.
	//		* GMapTypeControl(): 	Crea un control de tipo de mapa estándar para seleccionar tipos de mapas admitidos y pasar de uno a otro a través de botones.
	//		* GMenuMapTypeControl(): 	Crea un control de tipo de mapa desplegable para pasar de un tipo de mapa admitido a otro.
	//		* GHierarchicalMapTypeControl(): Crea un control de tipo de mapa "anidado" para seleccionar tipos de mapas admitidos y pasar de uno a otro a través de botones y casillas de verificación anidadas.
	//		* GOverviewMapControl(): Crea una vista general de minimapa de resumen plegable en la esquina del mapa principal que se puede usar como ubicación de referencia y para navegar (arrastrando el cursor). GOverviewMapControl crea una vista general del mapa con un borde negro de un píxel.
	addControl: function(tipo) {
		
		if (jgmap.start) {
			
			switch (tipo) {
				
				case 'GSmallMapControl':
				jgmap.map.addControl(new GSmallMapControl());
				break;
				
				case 'GLargeMapControl':
				jgmap.map.addControl(new GLargeMapControl());
				break;
				
				case 'GSmallZoomControl':
				jgmap.map.addControl(new GSmallZoomControl());
				break;
				
				case 'GScaleControl':
				jgmap.map.addControl(new GScaleControl());
				break;
				
				case 'GMapTypeControl':
				jgmap.map.addControl(new GMapTypeControl());
				break;
				
				case 'GMenuMapTypeControl':
				jgmap.map.addControl(new GMenuMapTypeControl());
				break;
				
				case 'GHierarchicalMapTypeControl':
				jgmap.map.addControl(new GHierarchicalMapTypeControl());
				break;
				
				case 'GOverviewMapControl':
				jgmap.map.addControl(new GOverviewMapControl());
				break;
					
				}
				
				
			}
		
	},
	
	captureClickToFields : function (latitud_field, longitud_field, zoom_field, marker) {
		
		// Bindeo el click para obtener las coordenadas y añadir la marca
		GEvent.addListener(jgmap.map, "click", function(source,event) {
			
			// Obtengo las coordenadas y el zoom del punto marcado
			if (event) {
				jgmap.latitud = event.lat();
				jgmap.longitud = event.lng();
				jgmap.zoom = jgmap.map.getZoom();
			}
			
			if (marker) {
				
				// Limpio las marcas puestas
				jgmap.map.clearOverlays();
				
				// Añado la nueva marca en el nuevo punto
				var marca = new GMarker(new GLatLng(jgmap.latitud, jgmap.longitud), {
					dragCrossMove: true,
					clickable: false,
					icon: jgmap.icon_marker
				});
				
				jgmap.map.addOverlay(marca);
				
			}
			
			// Actualizo los campos
			$(latitud_field).val(jgmap.latitud);
			$(longitud_field).val(jgmap.longitud);
			$(zoom_field).val(jgmap.zoom);
			
		});
		
		
		// Bindeo el zoom para actualizar los campos
		GEvent.addListener(jgmap.map, "zoomend", function(source,event) {
			
			// Obtengo las coordenadas y el zoom del punto marcado
			if (event) {
				jgmap.zoom = jgmap.map.getZoom();
			}
			
			// Actualizo los campos
			$(zoom_field).val(jgmap.zoom);
			
		});
			
	},
	
	search: function(text, button){
	
		// Bindeo el buscador
		$(button).click(function(){
		
			// Defino la variable localizadora
			var geocoder = new GClientGeocoder();
			
			// Direccion que contiene el texto a buscar
			var address = $(text).val();
			
			// Reseto la variable de localizacion
			geocoder.reset();
			
			// Localizo la busqueda y la muestro
			geocoder.getLatLng(address, function(event){
			
				// Controlo si se han producido resultados
				if (!event) {
				
					alert("Imposible localizar: " + address);
					
				} else {
				
					// Centro el mapa en las coordenadas encontradas
					jgmap.map.setCenter(event, jgmap.map.getZoom());
					
					// Obtengo las coordenadas y el zoom del punto marcado
					if (event) {
						jgmap.latitud = event.lat();
						jgmap.longitud = event.lng();
						jgmap.zoom = jgmap.map.getZoom();
					}
					
					// Limpio las marcas puestas
					jgmap.map.clearOverlays();
					
					// Añado la nueva marca en el nuevo punto
					var marca = new GMarker(new GLatLng(jgmap.latitud, jgmap.longitud), {
						dragCrossMove:true, 
						icon: jgmap.icon_marker
					});
					
					jgmap.map.addOverlay(marca);
					
					// Añado la informacion
					marca.openInfoWindowHtml("<b>Localización:</b><br>" + address);
					marca.bindInfoWindowHtml("<b>Localización:</b><br>" + address);
					
					// Actualizo los campos
					$("input[name='latitud']").val(jgmap.latitud);
					$("input[name='longitud']").val(jgmap.longitud);
					$("input[name='zoom']").val(jgmap.zoom);
					
				}
				
			});
			
		});
			
	},
	
	searchMultiple: function(button, text){
	
		// Bindeo el buscador
		$(button).click(function(){
			
			// Defino la variable localizadora
			var geocoder = new GClientGeocoder();
			
			// Direccion que contiene el texto a buscar
			var address = '';
			
			cuantos = text.length;
			for (i=0; i<cuantos; i=i+1) {
				
				if ($(text[i]).val()) {
					if (address == '') {
						address = $(text[i]).val();
					}
					else {
						address = address + ',' + $(text[i]).val();
					}
				}
					
			}
			//var address = $(text[0]).val() + ',' + $(text[1]).val() + ',' + $(text[2]).val() + ',' + $(text[3]).val() + ',' + $(text[4]).val() + ',' + $(text[5]).val();
			
			
			
			if (!address) return;
			
			// Reseto la variable de localizacion
			geocoder.reset();
			
			// Localizo la busqueda y la muestro
			geocoder.getLatLng(address, function(event){
			
				// Controlo si se han producido resultados
				if (!event) {
				
					alert("Imposible localizar: " + address);
					
				} else {
				
					// Centro el mapa en las coordenadas encontradas
					jgmap.map.setCenter(event, jgmap.map.getZoom());
					
					// Obtengo las coordenadas y el zoom del punto marcado
					if (event) {
						jgmap.latitud = event.lat();
						jgmap.longitud = event.lng();
						jgmap.zoom = jgmap.map.getZoom();
					}
					
					// Limpio las marcas puestas
					jgmap.map.clearOverlays();
					
					// Añado la nueva marca en el nuevo punto
					var marca = new GMarker(new GLatLng(jgmap.latitud, jgmap.longitud), {
						dragCrossMove:true, 
						icon: jgmap.icon_marker
					});
					
					jgmap.map.addOverlay(marca);
					
					// Añado la informacion
					marca.openInfoWindowHtml("<b>Localización:</b><br>" + address);
					marca.bindInfoWindowHtml("<b>Localización:</b><br>" + address);
					
					// Actualizo los campos
					$("input[name='latitud']").val(jgmap.latitud);
					$("input[name='longitud']").val(jgmap.longitud);
					$("input[name='zoom']").val(jgmap.zoom);
					
				}
				
			});
			
		});
			
	},
	
	addMarker : function(latitud, longitud, infoWindow) {
		
		// Si existe infoWindow sera clickable sino no
		clickable = false;
		if (infoWindow) {
			clickable = true;
		}
		
		// Añado la nueva marca en el nuevo punto
		var marca = new GMarker(new GLatLng(latitud,longitud),{
			dragCrossMove:true,
			clickable: clickable,
			icon:jgmap.icon_marker
		});
		jgmap.map.addOverlay(marca);
		
		
		// Bindeo la ventana con la informacion de la marca
		if (infoWindow) {
			marca.bindInfoWindowHtml(infoWindow);
		}
			
	}
		

}, jgmap);
