var wta = {};

wta.languages = {
	'it': {
		'struttura' 	: 'Struttura',
		'descrizione'	: 'Descrizione',
		'servizi'		: 'Servizi'
	},
	
	'en': {
		'struttura' 	: 'Struttura',
		'descrizione'	: 'Beschreibung',
		'servizi'		: 'Dienste'
	},
	
	'de': {
		'struttura' 	: 'Accomodation',
		'descrizione'	: 'Description',
		'servizi'		: 'Services'
	}
};

wta.mainMap = function(){
	// PRIVATE VARIABLES
	
	var objMapping = {};
		// Map default values
		objMapping.mapDiv = null;
		objMapping.map = null;
		objMapping.mapWidth = null;
		objMapping.mapHeight = null;
		objMapping.scrollWheelZoom = false;
		
		// MAP Loader Infos
		objMapping.loaderInfoContainer = null;
		objMapping.loaderInfo = null;
		
		// Map Zoom Values
		objMapping.zoomMin = 8;
		objMapping.zoomMax = 12;
		objMapping.startZoom = 8;

		// Map url & Geocoder
		objMapping.url = null;
		objMapping.geocoder = null;

		// Map KML
		objMapping.gkml = null;

		// Map managers, bounds and overlays
		objMapping.mgr = null;
		objMapping.bounds = null;
		objMapping.overlays = [];

		// Map markers
		objMapping.markers = [];
		objMapping.myMarkers = [];
		objMapping.currentMarker = null;
		objMapping.defaultIcon = null;
		
		// Map type
		objMapping.mapType = null;
		
		// Preload ICONS
		var ps = document.createElement('img');
		$(ps).attr('src', 'http://www.agriturismo-nelle-marche.it/assets/images/pin.png')
		
		var pp = document.createElement('img');
		$(pp).attr('src', 'http://www.agriturismo-nelle-marche.it/assets/images/pin_prod.png')
		
		var pa = document.createElement('img');
		$(pa).attr('src', 'http://www.agriturismo-nelle-marche.it/assets/images/pin_agri.png')
		
		var pc = document.createElement('img');
		$(pc).attr('src', 'http://www.agriturismo-nelle-marche.it/assets/images/pin_country.png')
		
		var pb = document.createElement('img');
		$(pb).attr('src', 'http://www.agriturismo-nelle-marche.it/assets/images/pin_bb.png')

		
	// PRIVATE FUNCTIONS
	
	/* Load API 
	---------------------------------------------------*/
	function _apiload(url, startZoom){
		//google.load("maps","2.94");
		google.load("maps","2.95", {"language" : "it"});
		google.setOnLoadCallback(_buildMap);		
		// Variabili necessarie alla mappa di dettaglio
		if(url){ objMapping.url = url; }
		if(startZoom){ objMapping.startZoom = startZoom; }
	}
	
	/* Initializalize map 
	---------------------------------------------------*/
	function _buildMap(){
		
		$(document).ready(function(){
		
			// Attivo il management dei form di ricerca semplice e avanzata
			wta.manageSearchForm.init('#simpleSearch');
			wta.manageSearchForm.init('#advancedSearch');
			
			// Inizio il processing della mappa
			objMapping.mapWidth = $('#map').width();
			objMapping.mapHeight = $('#map').height();
			
			if (GBrowserIsCompatible()) {
							
				objMapping.mapDiv = document.getElementById('map');
				objMapping.map = new google.maps.Map2(objMapping.mapDiv, {size: new google.maps.Size(objMapping.mapWidth,objMapping.mapHeight) });
				objMapping.geocoder = new google.maps.ClientGeocoder();
						
				
				objMapping.map.setCenter(new google.maps.LatLng(43.027374,13.844061), 8);
				
				//add map type
				objMapping.map.addMapType(G_PHYSICAL_MAP);
				//set map type
				objMapping.map.setMapType(G_PHYSICAL_MAP);
				//add controls
				objMapping.map.addControl(new google.maps.SmallMapControl());
				//objMapping.map.addControl(new google.maps.LargeMapControl());
				objMapping.map.addControl(new google.maps.HierarchicalMapTypeControl());		
				
				//enable scroll wheel zoom
				if(objMapping.scrollWheelZoom === true){
					objMapping.map.enableScrollWheelZoom();	
				}
				
				// Creo l'icona di base
				var baseIcon = new google.maps.Icon(G_DEFAULT_ICON);
				baseIcon.iconSize = new google.maps.Size(20,20);
				baseIcon.shadowSize = new google.maps.Size(0,0);
				baseIcon.iconAnchor = new google.maps.Point(11,21);
				baseIcon.infoWindowAnchor = new google.maps.Point(13, 2);
	
				objMapping.struttureIcon = new google.maps.Icon(baseIcon, "http://www.agriturismo-nelle-marche.it/assets/images/pin.png");
				objMapping.produttoriIcon = new google.maps.Icon(baseIcon, "http://www.agriturismo-nelle-marche.it/assets/images/pin_prod.png");
				objMapping.agriIcon = new google.maps.Icon(baseIcon, "http://www.agriturismo-nelle-marche.it/assets/images/pin_agri.png");
				objMapping.countryIcon = new google.maps.Icon(baseIcon, "http://www.agriturismo-nelle-marche.it/assets/images/pin_country.png");
				objMapping.bbIcon = new google.maps.Icon(baseIcon, "http://www.agriturismo-nelle-marche.it/assets/images/pin_bb.png");
				
				// faccio il setup del loader
				_createLoader();
				
				// carico XML 
				if(objMapping.url != null){
					_loadInitXml();
				}
				
				
			}
			
		});
	}
	/* Load INIT XML
	---------------------------------------------------*/
	function _loadInitXml(){
		_showLoaderInfo('carico i dati...');
		$.ajax({
			 type: "GET",
			 url: objMapping.url,
			 dataType: "xml",
			 success: _setupMarkers
		 }); 
	}
	
	/* Load custom XML
	---------------------------------------------------*/
	function _loadCustomXml(url){
		_showLoaderInfo('carico i dati...');
		$.ajax({
			 type: "GET",
			 url: url,
			 dataType: "xml",
			 success: _setupMarkers(url, overlay)
		 }); 
	}
	
	/* Setup Markers
	---------------------------------------------------*/
	function _setupMarkers(xml){
		objMapping.bounds = new google.maps.LatLngBounds(null);	
		objMapping.mapType = $(xml).find('markers').eq(0).attr('type');
		
		$(xml).find('marker').each(function(){
		
			var marker = {};
			var lat = $(this).find('lat').text();
			var lng = $(this).find('lng').text();
			
			switch(objMapping.mapType){
				case 'strutture':  marker = _buildStruttureMarker(this);
				break;
				
				case 'produttori': marker = _buildProduttoriMarker(this);
				break;
				
				default: alert('mapType non supportato'); return false;
			}
			// No LAT or LONG Escape function
			if((lat != "") && (lng != "")){
				var m = new google.maps.Marker(marker.point, {icon: marker.icon, title: marker.makerTitle});
				google.maps.Event.addListener(m, "click", function() {
					m.openInfoWindowTabsHtml(marker.tabs);
					objMapping.currentMarker = m;
				});
				marker.Gmarker = m;
				objMapping.markers.push(m);
				objMapping.myMarkers.push(marker);
				
				objMapping.bounds.extend(marker.point);
			}
			
		});  		
  		//_buildMap();
  		// Place markers
		_placeMarkers();
	}
	/* Build Marker Strutture
	---------------------------------------------------*/
	function _buildStruttureMarker(xml){
		
		var lat = $(xml).find('lat').text();
		var lng = $(xml).find('lng').text();
		
		// Marker
		var marker = {};
		marker.entryId = $(xml).find('entry').text();
		marker.point = new google.maps.LatLng(lat,lng);
		marker.title = $(xml).find('title').text();
		marker.category = $(xml).find('category').text() ? $(xml).find('category').text() : null;
		marker.detailpath = $(xml).find('detailpath').text();
		//marker.makerTitle = $(xml).find('markerTitle').text();
		marker.description = $(xml).find('description').text();
		marker.address = $(xml).find('address').text();
		marker.prices = $(xml).find('prices').text();
		marker.services = $(xml).find('services').text();
		marker.images = [];
		marker.gallery = $(xml).find('gallery').find('image').each(function(){marker.images.push($(this).text())});
		marker.thumbnail = $(xml).find('thumbnail').text();
		
		// Assign an icon to marker according with its category
		switch(marker.category) {
			case "5":
				marker.icon = objMapping.agriIcon;
				break;
			case "10":
				marker.icon = objMapping.bbIcon;
				break;
			case "13":
				marker.icon = objMapping.countryIcon;
				break;
			default:
				marker.icon = objMapping.struttureIcon;
				break;
		}
		
		// Marker Html		
		marker.galleryHtml = function(){ 
			var galleryString = '';
			$(marker.images).each(function(){
				galleryString += this;
			})
			return galleryString;
		}();
		marker.titleHtml = new google.maps.InfoWindowTab(wta.languages.it.struttura, _wrapHtmlContent(marker.title + "<p>" + marker.address + "<br />" + marker.prices + "<br /><a href=\""+ marker.detailpath +"\" class=\"detailOpener\">Dettagli</a></p>" + "<p><br />" + marker.galleryHtml + "</p>"));
		//marker.descriptionHtml = new google.maps.InfoWindowTab('Descrizione', _wrapHtmlContent(marker.description));
		//marker.servicesHtml = new google.maps.InfoWindowTab('Servizi', _wrapHtmlContent(marker.services));
		
		// Intercetto i click sulle immagini di galleria
		$(marker.galleryHtml).find('a.google').click(function(){
			return false;
		})
		
		// TABS
		//marker.tabs = [marker.titleHtml,marker.descriptionHtml,marker.servicesHtml];
		marker.tabs = [marker.titleHtml];

		return marker;
	
	}
	/* Build Marker Produttori
	---------------------------------------------------*/
	function _buildProduttoriMarker(xml){
	
		var lat = $(xml).find('lat').text();
		var lng = $(xml).find('lng').text();
		
		// Marker
		var marker = {};
		marker.entryId = $(xml).find('entry').text();
		marker.point = new google.maps.LatLng(lat,lng);
		marker.title = $(xml).find('title').text();
		marker.detailpath = $(xml).find('detailpath').text();
		marker.makerTitle = $(xml).find('markerTitle').text();
		marker.description = $(xml).find('description').text();
		marker.address = $(xml).find('address').text();
		marker.orario = $(xml).find('orario').text();		
		
		marker.icon = objMapping.produttoriIcon;
		
		marker.titleHtml = new google.maps.InfoWindowTab('Produttore', _wrapHtmlContent(marker.title + "<p>" + marker.address + "<br />" + marker.prices + "<br /><a href=\""+ marker.detailpath +"\" class=\"detailOpener\">Dettagli</a></p>" + "<p><br />" + marker.orario + "</p>"));
		marker.descriptionHtml = new google.maps.InfoWindowTab('Descrizione', _wrapHtmlContent(marker.description));
				
		// Intercetto i click sulle immagini di galleria
		$(marker.galleryHtml).find('a.google').click(function(){
			return false;
		})
		
		// TABS
		marker.tabs = [marker.titleHtml,marker.descriptionHtml];

		return marker;
	
	}
	
	
	/* Place Markers
	---------------------------------------------------*/
	function _placeMarkers(){
		//var ov = new google.maps.Overlay();
		
		/*** Problema marker manager da risolvere ***/
		/*objMapping.mgr = new google.maps.MarkerManager(objMapping.map);
  		objMapping.mgr.addMarkers(objMapping.markers, objMapping.zoomMin);   
  		objMapping.mgr.refresh();*/
  		
  	//BEGIN Workaround
  	for(i=0; i < objMapping.markers.length; i++){
			objMapping.map.addOverlay(objMapping.markers[i]);
		}
		//END workaround
  	
  	// centro la mappa
  	objMapping.map.setCenter(objMapping.bounds.getCenter(),objMapping.startZoom);
  		setTimeout(_hideLoaderInfo, 2000);
		}
	
	/* Wrap Html Content
	---------------------------------------------------*/ 
	function _wrapHtmlContent(html){
		html = "<div class=\"googleTabContainer\">" + html + "</div>";
		return html;
	}
	
	/* Remove Markers Overlay
	---------------------------------------------------*/ 
	function _clearMarkersOverlay(){
		if(objMapping.markers.length > 0){
			for(i=0; i < objMapping.markers.length; i++){
				objMapping.map.removeOverlay(objMapping.markers[i]);
			}
			objMapping.markers = new Array();
			objMapping.myMarkers = new Array();
			
		} else {
			//alert('Problema a rimuovere i marker');
		}
	}
	
	/* Validate XML
	---------------------------------------------------*/ 
	function _validateXml(xml){
		if($(xml).find('marker').length > 0){
			return true;
		} else {
			_showLoaderInfo('La ricerca non ha restituito risultati');
			setTimeout(_hideLoaderInfo, 2000);
			return false;
		}
	}
	/* Create Loader 
	---------------------------------------------------*/ 
	function _createLoader(){
		objMapping.loaderInfoContainer = document.createElement('div');
		$(objMapping.loaderInfoContainer).attr('id', 'mapLoaderContainer');
		
		objMapping.loaderInfo = document.createElement('div');
		$(objMapping.loaderInfo).attr('id', 'loadingInfo');
		
		// Nascondo gli elementi prima di appenderli
		$(objMapping.loaderInfoContainer).hide('fast');
		$(objMapping.loaderInfo).hide('fast');
		
		
		$('#mapwrapper').append(objMapping.loaderInfoContainer);
		$('#mapwrapper').append(objMapping.loaderInfo);
	}
	function _showLoaderInfo(msg){
		if(msg) $(objMapping.loaderInfo).html('<span>' + msg + '</span>');
		$(objMapping.loaderInfoContainer).show('fast');
		$(objMapping.loaderInfo).show('fast');
	}
	function _hideLoaderInfo(){
		$(objMapping.loaderInfoContainer).hide('fast');
		$(objMapping.loaderInfo).hide('fast');
	}
	
	
	// Public
	return {
		init: _apiload,
		objm: objMapping,
		
		traceMarkersArray: function(){
			console.dir(objMapping.markers);
		},
		traceMyMarkersArray: function(){
			console.dir(objMapping.myMarkers);
		},
		getCurrentMarker: function(){
			console.dir(objMapping.currentMarker);
		},
		simulateClick: function(i) {
			google.maps.Event.trigger(objMapping.markers[i], "click");
		},
		
		objMapping: objMapping,
		
		clearMarkersOverlay: _clearMarkersOverlay,
		
		showLoaderInfo: _showLoaderInfo,
		hideLoaderInfo: _hideLoaderInfo,
		
		injectXml: function(xml){
			_showLoaderInfo('Carico i risultati della ricerca...');
			if(_validateXml(xml)) {
				_clearMarkersOverlay();  
				_setupMarkers(xml); 
			}
		}
		
		
	}
}();

