/* Copyright 2009 SCube NewMedia. */

/** ============ XP WIDGETS ============= */
document.write('<script src="' + PATH_TEMPLATE + '/script/widgets.js" type="text/javascript" ></script>');

/** ============ CALENDAR ============= */
document.write('<script src="' + PATH_TEMPLATE + '/script/datepicker.js" type="text/javascript" ></script>');
document.write('<link href="' + PATH_TEMPLATE + '/style/datepicker.css" rel="stylesheet" type="text/css" />');

/** ============ LISTA TITOLI ============= */
document.write('<script src="' + PATH_TEMPLATE + '/script/dw_scrollObj.js" type="text/javascript" ></script>');
document.write('<script src="' + PATH_TEMPLATE + '/script/dw_glidescroll.js" type="text/javascript" ></script>');

/** ============ COMUNI ============= */
document.write('<script src="' + PATH_TEMPLATE + '/script/javascript.js" type="text/javascript"></script>');

/** ============ FOGLI DI STILE ============= */
document.write('<link href="' + PATH_TEMPLATE + '/style/layout.css" rel="stylesheet" type="text/css" />');

/** ============ EVENTI ============= */
//gestione evento "onload"
if (window.addEventListener) {
	window.addEventListener("load", loadTemplate, false);
} else if (window.attachEvent) {
	window.attachEvent("onload", loadTemplate);
};

/** ============ VARIABILI ============= */
// oggetti presenti nel template
var risultati, mappa, loading;

/** Giorni festivi italiani */
var SpecialDate = {"01/01":"", "06/01":"", "13/04":"", "25/04":"", "01/05":"", "02/06":"", "15/08":"", "01/11":"", "08/12":"", "25/12":"", "26/12":""};
/** Giorni festivi italiani annuali */
var SpecialDateAnnuali = {"24/03/2008":"","05/04/2010":"","24/04/2011":"","25/04/2011":"","17/03/2011":""};

/** Livello di zoom a cui posizionarsi quando si setta il focus su un oggetto */
var FocusLevelZoom = 16;
/** true se stiamo effettuando il primo resize del template, false in caso contrario */
var FirstResize = true;

/** ============ COSTANTI ============= */
/** Nomenclatura form Esselunga */
var NAME_FORM = "pathform";

/** Operatori per la gestione della query */
var OPERATOR_OR = " OR ";
var OPERATOR_AND = " AND ";

/** Numero di documenti per paginata di ricerca  */
var DOCUMENTS_FOR_PAGE = 10;

/** ============ FUNZIONI ============= */
/**
 * Richiamata su onload applicazione
 */
function loadTemplate() {
	// creazione mappa e gestione parti comuni
	initialize();
	
	// settaggio posizione mappa
	GMap.setCenter(LATITUDINE, LONGITUDINE, ZOOM);
	
	// Creates a collapsible overview map in the corner of the screen.
	GMap.addOverviewMapControl();
	// 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 switch between map types.
	// GMap.addMapTypeControl();
	GMap.addHierarchicalMapTypeControl();
	// 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();

	/*
	Arguments to function
	1) Array of titles
	2) Array indicating initial state of panels(true = expanded, false = not expanded )
	3) Array of cookie names used to remember state of panels
	*/
	initDhtmlgoodies_xpPane(Array('Dove ?', 'Quando ?','Quali reparti ?','Quale servizio ?'),Array(true,false,false,false),Array());

	// caricamento stili grafici
	GMap.getListLayerAsync();

	// gestione frontend
	initializeFrontEnd();

	// definizione controllo per la velina di attesa
	function LoadingControl(){
	}
	LoadingControl.prototype = new GControl();
	LoadingControl.prototype.initialize = function(map) {
		var overlay = document.getElementById("overlay");
		//var loading = document.getElementById("loading");
		overlay.removeChild(loading);
		map.getContainer().appendChild(loading);
		return loading;
	}
	LoadingControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(295, 225) );
	}
	// velina di attesa
	GMap.addControl(new LoadingControl());
	
	var idByURL = ParamByURL["id"];
	if (idByURL != null && idByURL.length > 0) {
		// navigatione su oggetto richiesto
		goToPOI(idByURL);
	}
}

