//************************************************************************************
// Restituisce l'elemento identificato da ID (getElementById) oppure document.all[id]
// ***********************************************************************************
function F_getId(id) {
	var elemento;
 	if(document.getElementById) elemento = document.getElementById(id); // se esiste il metodo getElementById		
	else elemento = document.all[id]; // altrimenti è necessario usare un vecchio sistema		
	return elemento;
}
// ***********************************************************************************

// ***********************************************************************************
// Assegnazione dell'oggetto XMLHttpRequest con compatibilità browsers
// ***********************************************************************************
function F_defXMLHttpRequest() {
	var XHR = null, browserUtente = navigator.userAgent.toUpperCase();
	
	// browser standard con supporto nativo
	// non importa il tipo di browser
	if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object") XHR = new XMLHttpRequest();

	// browser Internet Explorer
	// è necessario filtrare la versione 4
	else if(window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0) {
		// la versione 6 di IE ha un nome differente
		// per il tipo di oggetto ActiveX
		if(browserUtente.indexOf("MSIE 5") < 0)	XHR = new ActiveXObject("Msxml2.XMLHTTP");
		// le versioni 5 e 5.5 invece sfruttano lo stesso nome
		else XHR = new ActiveXObject("Microsoft.XMLHTTP");
	}
 return XHR;
}
// ***********************************************************************************

// oggetto di verifica stato (readyState)
var readyState = {
	INATTIVO:	0,
	INIZIALIZZATO:	1,
	RICHIESTA:	2,
	RISPOSTA:	3,
	COMPLETATO:	4
};
// array descrittivo dei codici restituiti dal server
// [la scelta dell' array è per evitare problemi con vecchi browsers]
var statusText = new Array();
statusText[100] = "Continue";
statusText[101] = "Switching Protocols";
statusText[200] = "OK";
statusText[201] = "Created";
statusText[202] = "Accepted";
statusText[203] = "Non-Authoritative Information";
statusText[204] = "No Content";
statusText[205] = "Reset Content";
statusText[206] = "Partial Content";
statusText[300] = "Multiple Choices";
statusText[301] = "Moved Permanently";
statusText[302] = "Found";
statusText[303] = "See Other";
statusText[304] = "Not Modified";
statusText[305] = "Use Proxy";
statusText[306] = "(unused, but reserved)";
statusText[307] = "Temporary Redirect";
statusText[400] = "Bad Request";
statusText[401] = "Unauthorized";
statusText[402] = "Payment Required";
statusText[403] = "Forbidden";
statusText[404] = "Not Found";
statusText[405] = "Method Not Allowed";
statusText[406] = "Not Acceptable";
statusText[407] = "Proxy Authentication Required";
statusText[408] = "Request Timeout";
statusText[409] = "Conflict";
statusText[410] = "Gone";
statusText[411] = "Length Required";
statusText[412] = "Precondition Failed";
statusText[413] = "Request Entity Too Large";
statusText[414] = "Request-URI Too Long";
statusText[415] = "Unsupported Media Type";
statusText[416] = "Requested Range Not Satisfiable";
statusText[417] = "Expectation Failed";
statusText[500] = "Internal Server Error";
statusText[501] = "Not Implemented";
statusText[502] = "Bad Gateway";
statusText[503] = "Service Unavailable";
statusText[504] = "Gateway Timeout";
statusText[505] = "HTTP Version Not Supported";
statusText[509] = "Bandwidth Limit Exceeded";

