/* Copyright 2007-2008 SCube NewMedia. */
/** ============ COSTANTI ============= */
/** Constanti rappresnetanti i campi di ricerca sulla data */
var DATA = "quando_SEARCH";
var TYPE_POLYGON = "polygon";
var TYPE_MARKER = "marker";

/** Eventi/Emergenze */
var EMERGENZE_ATTIVE = "emergenze_attive";
var EMERGENZE_PASSATE = "emergenze_passate";
var EVENTI = "eventi";

/** Elementi di rischio */
var AZIENDE_RISCHIO_ART6 = "aziende_rischio_art6";
var AZIENDE_RISCHIO_ART8 = "aziende_rischio_art8";
var AREE_ESO_PIANIEMERGENZA = "aree_eso_pianiemergenza";
var AREE_ESONDAZIONE = "aree_esondazione";
var FASCIA_A = "fascia_a";
var FASCIA_B = "fascia_b";
var FASCIA_C = "fascia_c";
var RETE_OLEODOTTI = "rete_oleodotti";
var RISCHIO_IDR_ELEV = "rischio_idr_elev";
var PONTI_CRITICI = "ponti";
var SCALI_FS = "scali_fs";

/** Elementi vulnerabili */
var ASILI_NIDO = "asili_nido";
var SCUOLE_MATERNE = "scuole_materne";
var SCUOLE_ELEMENTARI  = "scuole_elementari";
var SCUOLE_MEDIE = "scuole_medie";
var SCUOLE_SUPERIORI = "scuole_superiori";
var UNIVERSITA = "universita";
var CASE_RIPOSO = "case_riposo";
var STRUTTURE_DISABILI = "strutture_disabili";
var CENTRI_DIURNI_ANZIANI  = "centri_diurni_anziani";
var STAZIONI_FERROVIARIE = "stazioni_ferroviarie";
var IPER_CENTRICOMM  = "iper_centricomm";
var CINEMA = "cinema";
var BIBLIOTECHE  = "biblioteche";
var CARCERI  = "carceri";

/** Risorse */
var MSB = "msb";
var OSPEDALI_PRINCIPALI = "ospedali_principali";
var CASE_DI_CURA_PICCOLI_OSPEDALI = "case_di_cura_piccoli_ospedali";
var CASERME_VVF  = "caserme_vvf";
var CASERME_CARAB = "caserme_carab";
var CASERME_POLIZIA = "caserme_polizia";
var CASERME_GFIN = "caserme_gfin";
var CASERME_GFOR = "caserme_gfor";
var CENTRI_PC = "centri_pc";
var AREE_AMMASSAMENTO = "aree_ammassamento";
var CASE_CANTONIERE = "case_cantoniere";
var PREFETTURA = "prefettura";
var SEDI_COM = "sedi_com";
var SALA_REGIONALE = "sala_regionale";
var ORGANIZZAZIONI_VOLONTARIATO = "organizzazioni_volontariato";
var MUNICIPI = "municipi";

/** Polizia provinciale */
var ZONE_POLIZIA = "zone_polizia";
var POLIZIA_PROVINCIALE = "polizia_provinciale";


/** Gestori form di ricerca */
var _emergernzeventi = null;
var _elementirischio = null;
var _elementivulnerabili = null;
var _risorse = null;

/** Definizione macrocategorie */
var MC_EMERGENZE_ALTRI_EVENTI = []; 
var MC_ELEMENTI_RISCHIO = []; 
var MC_ELEMENTI_VULNERABILI = []; 
var MC_RISORSE = []; 

/** ============ VARIABILI COMUNI ============= */
/** Gestioen stato stampa */
var PrintStartAddress = null;
var PrintEndAddress = null;
var PrintTypeAddress = null;
var PrintTematica = {};

// true per ripristinare la mappa prima di una ricerca, false in caso contrario
var _toReset = false;

/**
 * Richiamata su onload applicazione.
 */
function customOnLoad() {
	// GEO_LOG_ERROR, GEO_LOG_WARNING, GEO_LOG_MESSAGE, GEO_LOG_DEBUG_USER, GEO_LOG_DEBUG_EVENT, GEO_LOG_DEBUG_DATA, GEO_LOG_DEBUG_METHOD, GEO_LOG_DEBUG_ALL
	// GeoLog.enable(GEO_LOG_MESSAGE);

	///////////////////////////////////////////////////////////////////////////
	// settaggio posizione iniziale
	gmap.setCenter(LAT, LNG, ZOOM);
	// Creates a collapsible overview map in the corner of the screen.
	gmap.addOverviewMapControl();
	// Creates a control with buttons to switch between map types.
	gmap.addHierarchicalMapTypeControl();
	// enables double click to zoom in and out (disabled by default).
	gmap.enableDoubleClickZoom();
	// Installs keyboard event handler for the map passed as argument.
	gmap.enableKeyboardHandler();
	// Creates a control with buttons to pan in four directions, and zoom in and zoom out, and a zoom slider.
	gmap.addLargeMapControl();
	// Enables wheel zoom
	gmap.enableScrollWheelZoom();
	// Enables continuous smooth zooming for select browsers (disabled by default).
	gmap.enableContinuousZoom();

	// gestione inizializzazione applicazione
	initialize();
	///////////////////////////////////////////////////////////////////////////
}

/**
 * Inizializza la mappa secondo lo stato specificato
 */
function initialize() {
	// inizializzazioen aree di scorrimento
	init();

	// settaggio informazioni stampa
	addPrintTematica(CONFINE_PROVINCIA_MILANO);
	addPrintTematica(CONFINE_PROVINCIA_MONZA);
	
	// caricamento stili per ricerca indirizzo
	gmap.getListLayerAsync(function(listLayer) {
		// caricamento confini provincia
		gmap.showLayerAsync(EMERGENZE_ATTIVE, /*query*/null, /*focus*/true, /*frontend*/ null, function(idLayer, listObject){
			var loadNews = false;
			// nel caso in cui trovo risultati non effettuo il focus sui confini
			if (listObject.length > 0) {
				loadNews = true;
			}

			// caricamento confini provincia
			gmap.showLayerAsync(EVENTI, /*query*/"[concluso]=[f]", /*focus*/false, /*frontend*/ null, function(idLayer, listObject){
				// nel caso in cui trovo risultati non effettuo il focus sui confini
				if (listObject.length > 0) {
					loadNews = true;
				}

				/** PARAMETRI DA URL */
				var tematicaByURL = ParamByURL["t"] || null;
				var queryByURL = ParamByURL["query"] || null;
				var idByURL = ParamByURL["id"] || null;
				if (tematicaByURL != null) {
					if (idByURL != null) {
						goToPOI(idByURL, tematicaByURL, true, true);
					} else {
						// N.B. DEVE ESSERE ABILITATO DOPO IL CARICAMENTO DELEL INFORMAZIONI BASE E PARAMETRIZZATE
						// PER EVITARE ERRORI NEL PUBLISHER NEL CASO IN CUI IL RISULTATO PRODUCA OGGETTI MAI VISIBILE 
						// SU MAPPA E SEMPRE RAPPRESENTATI
						// abilita la richiesta delle informazioni secondo on-demand (disabled by default).
						gmap.enableDataOnDemand();

						// caricamento informazioni da URL
						gmap.showLayerAsync(tematicaByURL, queryByURL, /*focus*/false, /*frontend*/ null, function(idLayer, listObject){
							// 
						});
					}
				}

				// N.B. DEVE ESSERE ABILITATO DOPO IL CARICAMENTO DELEL INFORMAZIONI BASE E PARAMETRIZZATE
				// PER EVITARE ERRORI NEL PUBLISHER NEL CASO IN CUI IL RISULTATO PRODUCA OGGETTI MAI VISIBILE 
				// SU MAPPA E SEMPRE RAPPRESENTATI
				// abilita la richiesta delle informazioni secondo on-demand (disabled by default).
				gmap.enableDataOnDemand();
				
				
				if (loadNews == true) {
					// settaggio focus su mappa
					gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/[EMERGENZE_ATTIVE, EVENTI]);
				}
	
				// caricamento confini provincia
				gmap.showLayerAsync(CONFINE_PROVINCIA_MILANO, /*query*/null, /*focus*/ false, /*frontend*/ null, function(idLayer){
					// gestione confine
					gmap.lockLayer(idLayer);
			
					gmap.showLayerAsync(CONFINE_PROVINCIA_MONZA, /*query*/null, /*focus*/ false, /*frontend*/ null, function(idLayer){
						// gestione confine
						gmap.lockLayer(idLayer);
			
						if (LoadByParam == false && loadNews == false) {
							// settaggio focus su confine provincia
							gmap.setDataLoadedFocus();
						}
					});// END - CONFINE_PROVINCIA_MONZA
				}); // END - CONFINE_PROVINCIA_MILANO
			}); // END - EVENTI NON CONCLUSI
		}); // END - EMERGENZE_ATTIVE
	}); // END - CARICAMENTO LISTA LAYER

	// gestione frontend
	initializeFrontEnd();

	// gestione POI
	/*
	var idByURL = ParamByURL["id"];
	if (idByURL != null && idByURL.length > 0) {
		goToPOI(idByURL);
	}
	*/
	// gestione inidirizzo
	var addressURL = ParamByURL["q"];
	if (addressURL != null && addressURL.length > 0) {
		// gestione ricerca indirizzo
		var ricercaIndirizzo = document.forms["cercaindirizzo"];
		ricercaIndirizzo.q.value = decodeURIComponent(addressURL);
		window.setTimeout(function(){searchAddress(ricercaIndirizzo);return false;}, LOAD_TIMEOUT);
	}
}
/**
 * Richiamato per ripristinare lo stato della mappa
 */