/** ============ FUNZIONI ============= */
/**
 * Effettua la ricerca di un indirizzo.
 */
function cercaIndirizzo() {
	// recuperiamo i valori
	var formricerca = document.forms[NAME_FORM];
	var indirizzo = formricerca.geocms_q.value;
	
	// verifichiamo che l'informazione sia valida
	if (indirizzo.replace(/[^A-Za-z0-9]/g,"") == "") {
		// gestione errore
		alert("Nessun indirizzo inserito");
	} else {
		// ricerchiamo l'indirizzo richiesto
		GMap.searchAddress(indirizzo, null, function(statusCode, name, response) {
			if (statusCode != SGEO_SUCCESS) {
				alert("Impossibile individuare l'indirizzo: \"" + name + "\"");
			}
		});		
	}
	return false;
}

/**
 * Effettua il calcolo del percorso partendo dai valori inseriti.
 */
function calcolaPercorso(latlng) {
	// recuperiamo i valori
	var formricerca = document.forms[NAME_FORM];
	var saddr = formricerca.geocms_saddr.value;
	var daddr = formricerca.geocms_daddr.value;
	
	// verifichiamo che l'informazione sia valida
	if (saddr.replace(/[^A-Za-z0-9]/g,"") == "") {
		// gestione errore
		alert("Indirizzo di partenza non specificato");
		return false;
	}
	
	// verifichiamo che l'informazione sia valida
	if (daddr.replace(/[^A-Za-z0-9]/g,"") == "") {
		// gestione errore
		alert("Indirizzo di arrivo non specificato");
		return false;
	}
	
	// nascondiamo il tabbed dei risultati
	hideTabResult();
	risultati.innerHTML = "<div id=\"percorso\"></div>";
	
	daddr = (latlng)?latlng:daddr;
	
	var option = {"getSteps":"false","locale":"IT"};
	// esecuzione calcolo itinerario
	GMap.getDirections([saddr, daddr], "percorso", option, function(statusCode) {

		if (statusCode != SGEO_SUCCESS) {
			// abilitazione sezione "ricerca"
			changearea('ricerca');

			// 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 informazioni stampa
			savePrintDirection(saddr, daddr);
			
			// eliminiamo i contenuti caricati
			GMap.clear();
			// eliminiamo il possibile indirizzo (se presente) su mappa
			GMap.removeAddress();

			// abilitazione sezione "risultati"
			changearea('risultati');
		}
	});
}

/**
 * Naviga su l'oggetto richiesto.
 * @param idPOI identificatore punto da raggiungere.
 * @param idLevel livello di appartenenza [opzionale].
 * @param bZoom true nel caso in cui si vule effetture lo zoom della mappa, false in caso contrario (true by default) [opzionale].
 */
function goToPOI(idPOI, idLevel, bZoom) {
	// focus su oggetto richiesto
	GMap.setObjectFocus(idPOI, idLevel, ((bZoom == null || bZoom == true)? FocusLevelZoom:null), ((bZoom == null || bZoom == true)? true:false));
}

/** ============ FUNZIONI SPECIALIZZATE ============= */
/**
 * Mostra tutti i punti vendita presenti sul territorio.
 */
function showAllStore() {
	try {
		// eliminiamo tutti contenuti caricati
		GMap.clearAll();

		// esecuzione ricerca
		GMap.showLayerAsync(/*layer*/LAYERS.PUNTI_VENTIDA, /*query*/null, /*focus*/true, /*frontend*/null, function (idLayer, listObject) {
			if (listObject.length == 0) {
				alert("Spiacenti.\nLa ricerca non ha prodotto risultati.");
			} else {

				// caricamewnto lista titoli
				loadResult(listObject);

				// salvataggio stato stampa
				savePrintData({PRINT_DATA_LAYER:idLayer})
			}
		});		

	} catch(e) {
		toException(e);
	}
}