wta.manageSearchForm = function(){
	// PRIVATE
	function _init(idForm){
		// Qui va collgato il form al submit
		var f = $(idForm);
		$(f).submit(function(){
			wta.mainMap.showLoaderInfo('sto cercando...');
			//Prepariamo i dati del form per passarli alla pagina in cui saranno gestiti
			var serialData = $(f).serialize();
			var formUrl = $(f).attr('action');
			$.ajax({
				type: "POST",
				url: formUrl,
				data: serialData,
				success: _showSearchResult,
				error: function(){ alert("Si e' verificato un errore, riprova"); wta.mainMap.hideLoaderInfo(); }
			});

			return false;	
		});
	}
	
	function _showSearchResult(xml) {
		//Visualizziamo il risultato della ricerca in forma testuale
		if($('#home_strutture_evidenza').text() != "") //DIV nell'home page
			var rc = $('#home_strutture_evidenza');
		else if($('#dettaglio_struttura').text() != "") //DIV nella pagina di dettaglio struttura
			var rc = $('#dettaglio_struttura');
		else //DIV nella pagina di dettaglio struttura
			var rc = $('#res_ricerca_avanzata');
		var numStrutture = 0;
		var rcText = "";
		$(xml).find('marker').each(function(){
			rcText = rcText + "<div class=\"mainimage_text\">" + $(this).find('thumbnail').text() + "</div>";
			rcText = rcText + "<div class=\"maintext_lista_text\"><a style=\"color:black;text-decoration:none\" href=\"" +
				$(this).find('detailpath').text() + "\" target=\"_blank\">" +	$(this).find('description').text() +
				"</a><br /><em><span class=\"maintext_indirizzo_text\">" + $(this).find('address').text() +
				"<br />" + $(this).find('contacts').text() + "</span></em></div>";
			rcText = rcText + "<p style=\"border-bottom:1px solid #CCC;width:600px\"></p><br />";
			numStrutture++;
		});
		rc.html("<h2>Risultato ricerca (" + numStrutture + " elementi trovati)</strong>:</h2>" + rcText + "<br /><br />");

		//Visualizza il risultato della ricerca sulla mappa
		_injectXml(xml);
	}
	
	function _injectXml(xml){
		wta.mainMap.injectXml(xml);
	}

	return {
		init: function(idForm){_init(idForm);}
	}
}();
