/* Copyright &copy; 2008 Andrea Curcio <curcio.and@gmail.com>
	
   Motore Ajax per siti internet Cheetah 2.0
	
   All Rights Reserved. */

// tempo di attesa del loader in millisecondi (impostare a 0 se non si desidera il loader)
var ATTESA_LOADER = 0;
// url del loader
var URL_LOADER = "img/ajax-loader.gif"

// funzione per creare l'oggetto XMLHttpRequest
function creaRichiesta(){
	//creazione della variabile alla quale sarà assegnato l'oggetto della connessione
	var xmlHttp=null;

	/*appurato che l'utente ha un browser che supporta la tecnologia Ajax, si passa tramite la cattura degli errori a creare
	l'oggetto per la connessione. IE a differenza degli altri browser più comuni in circolazione, usa un oggetto tutto suo.
	Si differenziano inoltre l'oggetto usato dalla versione 6 e superiori da quello usato dalla versione 5 e 5.5
	Si eseguono quindi una serie di try/catch (servono per catturare gli errori. In questo caso se il browser non riconosce l'oggetto
	XMLHttpRequest passa all'azione successiva del catch e cosi via. Alla fine si ritorna l'oggetto a chi ne ha fatto richiesta	*/
	try{
		// Oggetto per Firefox (dalla versione 1.5 ) Opera 8.0+, Safari
	 	xmlHttp=new XMLHttpRequest();
	}catch(e){
	 	try{
			//oggetto per le versioni 6 e superiori di Internet Explorer
	  		xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	  	}catch(e){
			//oggetto per le versioni 5 e 5.5 delle versioni di Internet Explorer
	  		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	 	}
	 }

	 //ritorno l'oggetto per la connessione in Ajax
	return xmlHttp;
}

/*funzione che ritorna la risposta data dal server alla richiesta in corso. In caso di valore dello status uguale a 200 (comunicazione a buon fine) ritorna la risposta,in caso contrario ritorna gli errori relativi agli status della richiesta
*/
function rispostaServer(richiesta){
	var risposta = null;

	switch(richiesta.status){
			case 200: risposta = richiesta.responseText;break;
			case 204: risposta = "204 No Content<br/> - Nessun contenuto nella pagina";break;
			case 400: risposta = "400 Bad Request<br/> - Richiesta errata";break;
			case 403: risposta = "403 Forbidden<br/> - Non sei autorizzato a compiere questa operazione";break;
			case 404: risposta = "404 Not Found<br/> - Pagina non trovata";break;
			case 500: risposta = "500 Internal Server Error<br/> - Errore interno del server";break;
			case 503: risposta = "503 Service Unavailable<br/> - Il server a causa di un temporaneo overload non pu&ograve; rispondere alla richiesta effettuata";break;
			case 504: risposta = "504 Gateway Timeout<br/> - Richiesta fuori tempo massimo";break;
			case 505: risposta = "505 HTTP Version Not Supported<br/> - Il server non supporta la versione dell&acute;http con cui è stata effettuata la richiesta";break;
			default: risposta = "Errore generico nella ricezione dati";break;
	}	
	return risposta;
}


//la funzione effettua la richiesta asincrona, e riceve la risposta del server.
//1° parametro è l'url della pagina alla quale vogliamo fare la richiesta. Per le richieste GET, all'url vanno aggiunti anche gli eventuali dati da passare al server
//2° parametro è l'id dell'elemento in cui vogliamo far stampare la richiesta
//3° parametro è il metodo che vogliamo usare per mandare i dati POST o GET
//4° (OPZIONALE)parametro sono i dati che vogliamo passare alla pagina. Va usato solo nel caso si faccia una richiesta POST. Per la richiesta GET, va lasciato vuoto
function richiestaTesto(id, url, metodo, contenuti) {
	// creazione e assegnazione oggetto XMLHttpRequest
  	var richiesta = creaRichiesta();
    var testo = null;
	//la seguentecontrollo serve per vedere se viene fatta una richiesta Ajax (non viene fatta se si usano browser che non lo supportano) o se gli utenti hanno javascript disattivato.
	if(richiesta){
		//Apertura della richiesta con il metodo specificato all'url specificato
    	richiesta.open(metodo, url, true);
		//nel caso la richiesta vien fatta con il metodo post, si aggiunge questo setRequestHeader
		if(metodo == "post")
			richiesta.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		
  		// rimozione dell'header "connection" come "keep alive"
    	richiesta.setRequestHeader("connection", "close");
    	// impostazione controllo e stato della richiesta
    	richiesta.onreadystatechange = function() {
       		// verifica dello stato, se la risposta è completa, stampa la risposta del server o l'errore opportuno
      		if(richiesta.readyState == 4) {
				//richiama la funzione rispostaServer passandogli la var richiesta, e salva la risposta del server nella var testo
        		testo = rispostaServer(richiesta);
				//richiama la funzione stampa
				stampa(id, testo)
			}
		}
    	// invio richiesta. Nel caso il metodo sia di tipo post, manda anche i contenuti, altrimenti manda null come valore
   		if(metodo == "post"){
			richiesta.send(contenuti);
		}else{
			richiesta.send(null);
		}
  	}
}


/* Funzione che permette la stampa a video del contenuto ricevuto dal server. Se si vuole stampare il contenuto in modo diverso da quello di default (che prevede la sostituzione del vecchio contenuto con quello nuovo) bisogna modificare SOLO l'ultima istruzione della funzione.
1° parametro è l'id dell'elemento in cui vogliamo far stampare la richiesta
2° parametro è il testo da inserire all'interno dell'elemento */
function stampa(id, testo){
	//crea la variabile elemento che rappresenta il blocco con l'id passato alla funzione
	var elemento = window.document.getElementById(id);
	elemento.innerHTML = testo;
}


/* Funzione che permette di visualizzare un loader che indica che si sta interagendo con il server. Il loader è una piccola immagine animata di caricamento.
1° parametro è l'id dell'elemento in cui vogliamo far stampare la richiesta
2° parametro è l'url della pagina alla quale vogliamo fare la richiesta. Per le richieste get, gli vanno aggiunti anche gli eventuali dati da passare al server
3° parametro è il metodo che vogliamo usare per mandare i dati POST o GET
4° (OPZIONALE)parametro sono i dati che vogliamo passare alla pagina. Va usato solo nel caso si faccia una richiesta Post. Per la richiesta Get, va lasciato vuoto */
function loader(id, url, metodo, contenuti){
	
	if (ATTESA_LOADER != 0){
		//serve per stampare l'immagine di caricamento in attesa della risposta del server
		window.document.getElementById(id).innerHTML = '<img src="'+URL_LOADER+'" alt="Loader" title="Loader" align="center" />';
	}
	//dopo un tempo pari ad ATTESA_LOADER, chiama la funzione richiestaResto che fa partire la richiesta Ajax. In questo modo si assicura una vita minima all'immagine di loader, cosi da evitare di creare effetti di apparizione sparizione troppo veloce che possono disturbare l'utente 
	setTimeout("controllo = richiestaTesto('"+id+"', '"+url+"', '"+metodo+"', '"+contenuti+"');", ATTESA_LOADER);
}