/**
 * Ripristina lo stato iniziale della mappa e della ricerca.
 */
function reset() {
	try {
		// settaggio informazioni stampa
		clearPrint();

		// abilitazione sezione "ricerca"
		changearea('ricerca');
		// nasconde il tabbed dei risultati
		hideTabResult();

		// eliminiamo tutti contenuti caricati
		GMap.clearAll();

		// gestione form di ricerca
		resetForm();

		// settaggio posizione mappa
		GMap.setCenter(LATITUDINE, LONGITUDINE, ZOOM);

	} catch(e) {
		toException(e);
	}
}
/**
 * Ripristina lo stato iniziale della form di ricerca.
 */
function resetForm() {
	// gestione form di ricerca
	var formricerca = document.forms[NAME_FORM];
	for (var i = 0; i < formricerca.length; ++i) {
		var element = formricerca[i];
		if (element.name.indexOf("geocms_") == 0) {
			if (element.tagName == "INPUT") {
				if (element.type == "text") {element.value = element.defaultValue;}
				else if (element.type == "checkbox") {element.checked = false;}
				else if (element.type == "radio" && element.name == "geocms_luogo" && element.value == "provincia") {element.checked = true;}
			} else if (element.tagName == "SELECT") {element.selectedIndex = 0;}
		}
	}
}
/**
 * Effettua la ricerca dei punti vendita secodno i parametri utente.
 */
function search() {
	try {

		// gestione form di ricerca
		var formricerca = document.forms[NAME_FORM];
		var query = NO_QUERY;
		var indirizzo = NO_QUERY;
		
		var queryData = getQueryData();
		if (queryData != QUERY_FAILURE) {
			
			/** Quando ? */
			if (queryData != QUERY_ABORT && queryData != NO_QUERY) {query += queryData;};
			
			/** Dove ? */
			var queryLuogo = getQueryLuogo();
			if (queryLuogo == QUERY_ABORT) {
				var temp = formricerca.geocms_indirizzo.value;
				if (temp != formricerca.geocms_indirizzo.defaultValue && temp.replace(/^\s+|\s+$/g,"") != "") {indirizzo = temp;}

				var comune = formricerca.geocms_citta;
				if (comune.value != comune.defaultValue && comune.value.replace(/^\s+|\s+$/g,"") != "") {indirizzo += "," + comune.value;}
				
				var provincia = formricerca.geocms_prov;
				if (provincia.value != provincia.defaultValue && provincia.value.replace(/^\s+|\s+$/g,"") != "") {indirizzo += "," + provincia.value;}
			}
			else if (queryLuogo != NO_QUERY) {if (query != NO_QUERY) {query += OPERATOR_AND}; query+= queryLuogo;}

			/** Quali reparti? */
			var queryReparti = getQueryReparti();
			if (queryReparti != NO_QUERY) {if (query != NO_QUERY) {query += OPERATOR_AND}; query+= queryReparti;}

			/** Quali servizi? */
			var queryServizi = getQueryServizi();
			if (queryServizi != NO_QUERY) {if (query != NO_QUERY) {query += OPERATOR_AND}; query+= queryServizi;}
			
			// ricerca per distanza		
			if (indirizzo != NO_QUERY) {
				// nasconde il tabbed dei risultati
				hideTabResult();

				// eliminiamo tutti contenuti caricati
				GMap.clearAll();
				
				// ricerchiamo l'indirizzo richiesto
				GMap.showObjectsNearAddressAsync(/*address*/indirizzo, /*distance*/null, /*maxresult*/NEAR_ADDRESS_MAX_RESULTS, /*layer*/LAYERS.PUNTI_VENTIDA, /*query*/query, /*focus*/true, /*frontend*/null, function(statusCode, point, idLayer, listObject) {
					if (statusCode != SGEO_SUCCESS) {
						alert("Impossibile individuare l'indirizzo: \"" + indirizzo + "\"");
					} else if (listObject.length == 0) {
						// settaggio posizione mappa
						GMap.setCenter(point.lat(), point.lng());
						
						alert("Spiacenti. La ricerca non ha prodotto risultati.\nSuggerimenti:\n - Assicurati che tutti i nomi di strade e citta' siano stati digitati correttamente.\n - L'indirizzo deve comprendere una citta' e una provincia.\n - Prova a inserire un codice postale ")
					} else {
	
						// salvataggio stato stampa
						savePrintData({PRINT_DATA_LAYER:idLayer,PRINT_DATA_QUERY:query,PRINT_DATA_ADDRESS:indirizzo})
	
						// caricamewnto lista titoli
						loadResult(listObject);
					}
				});	
			}
			// tutti i pdv		
			else if (queryData == QUERY_ABORT && query == NO_QUERY) {showAllStore();}
			// gestione errore
			else if (query == NO_QUERY) {alert("Specificare almeno un valore prima di procedere con la richiesta");}
			// esesuzione query
			else {
			
				// nasconde il tabbed dei risultati
				hideTabResult();

				// eliminiamo tutti contenuti caricati
				GMap.clearAll();

				// esecuzione ricerca
				GMap.showLayerAsync(/*layer*/LAYERS.PUNTI_VENTIDA, /*query*/query, /*focus*/true, /*frontend*/null, function (idLayer, listObject) {
					if (listObject.length == 0) {
						alert("Spiacenti.\nLa ricerca non ha prodotto risultati.");
					} else {

						// caricamewnto lista titoli
						loadResult(listObject);

						// salvataggio stato stampa
						savePrintData({PRINT_DATA_LAYER:idLayer,PRINT_DATA_QUERY:query})
					}
				});
			}
		}

	} catch(e) {
		toException(e);
	}
}
/** 
 * Costruisce la query sul luogo.
 */