function resetall() {
	
	document.forms["poliziaprov"].reset();

	// eliminiamo tutte le informazioni caricate su mappa
	gmap.clearAll();

	// ripristino lo stato della stampa
	resetPrint();
	
	var confini = document.forms["search"];
	if (confini.confprovmi.checked ||
			confini.confprovmz.checked ||
			confini.comuni.checked ||
			confini.COM.checked) {
		// settaggio focus su confine provincia
		gmap.setDataLoadedFocus();
	} else {
		// settaggio posizione iniziale
		gmap.setCenter(LAT,LNG,ZOOM);
	}

	// abilitazione area di ricerca
	light('ricerca')
	// disabilitazione area risultati
	disableTabResult();
}

/** ============ FRONTEND ============= */
var marginTopBottom = 0;
var marginLeftRight = 0;
/**
 * Inizializza lo stato grafico dell'aplicazione
 * */
function initializeFrontEnd() {
	// gestione ricerca indirizzo
	var ricercaIndirizzo = document.forms["cercaindirizzo"];
	ricercaIndirizzo.onsubmit = function(){searchAddress(ricercaIndirizzo);return false;};
	var cercapercorso = document.forms["cercapercorso"];
	cercapercorso.onsubmit = function(){calcolaPercorso(this.saddr.value, this.daddr.value);return false;};
	
	// calcolo occupazione margine superiore e inferiore
	marginTopBottom = document.getElementById("testalino").offsetHeight;	
	marginTopBottom += document.getElementById("subtestata").offsetHeight;
	marginTopBottom += document.getElementById("footer").offsetHeight;

	// calcolo occupazione margine destroe sinistro
	marginLeftRight += document.getElementById("panel").offsetWidth + ((xIE4Up)? 3:1);
	
	if (xIE6) {document.getElementById("map").style.width = "99%";}

	// abilitazione area di ricerca
	light('ricerca')
	// disabilitazione area risultati
	disableTabResult();

	/** Confini amministrativi */
	var confini = document.forms["search"];
	confini.reset();
	confini.confprovmi.checked = true;
	confini.confprovmz.checked = true;
	confini.confprovmi.onclick = function(){hideShowConfineTerritoriale(this, CONFINE_PROVINCIA_MILANO);};
	confini.confprovmz.onclick = function(){hideShowConfineTerritoriale(this, CONFINE_PROVINCIA_MONZA);};
	confini.comuni.onclick = function(){hideShowConfineTerritoriale(this, CONFINI_COMUNALI);};
	confini.COM.onclick = function(){hideShowConfineTerritoriale(this, CONFINI_COM);};

	/** Eventi/Emergenze */
	_emergernzeventi = document.forms["_emergernzeventi"];
	_emergernzeventi.reset();
	_emergernzeventi.onsubmit = function(){searchEmergernzeEventi();return false;};
	_emergernzeventi.onreset = function(){resetMacroCategoria(MC_EMERGENZE_ALTRI_EVENTI);};

	_emergernzeventi.giornoprec.onfocus = function(){_emergernzeventi.quandod[0].checked = true;};
	_emergernzeventi.from.onfocus = function(){_emergernzeventi.quandod[1].checked = true;};
	_emergernzeventi.to.onfocus = function(){_emergernzeventi.quandod[1].checked = true;};

	MC_EMERGENZE_ALTRI_EVENTI = [{"F":_emergernzeventi.emergenze_attive,"ID":EMERGENZE_ATTIVE},
	                     		{"F":_emergernzeventi.emergenze_passate,"ID":EMERGENZE_PASSATE},
	                    		{"F":_emergernzeventi.eventi,"ID":EVENTI}];

	/** Elementi di rischio */
	_elementirischio = document.forms["_elementirischio"];
	// _elementirischio.reset();
	_elementirischio.onsubmit = function(){searchElementiRischio();return false;};
	_elementirischio.onreset = function(){resetMacroCategoria(MC_ELEMENTI_RISCHIO);};

	_elementirischio.dove2.onchange = function(){_elementirischio.luogo[0].checked = true;};
	_elementirischio.vicinoa.onfocus = function(){_elementirischio.luogo[1].checked = true;return false;};
	
	MC_ELEMENTI_RISCHIO = [{"F":_elementirischio.fascia_a,"ID":FASCIA_A,"TY":TYPE_POLYGON},
		{"F":_elementirischio.fascia_b,"ID":FASCIA_B,"TY":TYPE_POLYGON},
		{"F":_elementirischio.fascia_c,"ID":FASCIA_C,"TY":TYPE_POLYGON},
		{"F":_elementirischio.rischio_idr_elev,"ID":RISCHIO_IDR_ELEV,"TY":TYPE_POLYGON},
		{"F":_elementirischio.aree_esondazione,"ID":AREE_ESONDAZIONE,"TY":TYPE_POLYGON},
		{"F":_elementirischio.aree_eso_pianiemergenza,"ID":AREE_ESO_PIANIEMERGENZA,"TY":TYPE_POLYGON},
		// {"F":_elementirischio.ponti,"ID":PONTI_CRITICI,"Q":"\"[LAYER]=[PONTICRITPUNTI]\""},
		{"F":_elementirischio.ponti,"ID":PONTI_CRITICI},
		{"F":_elementirischio.art6,"ID":AZIENDE_RISCHIO_ART6,"Q":"getQueryAziendeRischio()","A":"getAddressAziendeRischio()"},
		{"F":_elementirischio.art8,"ID":AZIENDE_RISCHIO_ART8,"Q":"getQueryAziendeRischio()","A":"getAddressAziendeRischio()"},
		{"F":_elementirischio.rete_oleodotti,"ID":RETE_OLEODOTTI,"TY":TYPE_POLYGON},
		{"F":_elementirischio.scali_fs,"ID":SCALI_FS}];

	/** Elementi vulnerabili */
	_elementivulnerabili = document.forms["_elementivulnerabili"];
	// _elementivulnerabili.reset();
	_elementivulnerabili.onsubmit = function(){searchElementiVulnerabili();return false;};
	_elementivulnerabili.onreset = function(){resetMacroCategoria(MC_ELEMENTI_VULNERABILI);};

	_elementivulnerabili.dove.onchange = function(){_elementivulnerabili.luogo[0].checked = true;};
	_elementivulnerabili.vicinoa2.onfocus = function(){_elementivulnerabili.luogo[1].checked = true;return false;};
	
	MC_ELEMENTI_VULNERABILI = [{"F":_elementivulnerabili.asili_nido,"ID":ASILI_NIDO},
		{"F":_elementivulnerabili.scuole_materne,"ID":SCUOLE_MATERNE},
		{"F":_elementivulnerabili.scuole_elementari,"ID":SCUOLE_ELEMENTARI},
		{"F":_elementivulnerabili.scuole_medie,"ID":SCUOLE_MEDIE},
		{"F":_elementivulnerabili.scuole_superiori,"ID":SCUOLE_SUPERIORI},
		{"F":_elementivulnerabili.universita,"ID":UNIVERSITA},
		{"F":_elementivulnerabili.case_riposo,"ID":CASE_RIPOSO},
		{"F":_elementivulnerabili.strutture_disabili,"ID":STRUTTURE_DISABILI},
		{"F":_elementivulnerabili.centri_diurni_anziani,"ID":CENTRI_DIURNI_ANZIANI},
		{"F":_elementivulnerabili.stazioni_ferroviarie,"ID":STAZIONI_FERROVIARIE},
		{"F":_elementivulnerabili.iper_centricomm,"ID":IPER_CENTRICOMM},
		{"F":_elementivulnerabili.cinema,"ID":CINEMA},
		{"F":_elementivulnerabili.biblioteche,"ID":BIBLIOTECHE},
		{"F":_elementivulnerabili.carceri,"ID":CARCERI}];

	/** Risorse */
	_risorse = document.forms["_risorse"];
	// _risorse.reset();
	_risorse.onsubmit = function(){searchRisorse();return false;};
	_risorse.onreset = function(){resetMacroCategoria(MC_RISORSE);};

	_risorse.dove3.onchange = function(){_risorse.luogo[0].checked = true;};
	_risorse.vicinoa3.onfocus = function(){_risorse.luogo[1].checked = true;return false;};
	
	/* Organizzazionei volontariato */
	gmap.getListUserdataAsync("tipo", "[idLayer]=[" + ORGANIZZAZIONI_VOLONTARIATO + "]", "default", function(listUserdata) {
		loadSelectOptions(_risorse.tipologia, listUserdata);
	});
	gmap.getListUserdataAsync("specializzazioneprevalente", "[idLayer]=[" + ORGANIZZAZIONI_VOLONTARIATO + "]", "default", function(listUserdata) {
		loadSelectOptions(_risorse.specializzazione1, listUserdata);
	});

	// gestione caricamento opzioni di ricerca dinamiche
	_risorse.tipologia.onchange = function(){
		// settaggio stato
		_risorse.organizzazioni_volontariato.checked = true;

			// gestione ricerca specializzazione primaria
		_risorse.specializzazione1.length = 0;
		_risorse.specializzazione1.disabled = true;
		attachOption(_risorse.specializzazione1, "NONE", "TUTTE");

		// gestione ricerca specializzazione secondaria
		_risorse.specializzazione2.length = 0;
		_risorse.specializzazione2.disabled = true;
		attachOption(_risorse.specializzazione2, "NONE", "TUTTE");

		var query = "[idLayer]=[" + ORGANIZZAZIONI_VOLONTARIATO + "]";
		var tipologia = _risorse.tipologia.value;
		if (tipologia != "NONE") {query += OPERATOR_AND + "[tipo]=[" + tipologia + "]";}
		
		gmap.getListUserdataAsync("specializzazioneprevalente", query, "default", function(listUserdata){
			// caricamento opzioni di ricerca
			loadSelectOptions(_risorse.specializzazione1, listUserdata)
		});
	};
	// gestione caricamento opzioni di ricerca dinamiche
	_risorse.specializzazione1.onchange = function(){
		// settaggio stato
		_risorse.organizzazioni_volontariato.checked = true;
		
		// gestione ricerca specializzazione secondaria
		_risorse.specializzazione2.length = 0;
		_risorse.specializzazione2.disabled = true;
		attachOption(_risorse.specializzazione2, "NONE", "TUTTE");
		
		var query = "[idLayer]=[" + ORGANIZZAZIONI_VOLONTARIATO + "]";
		var specializzazione = _risorse.specializzazione1.value;
		if (specializzazione != "NONE") {query += OPERATOR_AND + "[specializzazioneprevalente]=[" + specializzazione + "]";}
		var tipologia = _risorse.tipologia.value;
		if (tipologia != "NONE") {query += OPERATOR_AND + "[tipo]=[" + tipologia + "]";}

		gmap.getListUserdataAsync("specializzazionesecondaria", query, "default", function(listUserdata){
			// caricamento opzioni di ricerca
			loadSelectOptions(_risorse.specializzazione2, listUserdata)
		});
	};
	
	MC_RISORSE = [{"F":_risorse.msb,"ID":MSB,"Q":"getQueryRisorse()"},
		{"F":_risorse.ospedali_principali,"ID":OSPEDALI_PRINCIPALI,"Q":"getQueryRisorse()"},
		{"F":_risorse.case_di_cura_piccoli_ospedali,"ID":CASE_DI_CURA_PICCOLI_OSPEDALI,"Q":"getQueryRisorse()"},
		{"F":_risorse.caserme_vvf,"ID":CASERME_VVF,"Q":"getQueryRisorse()"},
		{"F":_risorse.caserme_carab,"ID":CASERME_CARAB,"Q":"getQueryRisorse()"},
		{"F":_risorse.caserme_polizia,"ID":CASERME_POLIZIA,"Q":"getQueryRisorse()"},
		{"F":_risorse.caserme_gfin,"ID":CASERME_GFIN,"Q":"getQueryRisorse()"},
		{"F":_risorse.caserme_gfor,"ID":CASERME_GFOR,"Q":"getQueryRisorse()"},
		{"F":_risorse.centri_pc,"ID":CENTRI_PC,"Q":"getQueryRisorse()"},
		{"F":_risorse.aree_ammassamento,"ID":AREE_AMMASSAMENTO,"TY":TYPE_POLYGON,"Q":"\"NONE\""},
		{"F":_risorse.case_cantoniere,"ID":CASE_CANTONIERE,"Q":"getQueryRisorse()"},
		{"F":_risorse.prefettura,"ID":PREFETTURA,"Q":"getQueryRisorse()"},
		{"F":_risorse.sedi_com,"ID":SEDI_COM,"Q":"getQueryRisorse()"},
		{"F":_risorse.sala_regionale,"ID":SALA_REGIONALE,"Q":"getQueryRisorse()"},
		{"F":_risorse.municipi,"ID":MUNICIPI,"MaxR":5,"Q":"getQueryMunicipi()"},
		{"F":_risorse.organizzazioni_volontariato,"ID":ORGANIZZAZIONI_VOLONTARIATO,"Q":"getQueryOrgabizzazioniVolentariato()"}];

	/** Polizia provinciale */
	var poliziaprov = document.forms["poliziaprov"];
	poliziaprov.reset();
	poliziaprov.zone_polizia.onclick = function(){(this.checked)?showTematica(ZONE_POLIZIA, null, true):clearTematica(ZONE_POLIZIA);};
	poliziaprov.sedi_comandi.onclick = function(){(this.checked)?showTematica(POLIZIA_PROVINCIALE, null, false):clearTematica(POLIZIA_PROVINCIALE);};
	
	// gestione resize
	resizeTemplate();
	
	// gestione evento di resize
	window.onresize = resizeTemplate;
}
function light(label){
	if (label=='ricerca') {
		changelight('ricerca','risultati', 'riclink', 'rislink');
	} else if (label=='risultati'){
		changelight('risultati','ricerca', 'rislink', 'riclink');
	}
}
/**
 * Carica la lista delel opzioni legate.
 * @param object oggetto da gestire.
 * @param values lista dei valori da caricare.
 */
