// -----------------------------------------------------
// 
// JpkAjax
// 
// Piccola libreria JavaScript
// per utilizzare AJAX
//
// jpkajax.js,v 1.3 2009/12/09 12:32:29 peter Exp
// Copyright (c) 2007 Pietro Komanns <pklabs@pktech.eu>
// 
// -----------------------------------------------------

// -------------------------------------------------
// Funzione standard di richiesta di una URL in AJAX
// -------------------------------------------------
//
// In input:
// url    - URL da richiamare per il servizio
// cback  - Referenza alla callback Javascript che ricevera'
//	    il ritorno dal servizio
// method - Metodo da impostare ( 'GET' o 'POST' )
//	    NB se method non vale 'POST' (maiuscolo) viene usato 'GET'
// parms  - In caso di metodo 'POST', stringa con i parametri da
//          passare nel formato "token=valore[&token=valore&token=valore...]"
//
function makeRequest(url,cback,method,parms)
{
	var http_request = false;

	// --------------------------------------------------
	// Primo: tento di procurarmi un XMLHTTPRequest.
	//        a seconda del tipo di browser l'approccio
	//	  cambia: con Mozilla e' un oggetto mentre
	//	  con IE e' un Active/X
	// --------------------------------------------------
	if (window.XMLHttpRequest)	// Mozilla, safari...
	{
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType)
		{
			// Per evitare problemi sull'header in 
			// risposta, imposto io il dato sul
			// contenuto...
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) // IE
	{
		try
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e)
		{
			try
			{
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
        }

	// Verifico se sono riuscito a procurarmi l'oggetto...
	if (!http_request)	// NO!
	{
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}

	// --------------------------------------------
	// Qui registro la callback che maneggera' le
	// risposte che arrivano dal server.Notare che
	// questa operazione si fa PRIMA di far partire
	// la richiesta verso il server...
	// Si passa come parametro l'indirizzo della 
	// callback....
	// --------------------------------------------
	http_request.onreadystatechange = function()
	{
		cback(http_request);
	};

	// ----------------------------------------------------------
	// Partenza della richiesta:
	// Par 1: Metodo - SEMPRE MAIUSCOLO! ( GET,POST, ecc. )
	// Par 2: La URL da richiamare. SEMPRE DELLO STESSO DOMINIO
	//        DELLA PAGINA CORRENTE!
	// Par 3: 'true' se asincrono oppure 'false' se sincrono
	// ----------------------------------------------------------
	var mt = 'GET';
	if( method.indexOf('POST') == 0 && method.length == 4 )
	{
		mt = 'POST';
		http_request.open(mt, url, true);
		http_request.setRequestHeader('Content-Type',
			'application/x-www-form-urlencoded');
	}
	else
		http_request.open(mt, url, true);

	// ------------------------------------------------------------
	// L'argomento e' una stringa per passare i dati di tipo POST,
	// Il formato della stringa e' "nam=val&nam2=val2&nam3=val3..."
	// ------------------------------------------------------------
        http_request.send(parms);

}

// -----------------------------------------------------------------------
// Callback standard per raccolta delle risposte dal server che richiedono 
// una lettura di tipo SQL: decodifica l'errore bloccante e passa il 
// documento xml ma solo se non ci sono errori bloccanti.
// il TAG 'errorMsg' che contiene il messaggio di errore SQL.
//
// In input:
// http_request - richiesta http
//
// In output: true se non ci sono errori bloccanti, oppure false 
//            se ce ne sono
//
// Questa funzione richiede che lo stream XML che arriva abbia SEMPRE 
// il TAG 'sqlcode' con il codice di errore ( 0=no errore 100=SQLNOTFOUND 
// altri=errore ) e, se il codice di errore e' diverso da zero, 
//
// Esempi:
//
// <root>
//   <sqlcode>-201</sqlcode>
//   <errorMsg>Syntax error</errorMsg>
// </root>
//
// <root>
//   <sqlcode>-217</sqlcode>
//   <errorMsg>Column not found in any part of the query</errorMsg>
// </root>
//
// <root>
//   <sqlcode>100</sqlcode>
// </root>
//
// <root>
//   <sqlcode>0</sqlcode>
//   <data1>content of data1</data1>
//   <data2>content of data2</data2>
//   <data3>content of data3</data3>
//   <data4>content of data4</data4>
// </root>
//
// NB: "data" non e' un nome fisso, dipende dall'implementazione.
// NB: "sqlcode" ed "errorMsg" SONO nomi fissi.
// ------------------------------------------------------------------------
function sqlcb(http_request)
{
	// readyState:
	// 0 = unintialized
	// 1 = loading
	// 2 = loaded
	// 3 = interactive
	// 4 = complete
	if (http_request.readyState == 4)
	{
		// Stato HTTP della richiesta, vedi W3C...
		if (http_request.status == 200)
		{
			var xmldoc = http_request.responseXML;
			var eno_node=xmldoc.getElementsByTagName('sqlcode').item(0);
			var eno=parseInt(eno_node.firstChild.data,10);
			switch( eno ) 
			{
				case 0:		// Nessun errore SQL
				case 100:	// SQLNOTFOUND
				return true;

				default:
				var msg_node=xmldoc.getElementsByTagName('errorMsg').item(0);
				var msg=msg_node.firstChild.data;
				alert('Error '+eno+' in AJAX! ('+msg+')');
				break;
			}
		}
		else
		{
			// alert('There was a problem with the request.');
		}
	}
	return false;
}

/* Decode
 * Funzione generica per chiamare il servizio AJAX
 * In Input:
 * url   - La URL del servizio
 * cback - Referenza alla callback da richiamare
 * fname - Nome del campo di input da cui prendere il parametro di ricerca
 * w     - Oggetto di input che ha richiesto la chiamata
 * Non fa nulla se la chiave richiesta e' vuota.
 */
function decode( url,cback,fname,w )
{
	if( w.value.length < 1 )
		w.focus();
	else
	{
		var parms=fname+'='+w.value;
		makeRequest(url,cback,'POST',parms);
	}
}