function getQueryLuogo() {
	var query = NO_QUERY;

	var formricerca = document.forms[NAME_FORM];
	// gestione modalità di ricerca
	var selected = null;
	var radio = formricerca.geocms_luogo;
	for(var i = 0; i < radio.length; i++) {
    	var temp = radio[i];
     	if((temp.checked)) {selected = temp.value;break}
	}
	
	// costruzione query
	if (selected == "provincia") {
		var value = formricerca.geocms_provincia.value;
		if (value != "NONE") {query = "[PROVINCE]=[" + value + "]";}
	} else if (selected == "comune") {
		var value = formricerca.geocms_comune.value;
		if (value != "NONE") {query = "[CITY]=[" + value + "]";}
	} else if (selected == "CAP") {
		var value = formricerca.geocms_zipcode.value;
		if (value.replace(/[^A-Za-z0-9]/g,"") != "") {
			if (isNaN(value) == true) {
				alert("Attenzione !\nIl campo CAP può contenere solo numeri.")
				query = QUERY_FAILURE;
			} else {query = "[ZIP]=[" + value.replace(/^\s+|\s+$/g,"") + "]";}
		}
	// ricerca per vicinanza
	} else {query = QUERY_ABORT;}

	// ritorniamo il valore richiesto
	return query;
}
/** 
 * Ritorna la query per la selezione delle date (se presente)
 */