function loadSelectOptions(object, values) {
	var numoption = 0;
	
	// verifichiamo che l'informazione sia valida
	if (values != null) {

		// cicliamo su i risultati della pagina corrente
		for (var i = 0; i < values.length; ++i) {
			var valore = values[i];
			// creazione opzione
			if (valore.replace(/^\s+|\s+$/g,"") != ""){
				++numoption;
				attachOption(object, valore, valore);
			}
		}
	}

	// gestione selezione automatica
	if (numoption == 1) {object.selectedIndex = 1;}
	// abilitazione oggetto
	if (numoption > 0) {object.disabled = false;}
}
/**
 * Carica una opzione nell'oggetto specificato.
 * @param object oggetto da gestire.
 * @param value valore associata alla opzione.
 * @param description descrizione associata alla opzione.
 */
function attachOption(object, value, description) {
	// creazione contenitore
	var option = document.createElement("option");
	option.setAttribute("value", value);
	option.appendChild(document.createTextNode(description));
	object.appendChild(option);
}
/** ============ RESIZE ============= */
var onresizeRunning = false;
/**
 * Richiamata per effettura il resize
 */
function resizeTemplate() {
	// gestione temporizzazione resize
	if (xMac == false && xIE6 == false) {
		if (onresizeRunning == true) {return;}
		onresizeRunning = true;
	}

	// occupazione verticale del template	
	var bodyHeight = 0;
	var bodyWidth = 0;
	if (xIE4Up) {
		bodyHeight = document.documentElement.clientHeight;
		bodyWidth = document.documentElement.clientWidth;
	} else {
		bodyHeight = window.innerHeight;
		bodyWidth = window.innerWidth;
	}
	
	// calcolo occupazione verticale della mappa
	var contentHeight = (bodyHeight - marginTopBottom);
	if (contentHeight < 300) {contentHeight = 300;}

	// area di ricerca
	var panel = document.getElementById("panel");
	panel.style.height = contentHeight + "px";

	// mappa
	resizemap(bodyWidth, contentHeight);
	
	// area di ricerca
	var divresult = document.getElementById("divresult");
	if (divresult) {
		divresult.style.height = (contentHeight - 80) + "px";
		document.getElementById("risultati").style.height = (contentHeight - 20) + "px";
	} else {
		document.getElementById("risultati").style.height = (contentHeight - 10) + "px";
	}
	document.getElementById("ricerca").style.height = contentHeight - 60 + "px";

	/** Ricerca avanzata */
	var ricercavanzata = document.getElementById("ricercavanzata");
	var offsetTop = ((bodyHeight - 475) / 2);
	ricercavanzata.style.top = ((offsetTop < 0)? 0:offsetTop) + "px";
	var offsetLeft = ((bodyWidth - 562) / 2);
	ricercavanzata.style.left = ((offsetLeft < 0)? 0:offsetLeft) + "px";
	
	// gestione temporizzazione resize
	if (xMac == false && xIE6 == false) {window.setTimeout("onresizeRunning = false", 200);}
	
	// aggiorniamo la mappa geocms
	gmap.checkResize();
}

