/* Funzioni generiche di base utilizza la libreria jQuery */

// ------------------------------------------------------------
// # Effettua la richiesta al server
// sBody: la stringa che contiene il Body del Form
// method: metodo submit
// action: pagina a cui effettua la richiesta
// Async: tipo di chiamata al server
// functionAsyncOK: funzione eseguita se la chiamata asincrona è terminata con successo
// userContext: variabili che vengono utilizzate dalla functionAsyncOK (es. nome del div da riempire)
function execRequest(sBody, method, action, Async, functionAsyncOK, userContext) {

	if (Async)
	{
		$.ajax({
		  type: method.toUpperCase() ,
		  url: action,
		  data: sBody,
		  async: true,
		  error: function(request, status, error) {
			  getFunctionAsyncError(request, status, error);
			  },
		  success:(function(resultData) {
			  eval(functionAsyncOK + "(resultData, '" + userContext + "')");
			})
		});
	}
	else
	{
		var resultData = $.ajax({
			type: method.toUpperCase(),
			url: action,
			data: sBody,
			async: false
		}).responseText;

		return resultData;
	}
	
}

// ------------------------------------------------------------
// # Effettua la richiesta sincrona al server
// sBody: la stringa che contiene il Body del Form
// method: metodo submit
// action: pagina a cui effettua la richiesta
function execRequestSj(sBody, method, action) {
	return execRequest(sBody, method, action, false, "", "");
}
/* Funzioni generiche per form */

// ------------------------------------------------------------
// # Ricava il contenuto dei campi Input del Form
// oForm: oggetto Form
function getRequestBody(oForm) {
	var aParams = new Array();

	// effettua un ciclo su tutti i campi Input del Form
	for (var i=0; i < oForm.elements.length; i++ ) {
		// crea un vettore in cui ogni elemento è: "NomeCampo=ValoreCampo" codificato per l'utilizzo nel URL
		// NB: encodeURIComponent è il metodo consigliato, ma corrompe i caratteri accentati
		var sParam = escape(oForm.elements[i].name);
		
		sParam += "=";

		//alert(oForm.elements[i].name);
		//alert(oForm.elements[i].value);
		//alert(escape(oForm.elements[i].value));
		
		sParam += escape(oForm.elements[i].value);
		aParams.push(sParam);
	}
	
	// restituisce il vettore sottoforma di stringa "NomeCampo1=ValoreCampo1&NomeCampo2=ValoreCampo2"
	return aParams.join("&");
}

function getValueFieldFromSQL(IDApplicativo, IDSubLogin, strSQL, blnField, listFields) {
	var sResult;
	var sBody = "IDApplicativo=" + IDApplicativo + "&IDSubLogin=" + IDSubLogin + "&strSQL=" + escape(strSQL) + "&IncField=" + (blnField ? "1":"0") + "&listFields=" + listFields;

	sResult = execRequest(sBody, "POST", "/Lib/Ajax/getValueFieldFromSQL.asp", false, "", "");

	return sResult;
}


/* Multi-Stage download: Scaricamento a più fasi
 
 - variabili globali:
 vDIV: array preventivamente popolato con il Body delle richieste Ajax
 DIVcounter: contatore DIV
 chkAjaxError: segnala un errore

 - esempio di chiamata:
 <body onLoad="fillWithAjax('Cella_', 'getHTML.asp');">

 - parametri:
 divName: prefisso dell'id del DIV da popolare
 aspPageName: pagina asp che restituisce il contenuto da inserire nei DIV

 - funzionamento:
 testa se l'array con i parametri esiste
 se esiste, chiama la pagina specificata in aspPageName con Ajax
 quando la procedura asincrona termina l'elaborazione:
 1. visualizza il risultato tramite il DIV corrispondente
 2. passa al DIV successivo
 3. se il DIV successivo esiste richiama se stessa

 in questo modo la temporizzazione è automatica e dipende dalle prestazioni disponibili

 se l'esecuzione della pagina specificata in aspPageName restituisce un errore, segnala con un alert e termina lo scaricamento
 
 - esempio di utilizzo:
 IALMan3/IpotesiCalendarioCorsi/IpotesiCalendarioCorsi.asp

 NB:
 le variabili globali sono necessarie per il meccanismo Asincrono, che, una volta che lo stato dell'oggetto XMLHttp risulta "Complete", prevede un Eval delle istruzioni volute all'interno della funzione execRequest

 */

