/*
	GeCPoT - Gestione Community e Portali Tematici (Sviluppo Asp+Xml)
	Versione 1.0 - Codificato da Lord Xml per 3pix Studio (http://www.3pix.it)
	ARCHIVIO FUNZIONI JAVASCRIPT: archivio completo delle funzioni per la gestione di finestre di sistema, creazione di effetti visivi, creazione calendari, caricamento di oggetti Ajax.
*/


// AJAX: variabili globali per il caricamento di oggetti Ajax
var gpt_xmlHttp;
var gpt_ajaxObj;


// CALENDARIO : dichiarazione variabili di sistema 
var gpt_posizione;
var gpt_bisestile;
var gpt_inizioMese;


// CONTROLLO CAMPI: lista dei campi sui quali effettuare un controllo prima di inviare il relativo modulo. Possono essere presenti campi di più moduli. La lista viene aggiornata automaticamente dal template gpt_creaCampoModulo
var gpt_controlloCampi = "";


// DATE: array con la lista completa delle date rilevanti (che contengono riferimenti a eventi o altri oggetti)
var gpt_listaDate = new Array();

// IMMAGINI: variabili di controllo per la gestione di effetti sulle immagini
var gpt_immaginePrecaricata;
var gpt_immagineNormale;
var gpt_transizioneImmagineInCorso;
var gpt_velocitaTransizioneImmagini = 10;
gpt_transizioneImmagineInCorso = false;

// OGGETTI: variabili di controllo per la gestione di effetti sugli oggetti
var gpt_oggettoInMovimento;
var gpt_transizioneOggettoInCorso;
var gpt_oggettoInTrascinamento;
gpt_oggettoInTrascinamento = null;
gpt_transizioneOggettoInCorso = false;

/*
	AGGIUNGI SEZIONE A LINK: esamina un url e restituisce l'url modificato con aggiunta del parametro "gpt_sezione" nel caso in cui sia presente nella pagina una suddivisione in sezioni.
*/
function gpt_aggiungiSezioneALink(indirizzo)
{
	var listaInput = document.getElementsByTagName("input");
	var destinazione = indirizzo;
	var sezioneDaSelezionare = "";
	var ancora = "";
	// verifica la presenza di una suddivisione in sezioni
	for (x in listaInput)
	{
		if (listaInput[x].id)
		{
			if (listaInput[x].id.indexOf("sezioneCorrente_") == 0)
			{
				sezioneDaSelezionare = listaInput[x].value;
			}
		}
	}
	if (sezioneDaSelezionare != "")
	{
		// parametro già presente (sostituzione)
		if (destinazione.indexOf("gpt_sezione") > -1)
		{
			var valoreAttuale = destinazione;
			valoreAttuale = valoreAttuale.substring(valoreAttuale.indexOf("gpt_sezione=") + 12);
			if (valoreAttuale.indexOf("&") > -1)
			{
				valoreAttuale = valoreAttuale.substring(0, valoreAttuale.indexOf("&"));
			}
			if (valoreAttuale.indexOf("#") > -1)
			{
				valoreAttuale = valoreAttuale.substring(0, valoreAttuale.indexOf("#"));
			}
			destinazione = destinazione.replace("gpt_sezione=" + valoreAttuale, "gpt_sezione=" + sezioneDaSelezionare);
		}
		else
		{
			if (destinazione.indexOf("#") > -1)
			{
				ancora = destinazione.substring(destinazione.indexOf("#"));
				destinazione = destinazione.substring(0, destinazione.indexOf("#"));
			}
			if (destinazione.indexOf("?") > -1)
			{
				destinazione = destinazione + "&gpt_sezione=" + sezioneDaSelezionare + ancora;
			}
			else
			{
				destinazione = destinazione + "?gpt_sezione=" + sezioneDaSelezionare  + ancora;
			}
		}
	}
	return destinazione;
}



/*
	ANTEPRIMA IMMAGINE: crea un box con la preview di un'immagine
*/
function gpt_anteprimaImmagine(visualizza, codiceBox, indirizzo, larghezzaAnteprima, altezzaAnteprima)
{
	var documento = window.document;
	var bodyDocumento = documento.getElementsByTagName("body")[0];
	// visualizza l'immagine di anteprima
	if (visualizza == true)
	{
		if (!(document.getElementById(codiceBox)))
		{
			// definisci il contenitore per l'immagine
			var divContenitore = documento.createElement("div");
			divContenitore.setAttribute("id", codiceBox);
			divContenitore.style.width = larghezzaAnteprima + "px";
			divContenitore.style.height = altezzaAnteprima + "px";
			divContenitore.setAttribute("class", "gpt_anteprimaImmagine");
			divContenitore.setAttribute("className", "gpt_anteprimaImmagine");
			divContenitore.style.position = "absolute";
			divContenitore.style.left = gpt_mouseX - (parseInt(larghezzaAnteprima / 100) * 25) + "px";
			divContenitore.style.top = gpt_mouseY - (altezzaAnteprima + (parseInt(altezzaAnteprima / 100) * 25)) + "px";
			// definisci l'immagine di anteprima
			var immagine = documento.createElement("img");
			immagine.setAttribute("id", codiceBox + "_img");
			immagine.setAttribute("alt", indirizzo);
			immagine.src = "sistema/noImmagineEmail.gif";
			immagine.style.width = "100%";
			immagine.style.height = "100%";
			// definisci il testo di caricamento
			var testoCaricamento = documento.createElement("div");
			testoCaricamento.setAttribute("id", codiceBox + "_loa");
			testoCaricamento.innerHTML = gpt_eliminaHtml(gpt_messaggioCaricamento);
			// aggancia gli elementi
			divContenitore.appendChild(immagine);
			divContenitore.appendChild(testoCaricamento);
			bodyDocumento.appendChild(divContenitore);
			// preacarica l'immagine di anteprima
			gpt_immagineNormale = documento.getElementById(codiceBox + "_img");
			gpt_impostaOpacita(0, codiceBox + "_img");
			gpt_precaricaImmagine(indirizzo, "dissolvenza", codiceBox + "_loa");
		}
	}
	// nascondi l'immagine di anteprima
	else
	{
		if (document.getElementById(codiceBox))
		{
			var divContenitore = document.getElementById(codiceBox);
			bodyDocumento.removeChild(divContenitore);
		}
	}
}



/*
	ARROTONDA VALORE: arrotonda un valore numerico o stringa dato un determinato numero di decimali 
*/
function gpt_arrotondaValore(valore, numeroDecimali)
{
	var risultato = parseFloat(valore);
	risultato = Math.round(risultato * Math.pow(10, numeroDecimali)) / Math.pow(10, numeroDecimali);
	risultato = risultato.toFixed(numeroDecimali);
	return risultato;
}



/*
	ASSEGNA VALORE GIORNO: inserisce un separatore tra i valori giorno mese e anno
*/
function gpt_assegnaValoreGiorno(giorno, mese, anno)
{
	codiceElemento = "valoreData";
	separatore = "-";
	if (document.getElementById(codiceElemento))
	{
		document.getElementById(codiceElemento).value = anno + separatore + mese + separatore + giorno;
	}
}



/*
	CONTROLLA CAPTCHA: verifica se il codice captcha inserito è corretto e in caso di successo invia il form di riferimento.
	Utilizza per effettuare il controllo una chiamata ajax verso un file ASP (per default "captcha.asp" nella root del sito).
	In caso di errore nel codice aggiunge automaticamente gli errori nella div "errori" del modulo o visualizza un alert con il messaggio.
*/
function gpt_captchaControlla(bersaglio, fileControllo, idInputCodiceControllo, idModulo, messaggioErrore)
{
	var gpt_ctrldt = new Date();
	if (document.getElementById(idInputCodiceControllo))
	{
		if (fileControllo.indexOf("?") > -1)
		{
			gpt_caricaContenutoAjax(bersaglio, fileControllo + "&cod=" + document.getElementById(idInputCodiceControllo).value + "&err=" + messaggioErrore + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");	
		}
		else
		{
			gpt_caricaContenutoAjax(bersaglio, fileControllo + "?cod=" + document.getElementById(idInputCodiceControllo).value + "&err=" + messaggioErrore + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");		
		}
	}
}



/*
	REFRESH IMAGE: ricarica l'attributo "src" di un'immagine.
	Utilizzato nella generazione dei codici di controllo tramite il file "gpt_captcha.asp".
	Nessun parametro.
*/
function gpt_captchaRefreshImage(valImageId)
{
	var objImage = document.images[valImageId];
	if (objImage == undefined)
	{
		return;
	}
	var now = new Date();
	objImage.src = objImage.src.split('?')[0] + '?x=' + now.toUTCString();
}



/*
	CARICA CONTENUTI: carica una sequenza di contenuti all'interno dei relativi elementi della pagina.
	Utilizza singole chiamate ajax appoggiandosi alla funzione gpt_caricaContenutoAjax.
*/

function gpt_caricaContenutiAjax(sequenza)
{
	var sequenzaControllo = sequenza;
	var sequenzaCorrente = "";
	var bersaglioCorrente = "";
	var metodoCorrente = "";
	var indirizzoCorrente = "";
	var caricaSuccessivo = true;
	// inserisci il carattere "," a fine sequenza nel caso in cui non sia presente
	if (sequenzaControllo.substr(sequenzaControllo.length - 1, 1) != ",")
	{
		sequenzaControllo = sequenzaControllo + ",";
	}
	// ricava i parametri per il lancio della chiamata ajax
	sequenzaCorrente  = sequenzaControllo.substring(0, sequenzaControllo.indexOf(","));
	bersaglioCorrente = sequenzaCorrente.substring(0, sequenzaCorrente.indexOf("["));
	metodoCorrente = sequenzaCorrente.substring(sequenzaCorrente.indexOf("[") + 1, sequenzaCorrente.indexOf("|")).toUpperCase();
	indirizzoCorrente = sequenzaCorrente.substring(sequenzaCorrente.indexOf("|") + 1, sequenzaCorrente.indexOf("]"));
	// verifica se non è stata effettuata in precedenza una chiamata ajax o in caso contrario verifica se la chiamata precedente è terminata
	if (gpt_xmlHttp == null)
	{
		gpt_caricaContenutoAjax(bersaglioCorrente, indirizzoCorrente, metodoCorrente);
	}
	else
	{
		if (gpt_xmlHttp.readyState == 4)
		{
			gpt_caricaContenutoAjax(bersaglioCorrente, indirizzoCorrente, metodoCorrente);
		}
		else
		{
			caricaSuccessivo == false;
		}
	}
	// aggiorna la sequenza di controllo e richiama la funzione se la sequenza o le chiamate ajax non sono ancora terminate
	if (caricaSuccessivo == true)
	{
		sequenzaControllo = sequenzaControllo.replace(sequenzaCorrente + ",", "");
	}
	if (sequenzaControllo != "")
	{
		setTimeout("gpt_caricaContenutiAjax('" + sequenzaControllo + "')", 1000);	
	}
}



/*
	CARICA CONTENUTO: carica il contenuto generato da un file esterno all'interno dell'elemento bersaglio.
	In caso di mancato supporto degli oggetti e metodi necessari viene visualizzato un messaggio di errore.
	Parametri della funzione:
	1)	bersaglio			Codice identificativo del tag html che dovrà contenere i dati estratti dal file esterno. 
	2)	fileCercato		Indirizzo del file da caricare e "riversare" all'interno del tag bersaglio.
	3)	metodo				Metodo di trasmissione dei dati (GET o POST).
*/

function gpt_caricaContenutoAjax(bersaglio, fileCercato, metodo)
{
	if (document.getElementById(bersaglio))
	{
		if (fileCercato != '')
		{
			gpt_xmlHttp = gpt_GetXmlHttpObject();
			if (gpt_xmlHttp == null)
			{
				alert (gpt_messaggioNoSupportoAjax);
				return;
			}
			var url = fileCercato;
			gpt_ajaxObj = bersaglio;
			if (metodo.toUpperCase() == "POST")
			{
				var indirizzo = url.substring(0, url.indexOf("?"));
				var parametri = url.substring(url.indexOf("?") + 1);
				gpt_xmlHttp.onreadystatechange = gpt_stateChanged;
				gpt_xmlHttp.open(metodo, indirizzo, true);
				gpt_xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				gpt_xmlHttp.setRequestHeader("Content-length", parametri.length);
				gpt_xmlHttp.setRequestHeader("Connection", "close");
				gpt_xmlHttp.send(parametri);
			}
			else
			{
				gpt_xmlHttp.onreadystatechange = gpt_stateChanged;
				gpt_xmlHttp.open(metodo, url, true);
				gpt_xmlHttp.send(null);
			}
		}
	}
}



/*
	COORDINATE MOUSE: rileva le coordinate del mouse e assegna il valore alle variabili JS di sistema "gpt_mouseX" e "gpt_mouseY"
	La funzione viene lanciata automaticamente nella sezione "head" del documento su evento "onmousemove".
*/
function gpt_coordinateMouse(e)
{
	// rileva le coordinate del mouse
	var _x;
	var _y;
	if (!gpt_IEinUso) 
	{
		_x = e.pageX;
		_y = e.pageY;
	}
	if (gpt_IEinUso) {
		_x = event.clientX + document.body.scrollLeft;
		_y = event.clientY + document.body.scrollTop;
	}
	gpt_mouseX = _x;
	gpt_mouseY = _y;
	// muovi l'eventuale oggetto in trascinamento
	if (gpt_oggettoInTrascinamento != null)
	{
		var tolleranza = 2;
		// recupera i valori posizionali e la dimensione dell'oggetto in trascinamento
		var larghezza = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "width"));
		var altezza = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "height"));
		var margineSinistro = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "marginLeft"));
		var margineDestro = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "marginRight"));
		var margineSuperiore = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "marginTop"));
		var margineInferiore = parseInt(gpt_getStyle(gpt_oggettoInTrascinamento, "marginBottom"));
		if (isNaN(margineSinistro) == true) { margineSinistro = 0; }
		if (isNaN(margineDestro) == true) { margineDestro = 0; }
		if (isNaN(margineSuperiore) == true) { margineSuperiore = 0; }
		if (isNaN(margineInferiore) == true) { margineInferiore = 0; }
		// gestisci lo spostamento orizzontale
		if (gpt_mouseX > 0 && gpt_mouseX < (screen.availWidth - larghezza - tolleranza))
		{
			gpt_oggettoInTrascinamento.style.left = "0px";
			margineSinistro = gpt_mouseX - tolleranza;
		}
		// gestisci lo spostamento verticale
		if (gpt_mouseY > 0 && gpt_mouseY < (screen.availHeight + gpt_getScrollXY() - altezza - tolleranza))
		{
			gpt_oggettoInTrascinamento.style.top = "0px";
			margineSuperiore = gpt_mouseY - tolleranza;
		}
		// muovi l'oggetto come stabilito
		gpt_oggettoInTrascinamento.style.margin = margineSuperiore + "px " + margineDestro + "px " + margineInferiore + "px " + margineSinistro + "px";
	}
	return true;
}