/** ============ FUNZIONI BALLOON ============= */
/**
 * Richiamata per calcolare un itinerario da un ballon.
 */
function pathFromPOI(lat, lng) {
	try {
		var daddr = document.getElementById("daddr").innerHTML;
		
		var blpercorso = document.forms["blpercorso"];
		var type = blpercorso.mode.value;
		var saddr = blpercorso.saddr.value;

		// compialzione ed esecuzione form		
		calcolaPercorso(saddr, daddr, (lat + "," + lng), type);

	} catch(e) {
		toException(e);
	}
	
	return false;
}
/**
 * .
 */
function elementivulnerabili(lat, lng, idLevel, idObject) {
	try {
		// ricerca in prossimità di un POI
		prepareFormPOI(_elementivulnerabili, lat, lng, idLevel, idObject)

		// apertura ricerca avanzata
		var title = document.getElementById("GT");
		avanzata('elementivulnerabili', (title)?title.innerHTML:false, true)
	} catch(e) {
		toException(e);
	}
}
/**
 * .
 */
function elementirischio(lat, lng, idLevel, idObject) {
	try {
		// ricerca in prossimità di un POI
		prepareFormPOI(_elementirischio, lat, lng, idLevel, idObject)

		// apertura ricerca avanzata		
		var title = document.getElementById("GT");
		avanzata('elementirischio', (title)?title.innerHTML:false, true)
	} catch(e) {
		toException(e);
	}
}
/**
 * .
 */
function risorse(lat, lng, idLevel, idObject) {
	try {
		// ricerca in prossimità di un POI
		prepareFormPOI(_risorse, lat, lng, idLevel, idObject)

		// apertura ricerca avanzata		
		var title = document.getElementById("GT");
		avanzata('risorse', (title)?title.innerHTML:false, true)
	} catch(e) {
		toException(e);
	}
}

/** ============ FUNZIONI ============= */

/**
 * Effettua il calcolo dell'itinerario.
 * @param saddr indirizzo di partenza.
 * @param daddr indirizzo di arrivo.
 * @param latlng indirizzo di arrivo nel sistema cartografico WSG-84.
 */
 function calcolaPercorso(saddr, daddr, latlng, type) {
	try {

		// verifichiamo che l'informazione sia valida
		if (saddr.replace(/[^A-Za-z0-9]/g,"").length == 0) {
			// gestione errore
			alert("Indirizzo di partenza non specificato");
			return false;
		}
		
		var indirizzo = daddr;
		// gestione coordinate
		if (latlng != null) {indirizzo = latlng;}
		
		// verifichiamo che l'informazione sia valida
		if (indirizzo.replace(/[^A-Za-z0-9]/g,"").length == 0) {
			// gestione errore
			alert("Indirizzo di arrivo non specificato");
			return false;
		}
		
		var option = {"getSteps":"false","locale":"IT"};
		var cercapercorso = document.forms["cercapercorso"];
		type = type || cercapercorso.mode.value;
		if (type == "w") {
			option.travelMode = G_TRAVEL_MODE_WALKING;
		} else if (type == "c") {
			option.avoidHighways = "false";
		}
		
		// calcolo percorso
		gmap.getDirections([saddr, indirizzo], "risultati", option, function(statusCode) {
	
			if (statusCode != SGEO_SUCCESS) {
				
				// disabilitazione area risultati
				disableTabResult();
				
	
				// costruzione messaggio di errore
				var message = ERROR_PATH;
				message = message.replace("ERROR_PATH_FROM", saddr);
				message = message.replace("ERROR_PATH_TO", daddr);
				
				// gestione errore
				alert(message);
	
			} else {
				// settaggio nformazioni di stampa
				preparePrintDirection(saddr, indirizzo, type)

				// eliminiamo i contenuti caricati
				gmap.clear();
				// eliminiamo il possibile indirizzo (se presente) su mappa
				gmap.removeAddress();
	
				// abilitazione area rsultati
				document.getElementById("risultati").innerHTML = "";
				enableTabResult();
				light('risultati')
			}
		});
	} catch(e) {
		toException(e);
	}

}
/** ============ CONFINI ============= */
/**
 * Richiamato per mostarre o nascondere i confini territoriali.
 * @param object gestore della richiesta.
 * @param level livello richiesto.
 * @param query query da eseguire sul livello, null se non richiesta.
 */
function hideShowConfineTerritoriale(object, level, query) {
	if (object.checked == true) {
		// settiamo la velina di attesa in modalità "ricerca" 
		setOverlayToSearch();

		gmap.lockLayer(level);
		gmap.showLayerAsync(level, /*query*/query, /*focus*/false, /*frontend*/null, function(idLayer) {
			// settiamo la velina di attesa in modalità "caricamento" 
			setOverlayToLoading();

			// settaggio focus su mappa
			// gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/[CONFINE_PROVINCIA_MILANO, CONFINE_PROVINCIA_MONZA, CONFINI_COM, CONFINI_COMUNALI]);
		});

		// settaggio informazioni stampa
		addPrintTematica(level);
	} else {
		gmap.unlockLayer(level);
		gmap.clearLayer(level);

		// settaggio informazioni stampa
		removePrintTematica(level);
	}
}