var DIVcounter = 0;
var vDIV;
var chkAjaxError = false;

function fillWithAjax(divName, aspPageName, fOnStart, fOnEnd, fOnPass) {

	if (fOnStart == undefined)
	{
		fOnStart = "";
	}
	if (fOnEnd == undefined)
	{
		fOnEnd = "";
	}
	if (fOnPass == undefined)
	{
		fOnPass = "";
	}
	if (vDIV != null && $("#" + divName+DIVcounter).length != 0) {
		if (DIVcounter == 0)
		{
			setTimeout("StartFillWithAjax('" + fOnStart + "')",1);
		}
		if ( $("#" + divName+DIVcounter).is(':visible') ) {
			setTimeout("ViewStateFillWithAjax()",1);
			execRequest(vDIV[DIVcounter], "POST", aspPageName, true, "fillWithAjaxSuccess", divName + "|" + aspPageName + "|" + fOnStart + "|" + fOnEnd + "|" + fOnPass); //asincrono
		} else {
			DIVcounter++;
			if ( $("#" + divName+DIVcounter).length != 0 && !chkAjaxError ) 
			{	
				fillWithAjax(divName, aspPageName, fOnStart, fOnEnd, fOnPass);
			}
			else
			{
				EndFillWithAjax(fOnEnd);
			}
		}
	}
}

function fillWithAjaxSuccess(responseData, userContext)
{
	var arrUserContext = userContext.split("|");
	var divName = arrUserContext[0];
	var aspPageName = arrUserContext[1];
	var fOnStart = arrUserContext[2];
	var fOnEnd = arrUserContext[3];
	var fOnPass = arrUserContext[4];

	var divToFill = $("#" + divName+DIVcounter);

	divToFill.html(responseData);
	if (fOnPass != "")
	{
		eval(fOnPass + "(\"" + responseData + "\",\"" + userContext + "\"," + DIVcounter + ")");
	}
	DIVcounter++;
	if ($("#" + divName+DIVcounter).length != 0 && !chkAjaxError)
	{
		fillWithAjax(divName, aspPageName, fOnStart, fOnEnd, fOnPass);
	}
	else
	{
		EndFillWithAjax(fOnEnd);
	}
}

function getFunctionAsyncError(request, status, errMsg) {
	
	if (request.status!=0)
	{
		alert("ATTENZIONE: Si è verificato un errore interno. Il caricamento verrà interrotto. (" + errMsg + ")");
	}
	chkAjaxError = true;
}

function StartFillWithAjax(fOnStart)
{
	if (fOnStart != "")
	{
		eval(fOnStart);
	}
	if ($("#divLoadingFillAjax").length != 0)
	{
		$("#divLoadingFillAjax").html("");		
		$("#divLoadingFillAjax").show();
	}
	if ($("#imgLoadingFillAjax").length != 0)
	{
		$("#imgLoadingFillAjax").show();
	}
}

function ViewStateFillWithAjax()
{	
	if ($("#divLoadingFillAjax").length != 0)
	{
		$("#divLoadingFillAjax").html("caricamento " + (DIVcounter+1) + " di " + vDIV.length);
	}

}

function EndFillWithAjax(fOnEnd)
{
	if ($("#imgLoadingFillAjax").length != 0)
	{
		$("#imgLoadingFillAjax").hide();
	}
	if ($("#divLoadingFillAjax").length != 0)
	{
		$("#divLoadingFillAjax").html("");
		$("#divLoadingFillAjax").hide();
	}
	if (fOnEnd != "")
	{
		eval(fOnEnd);
	}
}