function getQueryData() {
	var query = NO_QUERY;

	// parse data
	var giornoprec = document.forms[NAME_FORM].geocms_giornoprec.value;
	var retvalue = pareseDate(giornoprec);
	if (retvalue.date != null) {
		// N.B: gennaio è il mese 0 e non 1 e di conseguenza anche gli altri cambiano.
		var today = new Date(parseInt(retvalue.date.aaaa, 10), (parseInt(retvalue.date.mm, 10) - 1), parseInt(retvalue.date.gg, 10));
		
		// verifichiamo se la data specificata è un festivo o una domenica			
		if (today.getDay() == 0 ||
			SpecialDate[retvalue.date.gg + "/" + retvalue.date.mm] != null ||
			SpecialDateAnnuali[retvalue.date.gg + "/" + retvalue.date.mm + "/" + retvalue.date.aaaa] != null) {
			// costruzione query
			query = "[DATE]=[" + (retvalue.date.aaaa + "-" + retvalue.date.mm + "-" + retvalue.date.gg) + "]";
		} else {
			// costruzione query
			query = QUERY_ABORT;
		}
	} else if (retvalue.error != null) {
		// gestione errore
		alert("Formato data non corretto:\n" + retvalue.error);
		return QUERY_FAILURE;
	}

	return query;
}
/**
 * Parsa la data e comunica se è valida
 */
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 = {"aaaa":nums[2], "mm":nums[1], "gg":nums[0]};}
	}
	
	// ritorniamo il valore richiesto
	return ({"date": retvalue, "error": errore});
}
/** 
 * Costruisce la query sui reparti.
 */
function getQueryReparti() {
	var query = NO_QUERY;
	
	// gestione categorie tematiche
	var reparti = document.forms[NAME_FORM].geocms_reparto;
	for (var i = 0; i < reparti.length; i++){
		var reparto = reparti[i];
		// verifichiamo se il valore è selezionato
		if (reparto.checked == true) {
			// costruzione query
			if (query != NO_QUERY) {query += OPERATOR_AND;}
			query += "[CODE]=[" + reparto.value + "]";
		}
	}
	
	// ritorniamo il valore richiesto
	return query;
}
/** 
 * Costruisce la query sui servizio (esselunga e non).
 */
function getQueryServizi() {
	var query = NO_QUERY;
	
	var formricerca = document.forms[NAME_FORM];
	// gestione categorie tematiche
	var servizi = formricerca.geocms_srv;
	for (var i = 0; i < servizi.length; i++){
		var servizio = servizi[i];
		// verifichiamo se il valore è selezionato
		if (servizio.checked == true) {
			// costruzione query
			if (query != NO_QUERY) {query += OPERATOR_AND;}
			query += "[CODE_SRV]=[" + servizio.value + "]";
		}
	}

	var servizioex = formricerca.geocms_srvex.value;
	if (servizioex != "NONE") {
		if (query != NO_QUERY) {query += OPERATOR_AND;}
		query += "[NAME_SRVEX]=[" + servizioex + "]";
	}
		
	// ritorniamo il valore richiesto
	return query;
}
/** ============ BALLOON ============= */
/**
 * Calcola un percorso partendo dal balloon.
 * @param dlat latitudine del POI.
 * @param dlng longitudine del POI.
 */
function balloonPercorso(dlat, dlng) {
 	// recuperiamo i valori untente
	var balloonpercorso = document.forms["balloonpercorso"];
 	var saddr = balloonpercorso.saddr.value;
 	var daddr = document.getElementById("daddr").innerHTML;

 	// abilitiamo la sezione "calco percorso"
	light('cercaiitinerario');
 	var calcolapercorso = document.forms["calcolapercorso"];

 	// compilazione form
	var formricerca = document.forms[NAME_FORM];
	formricerca.geocms_saddr.value = saddr;
	formricerca.geocms_daddr.value = daddr;

	// esecuzione calcolo percorso
	calcolaPercorso((dlat+","+dlng));
}
/**
 * Massimizza la finestra attiva su mappa.
 */
function maximizeInfoWindow() {
	// gestione massimizzazione la finestra attiva su mappa.
	GMap.maximizeInfoWindow();	
}

/** ============ LISTA TITOLI ============= */
// variabili per la gestione delel paginate
var NDocsFound = -1;
var NCurrentPage = -1;
var ResultSearch = null;