/** ============ EVENTI/EMERGENZE ============= */
/**
 * Effettua la ricerca delle emergenze/eventi presenti sul territorio secondo i parametri utente.
 */
function searchEmergernzeEventi() {
	try {

		// gestione ricerche
		var query = NO_QUERY;

		// verifichiamo che sia stato selezionato almeno un valore
		if (atLeastOne(MC_EMERGENZE_ALTRI_EVENTI)) {
			var giorno = _emergernzeventi.quandod[0].checked;
			// ricerca giorno esatto
			if (giorno == true) {
				var giornoprec = _emergernzeventi.giornoprec.value;
				if (giornoprec.replace(/[^A-Za-z0-9]/g,"") != "") {
					// parse data
					var retvalue = pareseDate(giornoprec);
					if (retvalue.date != null) {
						if (query != NO_QUERY){query += OPERATOR_AND;}
						query = "[" + DATA + "]=[" + retvalue.date + "]";
					}
					else if (retvalue.error != null) {
						// gestione errore
						alert("Seleziona il giorno (gg/mm/aaaa)\nFormato data non corretto:\n" + retvalue.error);
						query = QUERY_FAILURE;
					}
				}
			// ricerca perido
			} else {
				var from = _emergernzeventi.from.value;
				var to = _emergernzeventi.to.value;
				if (from.replace(/[^A-Za-z0-9]/g,"") != "" || to.replace(/[^A-Za-z0-9]/g,"") != "") {
					// parse datainizio evento
					var datastart = pareseDate(from);
					if (datastart.date != null) {
						if (query != NO_QUERY){query += OPERATOR_AND;}
						query = "[" + DATA + "]>=[" + datastart.date + "]";
					}
					else if (datastart.error != null) {
						// gestione errore
						alert("Seleziona il periodo (gg/mm/aaaa): da\nFormato data non corretto:\n" + datastart.error);
						query = QUERY_FAILURE;
					}
					
					if (query != QUERY_FAILURE) {
						// parse data fine evento
						dataend = pareseDate(to);
						if (dataend.date != null) {
							if (query != NO_QUERY){query += OPERATOR_AND;}
							query += "[" + DATA + "]<=[" + dataend.date + "]";
						} else if (dataend.error != null) {
							// gestione errore
							alert("Seleziona il periodo (gg/mm/aaaa): a\nFormato data non corretto:\n" + dataend.error);
							query = QUERY_FAILURE;
						}
					}
				}
			}
			
			// verifichiamo che la query sulla data abbia dato esito positivo
			if (query != QUERY_FAILURE) {

				// eliminaimo le informazioni precedentemente caricate
				resetMacroCategoria(MC_EMERGENZE_ALTRI_EVENTI);
				// caricamento delle tematiche per vicinanza
				searchMacroCategoria(MC_EMERGENZE_ALTRI_EVENTI, query, _emergernzeventi.vicinoa.value);
			}
			
		} else {
			alert("Selezionare almeno uno tra i segunti valori prima procedere con la richiesta:\n- Emergenze\n- Eventi\n- Emergenze passate")
		}

	} catch(e) {
		toException(e);
	}
}
/**
 * Parsa la data e comunica se è valida
 * @param date data in formato testuale che deve essere verigicata
 */
function pareseDate(data) {
	var retvalue = null;
	var errore = null;
	
	if (data.replace(/\s+/g,"").length > 0) {

		// gg/mm/aaaa
		var nums = splitDateString(data); 
	
		// gestione giorno
		if (isNaN(nums[0]) == true) {
			errore = "Il giorno specificato non rappresenta un numero valido";
		} else if (parseInt(nums[0]) < 0 || parseInt(nums[0]) > 31) {
			errore = "Il giorno specificato non risulta valido";
		} else if (nums[0].length == 1) {
			nums[0] = "0" + nums[0];
		}
		
		if (errore == null) {
			// gestione mese
			if (isNaN(nums[1])  == true) {
				errore = "Il mese specificato non rappresenta un numero valido";
			} else if (parseInt(nums[1]) < 0 || parseInt(nums[1]) > 12) {
				errore = "Il mese specificato non risulta valido";
			} else if (nums[1].length == 1) {
				nums[1] = "0" + nums[1];
			}
		}
	
		if (errore == null) {
			// gestione anno
			if (isNaN(nums[2]) == true) {
				errore = "L'anno specificato non rappresenta un numero valido";
			} else if (nums[2].length != 4) {
				errore = "L'anno specificato specificato non risulta valido";
			}
		}
	
		if(errore == null) {retvalue = (nums[2] + nums[1] + nums[0]);}
	}
	
	// ritorniamo il valore richiesto
	return ({"date": retvalue, "error": errore});
}

/** ============ ELEMENTI DI RISCHIO ============= */
/**
 * Effettua la ricerca degli elementi di rischio presenti sul territorio secondo i parametri utente.
 */
function searchElementiRischio() {
	try {
		// verifichiamo che sia stato selezionato almeno un valore
		if (atLeastOne(MC_ELEMENTI_RISCHIO)) {
			
			// eliminaimo le informazioni precedentemente caricate
			resetMacroCategoria(MC_ELEMENTI_RISCHIO);
			// caricamento delle tematiche secondo parametri
			searchMacroCategoria(MC_ELEMENTI_RISCHIO, NO_QUERY, null, _elementirischio);

			// ricerca in prossimità di un POI
			resetForm(_elementirischio)

			// chiusura ricerca avanzata
			closeavanzata();
		
		} else {
			alert("Selezionare almeno uno un valore prima di procedere con la richiesta.")
		}
	} catch(e) {
		toException(e);
	}
}
/**
 * Costruzione query da aplpicare sulle aziende a richio chimico.
 * @return query da appicare alle aziende a richio chimico, null se non presente.
 */
function getQueryAziendeRischio() { 
	// aziende a rischio chimico
	var query = NO_QUERY;

	if (isSerachNearLatLng(_elementirischio) == false) {
		var art6 = _elementirischio.art6.checked;
		var art8 = _elementirischio.art8.checked;
		
		if (art6 || art8) {
	
			var comune = _elementirischio.dove2.value;
			if (comune != "NONE") {
				if (query != NO_QUERY){query += OPERATOR_AND;}
				query += "[gid]LIKE[" + comune + "%]";
			}
		}
	}
	
	return query; 
}
/**
 * Costruzione query da aplpicare sulle aziende a richio chimico.
 * @return query da appicare alle aziende a richio chimico, null se non presente.
 */
function getAddressAziendeRischio() {
	var retvalue = "";

	if (_elementirischio.luogo[1].checked) {
		retvalue = _elementirischio.vicinoa.value;
	}

	return retvalue;
}
/** ============ ELEMENTI VULNERABILI ============= */
/**
 * Effettua la ricerca degli elementi vulnerabili sul territorio secondo i parametri utente.
 */