/*
	CONTROLLA CAMPO: verifica la presenza di caratteri non consentiti all'interno del valore di un campo in un modulo HTML.
	La lista dei caratteri consentiti è definita all'interno del file "gpt_datiFunzioni.js".
	Passando un valore diverso da vuoto per il parametro "spazioNotificaErrori" si otterrà la visualizzazione dei messaggi all'interno di un qualunque tag della pagina (occorre appunto indicare l'id del tag di riferimento).
	Impostando il valore "svuotaSpazioNotificaErrori" su "true" si otterrà uno svuotamento del box dei messaggi di errore
	"valoreSuggerimento" indica il valore scritto all'interno del campo come suggerimento(che corrisponde al campo lasciato vuoto)
*/
function gpt_controllaCampo(idCampo, nomeCampo, tipoCampo, lunghezzaMax, lunghezzaMin, spazioNotificaErrori, svuotaSpazioNotificaErrori, valoreSuggerimento)
{
	if (document.getElementById(idCampo))
	{	
		// individua il nome effettivo del campo cercando una eventuale etichetta (elemento "label")
		if (document.getElementById("eti_" + idCampo))
		{
			nomeCampoEffettivo = document.getElementById("eti_" + idCampo).innerHTML;
			if (nomeCampoEffettivo.indexOf(" *") > -1)
			{
				nomeCampoEffettivo = nomeCampoEffettivo.substr(0, nomeCampoEffettivo.indexOf(" *"));
			}
		}
		else
		{
			nomeCampoEffettivo = nomeCampo;
		}
		// recupera messaggi già inseriti o elimina i messaggi precedenti in base alla richiesta
		var messaggi = "";
		var utilizzaSpazioNotifica = false;
		if (document.getElementById(spazioNotificaErrori))
		{
			if (svuotaSpazioNotificaErrori == true)
			{
				document.getElementById(spazioNotificaErrori).innerHTML = "";
			}
			else
			{
				messaggi = document.getElementById(spazioNotificaErrori).innerHTML;
			}
			utilizzaSpazioNotifica = true;			
		}
		// definisci lunghezza massima e minima e preleva il valore del campo
		var lunghezzaMassima = lunghezzaMax;
		var lunghezzaMinima = lunghezzaMin;
		var valoreImmesso = document.getElementById(idCampo).value;
		var corretto = true;
		// valore suggerimento (controlla se l'utente ha effettivamente inserito qualcosa all'interno del campo)
		if (valoreImmesso != "" && valoreImmesso == (gpt_carattereAperturaSuggerimento + valoreSuggerimento + gpt_carattereChiusuraSuggerimento))
		{	
			valoreImmesso = "";
		}
		// controllo sulla lunghezza
		if (valoreImmesso.length < lunghezzaMinima)
		{
			corretto = false;
			if (valoreImmesso.length == 0)
			{
				messaggi = messaggi + " " + gpt_messaggioCampoVuoto.replace(/nomeCampo/, nomeCampoEffettivo);
			}
			else
			{
				messaggi = messaggi + " " + gpt_messaggioCampoTroppoCorto.replace(/nomeCampo/, nomeCampoEffettivo).replace(/minimoCaratteri/, lunghezzaMinima);
			}
		}
		if (valoreImmesso.length > lunghezzaMassima)
		{
			corretto = false;
			messaggi = messaggi + " " + gpt_messaggioCampoTroppoLungo.replace(/nomeCampo/, nomeCampoEffettivo).replace(/massimoCaratteri/, lunghezzaMassima);
		}
		// creazione degli array di controllo per i caratteri determinato in base al tipo di campo
		var caratteriConsentiti = new Array();
		var caratteriObbligatori = new Array();
		switch(tipoCampo)
		{
			// intero (solo numeri)
			case "intero":
				for (i = 15; i <= 24; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
			break;
			// decimale (numeri e virgola)
			case "decimale":
				for (i = 15; i <= 24; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
		      	caratteriConsentiti[10] = gpt_caratteriCampoConsentiti[11];
			break;
			// data (numeri, spazio, /, :, -)
			case "data":
				for (i = 15; i <= 24; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
		      	caratteriConsentiti[10] = gpt_caratteriCampoConsentiti[14];
		      	caratteriConsentiti[11] = gpt_caratteriCampoConsentiti[25];
		      	caratteriConsentiti[12] = gpt_caratteriCampoConsentiti[189];
		      	caratteriConsentiti[13] = gpt_caratteriCampoConsentiti[12]
			break;
			// cellulare (solo numeri senza spazi con il carattere +)
			case "telefono":
				for (i = 15; i <= 24; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
	      		caratteriConsentiti[10] = gpt_caratteriCampoConsentiti[10];
			break;
			// email (tutti i caratteri con chiocciola e punto obbligatori)
			case "email":
				for (i = 0; i < 189; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
	      		caratteriObbligatori[0] = gpt_caratteriCampoConsentiti[31];
	      		caratteriObbligatori[1] = gpt_caratteriCampoConsentiti[13];
			break;
			// generico o non specificato (tutti i caratteri disponibili)
			default:
				for (i = 0; i < 191; i++)
		      	{
					caratteriConsentiti[i] = gpt_caratteriCampoConsentiti[i]; 
		      	}
			break;
		}
		// controllo caratteri consentiti: analisi della stringa carattere per carattere
		if (corretto == true)
		{
		  	var valoreAnalisi = valoreImmesso;
		  	var singoloCarattere;
		  	var compreso;
		  	var caratteriProibiti = "";
		  	var stringaDiSoliSpazi = true;
	    		while (valoreAnalisi.length > 0)
	    		{
		  		singoloCarattere = valoreAnalisi.substring((valoreAnalisi.length - 1), valoreAnalisi.length);
		  		compreso = false;
	      		for (i = 0; i < caratteriConsentiti.length; i++)
	      		{
	        			if (singoloCarattere == caratteriConsentiti[i])
	  				{
	  					compreso = true;
	  				}
	      		}
	  			if (compreso == false)
	  			{
	  				if (caratteriProibiti.indexOf(singoloCarattere) == -1 || (singoloCarattere == " " &&  caratteriProibiti.indexOf(gpt_stringaSostitutivaSpazio) == -1) || (singoloCarattere == "\r" &&  caratteriProibiti.indexOf(gpt_stringaSostitutivaInvio) == -1))
	  				{
		  				if (singoloCarattere == " ")
		  				{
		  					caratteriProibiti = caratteriProibiti +  " " + gpt_stringaSostitutivaSpazio;
		  				}
		  				else if (singoloCarattere == "\r")
		  				{
		  					caratteriProibiti = caratteriProibiti +  " " + gpt_stringaSostitutivaInvio;
		  				}
		  				else
		  				{
		  					caratteriProibiti = caratteriProibiti +  " " + singoloCarattere;
		  				}
		  			}
	  				corretto = false;
	  			}
	  			if (singoloCarattere != " ")
	  			{
	  				stringaDiSoliSpazi = false;
	  			}
	  			valoreAnalisi = valoreAnalisi.substring(0, (valoreAnalisi.length - 1));
	    		}
			if (corretto == false)
			{
				messaggi = messaggi + gpt_messaggioCampoCaratteriProibiti.replace(/nomeCampo/, nomeCampoEffettivo).replace(/caratteriProibiti/, caratteriProibiti);
			}
		}
		// controllo stringa di soli spazi
		if (stringaDiSoliSpazi == true && valoreImmesso.length > 0)
		{
			messaggi = messaggi + gpt_messaggioCampoSoloSpazi.replace(/nomeCampo/, nomeCampoEffettivo);
			corretto = false;
		}
		// controllo caratteri obbligatori
		if (caratteriObbligatori.length > 0)
		{
			var caratteriNecessari = "";
			for (i = 0; i < caratteriObbligatori.length; i++)
      		{
        			if (valoreImmesso.indexOf(caratteriObbligatori[i]) == -1)
        			{
        				caratteriNecessari = caratteriNecessari + " " + caratteriObbligatori[i];
        			}
      		}
      		if (caratteriNecessari != "")
      		{
      			messaggi = messaggi + gpt_messaggioCampoCaratteriNecessari.replace(/nomeCampo/, nomeCampoEffettivo).replace(/caratteriNecessari/, caratteriNecessari);
      			corretto = false;
      		}
		}
		// ritorna valore funzione e notifica eventuali messaggi di errore
		if (corretto == false)
		{
			if (utilizzaSpazioNotifica == true)
			{
				if (document.getElementById(spazioNotificaErrori))
				{
					document.getElementById(spazioNotificaErrori).innerHTML = messaggi;
				}
			}
			else
			{
				alert(gpt_eliminaHtml(messaggi));
			}
			return false;
		}	
		else
		{
			return true;
		}
	}
	else
	{
		return false;
	}
}



/*
	CONTROLLA LOGIN: controlla la correttezza del login prima di inviare il relativo modulo e restituisce un messaggio in caso di errore.
	Per default viene utilizzato il file di controllo "gpt_extra.asp" all'interno della cartella "sistema".
*/
function gpt_controllaLogin(bersaglio, fileControllo, idModulo, idInputUtente, idInputPassword, idInputCodiceVariabile)
{
	var gpt_ctrldt = new Date();
	if (document.getElementById(idInputUtente) && document.getElementById(idInputPassword))
	{
		if (fileControllo.indexOf("?") > -1)
		{
			if (document.getElementById(idInputCodiceVariabile))
			{
				gpt_caricaContenutoAjax(bersaglio, fileControllo + "&ute=" + document.getElementById(idInputUtente).value + "&pas=" + document.getElementById(idInputPassword).value + "&cod=" + document.getElementById(idInputCodiceVariabile).value + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");
			}
			else
			{
				gpt_caricaContenutoAjax(bersaglio, fileControllo + "&ute=" + document.getElementById(idInputUtente).value + "&pas=" + document.getElementById(idInputPassword).value + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");
			}
		}
		else
		{
			if (document.getElementById(idInputCodiceVariabile))
			{
				gpt_caricaContenutoAjax(bersaglio, fileControllo + "?ute=" + document.getElementById(idInputUtente).value + "&pas=" + document.getElementById(idInputPassword).value + "&cod=" + document.getElementById(idInputCodiceVariabile).value + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");
			}
			else
			{
				gpt_caricaContenutoAjax(bersaglio, fileControllo + "?ute=" + document.getElementById(idInputUtente).value + "&pas=" + document.getElementById(idInputPassword).value + "&dat=" + gpt_ctrldt.getMilliseconds() + "&mod=" + idModulo, "GET");
			}		
		}
	}
}



/*
	CONTROLLA REGISTRAZIONE: controlla se il nome utente e l'email scelti per la registrazione sono già in uso nel database e in caso contrario prosegue con la procedura.
	Per default viene utilizzato il file di controllo "gpt_extra.asp" all'interno della cartella "sistema".
*/
function gpt_controllaRegistrazione(bersaglio, fileControllo, idModulo, idInputUtente, idInputPassword, idInputEmail, controlloCaptcha, campoTestoCaptcha)
{
	var gpt_ctrldt = new Date();
	if (document.getElementById(idInputUtente) && document.getElementById(idInputPassword) && document.getElementById(idInputEmail))
	{
		if (fileControllo.indexOf("?") > -1)
		{
			carattereSeparazione = "&";
		}
		else
		{
			carattereSeparazione = "?";		
		}
		gpt_caricaContenutoAjax(bersaglio, fileControllo + carattereSeparazione + "ute=" + document.getElementById(idInputUtente).value + "&pas=" + document.getElementById(idInputPassword).value + "&ema=" + document.getElementById(idInputEmail).value + "&mod=" + idModulo + "&cap=" + controlloCaptcha + "&tca=" + campoTestoCaptcha + "&ber=" + bersaglio + "&dat=" + gpt_ctrldt.getMilliseconds(), "GET");
	}
}



/*
	CONTROLLO CARICAMENTO IMMAGINE: verifica se un'immagine è stata correttamente caricata dal browser e lancia un'azione specifica appena ciò avviene.
	Utilizzata in combinazione con "gpt_controlloCaricamentoImmagine". Sfrutta le costanti JS "gpt_immaginePrecaricata" e "gpt_immagineNormale".
*/
function gpt_controlloCaricamentoImmagine(operazioneSuccessiva, testoCaricamento, testoDidascalia, testoDidascaliaPrecedente)
{	
	if (gpt_immaginePrecaricata.complete)	
	{
		// nascondi il testo di caricamento
		if (document.getElementById(testoCaricamento))
		{
			document.getElementById(testoCaricamento).style.display = "none";
		}
		if (operazioneSuccessiva == "dissolvenza" || operazioneSuccessiva == "")
		{
			if (document.getElementById(testoDidascaliaPrecedente))
			{
				document.getElementById(testoDidascaliaPrecedente).style.display = "none";
			}
			gpt_dissolviImmagine(0, "uscita", testoDidascalia);
		}
		else
		{
			eval(operazioneSuccessiva);
		}
	}
	else
	{
		setTimeout("gpt_controlloCaricamentoImmagine('" + operazioneSuccessiva + "', '" + testoCaricamento + "', '" + testoDidascalia + "', '" + testoDidascaliaPrecedente + "')", 10);
	}
}



/*
	CREA COMANDI CAMPO DATA: crea una lista di sei "select" con giorno, mese, anno ora, minuto, secondo in corrispondenza di un campo input qualunque.
	Utilizzato per gestire i campi data. Il formato trattato è: aaaa/mm/gg oo:mm:ss.
*/
function gpt_creaComandiCampoData(codice, dataCorrente)
{
	if (document.getElementById(codice))
	{
		// selettore per il giorno
		document.write("<select id='dgi_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = 1;
		while (k <= 31)
 		{
			if (k >= 10)
			{
				document.write("<option value='" + k + "'>" + k + "</option>");
			}
			else
			{
				document.write("<option value='0" + k + "'>0" + k + "</option>");
			}
 			k = k + 1;
 		}
		document.write("</select>/");
		// selettore per il mese
		document.write("<select id='dme_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = 1;
		while (k <= 12)
 		{
			if (k >= 10)
			{
				document.write("<option value='" + k + "'>" + gpt_nomeMese[k] + "</option>");
			}
			else
			{
				document.write("<option value='0" + k + "'>" + gpt_nomeMese[k] + "</option>");
			}
 			k = k + 1;
 		}
		document.write("</select>/");
		// selettore per l'anno
		document.write("<select id='dan_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = gpt_limiteMinimoSelectAnno;
		while (k <= gpt_limiteMassimoSelectAnno)
 		{
			document.write("<option value='" + k + "'>" + k + "</option>");
 			k = k + 1;
 		}
		document.write("</select> ");
		// selettore per le ore
		document.write("<select id='dor_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = 0;
		while (k <= 23)
 		{
			if (k >= 10)
			{
				document.write("<option value='" + k + "'>" + k + "</option>");
			}
			else
			{
				document.write("<option value='0" + k + "'>0" + k + "</option>");
			}
 			k = k + 1;
 		}
		document.write("</select>:");
		// selettore per i minuti
		document.write("<select id='dmi_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = 0;
		while (k <= 59)
 		{
			if (k >= 10)
			{
				document.write("<option value='" + k + "'>" + k + "</option>");
			}
			else
			{
				document.write("<option value='0" + k + "'>0" + k + "</option>");
			}
 			k = k + 1;
 		}
		document.write("</select>:");
		// selettore per i secondi
		document.write("<select id='dse_" + codice + "' onchange='javascript: gpt_impostaCampoData(\"" + codice + "\", \"\", true);'>");
		document.write("<option value=''></option>");
		k = 0;
		while (k <= 59)
 		{
			if (k >= 10)
			{
				document.write("<option value='" + k + "'>" + k + "</option>");
			}
			else
			{
				document.write("<option value='0" + k + "'>0" + k + "</option>");
			}
 			k = k + 1;
 		}
		document.write("</select>");
		// seleziona una data di default se richiesto
		if (dataCorrente != "")
		{
			gpt_impostaCampoData(codice, dataCorrente, true);
		}
	}
}



/*
	SELETTORE MESE e ANNO: crea il selettore per anno e mese.
	Il selettore permette di modificare la visualizzazione del periodo del calendario. L'operazione viene eseguita "lato client".
	Parametri della funzione:
	1)	bersaglioSel			Codice univoco dell'elemento html all'interno del quale iniettare il codice del selettore.
	2)	codiceSel					Codice univoco da assegnare al selettore.
	3)	bersaglioCal			Codice univoco dell'elemento html che contiene il calendario da aggiornare tramite il selettore.
	4)	annoSelezionato		Anno che dovr� risultare selezionato nella <select /> relativa al mese.
	5)	meseSelezionato		Mese che dovr� risultare selezionato nella <select /> relativa all'anno. 
*/
function gpt_creaSelectMeseAnno(bersaglioSel, codiceSel, bersaglioCal, annoSelezionato, meseSelezionato)
{
	// crea il form per la selezione di mese e anno
	var codiceSelettore = "";
	// lista degli anni selezionabili
 	codiceSelettore = codiceSelettore + "<select id='" + codiceSel + "_anno' name='anno'>";
 		codiceSelettore = codiceSelettore + "<option value=''></option>";
 		var k = gpt_limiteMinimoSelectAnno;
 		while (k <= gpt_limiteMassimoSelectAnno)
 		{
 			if (annoSelezionato == k)
 			{
 				codiceSelettore = codiceSelettore + "<option selected='selected' value='" + k + "'>" + k + "</option>";
 			}
 			else
 			{
 				codiceSelettore = codiceSelettore + "<option value='" + k + "'>" + k + "</option>";
 			}
 			k = k + 1;
 		}
 	codiceSelettore = codiceSelettore + "</select>";
 	// lista dei mesi selezionabili
 	var chiamataMostra = "javascript: gpt_mostraPeriodo('" + codiceSel + "_anno', '" + codiceSel + "_mese', '" + bersaglioCal + "');";
 	codiceSelettore = codiceSelettore + '<select id="' + codiceSel + '_mese" name="mese" onchange="' + chiamataMostra + '">';
 		codiceSelettore = codiceSelettore + "<option value=''></option>";
 		k = 1;
 		while (k < 13)
 		{
 			if (meseSelezionato == k)
 			{
 				codiceSelettore = codiceSelettore + "<option selected='selected' value='" + k + "'>" + gpt_nomeMese[k] + "</option>";
 			}
 			else
 			{		
 				codiceSelettore = codiceSelettore + "<option value='" + k + "'>" + gpt_nomeMese[k] + "</option>";
 			}
 			k = k + 1;
 		}
 	codiceSelettore = codiceSelettore + "</select>";
 	// codiceSelettore = codiceSelettore + '<input type="button" onclick="' + chiamataMostra + '" value="' + gpt_etichettaSelettore + '" />';
	document.getElementById(bersaglioSel).innerHTML = codiceSelettore;
}



/*
	DISSOLVI IMMAGINE: esegue una dissolvenza in entrata o in uscita operando su un tag "img".
	Utilizzata in combinazione con "gpt_controlloCaricamentoImmagine".
*/
function gpt_dissolviImmagine(passaggio, direzione, testoDidascalia)
{
	var valore;
	var limitePassaggi = gpt_velocitaTransizioneImmagini;
	if (passaggio <= limitePassaggi)
	{
		if (direzione == "entrata")
		{
			valore = passaggio * Math.round(100 / limitePassaggi);
		}
		else
		{
			valore = (limitePassaggi - passaggio) * Math.round(100 / limitePassaggi);
		}
		gpt_immagineNormale.style.MozOpacity = (valore/100);
		gpt_immagineNormale.style.filter = "alpha(opacity=" + valore +")";
		gpt_immagineNormale.style.opacity = (valore/100);
		setTimeout("gpt_dissolviImmagine(" + (passaggio + 1) + ", '" + direzione + "', '" + testoDidascalia + "')", 25);
	}
	else
	{
		if (direzione == "uscita")
		{
			gpt_immagineNormale.src = gpt_immaginePrecaricata.src;
			gpt_dissolviImmagine(0, "entrata", testoDidascalia);
		}
		else
		{
			if (document.getElementById(testoDidascalia))
			{
				document.getElementById(testoDidascalia).style.display = "block";
			}
			gpt_transizioneImmagineInCorso = false;
		}
	}
}



/*
	ELIMINA HTML: elimina il codice HTML da una stringa generica e restituisce il testo privo di tag.
*/
function gpt_eliminaHtml(testo)
{
	var testoSemplice = testo;
	var tag = "";
	while (testoSemplice.indexOf("<") > -1 && testoSemplice.indexOf(">") > -1 && testoSemplice.indexOf("<") < testoSemplice.indexOf(">"))
	{
		if (testoSemplice.indexOf("<") > -1 && testoSemplice.indexOf(">") > -1 && testoSemplice.indexOf("<") < testoSemplice.indexOf(">"))
		{
			tag = testoSemplice.substr(testoSemplice.indexOf("<"), (testoSemplice.indexOf(">") - testoSemplice.indexOf("<")) + 1);
			testoSemplice = testoSemplice.replace(tag, "");  
		}
	}
	return testoSemplice;
}



/*
	FINESTRA POPUP: finestra di sistema in modalità popup.
	La funzione calcola automaticamente la dimensione e il posizionameto (centrale) della finestra.
	Parametri della funzione:
	1)	indirizzo		Indirizzo da visualizzare. 
*/

function gpt_finestraPopup(indirizzo)
{
	//opzioni = "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width=" + ((screen.availWidth / 4) * 3) + ", height=" + ((screen.availHeight / 4) * 3);
	var larghezza = (screen.availWidth / 4) * 3.5; 
	var altezza = (screen.availHeight / 4) * 3.5;
	var sposX = screen.availWidth - larghezza;
	sposX = sposX / 2; 
	var sposY = screen.availHeight - altezza;
	sposY = sposY / 2;
	opzioni = "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width=" + larghezza + ", height=" + altezza + ", screenY=" + sposY + ", screenX=" + sposX;
	window.open(indirizzo, "_blank", opzioni);
}



/*
	FORMATTA NUMERO: esegue la formattazione di un numero aggiungendo un separatore per le migliaia, defininendo quello per i decimali e normalizzando il numero dei decimali (con relativo arrotondamento se necessario). 
	Impostando il valore di "riconvertiInNumero" su "true" si ottiene una riconversione da stringa trasformata a numero corrispondente.
*/
function gpt_formattaNumero(valore, numeroDecimali, separatoreDecimali, separatoreMigliaia, riconvertiInNumero)
{
	var risultato, risultatoTrasformato, parteIntera, parteDecimale, temp1, temp2;
	// passa da stringa formattata a numero
	if (riconvertiInNumero == true)
	{
		risultato = valore;
		while (risultato.indexOf(separatoreMigliaia) > -1)
		{
			risultato = risultato.replace(separatoreMigliaia, '');
		}
		risultato = risultato.replace(separatoreDecimali, '.');
		risultatoTrasformato = parseFloat(risultato);
	}
	// passa da numero a stringa formattata
	else
	{
		risultato = parseFloat(valore);
		risultato = Math.round(risultato * Math.pow(10, numeroDecimali)) / Math.pow(10, numeroDecimali);
		risultato = risultato.toFixed(numeroDecimali);
		risultatoTrasformato = risultato + '';
		if (risultatoTrasformato.indexOf('.') > -1)
		{
			parteIntera = risultatoTrasformato.substr(0, risultatoTrasformato.indexOf('.'))
			parteDecimale = risultatoTrasformato.substr(risultatoTrasformato.indexOf('.') + 1);
		}
		else
		{
			parteIntera = risultatoTrasformato;
			parteDecimale = '';
		}
		temp1 = parteIntera;
		temp2 = '';
		while (temp1.length > 3)
		{
			temp2 = separatoreMigliaia + temp1.substr(temp1.length - 3, 3) + temp2;
			temp1 = temp1.substr(0, temp1.length - 3);
		}
		if (temp1.length > 0)
		{
			risultatoTrasformato = temp1 + temp2;
		}
		else
		{
			risultatoTrasformato = temp2.substr(1, temp2.length - 1);
		}
		if (numeroDecimali > 0)
		{
			risultatoTrasformato = risultatoTrasformato + separatoreDecimali + parteDecimale;
		}
	}
	return risultatoTrasformato;
}



/*
	GET STYLE: recupera un valore qualunque dalle definizioni di stile di un qualunque elemento html. Valuta i valori effettivamente utilizzati dal browser, anche quelli non espressamente definiti tramite CSS o attributo "style"
	Utilizza la funzione "gpt_toCamelCase" per eseguire parte del calcolo.
*/

function gpt_getStyle(el, style) 
{
	if (!document.getElementById)
	{
		return; 
	}
	var value = el.style[gpt_toCamelCase(style)];
	if (!value)
	{
		if (document.defaultView)
		{
			value = document.defaultView.getComputedStyle(el, "").getPropertyValue(style);
		}
		else if (el.currentStyle)
		{
			value = el.currentStyle[gpt_toCamelCase(style)];
		}
	}
	return value;
}
				
function gpt_toCamelCase( sInput )
{
	var oStringList = sInput.split('-');
	if (oStringList.length == 1)  
		return oStringList[0];
	var ret = sInput.indexOf("-") == 0 ?
	oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0];
	for (var i = 1, len = oStringList.length; i < len; i++) {
		var s = oStringList[i];
		ret += s.charAt(0).toUpperCase() + s.substring(1)
	}
	return ret;
}



/*
	GET SCROLL: restituisce lo spostamento verticale della pagina.
	La funzione viene utilizzata all'interno di "gpt_caricaFinestraSistema" per verificare lo spostamento verticale della finestra di sistema tenendo conto dello scroll della pagina.
*/

function gpt_getScrollXY()
{
	var scrOfX = 0, scrOfY = 0;
	if (typeof(window.pageYOffset) == 'number' )
	{
  		//Netscape compliant
  		scrOfY = window.pageYOffset;
  		scrOfX = window.pageXOffset;
	} 
	else if (document.body && (document.body.scrollLeft || document.body.scrollTop))
	{
  		//DOM compliant
  		scrOfY = document.body.scrollTop;
  		scrOfX = document.body.scrollLeft;
	}
	else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
	{
  		//IE6 standards compliant mode
  		scrOfY = document.documentElement.scrollTop;
  		scrOfX = document.documentElement.scrollLeft;
	}
	// return [scrOfX, scrOfY]
	return scrOfY;
}



/*
	INIZIALIZZA AJAX: crea un oggetto Ajax utilizzando i relativi metodi.
	Il codice della funzione è compatibile con tutti i principali browser.
*/

function gpt_GetXmlHttpObject()
{
	xmlHttp = null;
	try
	{
		xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{
		try
		{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}



/*
	AZIONE MODULO: crea un parametro nascosto "gpt_azione" all'interno di un modulo e invia il modulo stesso.
	In ingresso occorre indicare l'id del form bersaglio, il valore da assegnare al parametro nascosto e la modalita correntemente utilizzata dalla finestra di sistema
*/
function gpt_impostaAzioneModulo(codice, valore, modo)
{
	if (document.getElementById(codice))
	{
		// elimina i parametri azione e modo se già presenti
		if (document.getElementById("gpt_azione"))
		{
			campoAzione = document.getElementById("gpt_azione");
			document.getElementById(codice).removeChild(campoAzione);
		}
		if (document.getElementById("gpt_modo"))
		{
			campoModo = document.getElementById("gpt_modo");
			document.getElementById(codice).removeChild(campoModo);
		}
		// crea ed aggiungi il parametro azione e modo
		var parametroAzione = document.createElement("input");
		parametroAzione.setAttribute("id", "gpt_azione");
		parametroAzione.setAttribute("name", "gpt_azione");
		parametroAzione.setAttribute("type", "hidden");
		parametroAzione.setAttribute("value", valore);
		var parametroModo = document.createElement("input");
		parametroModo.setAttribute("id", "gpt_modo");
		parametroModo.setAttribute("name", "gpt_modo");
		parametroModo.setAttribute("type", "hidden");
		parametroModo.setAttribute("value", modo);
		document.getElementById(codice).appendChild(parametroAzione);
		document.getElementById(codice).appendChild(parametroModo);
		// invia il modulo
		gpt_inviaModulo(codice);
	}
}


						
/*
	OPACITA: imposta l'opacità di un oggetto.
	La funzione viene utilizzata per creare semplici effetti di "rollover".
	Parametri della funzione:
	1)	oggetto		Valore dell'attributo id dell'elemento html della pagina sul quale si intende operare.
	2)	valore		Valore da assegnare al parametro opacit� dell'elemento bersaglio (valore compreso tra 1 e 100). 
*/

function gpt_impostaOpacita(oggetto, valore)
{
	if (document.getElementById(oggetto))
	{
		document.getElementById(oggetto).style.MozOpacity = (valore/100);
		document.getElementById(oggetto).style.filter = "alpha(opacity=" + valore +")";
		document.getElementById(oggetto).style.opacity = (valore/100);
	}
}



/*
	IMPOSTA CAMPO DATA: imposta il valore di un campo data combinando il valore di sei diverse select
	Il parametro forza data permette di specificare una data da assegnare ignorando il valore dell select.
*/
function gpt_impostaCampoData(codice, forzaData, riempiTuttiIValori)
{
	if (document.getElementById(codice))
	{
		// forza la visualizzazione di una data assegnata
		if (forzaData != "" && forzaData != "svuota")
		{
			giornoSelezionato = forzaData.substring(8, 10);
			meseSelezionato = forzaData.substring(5, 7);
			annoSelezionato = forzaData.substring(0, 4);
			oraSelezionata = forzaData.substring(11, 13);
			minutoSelezionato = forzaData.substring(14, 16);
			secondoSelezionato = forzaData.substring(17, 19);
			if (document.getElementById("dgi_" + codice))
			{
				document.getElementById("dgi_" + codice).value = giornoSelezionato;
			}
			if (document.getElementById("dme_" + codice))
			{
				document.getElementById("dme_" + codice).value = meseSelezionato;
			}
			if (document.getElementById("dan_" + codice))
			{
				document.getElementById("dan_" + codice).value = annoSelezionato;
			}
			if (document.getElementById("dor_" + codice))
			{
				document.getElementById("dor_" + codice).value = oraSelezionata;
			}
			if (document.getElementById("dmi_" + codice))
			{
				document.getElementById("dmi_" + codice).value = minutoSelezionato;
			}
			if (document.getElementById("dse_" + codice))
			{
				document.getElementById("dse_" + codice).value = secondoSelezionato;
			}
		}
		// svuota la data
		else if (forzaData == "svuota")
		{
			giornoSelezionato = "";
			meseSelezionato = "";
			annoSelezionato = "";
			oraSelezionata = "";
			minutoSelezionato = "";
			secondoSelezionato = "";
			if (document.getElementById("dgi_" + codice))
			{
				document.getElementById("dgi_" + codice).value = "";
			}
			if (document.getElementById("dme_" + codice))
			{
				document.getElementById("dme_" + codice).value = "";
			}
			if (document.getElementById("dan_" + codice))
			{
				document.getElementById("dan_" + codice).value = "";
			}
			if (document.getElementById("dor_" + codice))
			{
				document.getElementById("dor_" + codice).value = "";
			}
			if (document.getElementById("dmi_" + codice))
			{
				document.getElementById("dmi_" + codice).value = "";
			}
			if (document.getElementById("dse_" + codice))
			{
				document.getElementById("dse_" + codice).value = "";
			}
		}
		// ricava la data dai campi e dalla selezione dell'utente
		else
		{
			// giorno
			giornoSelezionato = "";
			if (document.getElementById("dgi_" + codice))
			{
				if (document.getElementById("dgi_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dgi_" + codice).value = "01";
				}
				giornoSelezionato = document.getElementById("dgi_" + codice).value; 	
			}
			// mese
			meseSelezionato = "";
			if (document.getElementById("dgi_" + codice))
			{
				if (document.getElementById("dme_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dme_" + codice).value = "01";
				}
				meseSelezionato = document.getElementById("dme_" + codice).value; 	
			}
			// anno
			annoSelezionato = "";
			if (document.getElementById("dgi_" + codice))
			{
				if (document.getElementById("dan_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dan_" + codice).value = gpt_limiteMinimoSelectAnno;
				}
				annoSelezionato = document.getElementById("dan_" + codice).value; 	
			}
			// ora
			oraSelezionata = "";
			if (document.getElementById("dor_" + codice))
			{
				if (document.getElementById("dor_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dor_" + codice).value = "00";
				}
				oraSelezionata = document.getElementById("dor_" + codice).value; 	
			}
			// minuto
			minutoSelezionato = "";
			if (document.getElementById("dmi_" + codice))
			{
				if (document.getElementById("dmi_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dmi_" + codice).value = "00";
				}
				minutoSelezionato = document.getElementById("dmi_" + codice).value; 	
			}
			// secondo
			secondoSelezionato = "";
			if (document.getElementById("dse_" + codice))
			{
				if (document.getElementById("dse_" + codice).value == "" && riempiTuttiIValori == true)
				{
					document.getElementById("dse_" + codice).value = "00";
				}
				secondoSelezionato = document.getElementById("dse_" + codice).value; 	
			}
		}
		// imposta il valore
		var valoreFinale = "";
		if (annoSelezionato != '')
		{
			valoreFinale = annoSelezionato;
			if (meseSelezionato != '')
			{
				 valoreFinale = valoreFinale + "/" + meseSelezionato;
				 if (giornoSelezionato != '')
				 {
				 	 valoreFinale = valoreFinale + "/" + giornoSelezionato;
				 	 if (oraSelezionata != '')
				 	 {
				 	 	 valoreFinale = valoreFinale + " " + oraSelezionata;
				 	 	 if (minutoSelezionato != '')
				 	 	 {
				 	 	  	valoreFinale = valoreFinale + ":" + minutoSelezionato;
				 	 	  	if (secondoSelezionato != '')
				 	 	  	{
				 	 	  	 	valoreFinale = valoreFinale + ":" + secondoSelezionato;
				 	 	  	}
				 	 	 }
				 	 }
				 }
			}
		}
		document.getElementById(codice).value = valoreFinale;
	}
}



/*
	INVIA MODULO: verifica la presenza ed eventualmente invia un modulo HTML.
	Richiede in ingresso l'id del tag "form" di riferimento.
*/

function gpt_inviaModulo(codice)
{
	if (document.getElementById(codice))
	{
		// modifica l'attributo action per aggiungere il riferimento alla sezione corrente (se presente nella pagina e fissata)
		var ancora = "";
		var destinazioneForm = document.getElementById(codice).action;
		var metodoForm = document.getElementById(codice).method;
		var listaInput = document.getElementsByTagName("input");
		var sezioneDaSelezionare = "";
		for (x in listaInput)
		{
			if (listaInput[x].id)
			{
				if (listaInput[x].id.indexOf("sezioneCorrente_") == 0)
				{
					sezioneDaSelezionare = listaInput[x].value;
				}
			}
		}
		if (destinazioneForm != "" && sezioneDaSelezionare != "")
		{
			// form con metodo POST (aggiunta di un parametro all'url del form)
			if (metodoForm.toUpperCase() == "POST")
			{
				// parametro già presente (sostituzione)
				if (destinazioneForm.indexOf("gpt_sezione") > -1)
				{
					var valoreAttuale = destinazioneForm;
					valoreAttuale = valoreAttuale.substring(valoreAttuale.indexOf("gpt_sezione=") + 12);
					if (valoreAttuale.indexOf("&") > -1)
					{
						valoreAttuale = valoreAttuale.substring(0, valoreAttuale.indexOf("&"));
					}
					if (valoreAttuale.indexOf("#") > -1)
					{
						valoreAttuale = valoreAttuale.substring(0, valoreAttuale.indexOf("#"));
					}
					destinazioneForm = destinazioneForm.replace("gpt_sezione=" + valoreAttuale, "gpt_sezione=" + sezioneDaSelezionare);
				}
				else
				{
					if (destinazioneForm.indexOf("#") > -1)
					{
						ancora = destinazioneForm.substring(destinazioneForm.indexOf("#"));
						destinazioneForm = destinazioneForm.substring(0, destinazioneForm.indexOf("#"));
					}
					if (destinazioneForm.indexOf("?") > -1)
					{
						destinazioneForm = destinazioneForm + "&gpt_sezione=" + sezioneDaSelezionare + ancora;
					}
					else
					{
						destinazioneForm = destinazioneForm + "?gpt_sezione=" + sezioneDaSelezionare  + ancora;
					}
				}
				document.getElementById(codice).action = destinazioneForm;
			}
			// form con metodo GET (creazione di un campo nascosto con la sezione di destinazione)
			else
			{
				var parametroSezione = document.createElement("input");
				parametroSezione.setAttribute("name", "gpt_sezione");
				parametroSezione.setAttribute("type", "hidden");
				parametroSezione.setAttribute("value", sezioneDaSelezionare);
				document.getElementById(codice).appendChild(parametroSezione);
			}
		}
		
		// variabili per gestione spazio errori
		var spazioErrori = "";
		var numeroErrori = 0;
		// cerca per default la div per visualizzare i messaggi di errore
		if (document.getElementById("errori_" + codice))
		{
			spazioErrori = "errori_" + codice;
		}
		// per ogni campo presente nel form verifica se sono state definite delle restrizioni (tramite la dichiarazione di variabili)
		var numeroCampi = eval("document.forms." + codice + ".elements.length");
		var campiDaControllare = 0;
		for (t = 0; t < numeroCampi; t++)
		{
			// analizza solo i campi che hanno un "name" e un "id" definiti
			if (eval("document.forms." + codice + ".elements[t].name") != "" && eval("document.forms." + codice + ".elements[t].id") != "")
			{
				listaCampiControllo = gpt_controlloCampi;
				if (listaCampiControllo.indexOf("{[" + eval("document.forms." + codice + ".elements[t].id") + "|") > -1) 
				{
					// recupera dalla lista dei campi da controllare presenti nella pagina i dati relativi al campo in esame
					nomCampo = eval("document.forms." + codice + ".elements[t].name");
					idCampo = eval("document.forms." + codice + ".elements[t].id");
					stringaControllo = listaCampiControllo.substring(listaCampiControllo.indexOf("{[" + idCampo + "|") + 2, listaCampiControllo.length);
					stringaControllo = stringaControllo.substring(0, stringaControllo.indexOf("]}"));
					stringaControllo = stringaControllo.substring(stringaControllo.indexOf("|") + 1, stringaControllo.length);
					tipCampo = stringaControllo.substring(0, stringaControllo.indexOf("|"));
					stringaControllo = stringaControllo.substring(stringaControllo.indexOf("|") + 1, stringaControllo.length);
					minCar = stringaControllo.substring(0, stringaControllo.indexOf("|"));
					maxCar = stringaControllo.substring(stringaControllo.indexOf("|") + 1, stringaControllo.length);
					eliminaMessaggiPrecedenti = false;
					// cancella i messaggi precedenti se stai analizzando il primo campo disponibile
					if (campiDaControllare == 0)
					{
						eliminaMessaggiPrecedenti = true;
					}
					// effettua il controllo sul campo corrente
					esitoControllo = gpt_controllaCampo(idCampo, nomCampo, tipCampo, maxCar, minCar, spazioErrori, eliminaMessaggiPrecedenti, ""); 
					if (esitoControllo  == false)
					{
						numeroErrori = numeroErrori + 1;
					}
					campiDaControllare = campiDaControllare + 1;
				}
			}
  		}
  		// se non ci sono stati errori invia il modulo
  		if (numeroErrori == 0)
  		{
  			document.getElementById(codice).submit();
  		}
  		// verifica se è previsto un secondo spazio per i messaggi di errore
  		else
  		{
  			if (document.getElementById("erroriCopia_" + codice))
			{
				document.getElementById("erroriCopia_" + codice).innerHTML = "";
				document.getElementById("erroriCopia_" + codice).innerHTML = document.getElementById("errori_" + codice).innerHTML;
			}
  		}
	}
}



/*
	MARCA RIGA: crea effetto "rollover" sulla riga di una tabella.
	Parametri della funzione:
	1)	codiceRiga		Valore dell'attributo id dell'elemento <tr> della pagina sul quale si intende operare.
	2)	coloreRiga		Valore da assegnare alla propriet� "backgroundColor" dell'elemento <tr> selezionato.
*/

function gpt_marcaRiga(codiceRiga, coloreRiga)
{
	document.getElementById(codiceRiga).style.backgroundColor = coloreRiga;
}



/*
	MILLISECONDI: calcola e restituisce i millisecondi della data corrente. Utilizzata nelle chiamate ajax per modificare gli indirizzi in modo da eviatare il caching del browser.
*/
function gpt_millisecondi()
{
	var gpt_ctrldt = new Date();
	return gpt_ctrldt.getMilliseconds();
}


	 
/*
	MOSTRA MESE: funzione per la creazione della tabella con i giorni del mese.
	Dato un anno e un mese genera codice html da iniettare all'interno di un tag bersaglio per la visualizzazione del relativo calendario.
	Parametri della funzione:
	1)	annoCorrente		Anno da visualizzare.
	2)	meseCorrente		Mese da visualizzare.
	3)	bersaglioCal		Codice dell'elemento html all'interno del quale iniettare il codice generato dalla funzione. 
*/ 
function gpt_mostraMese(annoCorrente, meseCorrente, bersaglioCal)
{
	// dichiarazione variabili
	var w, z;
	var data = new Date();
	var titGiorno;
	var codiceCalendario;
	var verificaCorrente;
	// verifica se l'anno corrente � bisestile
	if ((annoCorrente % 4) == 0)
	{
		gpt_bisestile = true;
	}
	else
	{
		gpt_bisestile = false;
	}
	// calcolo "inizioAnno"
	if (annoCorrente != "")
	{
		spostamento = (Math.floor((annoCorrente - 2000) / 4) + 1) + ((annoCorrente - 2000) % 7);
		if (gpt_bisestile == true){
			spostamento = spostamento - 1; 
		}
		spostamento = spostamento % 7;
		gpt_selezionaGiorno(6,spostamento);
		inizioAnno = gpt_nomeGiorno[gpt_posizione];
	}
	// calcolo "inizioMese"
	if (gpt_bisestile == true)
	{
		switch (parseFloat(meseCorrente))
		{
			case 1:
				spostamento = 0;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 2:
				spostamento = 31 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 3:
				spostamento = (59 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 4:
				spostamento = (90 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 5:
				spostamento = (120 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 6:
				spostamento = (151 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 7:
				spostamento = (181 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 8:
				spostamento = (212 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 9:
				spostamento = (243 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 10:
				spostamento = (273 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 11:
				spostamento = (304 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 12:
				spostamento = (334 + 1) % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
		}
	}
	else
	{
		switch (parseFloat(meseCorrente))
		{
			case 1:
				spostamento = 0;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 2:
				spostamento = 31 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 3:
				spostamento = 59 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 4:
				spostamento = 90 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 5:
				spostamento = 120 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 6:
				spostamento = 151 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 7:
				spostamento = 181 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 8:
				spostamento = 212 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 9:
				spostamento = 243 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 10:
				spostamento = 273 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 11:
				spostamento = 304 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
			case 12:
				spostamento = 334 % 7;
				gpt_selezionaGiorno(gpt_posizione,spostamento);
				gpt_inizioMese = gpt_posizione;
				break
		}
	}
	// variabile y (numero del giorno) 
	switch (parseFloat(gpt_inizioMese))
	{
		case 1:
			y = 1;
			z = 32;
			break
		case 2:
			y = 0;
			z = 33;
			break
		case 3:
			y = -1;
			z = 34;
			break
		case 4:
			y = -2;
			z = 35;
			break
		case 5:
			y = -3;
			z = 36;
			break
		case 6:
			y = - 4;
			z = 37;
			break
		case 7:
			y = -5;
			z = 38;
			break			
	}
	// inizio tabella e intestazione del calendario
	codiceCalendario = "<table class='" + gpt_classeTabellaCal + "'>";
	codiceCalendario = codiceCalendario + "<tr><td class='" + gpt_classeCellaIntestazioneCal + "' colspan='7'>" + gpt_nomeMese[meseCorrente] + " " + annoCorrente + "</td></tr>";
	// intestazione con etichette per i giorni
	codiceCalendario = codiceCalendario + "<tr>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[1] + "'>" + gpt_nomeGiorno[1].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[2] + "'>" + gpt_nomeGiorno[2].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[3] + "'>" + gpt_nomeGiorno[3].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[4] + "'>" + gpt_nomeGiorno[4].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[5] + "'>" + gpt_nomeGiorno[5].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[6] + "'>" + gpt_nomeGiorno[6].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "<th title='" + gpt_nomeGiorno[0] + "'>" + gpt_nomeGiorno[0].substring(0, gpt_caratteriNomeGiorni) + "</th>";
	codiceCalendario = codiceCalendario + "</tr>";
	// inizio righe settimane
	codiceCalendario = codiceCalendario + "<tr>";
	// calcolo del valore z (totale giorni presenti nel mese)
	if (meseCorrente == 11 || meseCorrente == 4 || meseCorrente == 6 || meseCorrente == 9)
	{
		z = z - 1;
	}
	if (meseCorrente == 2 && gpt_bisestile == true)
	{
		z = z - 2;
	}
	else if (meseCorrente == 2 && gpt_bisestile != true)
	{
		z = z - 3;
	}
	// ciclo per la scrittura delle righe del calendario. w (contatore)
	w = 1;
	var temp3;
	while (w < z)
	{
		if (y > 0)
		{
			// calcolo del titolo per la cella del calendario
			titGiorno = gpt_nomeGiorno[(w % 7)] + " " + y + " " + gpt_nomeMese[meseCorrente] + " " + annoCorrente;
			// giorno corrente o giorno non corrente 
			if (parseFloat(annoCorrente) == data.getYear() && parseFloat(meseCorrente) == (data.getMonth() + 1) && y == data.getDate())
			{
				codiceCalendario = codiceCalendario + "<td class='" + gpt_classeCellaCorrenteCal + "' title='" + titGiorno + "' onclick='javascript: gpt_assegnaValoreGiorno(" + y + ", " + meseCorrente + ", " + annoCorrente + ");'>";
			}
			else
			{
				codiceCalendario = codiceCalendario + "<td class='" + gpt_classeCellaCal + "' title='" + titGiorno + "' onclick='javascript: gpt_assegnaValoreGiorno(" + y + ", " + meseCorrente + ", " + annoCorrente + ");'>";
			}
			// data segnalata nella lista (evento o altro oggetto associato)
			verificaCorrente = gpt_verificaDataCalendario(y, meseCorrente, annoCorrente);
			if (verificaCorrente != "no")
			{
				contenutoCella = verificaCorrente;
			}
			// nessun evento o oggetto associato
			else
			{
				contenutoCella = y;
			}
			// domenica: giorno scritto in grassetto
			if ((w % 7) == 0)
			{
				codiceCalendario = codiceCalendario + "<strong>" + contenutoCella + "</strong>";
			}
			// tutti i giorni tranne la domenica
			else 
			{
				codiceCalendario = codiceCalendario + "<span>" + contenutoCella + "</span>"; 
			}
			codiceCalendario = codiceCalendario + "</td>";
		}
		else
		{
			codiceCalendario = codiceCalendario + "<td class='" + gpt_classeCellaVuotaCal + "'>&#160;</td>";
		}
		if ((w % 7) == 0)
		{
			codiceCalendario = codiceCalendario + "</tr><tr>";
		}
		y = y + 1;
		w = w + 1;
	}
	codiceCalendario = codiceCalendario + "</tr>";
	codiceCalendario = codiceCalendario + "</table>";
	// aggiorna contenitore per il calendario e intestazione della finestra
	document.getElementById(bersaglioCal).innerHTML = codiceCalendario;
}



/*
	MOSTRA PERIODO: mostra il periodo indicato tramite un selettore all'interno di uno dei calendari disponibili.
	La funzione è richiamata attraverso il pulsante di invio di un qualunque selettore.
	Parametri della funzione:
	1)	riferimentoAnno		Elemento html dal quale prelevare il valore dell'anno da mostrare (generalmente un elemento "<select />").
	2)	riferimentoMese		Elemento html dal quale prelevare il valore del mese da mostrare (generalmente un elemento "<select />").
	3)	bersaglioCal			Codice dell'elemento html che contiene il calendario da aggiornare.
*/
function gpt_mostraPeriodo(riferimentoAnno, riferimentoMese, bersaglioCal)
{
	var annoDaVisualizzare = document.getElementById(riferimentoAnno).value;
	var meseDaVisualizzare = document.getElementById(riferimentoMese).value;
	gpt_mostraMese(annoDaVisualizzare, meseDaVisualizzare, bersaglioCal);
}



/*
	MOSTRA RICERCA: mostra o nasconde il menu per la ricerca veloce.
	Parametri della funzione:
	1)	mostra	Flag per determinare se aprire oppure chiudere gli strumenti di ricerca
*/
function gpt_mostraRicerca(mostra, contenitore) {
	if (mostra == true) {
		gpt_visualizzaElementi(false, "gpt_apriRicercaVeloce_" + contenitore + ",");
		gpt_visualizzaElementi(true, "gpt_ricercaVeloce_" + contenitore + "," + "gpt_chiudiRicercaVeloce_" + contenitore + ",");
	}
	else {
		gpt_visualizzaElementi(true, "gpt_apriRicercaVeloce_" + contenitore + ",");
		gpt_visualizzaElementi(false, "gpt_ricercaVeloce_" + contenitore + "," + "gpt_chiudiRicercaVeloce_" + contenitore + ",");
		
	}
	if (window.parent)
	{
		window.parent.gpt_ridimensionaSchedaSovrapposizione();
	}
}



/*
	MUOVI CAROSELLO: muovi il carosello avanti indietro o verso un blocco bersaglio.
	Accetta sia valori interi che stringa.
*/

function gpt_muoviCarosello(codice, bersaglio)
{
	if (gpt_transizioneOggettoInCorso == false)
	{
		var obiettivo = 0;
		// recupera il limite del carosello in basso e in alto e il blocco attuale
		var elementiPerBlocco = eval("elementiPerBlocco_" + codice);
		var bloccoAttuale = eval("bloccoCarosello_" + codice);
		var limiteInAlto = eval("elementiCarosello_" + codice + ".length / " + elementiPerBlocco);
		if (eval("elementiCarosello_" + codice + ".length % " + elementiPerBlocco) != 0)
		{
			limiteInAlto = limiteInAlto + 1;
		}
		var limiteInBasso = 1;
		// seleziona l'oggetto da muovere
		gpt_oggettoInMovimento = eval("document.getElementById('" + codice + "_mascheraContenutiCarosello')");
		// verifica se è stato passato un valore numerico oppure un'istruzione
		if (isNaN(parseInt(bersaglio)) == false)
		{
			obiettivo = bersaglio;
		}
		else
		{
			if (bersaglio == "avanti")
			{
				obiettivo = bloccoAttuale + 1;
			}
			else
			{
				obiettivo = bloccoAttuale - 1;
			}
		}
		// seleziona il blocco obiettivo
		if (obiettivo >= limiteInBasso && obiettivo <= limiteInAlto)
		{
			eval("selezionaBlocco_" + codice + "(" + obiettivo + ")");
		}
	}
}
			
			

/*
	MUOVI OGGETTO: imposta un qualunque oggetto della pagina HTML impostandolo come trascinabile con il mouse.
	Utilizza la variabile JS "gpt_oggettoInTrascinamento" dichiarata preventivamente.
*/
function gpt_muoviOggetto(codice, movimento)
{
	if (movimento == true && codice != "")
	{
		gpt_oggettoInTrascinamento = document.getElementById(codice);
	}
	else
	{
		gpt_oggettoInTrascinamento = null;
	}
}



/*
	NULLA: funzione che non esegue nessun comando.
	Può essere utilizzata come valore dell'attributo "href" di un collegamento se il collegamento non deve avere nessun effetto. 
*/

function gpt_nulla()
{
	var nulla;
	nulla = "";
}



/*
	PRECARICA IMMAGINE: prepara il caricamento di un'immagine e procede al successivo controllo.
	Utilizzata in combinazione con "gpt_controlloCaricamentoImmagine".
*/
function gpt_precaricaImmagine(indirizzo, operazioneSuccessiva, testoCaricamento, testoDidascalia, testoDidascaliaPrecedente)
{
	gpt_transizioneImmagineInCorso = true;
	if (document.getElementById(testoCaricamento))
	{
		document.getElementById(testoCaricamento).style.display = "block";
	}
	gpt_immaginePrecaricata = null;
	gpt_immaginePrecaricata = new Image();
	gpt_immaginePrecaricata.src = indirizzo;
	gpt_controlloCaricamentoImmagine(operazioneSuccessiva, testoCaricamento, testoDidascalia, testoDidascaliaPrecedente);
}



/*
	RAGGRUPPA CAMPI: analizza una sequenza di campi e li raggruppa se fanno riferimento allo stesso dato ma in una lingua diversa.
	Richiede che sia stato inizializzato l'array "gpt_nomiCampi".
*/
function gpt_raggruppaCampi(selezionato)
{
	var gpt_stringaTab = '';
	var gpt_spegnimentoTab = '';
	var gpt_accensioneTab = '';
	var gpt_selezionato = "";
	for (i = 0; i < gpt_nomiCampi.length; i++)
	{
		if (gpt_nomiCampi[i] != 'ID' && gpt_nomiCampi[i] != 'id' && gpt_nomiCampi[i] != 'Id')
		{
			for (k = 0; k < gpt_nomiCampi.length; k++)
			{
				// cerca campi che hanno lo stesso identico nome seguito dal carattere "_"
				if (gpt_nomiCampi[k].indexOf(gpt_nomiCampi[i] + '_') > -1)
				{
					gpt_stringaTab = gpt_stringaTab + '<strong id="gpt-sel-' + gpt_nomiCampi[k] + '">' + document.getElementById('eti_' + gpt_nomiCampi[k]).innerHTML + '</strong>';
					gpt_stringaTab = gpt_stringaTab + '<a id="gpt-col-' + gpt_nomiCampi[k] + '" href="javascript: {[comandi]} gpt_visualizzaElementi(false,  \'gpt-col-' + gpt_nomiCampi[k] + ',\'); gpt_visualizzaElementi(true, \'con_' + gpt_nomiCampi[k] + ',gpt-sel-' + gpt_nomiCampi[k] + ',\'); document.getElementById(\'' + gpt_nomiCampi[k] + '\').focus();">'  + document.getElementById('eti_' + gpt_nomiCampi[k]).innerHTML + '</a>';
					gpt_spegnimentoTab = gpt_spegnimentoTab + 'par_' + gpt_nomiCampi[k] + ',con_' + gpt_nomiCampi[k] + ',gpt-sel-' + gpt_nomiCampi[k] + ',';
					gpt_accensioneTab = gpt_accensioneTab + 'gpt-col-' + gpt_nomiCampi[k] + ',';
					gpt_visualizzaElementi(false, 'eti_' + gpt_nomiCampi[k] + ',');
				}
			}
			// se esistono campi che hanno nome identico seguito dal carattere "_"
			if (gpt_stringaTab != '')
			{
				// aggiungi i riferimenti al campo originale (quello senza il carattere "_")
				var gpt_stringaCampoOriginale = '<strong id="gpt-sel-' + gpt_nomiCampi[i] + '">' + document.getElementById('eti_' + gpt_nomiCampi[i]).innerHTML + '</strong>';
				gpt_stringaCampoOriginale = gpt_stringaCampoOriginale + '<a id="gpt-col-' + gpt_nomiCampi[i] + '" href="javascript:  {[comandi]} gpt_visualizzaElementi(false,  \'gpt-col-' + gpt_nomiCampi[i] + ',\'); gpt_visualizzaElementi(true, \'con_' + gpt_nomiCampi[i] + ',gpt-sel-' + gpt_nomiCampi[i] + ',\'); document.getElementById(\'' + gpt_nomiCampi[i] + '\').focus();">' + document.getElementById('eti_' + gpt_nomiCampi[i]).innerHTML + '</a>';
				gpt_stringaTab = gpt_stringaCampoOriginale + gpt_stringaTab;
				gpt_spegnimentoTab = gpt_spegnimentoTab + 'con_' + gpt_nomiCampi[i] + ',gpt-sel-' + gpt_nomiCampi[i] + ',';
				gpt_accensioneTab = gpt_accensioneTab + 'gpt-col-' + gpt_nomiCampi[i] + ',';
				// sostituisci l'interno dell'etichetta del campo orginale con la sequenza completa di tab
				document.getElementById('eti_' + gpt_nomiCampi[i]).innerHTML = gpt_stringaTab;
				// crea la stringa condivisa dei comandi 
				var gpt_comandi = "gpt_visualizzaElementi(false, '" + gpt_spegnimentoTab + "'); ";
				gpt_comandi = gpt_comandi + "gpt_visualizzaElementi(true, '" + gpt_accensioneTab + "'); ";
				for (k = 0; k < gpt_nomiCampi.length; k++)
				{
					if (gpt_nomiCampi[k].indexOf(gpt_nomiCampi[i] + '_') > -1)
					{
						document.getElementById('gpt-col-' + gpt_nomiCampi[k]).href = document.getElementById('gpt-col-' + gpt_nomiCampi[k]).href.replace('{[comandi]}', gpt_comandi);	
					}
					document.getElementById('gpt-col-' + gpt_nomiCampi[i]).href = document.getElementById('gpt-col-' + gpt_nomiCampi[i]).href.replace('{[comandi]}', gpt_comandi);
				}
				// spegni tutti i tab e i blocchi e accendi solamente quelli corretti (considera anche se è stato richiesto di selezionarne uno in particolare)
				if (selezionato != '')
				{
					s = i;
					for (k = 0; k < gpt_nomiCampi.length; k++)
					{
						if (gpt_nomiCampi[k].indexOf(gpt_nomiCampi[i] + '_') > -1)
						{
							if (gpt_nomiCampi[k].indexOf(gpt_nomiCampi[i] + '_' + selezionato) > -1)
							{
								s = k;
							}
						}
					}
				}
				else
				{
					s = i;
				}
				gpt_visualizzaElementi(false, gpt_spegnimentoTab);
				gpt_visualizzaElementi(true, gpt_accensioneTab);
				gpt_visualizzaElementi(false,  'gpt-col-' + gpt_nomiCampi[s] + ',');
				gpt_visualizzaElementi(true, 'con_' + gpt_nomiCampi[s] + ',gpt-sel-' + gpt_nomiCampi[s] + ',');
			}
			// svuota le stringhe prima di analizzare il campo successivo
			gpt_stringaTab = '';
			gpt_spegnimentoTab = '';
			gpt_accensioneTab = '';
			gpt_selezionato = "";
		}
	}
}

							
							
/*
	RICHIESTA CONFERMA: richiesta di conferma sull'invio di un modulo.
	La funzione visualizza una finestra di scelta tramite javascript per la selezione dell'azione da compiere.
	Parametri della funzione:
	1)	oggettoConf			Codice identificativo del modulo da inviare. 
	2)	messaggioConf		Messaggio da visualizzare nella finestra di selezione.
*/

function gpt_richiestaConferma(oggettoConf, messaggioConf)
{
	var conferma = confirm(messaggioConf);
	if (conferma == true)
	{
		gpt_inviaModulo(oggettoConf);
	}
}



/*
	RIDIMENSIONA SCHEDA SOVRAPPOSIZIONE: ridimensiona la scheda in sovrapposizione se in modalità "iframe".
*/
function gpt_ridimensionaSchedaSovrapposizione(standard)
{
	var i, codiceIFrame, suffissoId;
	// scorri tutti gli iframe presenti all'interno del documento
	for (i = 0; i < parent.document.getElementsByTagName("iframe").length; i++)
	{
		codiceIFrame = parent.document.getElementsByTagName("iframe")[i].getAttribute("id");
		if (codiceIFrame.indexOf("gpt_iframeSchedaSovrapposizione") > -1)
		{
			if (codiceIFrame.substring(codiceIFrame.indexOf("gpt_iframeSchedaSovrapposizione") + 31) != "")
			{
				suffissoId = codiceIFrame.substring(codiceIFrame.indexOf("gpt_iframeSchedaSovrapposizione") + 31);
			}
			else
			{
				suffissoId = "";
			}
			// escludi dal ridimensionamento alcune finestre specifiche ("opzioni email")
			if (suffissoId != "_gpt_opzioniEmail")
			{
				// verifica se in modalità "iframe" (esiste l'oggetto cercato)
				if (parent.document.getElementById("gpt_schedaSovrapposizione" + suffissoId) && parent.document.getElementById("gpt_iframeSchedaSovrapposizione" + suffissoId))
				{
					// riporta alla dimensione standard
					if (standard == true)
					{
						// riporta alla dimensione base definita per la finestra di sistema
						parent.document.getElementById("gpt_schedaSovrapposizione" + suffissoId).style.height = gpt_altezzaDefaultSchedaSovrapposizione + "px";
						parent.document.getElementById("gpt_inferioreSchedaSovrapposizione" + suffissoId).style.height =  (gpt_altezzaDefaultSchedaSovrapposizione - gpt_schedaSvrAltezzaMinimaSuperiore) + "px";
						parent.document.getElementById("gpt_inferioreSinistraSchedaSovrapposizione" + suffissoId).style.height = (gpt_altezzaDefaultSchedaSovrapposizione - gpt_schedaSvrAltezzaMinimaSuperiore) + "px";
						parent.document.getElementById("gpt_inferioreDestraSchedaSovrapposizione" + suffissoId).style.height = (gpt_altezzaDefaultSchedaSovrapposizione - gpt_schedaSvrAltezzaMinimaSuperiore) + "px";
						parent.document.getElementById("gpt_iframeSchedaSovrapposizione" + suffissoId).style.height = (gpt_altezzaDefaultSchedaSovrapposizione - gpt_schedaSvrAltezzaMinimaSuperiore - gpt_schedaSvrAltezzaMinimaInferiore) + "px";
						gpt_ridimensionaSchedaSovrapposizione(false);
					}
					// dimensiona in base al contenuto dell'iframe
					else
					{
						// calcola l'atezza effettiva del contenuto all'interno dell'iframe
						var altezzaEffettiva = parent.document.getElementById("gpt_iframeSchedaSovrapposizione" + suffissoId).contentWindow.document.documentElement.scrollHeight;
						// calcola l'altezza totale attuale e l'altezza totale dei contenuti
						var altezzaAttuale = parent.document.getElementById('gpt_schedaSovrapposizione' + suffissoId).style.height;
						altezzaAttuale = altezzaAttuale.substr(0, altezzaAttuale.indexOf("px"));
						altezzaAttuale = parseFloat(altezzaAttuale);
						var altezzaAttualeContenuti = altezzaAttuale - gpt_schedaSvrAltezzaMinimaSuperiore - gpt_schedaSvrAltezzaMinimaInferiore;
						// calcola la larghezza totale della finestra
						var larghezzaAttuale = parent.document.getElementById('gpt_schedaSovrapposizione' + suffissoId).style.width;
						larghezzaAttuale = larghezzaAttuale.substr(0, larghezzaAttuale.indexOf("px"));
						larghezzaAttuale = parseFloat(larghezzaAttuale);
						// ridimensiona in base all'altezza effettiva del contenuto dell'iframe
						if (altezzaEffettiva > altezzaAttualeContenuti)
						{
							parent.document.getElementById("gpt_schedaSovrapposizione" + suffissoId).style.height = ((altezzaAttuale - altezzaAttualeContenuti) + altezzaEffettiva) + "px";
							parent.document.getElementById("gpt_inferioreSchedaSovrapposizione" + suffissoId).style.height = ((altezzaAttuale - altezzaAttualeContenuti - gpt_schedaSvrAltezzaMinimaSuperiore) + altezzaEffettiva) + "px";
							parent.document.getElementById("gpt_inferioreSinistraSchedaSovrapposizione" + suffissoId).style.height = ((altezzaAttuale - altezzaAttualeContenuti - gpt_schedaSvrAltezzaMinimaSuperiore) + altezzaEffettiva) + "px";
							parent.document.getElementById("gpt_inferioreDestraSchedaSovrapposizione" + suffissoId).style.height = ((altezzaAttuale - altezzaAttualeContenuti - gpt_schedaSvrAltezzaMinimaSuperiore) + altezzaEffettiva) + "px";
							parent.document.getElementById("gpt_iframeSchedaSovrapposizione" + suffissoId).style.height = altezzaEffettiva + "px";
						}
					}
				}
			}
		}
	}
}





/*
	SCHEDA SOVRAPPOSIZIONE: carica una finestra sovrapposta a tutti gli altri elementi della pagina.
	La scheda viene automaticamente agganciata all'elemento "body" del documento.
*/
function gpt_schedaSovrapposizione(visibilita, larghezza, altezza, contenuto, modo)
{
	// recupera la modalità e preleva le eventuali opzioni
	var modalita = modo;
	if (modalita.indexOf("[") > -1 && modalita.indexOf("]") > -1)
	{
		var opzione = modalita.substring(modalita.indexOf("[") + 1, modalita.indexOf("]"));
		modalita = modalita.substring(0, modalita.indexOf("["));
	}
	// variabili di configurazione per la visualizzazione delle diverse sezioni della scheda
	var sfondoSuperioreSinistra = gpt_schedaSvrSfondoSuperioreSinistra;
	var sfondoSuperioreDestra = gpt_schedaSvrSfondoSuperioreDestra;
	if (opzione == "noChiusura")
	{
		sfondoSuperioreDestra = sfondoSuperioreDestra.replace(".png", "NoChiusura.png");
	}
	var sfondoInferioreSinistra = gpt_schedaSvrSfondoInferioreSinistra;
	var sfondoInferioreDestra = gpt_schedaSvrSfondoInferioreDestra;
	var altezzaMinimaSuperiore = gpt_schedaSvrAltezzaMinimaSuperiore;
	var altezzaMinimaInferiore = gpt_schedaSvrAltezzaMinimaInferiore;
	var larghezzaMinimaSinistra = gpt_schedaSvrLarghezzaMinimaSinistra;
	var larghezzaMinimaDestra = gpt_schedaSvrLarghezzaMinimaDestra;
	// versione immagini di sfondo per IE6
	browserInUso = navigator.appVersion;
	if (browserInUso.indexOf("MSIE 6.0") > 0)
	{
		sfondoSuperioreSinistra = sfondoSuperioreSinistra.replace(".png", ".gif");
		sfondoSuperioreDestra = sfondoSuperioreDestra.replace(".png", ".gif");
		sfondoInferioreSinistra = sfondoInferioreSinistra.replace(".png", ".gif");
		sfondoInferioreDestra = sfondoInferioreDestra.replace(".png", ".gif");
	}
	// se la finestra è stata creata precedentemente eliminala prima di procedere
	var bersaglio = modalita.substring(modalita.indexOf("=") + 1);
	if (modalita.indexOf("bersaglio=") > -1)
	{
		if (document.getElementById("gpt_schedaSovrapposizione_" + bersaglio) && document.getElementById(bersaglio))
		{
			var elementoBersaglio = document.getElementById(bersaglio);
			var elementoContenitore = elementoBersaglio.parentNode;
			var scheda = document.getElementById("gpt_schedaSovrapposizione_" + bersaglio);
			elementoBersaglio.removeChild(scheda);
			elementoContenitore.removeChild(elementoBersaglio);
		}
	}
	else
	{
		if (document.getElementById("gpt_schedaSovrapposizione"))
		{
			var scheda = document.getElementById("gpt_schedaSovrapposizione");
			document.getElementsByTagName("body")[0].removeChild(scheda);
		}
	}
	// crea la scheda
	if (visibilita == true)
	{
		// crea codice html per il contenuto della scheda
		var codiceHtml = "";
		var codiceContenuto = "";
		if (modalita == "iframe")
		{
			codiceContenuto = codiceContenuto + "<iframe id='gpt_iframeSchedaSovrapposizione' src='" + contenuto + "' style='width: " + (larghezza - (larghezzaMinimaSinistra + larghezzaMinimaDestra)) + "px; height: " + (altezza - (altezzaMinimaSuperiore + altezzaMinimaInferiore)) + "px;' frameborder='0' scrolling='auto'></iframe>";
		}
		else if (modalita.indexOf("bersaglio=") > -1)
		{
			codiceContenuto = codiceContenuto + "<iframe id='gpt_iframeSchedaSovrapposizione_" + modalita.substring(modalita.indexOf("=") + 1) + "' src='" + contenuto + "' style='width: " + (larghezza - (larghezzaMinimaSinistra + larghezzaMinimaDestra)) + "px; height: " + (altezza - (altezzaMinimaSuperiore + altezzaMinimaInferiore)) + "px;' frameborder='0' scrolling='auto'></iframe>";		
		}
		else if (modalita == "ajax")
		{
			codiceContenuto = codiceContenuto + "<div id='gpt_contenutoSchedaSovrapposizione'></div>";
		}
		else
		{
			codiceContenuto = contenuto;
		}
		// calcola suffisso aggiuntivo nel caso in cui sia stato indicato un tag bersaglio
		var suffissoId;
		if (modalita.indexOf("bersaglio=") > -1)
		{
			suffissoId = "_" + modalita.substring(modalita.indexOf("=") + 1);
		}
		else
		{
			suffissoId = "";
		}
		// crea codice html e css completo per visualizzare il contenuto della scheda in sovrapposizione
		codiceHtml = codiceHtml + "<div id='gpt_superioreSchedaSovrapposizione" + suffissoId + "' class='gpt_superiore' style='width: " + larghezza + "px; height: " + altezzaMinimaSuperiore + "px;'>\r";
		if (suffissoId == '') 
		{ 
			codiceHtml = codiceHtml + "<div id='gpt_superioreSinistraSchedaSovrapposizione" + suffissoId + "' class='gpt_sinistra' style='cursor: move; float: left; width: " + larghezzaMinimaSinistra + "px; height: " + altezzaMinimaSuperiore + "px; background: url(" + sfondoSuperioreSinistra + ") left top no-repeat;' onmousedown='javascript: gpt_muoviOggetto(\"" + ("gpt_schedaSovrapposizione" + suffissoId) + "\", true);' onmouseup='javascript: gpt_muoviOggetto(\"" + ("gpt_schedaSovrapposizione" + suffissoId) + "\", false);'></div>\r";
		}
		else
		{
			codiceHtml = codiceHtml + "<div id='gpt_superioreSinistraSchedaSovrapposizione" + suffissoId + "' class='gpt_sinistra' style='float: left; width: " + larghezzaMinimaSinistra + "px; height: " + altezzaMinimaSuperiore + "px; background: url(" + sfondoSuperioreSinistra + ") left top no-repeat;'></div>\r";
		}
		codiceHtml = codiceHtml + "<div id='gpt_superioreDestraSchedaSovrapposizione" + suffissoId + "' class='gpt_destra' style='float: right; width: " + (larghezza - larghezzaMinimaSinistra) + "px; height: " + altezzaMinimaSuperiore + "px; background: url(" + sfondoSuperioreDestra + ") right top no-repeat;'>\r";
		if (opzione == "noChiusura")
		{ 
			codiceHtml = codiceHtml + "<div style='float: right; width: 60px; height: " + altezzaMinimaSuperiore + "px;'>\r";
		}
		else 
		{
			codiceHtml = codiceHtml + "<div onclick='gpt_schedaSovrapposizione(false, 0, 0, \"\", \"" + modalita + "\")' style='float: right; cursor: pointer; width: 60px; height: " + altezzaMinimaSuperiore + "px;'>\r"; 
		}
		codiceHtml = codiceHtml + "</div>\r";
		codiceHtml = codiceHtml + "</div>\r";
		codiceHtml = codiceHtml + "<div id='gpt_inferioreSchedaSovrapposizione" + suffissoId + "' class='gpt_inferiore' style='width: " + larghezza + "px; height: " + (altezza - altezzaMinimaSuperiore) + "px;'>\r";
		codiceHtml = codiceHtml + "<div id='gpt_inferioreSinistraSchedaSovrapposizione" + suffissoId + "' class='gpt_sinistra' style='float: left; width: " + larghezzaMinimaSinistra + "px; height: " + (altezza - altezzaMinimaSuperiore) + "px; background: url(" + sfondoInferioreSinistra + ") left bottom no-repeat;'></div>\r";
		codiceHtml = codiceHtml + "<div id='gpt_inferioreDestraSchedaSovrapposizione" + suffissoId + "' class='gpt_destra' style='float: right; width: " + (larghezza - larghezzaMinimaSinistra) + "px; height: " + (altezza - altezzaMinimaSuperiore) + "px; background: url(" + sfondoInferioreDestra + ") right bottom no-repeat;'>\r";
		codiceHtml = codiceHtml + "<div style='width: " + (larghezza - (larghezzaMinimaSinistra + larghezzaMinimaDestra)) + "px; height: " + (altezza - (altezzaMinimaSuperiore + altezzaMinimaInferiore)) + "px;'>\r";
		codiceHtml = codiceHtml + codiceContenuto + "\r";
		codiceHtml = codiceHtml + "</div>\r";
		codiceHtml = codiceHtml + "</div>\r";
		codiceHtml = codiceHtml + "</div>\r";
		// spegni tutti gli eventuali elementi "object" presenti nel corpo del documento
		for (i = 0; i < document.getElementsByTagName("object").length; i++)
    		{
			document.getElementsByTagName("object")[i].style.visibility = "hidden";			
	  	}
		// carica scheda all'interno di un elemento bersaglio	  	
	  	if (modalita.indexOf("bersaglio=") > -1)
	  	{
	  		bersaglio = modalita.substring(modalita.indexOf("=") + 1);
			var nuovaScheda = document.createElement("div");
			nuovaScheda.setAttribute("id","gpt_schedaSovrapposizione_" + bersaglio);
			if (document.getElementById(bersaglio))
			{
				document.getElementById(bersaglio).appendChild(nuovaScheda);
				document.getElementById("gpt_schedaSovrapposizione_" + bersaglio).style.zIndex = 99;
				document.getElementById("gpt_schedaSovrapposizione_" + bersaglio).innerHTML = codiceHtml;
			}
	  	}
	  	// aggiungi scheda alla pagina (aggancia a "body")
	  	else
	  	{
			var contenutoDocumento = document.getElementsByTagName("body")[0].innerHTML;
			contenutoDocumento = codiceHtml + contenutoDocumento;
			var nuovaScheda = document.createElement("div");
			nuovaScheda.setAttribute("id","gpt_schedaSovrapposizione");
			document.getElementsByTagName("body")[0].appendChild(nuovaScheda);
			document.getElementById("gpt_schedaSovrapposizione").style.width = larghezza + "px";
			document.getElementById("gpt_schedaSovrapposizione").style.height = altezza + "px";
			document.getElementById("gpt_schedaSovrapposizione").style.position = "absolute";
			document.getElementById("gpt_schedaSovrapposizione").style.top = "50%";
			document.getElementById("gpt_schedaSovrapposizione").style.left = "50%";
			document.getElementById("gpt_schedaSovrapposizione").style.margin = (gpt_getScrollXY() - Math.round(altezza / 2)) + "px 0 0 -" + Math.round(larghezza / 2) + "px";
			document.getElementById("gpt_schedaSovrapposizione").style.zIndex = 100;
			document.getElementById("gpt_schedaSovrapposizione").innerHTML = codiceHtml;
		}
		// carica contenuto ajax se richiesto
		if (modalita == "ajax")
		{
			gpt_caricaContenutiAjax("gpt_contenutoSchedaSovrapposizione[post|" + contenuto + "],");
		}
	}
	// elimina la scheda
	else
	{
		// elimina scheda associata a tag specifico
		if (modalita.indexOf("bersaglio=") > -1)
		{
			for (i = 0; i < document.getElementsByTagName("object").length; i++)
	    		{
				document.getElementsByTagName("object")[i].style.visibility = "visible";			
		  	}
			var scheda = document.getElementById("gpt_schedaSovrapposizione_" + modalita.substring(modalita.indexOf("=") + 1));
			document.getElementById(modalita.substring(modalita.indexOf("=") + 1)).removeChild(scheda);
		}
		// elimina scheda associata a tag "body"
		else if (document.getElementById("gpt_schedaSovrapposizione"))
		{
			for (i = 0; i < document.getElementsByTagName("object").length; i++)
	    		{
				document.getElementsByTagName("object")[i].style.visibility = "visible";			
		  	}
			var scheda = document.getElementById("gpt_schedaSovrapposizione");
			document.getElementsByTagName("body")[0].removeChild(scheda);
		}
		// accendi tutti gli eventuali elementi "object" presenti nel corpo del documento
		for (i = 0; i < document.getElementsByTagName("object").length; i++)
    		{
			document.getElementsByTagName("object")[i].style.visibility = "visible";			
	  	}
	}
}



/*
	SELEZIONA GIORNO: funzione per la selezione del giorno.
	La funzione è complementare a "gpt_mostraMese" e viene utilizzata in combinazione.
*/
function gpt_selezionaGiorno(inizioSequenza,intervallo)
{
	if ((inizioSequenza + intervallo) > 7)
	{
		gpt_posizione = Math.abs(7 - (inizioSequenza + intervallo));
		spostamento = gpt_posizione;
	} 
	else
	{
		gpt_posizione = inizioSequenza + intervallo;
	}
}



/*
	SEZIONI CON MENU CONTESTUALE: suddivide la pagina in sezioni raggruppando aree differenti e creando un menù contestuale.
	Lavora a ritroso: tutti gli elementi da "accendere e spegenere" devono essere già presenti sulla pagina (compreso un tag DIV che conterrà il menu contestuale).
	L'elemento INPUT nascosto "sezioneCorrente_[valoreParametroMenu]" contiene sempre il valore aggiornato della sezione correntemente selezionata.
	Per default viene creato anche un elemento ancora con id pari a "ancora_[valoreParametroMenu]" in corrispondenza del blocco menu.
*/

function gpt_sezioniConMenuContestuale(stringa, menu, selezionato, classeCss, ancora)
{
	// inizializza variabili della funzione
	var stringaSezioni = stringa;
	var codice, titolo, htmlMenu, comandiJavascript;
	var tutteLeSezioni = "";
	var tutteLeSezioniMenu = "";
	var tutteLeSezioniMenuSelezionate = "";
	htmlMenu = "<input type=\"hidden\" id=\"sezioneCorrente_" + menu +"\" value=\"" + selezionato + "\"></input>"
	htmlMenu = htmlMenu + "<a name=\"ancora_" + menu + "\"></a>";
	htmlMenu = htmlMenu + "<div class=\"" + classeCss + "\">";
	// scorri la lista completa delle sezioni
	if (stringaSezioni.indexOf(",") > -1)
	{
		// inizializza le variabili per la creazione del menu e delle sezioni
		while (stringaSezioni.indexOf(",") > -1)
  		{
  			codice = stringaSezioni.substring(0, stringaSezioni.indexOf("["));
  			titolo = stringaSezioni.substring(stringaSezioni.indexOf("[") + 1, stringaSezioni.indexOf("]"));
			tutteLeSezioni = tutteLeSezioni + codice + ",";
			tutteLeSezioniMenu = tutteLeSezioniMenu + "menu_" + codice + ",";
			tutteLeSezioniMenuSelezionate = tutteLeSezioniMenuSelezionate + "menuSel_" + codice + ",";
			stringaSezioni = stringaSezioni.substring(stringaSezioni.indexOf(",") + 1);
		}
		// crea il codice HTML per la visualizzazione del menu
		stringaSezioni = stringa;
		while (stringaSezioni.indexOf(",") > -1)
		{
  			codice = stringaSezioni.substring(0, stringaSezioni.indexOf("["));
  			titolo = stringaSezioni.substring(stringaSezioni.indexOf("[") + 1, stringaSezioni.indexOf("]"));
			comandiJavascript = "gpt_visualizzaElementi(false, '" + tutteLeSezioni + tutteLeSezioniMenuSelezionate + "');"
			comandiJavascript = comandiJavascript + "gpt_visualizzaElementi(true, '" + codice + "," + tutteLeSezioniMenu + "menuSel_" + codice + ",');"
			comandiJavascript = comandiJavascript + "gpt_visualizzaElementi(false, 'menu_" + codice + ",');"
			comandiJavascript = comandiJavascript + "document.getElementById('sezioneCorrente_" + menu + "').value = '" + codice + "';"
			if (codice == "" && titolo == "")
			{
				htmlMenu = htmlMenu + "<br/>";
			}
			else
			{
				htmlMenu = htmlMenu + "<a id=\"menu_" + codice + "\" href=\"#" + ancora + "\" onclick=\"javascript: " + comandiJavascript + "\">" + titolo + "</a>";
				htmlMenu = htmlMenu + "<strong id=\"menuSel_" + codice + "\">" + titolo + "</strong>";
			}
  			stringaSezioni = stringaSezioni.substring(stringaSezioni.indexOf(",") + 1);
  		}
	}
	htmlMenu = htmlMenu + "</div>";
	// crea il menu contestuale
	if (document.getElementById(menu))
	{
		document.getElementById(menu).innerHTML = htmlMenu;
	}
	// visualizza l'area selezionata e la rispettiva voce di menu
	gpt_visualizzaElementi(false, tutteLeSezioni + tutteLeSezioniMenuSelezionate + "menu_" + selezionato + ",");
	gpt_visualizzaElementi(true, selezionato + "," + "menuSel_" + selezionato + ",");
}



/*
	CONTROLLA STATO: controlla lo stato dell'operazione in corso ed esegue le modifiche solo a caricamento terminato.
	La funzione verifica lo stato della transazione ajax e inserisce all'interno dell'oggetto bersaglio il messaggio di "caricamento in corso".
	Viene utilizzata all'interno di "gpt_caricaContenutoAjax".
*/

function gpt_stateChanged() 
{ 
	if (gpt_xmlHttp.readyState == 4)
	{
		var contenutiRestituiti = gpt_xmlHttp.responseText;
		var contenutiFiltrati = contenutiRestituiti;
		var istruzioniJs = "";
		var stringaJs = "";
		while (contenutiFiltrati.indexOf('<script type="text/javascript">') > -1)
		{
			stringaJs = "";
			stringaJs = contenutiFiltrati.substring(contenutiFiltrati.indexOf('<script type="text/javascript">'), (contenutiFiltrati.indexOf("</script>") + 9));
			contenutiFiltrati = contenutiFiltrati.replace(stringaJs, "");
			stringaJs = stringaJs.substring(stringaJs.indexOf('<script type="text/javascript">') + 31, (stringaJs.indexOf("</script>")));
			istruzioniJs = istruzioniJs + stringaJs;
		}
		document.getElementById(gpt_ajaxObj).innerHTML = contenutiFiltrati;
		eval(istruzioniJs);
	}
	else
	{
		document.getElementById(gpt_ajaxObj).innerHTML = gpt_messaggioCaricamento;
	}
}



/*
	VERIFICA DATA: verifica la presenza di eventi nella data corrente per creare eventuali collegamenti sul calendario.
	La funzione effettua un controllo analizzando l'array "gpt_listaDate" che contiene una lista di tutte le date sensibili (ovvero che contengono un riferimento ad un evento o ad un altro oggetto).
	Le risposte possibili sono due: o il valore "no" oppure il codice html trovato in corrispondenza della cella dell'array.
	L'array pu� essere compilato manualmente oppure durante l'esecuzione della pagina che contiene lo script del calendario.
	Ogni cella dell'array dovrà avere la seguente struttura (con asterisco di separazione): [data]~[valore].
	La data deve essere compilata nel formato "gg/mm/aaaa" mentre il valore può essere un qualunque codice html.
	Utilizzando all'interno del valore la stringa "{[giorno_1]}" essa verrà automaticamente rimpiazzata con il numero del giorno corrente.
	Utilizzando all'interno del valore la stringa "{[mese_1]}" essa verrà automaticamente rimpiazzata con il numero del mese corrente.
	Utilizzando all'interno del valore la stringa "{[anno_1]}" essa verrà automaticamente rimpiazzata con il numero dell'anno corrente.
	E' possibile indicare un template valido per tutte le date utilizzando il carattere "*" al posto della data in una qualunque posizione dell'array gpt_listaDate.
	Esempio di compilazione dell'array "gpt_listaDate":
	var gpt_listaDate = new Array();
	gpt_listaDate[0] = "10/10/2007~<a href='eventi.asp?id=143' title='Visualizza evento'>Evento!</a>";
	gpt_listaDate[1] = "23/10/2007~<a href='eventi.asp?id=465' title='Visualizza evento'>{[giorno]}</a>";
	gpt_listaDate[1] = "7/10/2007~<p>{[giorno]}</p>";
	gpt_listaDate[1] = "*~<a href='eventi.asp?id=143' title='Visualizza evento'>Evento!</a>";
	Parametri della funzione:
	1)	giornoPassato		Giorno da controllare (valore da 1 a 31 con anche una sola cifra: la conversione viene effettuata in automatico).		
	2)	mesePassato			Mese da controllare (valore da 1 a 12 con anche una sola cifra: la conversione viene effettuata in automatico).
	3)	annoPassato			Anno da controllare (valore con quattro cifre).
*/

function gpt_verificaDataCalendario(giornoPassato, mesePassato, annoPassato)
{
	var dataSegnalata = "no";
	var presenteInListaDate = false;
	var dataControllo;
	var valoreControllo;
	// ricava la stringa da ricercare nell'array delle date
	var meseCalcolato = mesePassato;
	var giornoCalcolato = giornoPassato;
	if (mesePassato < 10)
	{
		meseCalcolato = "0" + mesePassato; 
	}
	if(giornoPassato < 10)
	{
		giornoCalcolato = "0" + giornoPassato;
	}
	var dataCercata =  giornoCalcolato + "/" + meseCalcolato + "/" + annoPassato;
	// cerca nell'array delle date se � stato definito un template specifico valido esclusivamente per questa data
  for (i = 0; i < gpt_listaDate.length; i++)
  {
		dataControllo = gpt_listaDate[i].substring(0, gpt_listaDate[i].indexOf("~"));	
		if (dataControllo.indexOf(dataCercata) != -1)
		{
	 		valoreControllo = gpt_listaDate[i].substr((gpt_listaDate[i].indexOf("~") + 1), (gpt_listaDate[i].length - dataControllo.length));
			presenteInListaDate = true;
		}
	}
	// cerca nell'array delle date se � stato definito un template generale valido per tutte le date
	if (presenteInListaDate == false)
	{
    for (i = 0; i < gpt_listaDate.length; i++)
    {
			dataControllo = gpt_listaDate[i].substring(0, gpt_listaDate[i].indexOf("~"));	
  		if (dataControllo == "*")
  		{
  	 		valoreControllo = gpt_listaDate[i].substr((gpt_listaDate[i].indexOf("~") + 1), (gpt_listaDate[i].length - dataControllo.length));
  			presenteInListaDate = true;
  		}
  	}
	}
	// crea il codice html da restituire
	if (presenteInListaDate == true)
	{
		for (i = 0; i < 6; i++)
		{
  		valoreControllo = valoreControllo.replace("{[giorno_" + i + "]}", giornoPassato);
  		valoreControllo = valoreControllo.replace("{[mese_" + i + "]}", mesePassato);
  		valoreControllo = valoreControllo.replace("{[nomemese_" + i + "]}", gpt_nomeMese[mesePassato]);
  		valoreControllo = valoreControllo.replace("{[anno_" + i + "]}", annoPassato);
		}
		dataSegnalata = valoreControllo;
	}
	return dataSegnalata;
}



/*
	VISUALIZZA ELEMENTI: imposta la visibilit di uno o pi� elementi della pagina.
	Gli elementi trattati dovrebbero essere esclusivamente tag <div /> per ragioni dicompatibilit�.
	Parametri della funzione:
	1)	valore 			Flag per stabilire se mostrare oppure nascondere gli elementi selezionati.
	2)	elementi		Lista degli elementi da trattare separati dal carattere ";". Il punto e virgola deve necessariamente chiudere la stringa. 
	Esempio di lancio della funzione:
	gpt_visualizzaElementi(false, "el_1,el_2,el_3,")		Spegne gli elementi con id "el_1", "el_2" e "el_3".
	gpt_visualizzaElementi(true, "el_1,")					Accende l'elemento con id "el_1".
*/
function gpt_visualizzaElementi(valore, elementi)
{
	var listaElementi = elementi
	var elementoSelezionato;
	if (listaElementi.lastIndexOf(",") == (listaElementi.length - 1))
	{
  		while (listaElementi != "")
    		{
  			elementoSelezionato = listaElementi.substring(0, listaElementi.indexOf(","))
  			listaElementi = listaElementi.replace((elementoSelezionato + ","), "");
				if (document.getElementById(elementoSelezionato))
				{
  					if (valore == true)
  					{
  						tipoDiNodo = document.getElementById(elementoSelezionato).nodeName;
  						if (tipoDiNodo == "SPAN" || tipoDiNodo == "A" || tipoDiNodo == "STRONG" || tipoDiNodo == "INPUT")
  						{
  							document.getElementById(elementoSelezionato).style.display = "inline";
  						}
  						else if (tipoDiNodo == "TD" || tipoDiNodo == "TH")
  						{
  							document.getElementById(elementoSelezionato).style.display = "table-cell";
  						}
  						else
  						{
  							document.getElementById(elementoSelezionato).style.display = "block";
  						}
  					}
  					else
  					{
  						document.getElementById(elementoSelezionato).style.display = "none";
  					}
				}
    		}
	}	
}


