
/**
 * Modulo de buscador con Google Maps
 */
var maps = (function(){
	
	/**
	 * Constante con el nombre del campo de localizacion
	 * @private
	 * @type String
	 */
	var CAMPO_LOCALIZACION = 'localizacion';
	
	/**
	 * Interface publica del modulo
	 * @private
	 * @type Object
	 */
	var self = {};
	
	/**
	 * Instancia del mapa
	 * @private
	 * @type google.maps.Map
	 */
	var map = null;
	
	/**
	 * Listado de markers del mapa
	 * @private
	 * @type Array
	 */
	var markers = [];
	
	/**
	 * Listado de las coordenadas de los markers
	 * @private
	 * @type Array
	 */
	var markerLocations = [];
	
	/**
	 * Venta con la informacion de cada resultado
	 * @private
	 * @type google.maps.Marker
	 */
	var infoWindow = null;
	
	var locationMarker = null;
	
	/**
	 * Metodo que elimina todos los marcadores del mapa
	 * @method
	 * @private
	 */
	function clearMarkers() {
		
		for (var i = 0, longMarkers = markers.length; i < longMarkers; i++) {
			markers[i].setMap(null);
		}
		
		markers = [];
		markerLocations = [];
	};
	
	/**
	 * Metodo de inicializacion de mapSearch
	 * @method
	 * @public
	 * 
	 * @param params Parametros de inicializacion:
	 * 				{
	 * 					'container': $('')	-	Contenedor del mapa
	 * 					'location': {'lat': xxxxxx, 'long': xxxxx} - Coordenadas iniciales del mapa
	 * 					'zoom': 8
	 * 				}
	 * 
	 * @returns
	 */
	self.init = function(params) {
		
		if (!params.container) {
			throw new Error('Container is not defined!');
		}
		
		var options = {
			'mapTypeId': google.maps.MapTypeId.ROADMAP,
			'scrollwheel': false
		};
		
		if (params.location) {
			var center = new google.maps.LatLng(params.location.lat, params.location.long);
			
			options['center'] = center;
		}
		
		if (params.zoom) {
			options['zoom'] = params.zoom;
		}
		
		if (params.geolocate) {
			
			self.locate();
		}
		
		
		map = new google.maps.Map(params.container, options);
		
		infoWindow = new google.maps.InfoWindow({ 'content': '' });
	};
	
	/**
	 * Metodo que carga los datos del buscador
	 * @method
	 * @public
	 */
	self.loadData = function(params) {
		
		if (params.loading) {
			$(params.loading).show();
		}
		
		$.ajax({
			url: params.url,
			data: params.data,
			dataType: 'json',
			success: function(data){
			
				if (data.length <= 0 && params['empty']) {
					params['empty']();
				}
			
				self.showResult(data, params.template);
			},
			error: function(jXhr, status, error){
				alert(error);
			},
			complete: function() {
				if (params.loading) {
					$(params.loading).hide();
				}
			}
		});
	};
	
	/**
	 * Metodo que carga una serie de datos en el mapa de google usando una plantilla de jQuery para el contenido de la infoWindow
	 * @method
	 * @public
	 * 
	 * @param data
	 * @param template
	 */
	self.showResult = function(data, template) {
		
		clearMarkers();
		
		var html = '';
		var location;
		var img;
		
		for (var i = 0, longData = data.length; i < longData; i++) {
			
			location = new google.maps.LatLng(data[i][CAMPO_LOCALIZACION]['x'],data[i][CAMPO_LOCALIZACION]['y']);
			
			html = $('<div></div>').append(template.tmpl(data[i])).html();
			
			markerLocations[i] = location;
			
			markers[i] = new google.maps.Marker({
			    position: location,
			    map: map,
			    title: data[i]['name'],
			    text: html
			});

			google.maps.event.addListener(markers[i], 'click', function() {
				
				infoWindow.setContent(this.text);
				infoWindow.open(map, this);
			});
		}
		
		//Ajustamos el mapa para que se vean todos los markers
		var bounds = new google.maps.LatLngBounds();
		
		for (var i = 0, longMarkerLocations = markerLocations.length; i < longMarkerLocations; i++) {
			bounds.extend(markerLocations[i]);
		}
		
		map.fitBounds(bounds);
	};
	
	/**
	 * Metodo que intenta localizar el usuario en el mapa mediante html5
	 * @method
	 * @public
	 */
	self.locate = function(address) {
		
		if (locationMarker) {
			locationMarker.setMap(null);
		}
		
		if (address) {

			var geocoder = new google.maps.Geocoder();
			geocoder.geocode({ 'address': address}, function(results, status) {
		      
				if (status == google.maps.GeocoderStatus.OK) {
					
					map.setCenter(results[0].geometry.location);
					map.setZoom(15);
					
					locationMarker = new google.maps.Marker({
						map: map, 
						position: results[0].geometry.location
					});
				} else {
					alert("Non se puido atopar a dirección indicada");
				}
		    });
			
		} else {
			if(navigator.geolocation) {
				
				 navigator.geolocation.getCurrentPosition(function(position) {
					 
						 var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

						 map.setCenter(pos);
						 map.setZoom(15);
						 
						 locationMarker = new google.maps.Marker({
							map: map, 
							position: pos
						});
						 
				 	}, function() {
				 		alert('Ocorreu un error o recuerar a localización');
				    });
				
			} else {
				alert('Erro! o teu navegador non soporta a xeolocalización.');
			}
		}
		
	};
	
	//Devolvemos el interface publico dle modulo
	return self;
	
})();