function searchElementiVulnerabili() {
	try {

		// gestione ricerche
		var query = NO_QUERY;
		var address = "";
		
		// verifichiamo che sia stato selezionato almeno un valore
		if (atLeastOne(MC_ELEMENTI_VULNERABILI)) {
			// eliminaimo le informazioni precedentemente caricate
			resetMacroCategoria(MC_ELEMENTI_VULNERABILI);
			
			if (isSerachNearLatLng(_elementivulnerabili) == false) {
				// verifichiamo che sia stata selezionata la ricerca per comune
				if (_elementivulnerabili.luogo[0].checked == true) {
					var query = NO_QUERY;
					var comune = _elementivulnerabili.dove.value;
					if (comune != "NONE") {
						if (query != NO_QUERY){query += OPERATOR_AND;}
						query += "[gid]LIKE[" + comune + "%]";
					}
				}
				address = (_elementivulnerabili.luogo[1].checked)?_elementivulnerabili.vicinoa2.value:"";
			}
			
			// caricamento delle tematiche secondo parametri
			searchMacroCategoria(MC_ELEMENTI_VULNERABILI, query, address, _elementivulnerabili);
			
			// ricerca in prossimità di un POI
			resetForm(_elementivulnerabili)
			
			// chiusura ricerca avanzata
			closeavanzata();
		} else {
			alert("Selezionare almeno uno un valore prima di procedere con la richiesta.")
		}

	} catch(e) {
		toException(e);
	}
}
/** ============ RISORSE ============= */
/**
 * Effettua la ricerca delel risorse sul territorio secondo i parametri utente.
 */
function searchRisorse() {
	try {

		
		// verifichiamo che sia stato selezionato almeno un valore
		if (atLeastOne(MC_RISORSE)) {
			// eliminaimo le informazioni precedentemente caricate
			resetMacroCategoria(MC_RISORSE);
			
			var address = "";
			if (isSerachNearLatLng(_risorse) == false) {
				address = (_risorse.luogo[1].checked)?_risorse.vicinoa3.value:"";
			}
			
			// caricamento delle tematiche secondo parametri
			searchMacroCategoria(MC_RISORSE, NO_QUERY, address, _risorse);

			// ricerca in prossimità di un POI
			resetForm(_risorse)
			
			// chiusura ricerca avanzata
			closeavanzata();

		} else {
			alert("Selezionare almeno uno un valore prima di procedere con la richiesta.")
		}

	} catch(e) {
		toException(e);
	}
}
/**
 * Costruzione query da aplpicare sulle oranizzazionei di volontariato.
 * @return query da appicare alle organizzazioni di volontariato, null se non presente.
 */
function getQueryOrgabizzazioniVolentariato() { 
	var query = NO_QUERY;
	
	var tipologia = _risorse.tipologia.value;
	var specializzazione1 = _risorse.specializzazione1.value;
	var specializzazione2 = _risorse.specializzazione2.value;

	if (tipologia != "NONE") {
		if (query != NO_QUERY){query += OPERATOR_AND;}
		query += "[tipo]=[" + tipologia + "]";
	}
	if (specializzazione1 != "NONE") {
		if (query != NO_QUERY){query += OPERATOR_AND;}
		query += "[specializzazioneprevalente]=[" + specializzazione1 + "]";
	}
	if (specializzazione2 != "NONE") {
		if (query != NO_QUERY){query += OPERATOR_AND;}
		query += "[specializzazionesecondaria]=[" + specializzazione2 + "]";
	}

	if (isSerachNearLatLng(_risorse) == false) {
		// verifichiamo che sia stata selezionata la ricerca per comune
		if (_risorse.luogo[0].checked == true) {
			var comune = _risorse.dove3.value;
			if (comune != "NONE") {
				if (query != NO_QUERY){query += OPERATOR_AND;}
				query += "[gid]LIKE[" + comune + "%]";
			}
		}
	}
	return query; 
}
/**
 * Costruzione query da aplpicare sulle oranizzazionei di volontariato.
 * @return query da appicare alle organizzazioni di volontariato, null se non presente.
 */
function getQueryMunicipi() { 
	var query = NO_QUERY;
	
	if (isSerachNearLatLng(_risorse) == false) {
		// verifichiamo che sia stata selezionata la ricerca per comune
		if (_risorse.luogo[0].checked == true) {
			var comune = _risorse.dove3.value;
			if (comune != "NONE") {
				query += "[codice_istat]=[" + comune + "]";
			}
		}
	}

	return query; 
}
/**
 * Costruzione query da aplpicare sulle oranizzazionei di volontariato.
 * @return query da appicare alle organizzazioni di volontariato, null se non presente.
 */
function getQueryRisorse() { 
	var query = NO_QUERY;
	
	if (isSerachNearLatLng(_risorse) == false) {
		// verifichiamo che sia stata selezionata la ricerca per comune
		if (_risorse.luogo[0].checked == true) {
			var comune = _risorse.dove3.value;
			if (comune != "NONE") {
				query += "[gid]LIKE[" + comune + "%]";
			}
	}
	}

	return query; 
}

/** ============ FUNZIONI COMUNI ============= */
/**
 * Verifica che almento una voce appartenente alal macro categoria sia stata selezionata.
 * @param manager struttura dati per gestire la macro categoria.
 * @return true se è presente almeno una tematica selezioanta, false in caso contrario.
 */
function atLeastOne(manager) {
	var bAtLeastOne = false;
	// gestione tematiche presenti nella macro categoria
	for (var i = 0; i < (manager.length) && bAtLeastOne == false; ++i) {
		// recuperiamo la tematica in fase di elaborazione
		bAtLeastOne = manager[i].F.checked;
	}
	return bAtLeastOne
}
/**
 * Verifica se la ricerca deve essere essffettuata in prossimità di un POI.
 * @param objform gestore della form di ricerca.
 * @return true se la ricerca deve essere effettuat ain prossimità di un POI, false in caso contrario.
 */
function isSerachNearLatLng(objform) {
	//
	return (objform.lat.value != "" && objform.lng.value != "");
}
/**
 * Ritorna le coordinate geografiche per effettuare la ricerca in prossimità di un POI.
 * @param objform gestore della form di ricerca.
 * @return coordinate geografiche per effettuare la ricerca in prossimità di un POI.
 */
function getLatLngPOI(objform) {
	var retvalue = null;
	// ricerca in prossimità di un POI
	if (isSerachNearLatLng(objform)) {
		retvalue = (new GeoPoint(objform.lat.value, objform.lng.value));
	}
	
	return retvalue;
}
/**
 * Setta lo stato per effettuare la ricerca in prossimità di un POI.
 * @param objform gestore della form di ricerca.
 * @param lat latitudine.
 * @param lng longitudine.
 */
function prepareFormPOI(objform, lat, lng, idLevel, idObject) {
	// ricerca in prossimità di un POI
	objform.lat.value = lat;
	objform.lng.value = lng;
	objform.idLevel.value = idLevel;
	objform.idObject.value = idObject;
}
/**
 * Ripristina lo stato iniziale della maschera di ricerca.
 * @param objform gestore della form di ricerca.
 */
function resetForm(objform) {
	// ricerca in prossimità di un POI
	objform.lat.value = "";
	objform.lng.value = "";
}
/**
 * Ripristina lo stato iniziale della macro categoria.
 * @param manager struttura dati per gestire la macro categoria.
 */
function resetMacroCategoria(manager) {
	try {

		// eliminiamo il possibile indirizzo (se presente) su mappa
		gmap.removeAddress();

		for (var i = 0; i < manager.length; ++i) {
			// recuperiamo la tematica in fase di elaborazione
			var tematica = manager[i];
			var idTematica = tematica.ID;
			
			// recupero il gestore della mappa
			var oggetto = (tematica.M)?eval(tematica.M):gmap;
			// eliminiamo le informazioni precedentemente caricate
			oggetto.clearLayer(idTematica);

			// settaggio informazioni stampa
			removePrintTematica(idTematica);
		}

	} catch(e) {
		toException(e);
	}
}

/**
 * Effettua il caricamento delle tematiche secondo parametri.
 * @param manager struttura dati per gestire la macro categoria.
 * @param query possibile query da applicare in ricerca, null se non richiesta [opzionale].
 * @param indirizzo se specificato la ricerca avviene in prossimità dell'indirizzo fornito [opzionale].
 * @param objform gestore della form di ricerca.
 */