/**
 * Carica la lista dei risultati gestendo le paginate.
 * @param result dati da elaborare.
 */
function loadResult(result) {
	// settaggiogestore ricerca
	ResultSearch = result;
	NCurrentPage = -1;
	// numero di docuemnti prodotti dalla ricerca
	NDocsFound = ResultSearch.length;
	
	// numero di paginate
	var nPages = parseInt(NDocsFound / DOCUMENTS_FOR_PAGE);
	if ((NDocsFound % DOCUMENTS_FOR_PAGE) > 0) {++nPages;}
	
	// settaggio contenuto
	risultati.innerHTML = "Trovati <strong>" + NDocsFound + "</strong> risultati<br /><br />";

	// veridfichiamo che la ricerca abbia prodotto risultati
	if (NDocsFound > 0) {
		// contenitore struttura HTML
		var resultHTML = "";
		
		NCurrentPage = 1;
		
		if (nPages > 1) {
			// costruzione struttura
			resultHTML += "<table class=\"main\" cellspacing=\"0\" cellpadding=\"1\" border=\"0\">";
			resultHTML += "<tr>";
			resultHTML += "<td style=\"width: 10px\">Pag.&nbsp;<a id=\"arrowleft\" href=\"javascript:void(0)\" onclick=\"dw_scrollObj.scrollBy('wn',70,0); return false\">&laquo;</a>&nbsp;</td>";
			resultHTML += "<td>";
			resultHTML += "<div id=\"hold\">";
			resultHTML += "<div id=\"wn\">";
			resultHTML += "<div id=\"lyr1\" class=\"content\">";
			resultHTML += "<table id=\"t1\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
			resultHTML += "<tr>";
			
	
			// cicliamo su i risultati della pagina corrente
			resultHTML += "<td><a class=\"selected\" id=\"page1\" href=\"javascript:void(0)\" onclick=\"javascript:loadPage(1)\">1</a>&nbsp;</td>";
			for (var i = 2; i <= nPages; ++i) {
				resultHTML += "<td>|&nbsp;<a href=\"javascript:void(0)\" id=\"page" + i + "\" onclick=\"javascript:loadPage(" + i + ")\">" + i + "</a>&nbsp;</td>";
			}
			
			// costruzione struttura
			resultHTML += "</tr>";
			resultHTML += "</table>";
			resultHTML += "</div>";
			resultHTML += "</div>";
			resultHTML += "</div>";
			resultHTML += "</td>";
			resultHTML += "<td style=\"width: 10px\">&nbsp;<a id=\"arrowright\" href=\"javascript:void(0)\" onclick=\"dw_scrollObj.scrollBy('wn',-70,0); return false\">&raquo;</a></td>";
			resultHTML += "</tr>";
			resultHTML += "</table>";
		}

		// costruzione lista titoli
		resultHTML += "<br />";
		resultHTML += "<div id=\"divresult\" style=\"overflow: auto;overflow-x: hidden;overflow-y: auto; padding: 0pt 2pt 0pt 25pt; height:490px;\">";
		resultHTML += "<ol id=\"pageresult\">";
		resultHTML += "</ol>";
		resultHTML += "</div>";

		// settaggio contenuto
		risultati.innerHTML += resultHTML;

		// caricamento prima pagina
		loadPage(1);
	
		// cambio area di visualizzazione
		changearea('risultati');
		// inizializzazione gestione paginate
		initScrLyr();
	}
}

/**
 * Carica la lista dei risultati gestendo le paginate.
 * @param nPage numero della pagina richiesta.
 */
