/**
 * SOPORTE GOOGLE MAPS
 */
var _mapOptions, _map, _mapMini, _mapMobi, _mapContent, _oldInfoWindow;
var _image, _shadow, _imageMini, _shadowMini;
var _allMarkers = new Array(), _markerIndex = 0;
var _mapLink = '', _currentMarker;
var _markerContentLat = '', _markerContentLng = '';
var _directionsDisplay = null;
var _directionsService = null;
var _map_canvas_content, _dir_canvas_content;

/**
 * Función que inicializa google maps.
 */
function initGoogleMaps(_mapCanvas, _zoom, _streetViewControl) {

	_mapOptions = {
		zoom: _zoom,
		center: new google.maps.LatLng(40, -3.5),
		disableDoubleClickZoom: true,
		disableDefaultUI: false,
		streetViewControl: _streetViewControl,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		styles: [{
			featureType: "poi",
			elementType: "labels",
			stylers: [ { visibility: "off" } ]
		}]
	}

	var _mapObject = new google.maps.Map(_mapCanvas, _mapOptions);

	_image = new google.maps.MarkerImage(
		_rootWeb + '/imagenes/villastermales/gmarker.png',
		new google.maps.Size(20, 34),
		null,
		new google.maps.Point(10, 34)
	);

	_shadow = new google.maps.MarkerImage(
		_rootWeb + '/imagenes/villastermales/gmarker_shadow50.png',
		new google.maps.Size(37, 34),
		null,
		new google.maps.Point(10, 34)
	);

	_imageMini = new google.maps.MarkerImage(
		_rootWeb + '/imagenes/villastermales/gmarker_mini.png',
		new google.maps.Size(8, 14),
		null,
		new google.maps.Point(4, 14)
	);

	_shadowMini = new google.maps.MarkerImage(
		_rootWeb + '/imagenes/villastermales/gmarker_mini_shadow50.png',
		new google.maps.Size(14, 14),
		null,
		new google.maps.Point(4, 14)
	);

	return _mapObject;
}

/**
 * Función específica de inicialización para el mapa grande
 */
function initMap(_mapObject) {
	// Cuando hagamos click en el mapa cerramos la ventana
	// de información en caso de que haya alguna abierta
	google.maps.event.addListener(_mapObject, 'click', function() {
		if(_oldInfoWindow) _oldInfoWindow.close();
	});
}

/**
 * Función específica de inicialización para el mapa mini
 */
function initMapMini(_mapObject) {
	// Cuando cambiamos el nivel de zoom del mapa mostramos unos
	// iconos grandes si zoom > 5 o pequeños en caso contrario
	google.maps.event.addListener(_mapObject, 'zoom_changed', function() {
		for(_markerIndex = 0; _markerIndex < _allMarkers.length; _markerIndex++) {
			if(_mapObject.getZoom() > 5) {
				_allMarkers[_markerIndex].setIcon(_image);
				_allMarkers[_markerIndex].setShadow(_shadow);
			}
			else {
				_allMarkers[_markerIndex].setIcon(_imageMini);
				_allMarkers[_markerIndex].setShadow(_shadowMini);
			}
		}
	});
}

/**
 * Función que recupera y procesa todos los subcontenidos que contengan
 * los parámetros latitud y longitud, para posicionar en el mapa.
 */
function getMarkers(_mapObject, _processMarkers) {

	// Realizamos la petición ajax
	$.ajax({
		type: 'POST',
		url: _rootWeb+'/cm/kml',
		data: 'idContent=23', // Rama DESTINOS
		dataType: 'xml',
		success: function(kml) {
			_processMarkers(_mapObject, kml);
		}
	});
}

/**
 * Función específica que procesa los puntos de localización en el mapa grande
 */
function processMarkers(_mapObject, kml) {
	var kmlResp = $(kml).find("Document");
	if(kmlResp.size() > 0) {

		// Procesamos cada punto de localización del kml
		$("Placemark", kmlResp).each(function() {
			var _markerCoords, _markerLat, _markerLng, _markerLatLng = null;
			var _markerName = ($("name", this).size() > 0)?$("name", this).text():'';
			var _markerDescription = ($("description", this).size() > 0)?$("description", this).text():'';
			var _markerPoint = $("Point", this);

			if(_markerPoint.size() > 0) {
				_markerCoords = $("coordinates", _markerPoint);
				if(_markerCoords.size() > 0) {
					_markerCoords = _markerCoords.text();
					_markerLat = _markerCoords.split(',')[0];
					_markerLng = _markerCoords.split(',')[1];
					_markerLatLng = new google.maps.LatLng(_markerLat,_markerLng);
				}
			}

			// Si tenemos marcador lo creamos
			if(_markerLatLng != null) {

				 // Insertamos el marcador en el mapa
				_allMarkers[_markerIndex] = new google.maps.Marker({
					map: _mapObject,
					icon: _image,
					shadow: _shadow,
					position: _markerLatLng,
					title: _markerName
				});

				 // Creamos la capa de información del marcador
				var _infoWindow = new google.maps.InfoWindow({
					content: _markerDescription,
					pixelOffset: new google.maps.Size(2, 32),
					maxWidth: 320
				});

				 // Asociamos la capa de información con el evento onclick del marcador
				google.maps.event.addListener(_allMarkers[_markerIndex], 'click', function() {
					if(_oldInfoWindow) _oldInfoWindow.close();
					_oldInfoWindow = _infoWindow;
					_infoWindow.open(_mapObject, this);
				});

				_markerIndex++;
			}
		});
	}
}