function searchMacroCategoria(manager, query, indirizzo, objform) {
	
	// eliminiamo dalla mappa il possibile percorso caricato
	gmap.removeDirection();

	// tematiche caricate
	var tematicheToFocus = [];
	var tematicheToLoad = [];

	// variabili di stato
	var bFound = false;
	var bFinished = false;
	var statusAddress = SGEO_SUCCESS;
	var extendToAddress = false;
	var countResponse = 0;
	
	// lista titoli da caricare
	var listResult = [];

	// recupero le coordinate (se esistono) per la ricerca in prossimità di un POI
	var coordinatePOI = null;
	var idLevelPOI = "";
	var idObjectPOI = "";
	if (objform) {
		coordinatePOI = getLatLngPOI(objform);
		if (coordinatePOI != null) {
			_toReset = true;
			idLevelPOI = objform.idLevel.value;
			idObjectPOI = objform.idObject.value;
			
			// settaggio informazioni stampa
			addPrintPOI(idLevelPOI, idObjectPOI);
			// aggiorniamo la collezioen deel tematiche su ccui effettuare il focus
			tematicheToFocus.push(idLevelPOI);
		}
	}

	if (_toReset == true) {
		// settaggio stato = false
		_toReset = false;
		
		// cancelliamo i contenuti caricati
		gmap.clear();
		// il possibile indirizzo (se presente) su mappa
		gmap.removeAddress();
		// il possibile percorso (se presente) su mappa
		gmap.removeDirection();

		// ripristino lo stato della stampa
		resetPrint();
	}

	// settiamo lo stato in modo che alla prossima ricerca la mappa viene pulita
	if (coordinatePOI != null) {_toReset = true;}

	// abilitazione sezione "ricerca"
	light('ricerca');
	// disabilitazione area risultati
	disableTabResult();
	
	// settiamo la velina di attesa in modalità "ricerca" 
	setOverlayToSearch();
	
	// gestione tematiche presenti nella macro categoria
	for (var i = 0; i < manager.length; ++i) {
		// recuperiamo la tematica in fase di elaborazione
		var tematica = manager[i];

		var idTematica = tematica.ID;

		if (tematica.F.checked == true) {
			var type = (tematica.TY)?tematica.TY:TYPE_MARKER;

			// aggiorniamo la lista delle tematiche caricate
			tematicheToLoad.push(idTematica);
			
			// aggiorniamo la lista delle tematiche su cui effettuare il focus
			if (type == TYPE_MARKER || (type != TYPE_MARKER && coordinatePOI == null)) {
				tematicheToFocus.push(idTematica);
			}

			// costruzione query
			var queryTematica = (tematica.Q)?eval(tematica.Q):"";
			var tmpQuery = null;
			if (queryTematica != "NONE") {
				tmpQuery = query || ""; 
				if (tmpQuery != NO_QUERY && queryTematica.length > 0){tmpQuery += OPERATOR_AND;}
				tmpQuery += queryTematica;
			}
			
			// gestione indirizzo
			var tmpAddress = null
			if (type == TYPE_MARKER) {
				tmpAddress = (tematica.A)?eval(tematica.A):indirizzo;
				if (tmpAddress != null) {
					tmpAddress = tmpAddress.replace(/^\s+|\s+$/g,"");
					if (tmpAddress.length == 0) {tmpAddress = null;}
				}
			}

			// recupero il gestore della mappa
			var oggetto = (tematica.M)?eval(tematica.M):gmap;

			
			if (coordinatePOI != null && type == TYPE_MARKER) {
				// esistono delle coordinate
				var maxresult = tematica.MaxR || 10;
				
				// settaggio informazioni stampa
				addPrintTematica(idTematica, type, tmpQuery, maxresult);
				addPOIPrintTematica(idTematica, coordinatePOI) 

				// caricamento contenuti per vicinanza
				oggetto.showObjectsNearLatLngAsync(coordinatePOI, /*distance*/null, /*maxresult*/maxresult, /*layer*/idTematica, /*query*/tmpQuery, /*focus*/false, /*frontend*/null, function(idLayer, _listObject) {
				});

				// recupero la lista degli oggetti
				oggetto.getListObjectNearLatLngAsync(coordinatePOI, /*distance*/null, /*maxresult*/maxresult, /*layer*/idTematica, /*query*/tmpQuery, function(idLevel, listObject) {
					// settaggio stato
					++countResponse;

					bFound = bFound || (listObject.length > 0);
					// aggiorniamo la lista risultati
					listResult = listResult.concat(listObject);

					// settaggio informazioni stampa
					if (listObject.length == 0) {removePrintTematica(idLevel);}


					// effettuiamo il focus sulle informazioni caricate
					if (bFinished == true) {
						if (countResponse == tematicheToLoad.length) {
							// settiamo la velina di attesa in modalità "caricamento" 
							setOverlayToLoading();

							if (statusAddress != SGEO_SUCCESS) {
								alert("Impossibile individuare l'indirizzo: \"" + indirizzo + "\"");
							} else if (bFound == false) {
								alert("Spiacenti.\nLa ricerca non ha prodotto risultati.")
							} else {
								
								// carichimo il POI da cui è stata avviata al ricerca
								gmap.showObjectAsync(idLevelPOI, idObjectPOI, /*frontend*/null, function(objectLoaded) {
									gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
								});

								// caricamento lista titoli
								loadResult(listResult);
							}
						}
					}
				});
				
			} else if (tmpAddress != null) {
				// esiste un indirizzo
				var maxresult = tematica.MaxR || 10;

				// settaggio stato
				extendToAddress = true;

				// settaggio informazioni stampa
				addPrintTematica(idTematica, type, tmpQuery, maxresult);

				// caricamento contenuti per vicinanza
				oggetto.showObjectsNearAddressAsync(tmpAddress, /*distance*/null, /*maxresult*/maxresult, /*layer*/idTematica, /*query*/tmpQuery, /*focus*/false, /*frontend*/null, function(statusCode, point, idLayer, _listObject) {
					// settaggio informazioni stampa POI
					addPOIPrintTematica(idLayer, point) 

					// verifico la correttezza dell'indirizzo
					if (statusAddress == SGEO_SUCCESS) {statusAddress = statusCode;}
					if (statusCode == SGEO_SUCCESS) {

						// recupero la lista degli oggetti
						oggetto.getListObjectNearLatLngAsync(point, /*distance*/null, /*maxresult*/PrintTematica[idLayer].MaxR, /*layer*/idLayer, /*query*/PrintTematica[idLayer].Q, function(idLevel, listObject) {
							// settaggio stato
							++countResponse;

							bFound = bFound || (listObject.length > 0);

							// settaggio informazioni stampa
							if (listObject.length == 0) {removePrintTematica(idLevel);}
							
							// aggiorniamo la lista risultati
							listResult = listResult.concat(listObject);

							
							// effettuiamo il focus sulle informazioni caricate
							if (bFinished == true) {
								if (countResponse == tematicheToLoad.length) {
									// settiamo la velina di attesa in modalità "caricamento" 
									setOverlayToLoading();
		
									if (statusAddress != SGEO_SUCCESS) {
										alert("Impossibile individuare l'indirizzo: \"" + indirizzo + "\"");
									} else if (bFound == false) {
										alert("Spiacenti.\nLa ricerca non ha prodotto risultati.")
									} else {
										// settaggio focus contenuti caricati solo nel caso in cui non effettuo una ricerca in prossimità di un POI
										if (coordinatePOI == null) {
											gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
										} else if (idObjectPOI != "") {

											// carichimo il POI da cui è stata avviata al ricerca
											gmap.showObjectAsync(idLevelPOI, idObjectPOI, /*frontend*/null, function(objectLoaded) {
												gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
											});
										}

										// caricamento lista titoli
										loadResult(listResult);
									}
								}
							}
						});
					} else {
						// settaggio stato
						++countResponse;
					}
				});

			} else {
				// ricerca normale
				
				// settaggio informazioni stampa
				addPrintTematica(idTematica, type, tmpQuery);

				// caricamento contenuti layer secondo parametri
				oggetto.showLayerAsync(/*layer*/idTematica, /*query*/tmpQuery, /*focus*/false, /*frontend*/null, function (idLayer, _listObject) {

					if (PrintTematica[idLayer].TY == TYPE_MARKER) {
						// recupero la lista degli oggetti
						oggetto.getListObjectAsync(/*layer*/idLayer, /*query*/PrintTematica[idLayer].Q, function(idLevel, listObject) {
							// settaggio stato
							++countResponse;
	
							bFound = bFound || (listObject.length > 0);
							// settaggio informazioni stampa
							if (listObject.length == 0) {removePrintTematica(idLevel);}
							// aggiorniamo la lista risultati (caso query)
							else if (PrintTematica[idLevel].Q != null && PrintTematica[idLevel].Q.length > 0) {
								listResult = listResult.concat(listObject);
							}

		
							// effettuiamo il focus sulle informazioni caricate
							if (bFinished == true) {
								if (countResponse == tematicheToLoad.length) {
									// settiamo la velina di attesa in modalità "caricamento" 
									setOverlayToLoading();
			
									if (statusAddress != SGEO_SUCCESS) {
										alert("Impossibile individuare l'indirizzo: \"" + indirizzo + "\"");
									} else if (bFound == false) {
										alert("Spiacenti.\nLa ricerca non ha prodotto risultati.")
									} else {
										// settaggio focus contenuti caricati solo nel caso in cui non effettuo una ricerca in prossimità di un POI
										if (coordinatePOI == null) {
											gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
										} else if (idObjectPOI != "") {
											// carichimo il POI da cui è stata avviata al ricerca
											gmap.showObjectAsync(idLevelPOI, idObjectPOI, /*frontend*/null, function(objectLoaded) {
												gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
											});
										}
										
										// caricamento lista titoli
										loadResult(listResult);
									}
								}
							}
						});
					} else {
						// N.B. le forme poligonali non hanno lista titoli
						
						// settaggio stato
						++countResponse;
						bFound = true;

						// effettuiamo il focus sulle informazioni caricate
						if (bFinished == true) {
							if (countResponse == tematicheToLoad.length) {
								// settiamo la velina di attesa in modalità "caricamento" 
								setOverlayToLoading();
		
								if (statusAddress != SGEO_SUCCESS) {
									alert("Impossibile individuare l'indirizzo: \"" + indirizzo + "\"");
								} else {
									// settaggio focus contenuti caricati solo nel caso in cui non effettuo una ricerca in prossimità di un POI
									if (coordinatePOI == null) {
										gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
									} else if (idObjectPOI != "") {
										// carichimo il POI da cui è stata avviata al ricerca
										gmap.showObjectAsync(idLevelPOI, idObjectPOI, /*frontend*/null, function(objectLoaded) {
											gmap.setDataLoadedFocus(/*layerToSkip*/null, /*layerToFocus*/tematicheToFocus, extendToAddress);
										});
									}
									
									// caricamento lista titoli
									loadResult(listResult);
								}
							}
						}
					}
				});
	
			}
		}
	}
	// settaggio stato
	bFinished = true;
}
/**
 * Richiamato per eliminare una tematica.
 * @param level livello richiesto.
 * @param query query da eseguire per recuperare le informazioni in formato SQL like (ad esempio: "[categoria]=[musica] AND [keyword]=[classica]").
 */