// ***********************************************************************************
// Assegnazione dell'oggetto XMLHttpRequest con compatibilità browsers
// ***********************************************************************************
function F_richiestaGet(id,url) {
	// variabili di funzione
	var txt, ajax = F_defXMLHttpRequest(), elemento = F_getId(id), attivaLink=true;
	// se l'oggetto XMLHttpRequest non è nullo
	if(ajax) { 
		// Mostra Preload;
		//F_mostraAttesa(id,"wait");
		attivaLink = false; // il link al file non deve essere usato
		// impostazione richiesta asincrona in GET
		// del file specificato
		ajax.open("GET", url, true);
		// rimozione dell'header "connection" come "keep alive"
		ajax.setRequestHeader("connection", "close");
		// impostazione controllo e stato della richiesta
		ajax.onreadystatechange = function() {
	  
			// verifica dello stato
			if(ajax.readyState === readyState.COMPLETATO) {
				// verifica della risposta da parte del server
				
				if(statusText[ajax.status] === "OK") { // operazione avvenuta con successo
					txt = ajax.responseText;
					elemento.innerHTML=txt; 
				} else {
				  // errore di caricamento
				  txt = "Impossible to proceed!<br />";
				  txt += "Error: " + statusText[ajax.status];
				}
				
	  		} 
			// Ferma il Preload;
			//F_mostraAttesa(id,"");
			
		}
		ajax.send(null); // invio richiesta
	}
	return attivaLink;
} 
// ***********************************************************************************

// ***********************************************************************************
// Assegnazione dell'oggetto XMLHttpRequest con compatibilità browsers
// ***********************************************************************************
function F_richiestaPost(id,url,dati) {
	// variabili di funzione
	var txt, ajax = F_defXMLHttpRequest(), elemento = F_getId(id), attivaLink=true;
	// se l'oggetto XMLHttpRequest non è nullo
	if(ajax) { 
		// Mostra Preload;
		//F_mostraAttesa(id,"wait");
		attivaLink = false; // il link al file non deve essere usato
		// impostazione richiesta asincrona in POST
		// del file specificato
		ajax.open("POST", url, true);
		// rimozione dell'header "connection" come "keep alive"
		ajax.setRequestHeader("connection", "close");
		// da settare per il metodo post"
		ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		// impostazione controllo e stato della richiesta
		ajax.onreadystatechange = function() {
	  
			// verifica dello stato
			if(ajax.readyState === readyState.COMPLETATO) {
				// verifica della risposta da parte del server
				if(statusText[ajax.status] === "OK") { // operazione avvenuta con successo
					txt = ajax.responseText; 
					elemento.innerHTML=txt;
				} else {
				  // errore di caricamento
				  txt = "Impossible to proceed!<br />";
				  txt += "Error: " + statusText[ajax.status];
				}
	  		} 
			// Ferma il Preload;
			//F_mostraAttesa(id,"");
			
		}
		ajax.send(dati); // invio richiesta
		
	}
	return attivaLink;
} 
// ***********************************************************************************

// ***********************************************************************************
// Funzione Preload
// ***********************************************************************************
// accetta una stringa di testo non html da mostrare
function F_mostraAttesa(id,tmpTxt) {
	// variabili di funzione
	var puntini = 0, testoIntrattenimento = F_getId(id),
    // funzione per aggiungere puntini al testo scelto
    animaTesto = function() {
		// stringa locale contenente i vari puntini
		var testoAggiunto = "";
		// ciclo per aggiungere i puntini
		for(var a = 0; a < puntini; a++)
		testoAggiunto += ".";
		
		// assegnazione del nuovo testo al nodo
		// comprensivo dei puntini
		testoIntrattenimento.nodeValue = tmpTxt + testoAggiunto;
		if(puntini < 4) puntini++;
		else puntini = 0;
		setTimeout(animaTesto, 300);
    };

	// verifica della precedente assegnazione
	// del nodo testuale all'interno dell'elemento
	if(testoIntrattenimento.firstChild) {
		// in questo caso è necesario riassegnare
		// la funzione al fine di eliminare l'intervallo
		// successivo ...
		animaTesto = function(){};
		// ... per poi eliminare il nodo precedentemente aggiunto
		testoIntrattenimento.removeChild(testoIntrattenimento.firstChild);
	} else {
		// nodo inesistente, è necessario crearlo
		// con il testo predefinito ...
		testoIntrattenimento = document.createTextNode(tmpTxt);
		// ... ed assegnarlo all'elemento
		F_getId(id).appendChild(testoIntrattenimento);
		// per poter richiamare la funzione
		animaTesto();
	}
}
// ***********************************************************************************
