//======================================================================// Libreria contenente la classe AJAXHandler per la realizzazione di varie tipologie di menu. La classe AJAXHandler// pu\u00F2 essere utilizzate per effettuare richieste client to server via HTTP asincrone o sincrone.//// Abbinamento con agenti LotusScript:// Un agente interrogato mediante una richiesta HTTP AJAX, pu\u00F2 restituire// -		una stringa di testo// -		una stringa XML// -		una stringa JSON.//// Stringhe XML e JSON saranno convertite nei corrispondenti oggetti dallo stesso oggetto AJAXHandler.// L'agente potr\u00E0 restituire tale stringa mediante comando ls print, curando di restituire anche le informazioni dell'header.// Es.//		Print "Content-Type:text/plain; charset=utf-8"//		Print "Cache-Control:NoCache"//		Print Qui va la stringa da restituire//// Avvertenza:// si esortano gli utilizzatori a non effettuare modifiche non autorizzate su questa libreria. Tali modifiche verrebbero// perse in caso di aggiornamento ed inoltre potrebbero causare malfunzionamenti nelle funzioni che ne fanno uso.//// Prerequisiti:// - Libreria QJS Basic 4.0 o superiore//// Versioni:// - 3.0			Prima versione ufficialmente rilasciata.// - 4.0			Modificato default del parametro pAsyncMode del metodo sendRequest e gestione della funzione da chiamare.//					Eliminato parametro pJSObject del metodo sendRequest. Aggiunto metodo resetParameters//// Propriet\u00E0:	Quattroemme S.p.A.// Autore:		Francesco Diamanti//======================================================================function AJAXHandler() {	//------------------------------------------------------------------------------------------------------------------------	// Variabili private	//------------------------------------------------------------------------------------------------------------------------	var XMLHttp = getXMLHttp()		//Oggetto XmlHttpRequest	var functionToCall = ""				//Indica quale funzione chiamare al completamento della richiesta	var responseType					//Tipo di risposta. Assume "Text", "XML" o "JSON"	var JSObject							//Oggetto contenente il metodo da richiamare se functionToCall \u00E8 un metodo di oggetto.	var parameters = null				//Stringa parametri per il metodo post. Segue il formato:											//Nome variabile 1 + QSEP2 + valore 1 + QSEP1 + Nome variabile 2 + QSEP2 + valore 2	var that = this	//------------------------------------------------------------------------------------------------------------------------	// Propriet\u00E0 pubbliche	//------------------------------------------------------------------------------------------------------------------------	this.noCache = true					//Se true non utilizza la cache per le risposte del server		//METODI PUBBLICI	//------------------------------------------------------------------------------------------------------------------------	// Metodi pubblici	//------------------------------------------------------------------------------------------------------------------------	this.addParameter = M_addParameter				//Aggiunge un parametro alla richiesta HTTP di tipo post.	this.resetParameters = M_resetParameters		//Annulla tutti parametri assegnati alla chiamata	this.sendRequest = M_sendRequest				//Invia la richiesta HTTP	//------------------------------------------------------------------------------------------------------------------------	// Definizione dei metodi pubblici	//------------------------------------------------------------------------------------------------------------------------	function M_addParameter(pName, pValue) {		//Imposta un parametro alla stringa dei parametri.		//Parametri:		//- pName			Nome del parametro		//- pValue			Valore del parametro. Se trattasi di un array, verr\u00E0 converito in una stringa concatenata con QSEP3		try {			var name = pName + QSEP2			var value = (QIsArray(pValue))? pValue.join(QSEP3) : pValue			var parameter = name + value + QSEP1			if (parameters == null) parameters = parameter			else {				if (parameters.indexOf(name) == -1) parameters += parameter				else {					var objString = new QString(parameters)					parameters = objString.replaceInner(value, name, QSEP1)				}			}		} 		catch(e) {QException(e, "AJAXHandler.addParameter")}	}		//------------------------------------------------------------------------------------------------------------------------	function M_resetParameters() {		//Annulla tutti parametri assegnati alla chiamata		try {			parameters = null		} 		catch(e) {QException(e, "AJAXHandler.resetParameters")}	}		//------------------------------------------------------------------------------------------------------------------------	function M_sendRequest(pURL, pFunctionToCall, pResponseType, pAsyncMode) {		//Parametri:		//AgentUrl					Nome dell'agente Domino da invocare pi\u00F9 i parametri.		//							Es: "NomeAgente?OpenAgent&NomeParametro1=ContenutoParametro1&NomeParametro2=......."		//pFunctionToCall		Funzione o nome della funzione javascript da eseguire al termine della richiesta.		//							Verr\u00E0 automaticamente appeso il parametro contenente la risposta del server.		//							Es: SaveAndClose(UserName, this) o SaveAndClose(this)		//pResponseType		Tipo di valore di ritorno, ovvero: "Text", "XML" o "JSON"		//pAsyncMode			True se la richiesta e asincrona, false se \u00E8 sincrona. Il default \u00E8 true.		//							NOTA: Firefox accetta solo chiamate asincrone percui impostare il parametro a true		try {			if (XMLHttp) {				var URL = pURL				//Normalizza il nome della funzione inserendo tra i parametri l'oggetto istanza				functionToCall = pFunctionToCall				//Tipo di valore di ritorno				responseType = (pResponseType == "" || pResponseType == undefined)? "TEXT":pResponseType.toUpperCase()				//Metodo asincrono				var asyncMode = (pAsyncMode == null)? true : pAsyncMode				//Se il parametro pJSObject \u00E8 un oggetto, la funzione da lanciare successivamente \u00E8 un suo metodo.				if (typeof(pJSObject) == "object") JSObject = pJSObject				else JSObject = ""				//Apertura dell'oggetto XMLHttpRequest				if (parameters == null) XMLHttp.open("GET", URL, asyncMode)				else XMLHttp.open("POST", URL, asyncMode)				//Definizione della funzione di fine elaborazione				XMLHttp.onreadystatechange = doWhenStateChange				if (that.noCache) XMLHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")				//Invio della richiesta				XMLHttp.send(parameters)			}			else alert("This browser doesn't support AJAX")		}		catch(e) {QException(e, "AJAXHandler.SendRequest")}	}		//------------------------------------------------------------------------------------------------------------------------	// Metodi privati	//------------------------------------------------------------------------------------------------------------------------	function getXMLHttp() {		//Restituisce un oggetto XmlHttpRequest per IE7, Mozilla, Safari, e tutti i browser con oggetto XMLHttpRequest nativo,		//oppure per IE6, IE5 e tutti i browser che usano l'oggetto XMLHttpRequest di tipo ActiveX		try {			if (window.XMLHttpRequest) return new XMLHttpRequest()			else if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP")		}		catch(e) {QException(e, "AJAXHandler.getXMLHttp")}	}		//------------------------------------------------------------------------------------------------------------------------	function doWhenStateChange() {		//Funzione di controllo dei cambiamenti di stato della richiesta in corso. Al termine (stato = 4) avvia		//la funzione indicata come funzione successiva da lanciare per elaborare il risultato della richiesta.		try {			if (XMLHttp) {				if (XMLHttp.readyState == 4) {					var value					switch (responseType) {						case "TEXT":							value = XMLHttp.responseText.substring(0, XMLHttp.responseText.length - 1)							break						case "XML":							value = XMLHttp.responseXML							break						case "JSON":							if (XMLHttp.responseText != "") {								value = eval("(" + XMLHttp.responseText.substring(0, XMLHttp.responseText.length - 1) + ")")							}							break					}					//Avvia la funzione da chiamare a termine delle richiesta					switch (typeof(functionToCall)) {						case "function": functionToCall(value)							break						case "string": 							var toCall = functionToCall							var pos = toCall.indexOf(")")							if (pos == -1) toCall += "(value)"  							else if (toCall.charAt(pos - 1) == "(") toCall = toCall.substring(0, pos) + "value)"							else toCall = toCall.substring(0, pos) + ", value)"							eval(toCall)							break					}				}			}		} 		catch(e) {QException(e, "AJAXHandler.doWhenStateChange")}	}}