function loadPage(nPage) {
	// indice di partenza della paginata
	var idResult = (DOCUMENTS_FOR_PAGE * (nPage - 1));

	// costruzione lista titoli
	var resultHTML = "";
	// cicliamo su i risultati della pagina corrente
	for (var i = 0; i < DOCUMENTS_FOR_PAGE; ++i) {
		var indice = (i + idResult);
		// condizione di uscita
		if (indice >= NDocsFound) {break;}

		// recupero l risultato corrente
		var result = ResultSearch[indice];
		var descrizione = result.description || "Descrizione non presente";				
		
		// gestione distanza
		var distanzaHTML = ""
		var distanza = result.getUserdata("GeoCMS_Distance");
		if (distanza && isNaN(distanza) == false) {
			if ((distanza / 1000) < 1) {
				distanzaHTML += "<b>" + parseInt(distanza) + "</b> m"
			} else {
				distanza = ((distanza / 1000).toString());
				distanzaHTML += "<b>" + distanza.substring(0, distanza.indexOf(".") + 2) + "</b> km"
			}
		}

		// costruzione descrizione
		resultHTML += "<li><a href=\"javascript:void(0)\" onclick=\"javascript:goToPOI('" + result.id + "', '" + result.idLayer + "')\">&raquo; " + descrizione + "</a>";
		resultHTML += (distanzaHTML.length > 0)? " - " + distanzaHTML:"";
		resultHTML += "<br />" + result.getUserdata("ADDRESS");
		resultHTML += "<br />" + result.getUserdata("ZIP") + " " + result.getUserdata("CITY") + " (" + result.getUserdata("PROVINCE") + ")";

		// costruzione descrizione
		resultHTML += "</li>";
	}
	
	if (NCurrentPage > 0 && (NCurrentPage != nPage)) {
		// settagio formattazione
		document.getElementById("page" + NCurrentPage).className = "";
		document.getElementById("page" + nPage).className = "selected";
	}
	
	// abilitazione sezione "risultati"
	var pageresult = document.getElementById("pageresult");
	pageresult.setAttribute("start", (idResult + 1));
	pageresult.innerHTML = resultHTML;

	// swettaggio pagina corrente
	NCurrentPage = nPage;
}

function initScrLyr() {
	if (document.getElementById("wn")) {
		// arguments: id of layer containing scrolling layers (clipped layer), id of layer to scroll, 
		// if horizontal scrolling, id of element containing scrolling content (table?)
		var wndo = new dw_scrollObj('wn', 'lyr1', 't1');
		
		// pass id('s) of scroll area(s) if inside table(s)
		dw_scrollObj.GeckoTableBugFix('wn');
		// gestione frecce di scorrimento
		hideSwowArrow(0,0);
	}
}


/** ============ FRONTEND ============= */

/**
 * Inizializza lo stato grafico dell'aplicazione
 */
function initializeFrontEnd() {
	// grafica
	risultati = document.getElementById("risultati");
	mappa = document.getElementById("map");
	loading = document.getElementById("loading");
	
	// funzioni
	var formricerca = document.forms[NAME_FORM];
	
	// gestione ricerca indirizzo
	formricerca.geocms_findindirizzo.onclick = function(){cercaIndirizzo(formricerca);return false;};
	// gestione calcolo itinerario
	formricerca.geocms_findpercorso.onclick = function(){calcolaPercorso();return false;};

	// gestione ricerca per query
	formricerca.geocms_findstore.onclick = function(){search();return false;};
	formricerca.geocms_resetstore.onclick = function(){reset();};
	formricerca.geocms_provincia.disabled = true;
	formricerca.geocms_comune.disabled = true;
	formricerca.geocms_provincia.onchange = function(){setFocusRadio(this)};
	formricerca.geocms_comune.onchange = function(){setFocusRadio(this)};
	formricerca.geocms_zipcode.onfocus = function(){setFocusRadio(this)};
	
	formricerca.geocms_indirizzo.onfocus = function(){setFocusRadio(this);inputTextOnFocus(this)};
	formricerca.geocms_indirizzo.onblur = function(){inputTextOnBlur(this)};
	formricerca.geocms_citta.onfocus = function(){setFocusRadio(this);inputTextOnFocus(this)};
	formricerca.geocms_citta.onblur = function(){inputTextOnBlur(this)};
	formricerca.geocms_prov.onfocus = function(){setFocusRadio(this);inputTextOnFocus(this)};
	formricerca.geocms_prov.onblur = function(){inputTextOnBlur(this)};
	
	document.getElementById("cercastore").scrollTop = 0;
	
	// gestione caricamento opzioni di ricerca dinamiche
	GMap.getListUserdataAsync("PROVINCE", null, "default", function(listUserdata) {
		loadSelectOptions(formricerca.geocms_provincia, listUserdata);
	});
	// gestione caricamento opzioni di ricerca dinamiche
	GMap.getListUserdataAsync("CITY", null, "default", function(listUserdata) {
		loadSelectOptions(formricerca.geocms_comune, listUserdata, "Seleziona un comune");
	});
	// gestione caricamento opzioni di ricerca dinamiche
	GMap.getListUserdataAsync("NAME_SRVEX", null, "srvex", function(listUserdata) {
		loadSelectOptions(formricerca.geocms_srvex, listUserdata, "Seleziona un valore");
	});
}
/**
 * Nasconde il tabbed dei risultati.
 */