/**
 * Función específica que procesa los puntos de localización en el mapa mini
 */
function processMarkersMini(_mapObject, kml) {
	var kmlResp = $(kml).find("Document");
	if(kmlResp.size() > 0) {

		// Procesamos cada punto de localización del kml
		$("Placemark", kmlResp).each(function() {
			var _markerCoords, _markerLat, _markerLng, _markerLatLng = null;
			var _markerName = ($("name", this).size() > 0)?$("name", this).text():'';
			var _markerDescription = ($("description", this).size() > 0)?$("description", this).text():'';
			var _markerPoint = $("Point", this);

			if(_markerPoint.size() > 0) {
				_markerCoords = $("coordinates", _markerPoint);
				if(_markerCoords.size() > 0) {
					_markerCoords = _markerCoords.text();
					_markerLat = _markerCoords.split(',')[0];
					_markerLng = _markerCoords.split(',')[1];
					_markerLatLng = new google.maps.LatLng(_markerLat,_markerLng);
				}
			}

			// Si tenemos marcador lo creamos
			if(_markerLatLng != null) {

				 // Insertamos el marcador en el mapa
				_allMarkers[_markerIndex] = new google.maps.Marker({
					map: _mapObject,
					icon: _imageMini,
					shadow: _shadowMini,
					position: _markerLatLng,
					title: _markerName
				});

				 // Asociamos la capa de información con el evento onclick del marcador
				google.maps.event.addListener(_allMarkers[_markerIndex], 'click', function() {
					location.href = $("a", _markerDescription).attr("href");
				});

				_markerIndex++;
			}
		});
	}
}

/**
 * Función específica de inicialización para el mapa del contenido
 */
function initMapContent(forceInit) {

	// Inicializamos el mapa del contenido si hace falta
	if(_map_canvas_content && _dir_canvas_content && !forceInit) return;

	_map_canvas_content = document.getElementById("map_canvas_content");
	_dir_canvas_content = document.getElementById("dir_canvas_content");

	if(_map_canvas_content && _markerContentLat != '' && _markerContentLng != '') {
		_mapContent = initGoogleMaps(_map_canvas_content, 14, true);
		var _markerLatLng = new google.maps.LatLng(_markerContentLat,_markerContentLng);
		var _markerName = $("#contentName").text();

		// Insertamos el marcador en el mapa
		_currentMarker = new google.maps.Marker({
			map: _mapContent,
			icon: _image,
			shadow: _shadow,
			position: _markerLatLng,
			title: _markerName
		});

		// Centramos el mapa en la posición del marcador
		_mapContent.setCenter(_markerLatLng, 14);
	}
}

/**
 * Calcula la ruta de destino a partir de una dirección de origen introducida
 */
function calcRoute() {
	if(!_map_canvas_content || !_dir_canvas_content) return;

	if(!_directionsDisplay || !_directionsService) {
		_directionsDisplay = new google.maps.DirectionsRenderer({draggable: true});
		_directionsService = new google.maps.DirectionsService();
	}

	var _startAddress = document.getElementById("startAddress").value;
	var _endAddress = _currentMarker.getPosition();
	var _dirRequest = {
		origin: _startAddress,
		destination: _endAddress,
		travelMode: google.maps.DirectionsTravelMode.DRIVING,
		unitSystem: google.maps.DirectionsUnitSystem.METRIC,
		provideRouteAlternatives: true
	};
	_directionsService.route(_dirRequest, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			showAddressPanel();
			_directionsDisplay.setMap(_mapContent);
			_directionsDisplay.setPanel(_dir_canvas_content);
			_directionsDisplay.setDirections(response);
		}
		else {
			alert("No se ha podido localizar la direcci\u00F3n de origen.");
		}
	});
}

/**
 * Muestra la capa de direcciones de la ruta encontrada y adapta los tamaños
 */
function showAddressPanel() {
	if(!_map_canvas_content || !_dir_canvas_content) return;

	$(_map_canvas_content).addClass("googleMapsRoute");
	$(_dir_canvas_content).show();
	$("#gmSearchResetButton").show();

	// Le indicamos al mapa que ha sido cambiado de tamaño
	google.maps.event.trigger(_mapContent, 'resize');
}

/**
 * Deja el mapa en su estado inicial
 */
function hideAddressPanel() {
	if(!_map_canvas_content || !_dir_canvas_content) return;

	$(_map_canvas_content).removeClass("googleMapsRoute");
	$(_dir_canvas_content).hide();
	$("#gmSearchResetButton").hide();

	initMapContent(true);
}

/**
 * Función que se ejecuta cuando carga la página y todos sus recursos
 */
$(window).load(function() {

	// Si existe mapa mini lo inicializamos
	var _map_canvas_mini = document.getElementById("googlemaps_mini");
	if(_map_canvas_mini) {
		var _mapMini = initGoogleMaps(_map_canvas_mini, 4, false);
		initMapMini(_mapMini);
		getMarkers(_mapMini, processMarkersMini);
	}


	// Si existe mapa para móvil, lo inicializamos
	var _map_canvas_mobi = document.getElementById("googlemaps_mobi");
	if(_map_canvas_mobi) {
		var _mapMobi = initGoogleMaps(_map_canvas_mobi, 5, false);
		initMap(_mapMobi);
		getMarkers(_mapMobi, processMarkers);
	}

	// Si existe mapa grande lo inicializamos
	var _map_canvas = document.getElementById("googlemaps");
	if(_map_canvas) {
		var _map = initGoogleMaps(_map_canvas, 6, true);
		initMap(_map);
		getMarkers(_map, processMarkers);
	}

});