function showTematica(level, query, bFocusOnLoad) {
	// settiamo la velina di attesa in modalità "ricerca" 
	setOverlayToSearch();

	// caricamento contenuti layer secondo parametri
	gmap.showLayerAsync(/*layer*/level, /*query*/query, /*focus*/bFocusOnLoad, /*frontend*/null, function (idLayer, listObject) {
		// settiamo la velina di attesa in modalità "caricamento" 
		setOverlayToLoading();
		
		if (bFocusOnLoad == false) {
			// settaggio focus sui contenuti caricati
			gmap.setDataLoadedFocus(null, /*layerToFocus*/[level]);
		}

		// TODO
		/*
		if (listObject.length == 0) {
			alert("Spiacenti.\nLa ricerca non ha prodotto risultati.")
		} else {
			// settaggio informazioni stampa
			addPrintTematica(level, query);
		}
		*/
		// settaggio informazioni stampa
		addPrintTematica(level, query);
	});

}
/**
 * Richiamato per eliminare una tematica.
 * @param level livello richiesto.
 */
function clearTematica(level) {
	gmap.clearLayer(level);
	
	// settaggio informazioni stampa
	removePrintTematica(level);
}
/**
 * Ripristina lo stato iniziale della mappa.
 */
function resetPrint() {
	PrintTematica = {};
	resetPrintDirection();
}
/**
 * 
 */
function addPrintTematica(idTematica, type, query, maxresult) {
	resetPrintDirection();
	PrintTematica[idTematica] = {};
	PrintTematica[idTematica].TY = type;
	PrintTematica[idTematica].Q = query;
	PrintTematica[idTematica].MaxR = maxresult;
}
function addPOIPrintTematica(idTematica, point) {
	resetPrintDirection();
	var tematica = PrintTematica[idTematica];
	if (tematica) {
		PrintTematica[idTematica].Y = point.lat();
		PrintTematica[idTematica].X = point.lng();
	}
}
function addPrintPOI(idTematica, idObject) {
	resetPrintDirection();
	PrintTematica[idTematica] = {};
	PrintTematica[idTematica].O = idObject;
}
function removePrintTematica(idTematica, query, address) {
	delete PrintTematica[idTematica];
}
/**
 * Richiamato per settare le informazioni di stampa legate ad una percorso.
 */
function preparePrintDirection(saddr, daddr, type) {
	resetPrint();
	PrintStartAddress = saddr;
	PrintEndAddress = daddr;
	PrintTypeAddress = type;
}
/**
 * Richiamato per settare le informazioni di stampa legate ad una percorso.
 */
function resetPrintDirection() {
	PrintStartAddress = null;
	PrintEndAddress = null;
	PrintTypeAddress = null;
}
/**
 * Stampa i contenuti presenti sulla mappa.
 */
function stampa() {
	try {

		// richiamo la pagina di stampa
		var paramURL = ""; 
		if (PrintStartAddress != null && PrintEndAddress != null) {
			paramURL += PRINT_MODE + "=" + PRINT_DIRECTION;
			paramURL += "&" + PRINT_START_ADDRESS + "=" + encodeURIComponent(PrintStartAddress);
			paramURL += "&" + PRINT_END_ADDRESS + "=" + encodeURIComponent(PrintEndAddress);
			paramURL += "&" + PRINT_TYPE_ADDRESS + "=" + PrintTypeAddress;
		} else {
			var tmp = "[";
			var bFound = false;
			for (key in PrintTematica) {
				bFound = true;
				var valore = PrintTematica[key];
				tmp += "{\"ID\":\"" + key + "\"";
				if (valore.Q != null && valore.Q.length > 0) {
					tmp += ",\"Q\":\"" + valore.Q + "\"";
				}
				if (valore.X != null && valore.Y != null) {
					tmp += ",\"X\":\"" + valore.X + "\"";
					tmp += ",\"Y\":\"" + valore.Y + "\"";
				}
				if (valore.O != null) {
					tmp += ",\"O\":\"" + valore.O + "\"";
				}
				if (valore.MaxR != null) {
					tmp += ",\"MaxR\":\"" + valore.MaxR + "\"";
				}
				tmp += "},";
			}
			tmp = tmp.substring(0, tmp.length - 1)
			tmp += "]";
			if (bFound == true) {
				paramURL += PRINT_MODE + "=" + PRINT_DATA;
				paramURL += "&" + PRINT_TEMATICHE + "=" + encodeURIComponent(tmp);
			} else {
				paramURL += PRINT_MODE + "=" + PRINT_GRAPHIC;
			}
		}
		// window.location = "print.html?" + paramURL;
		var newwindow = window.open("stampa.html?" + paramURL, "stampa", "height=600,width=800,menubar=yes,toolbar=yes,location=no,scrollbars=yes");
		if (window.focus) {newwindow.focus()}
	} catch(e) {
		toException(e);
	}
}