function hideTabResult() {
	// nascondiamo il tabbed dei risultati
	risultati.innerHTML = "";
	document.getElementById("rislink").style.display = "none";
}
/**
 * Seleziona il radio corrispondente al controllo.
 * @param object controllo su cui è stato richiesto il focus
 */
function setFocusRadio(object) {
	// selezione oggetto richiesto
	(object.parentNode.getElementsByTagName("INPUT")[0]).checked = true;
	return false;
}

/**
 * Richiamato quando viene settato il focus sulla casella di testo.
 * @param object oggetto da gestire.
 */
function inputTextOnFocus(object) {
	if(object.value==object.defaultValue)object.value="";
}
/**
 * Richiamato quando viene perso il focus sulla casella di testo.
 * @param object oggetto da gestire.
 */
function inputTextOnBlur(object) {
	if(object.value=="")object.value=object.defaultValue;;
}

/**
 * Carica la lista delle opzioni legate.
 * @param object oggetto da gestire.
 * @param values lista dei valori da caricare.
 * @param text testo descrittivo della combo da utilizzare come primo valore [opzionale].
 */
function loadSelectOptions(object, values, text) {

	// verifichiamo che l'informazione sia valida
	if (values != null) {
		var len = values.length;
		var indexToSelect = -1;
		var valueToSelect = object.getAttribute("defaultValue");
		
		if (text) {
			// creazione opzione
			object.length = 0;
			attachOption(object, "NONE", text + " (" + len + ")");
		}
		
		// cicliamo su i risultati della pagina corrente
		for (var i = 0; i < len; ++i) {
			var valore = values[i];
			// creazione opzione
			attachOption(object, valore, valore);
			if (valore == valueToSelect) {indexToSelect = (i + 1)}
		}
		
		// abilitazione oggetto
		object.disabled = !(len > 0);

		if (indexToSelect != -1) {object.selectedIndex = indexToSelect;}
		else if (len == 1) {object.selectedIndex = 1;}
	}
}
/**
 * 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 ============= */
/**
 * Comprime la mappa eliminando l'ingombro dell'area di ricerca
 */
function collapseMap() {
	// gestione dimensioni
	mappa.style.width = "569px";
	loading.style.right = "260px";

	// aggiorniamo la mappa
	GMap.checkResize();

	// verifichiamo se si tratta del primo resize
	if (FirstResize == true) {
		// settaggio stato 
		FirstResize = false;
		// settaggio posizione mappa
		GMap.setCenter(LATITUDINE, LONGITUDINE, ZOOM);
	}
}

/**
 * Espande la mappa eliminando l'ingombro dell'area di ricerca
 */
function expandMap() {
	// gestione dimensioni
	mappa.style.width = "100%";
	loading.style.right = "385px";

	// aggiorniamo la mappa
	GMap.checkResize();
}
