Regalamiunsorriso/rus/admin/_V4/_js/ajaxFunc.js
2026-03-14 20:04:39 +01:00

438 lines
13 KiB
JavaScript

//v.2.2
//15-09-2014 _ablia.js
//13-06-2014 aggiunta direttiva async nella chiamata ajax della fetch
//09-06-2014 modificato fetch: aggiunto parametro per il tipo di risposta dal server
// che se non impostato è html altrimenti passare es. "json" per tipo json, ecc..
//29-03-2014 modificato per utilizzare executeProcess(postProcess,ppArgs)
//18-03-2014 fetch asincrona
//18-02-2014 testato fetch
//07-02-2014 fetch modificata da testare il postprocess con passaggio dei parametri
//hideList isListVisible e showList spostate in ajacTextBoxSearch
//compatibile con abliajar Abl_16_70_26_070214
//30-10-2013 sendJQueryMessage
//05-06-2013 aggiiornato immagine attesa
//28-01-2011 postProcess adesso puo' essere null
//06-11-2008 gestione postProcess. Utilizzabile sempre. Usato su ajaxTextBoxSerch
//04-11-2008 prima versione
/*
04-11-2008 gestione showList che funziona all'interno dei tab
27-10-2008 priva versione e inizio versionamento
*/
/** (C) HTML.IT - insieme di funzioni ed oggetti utili per interagire con ajax */
/** OGGETTI / ARRAY */
// oggetto di verifica stato
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";
/** FUNZIONI */
// funzione per assegnare un oggetto XMLHttpRequest
function assegnaXMLHttpRequest() {
var
XHR = null,
browserUtente = navigator.userAgent.toUpperCase();
if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object")
XHR = new XMLHttpRequest();
else if(window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0) {
if(browserUtente.indexOf("MSIE 5") < 0)
XHR = new ActiveXObject("Msxml2.XMLHTTP");
else
XHR = new ActiveXObject("Microsoft.XMLHTTP");
}
return XHR;
};
////////////////////////////////////////////////////
////////////////////////////////////////////////////
function sendAjaxGet2(svltRequest,divLista)
{
// variabili di funzione
// assegnazione oggetto XMLHttpRequest
ajax = assegnaXMLHttpRequest(),
// assegnazione elemento del documento
elemento = prendiElementoDaId(divLista),
// risultato booleano di funzione
usaLink = true;
// se l'oggetto XMLHttpRequest non è nullo
if(ajax)
{
//faccio vedere la lista
if(!isListVisible(divLista))
{
showList(divLista);
}
// il link al file non deve essere usato
usaLink = false;
// impostazione richiesta asincrona in GET
// del file specificato
ajax.open("get", svltRequest, 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
elemento.innerHTML = ajax.responseText;
else
{
// errore di caricamento
elemento.innerHTML = "Impossibile effettuare l'operazione richiesta.<br />";
elemento.innerHTML += "Errore riscontrato: " + statusText[ajax.status];
}
}
}
// invio richiesta
ajax.send(null);
}
return usaLink;
}
function sendAjaxGet(svltRequest,divLista,postProcess)
{
// variabili di controllo del tempo
// data di inizio interazione
dataChiamata = new Date(),
// tempo in millisecondi dell'inizio
inizioChiamata = dataChiamata.getTime(),
// secondi di attesa prima di fermare l'interazione
massimaAttesa = 10,
// variabile cui assegnare la funzione di verifica
verificaTempoTrascorso = function(){};
// variabili di funzione
// assegnazione oggetto XMLHttpRequest
ajax = assegnaXMLHttpRequest(),
// assegnazione elemento del documento
elemento = Ab.prendiElementoDaId(divLista),
// risultato booleano di funzione
usaLink = true;
// se l'oggetto XMLHttpRequest non è nullo
if(ajax)
{
//faccio vedere la lista
{
//metto la gif
elemento.innerHTML="Ricerca in corso .....";
//elemento.innerHTML="Ricerca in corso ....."+"<img src='../../../../"+webApp+"/admin/_V3/_img/attesa.gif' alt='Ricerca in corso''>";
//<img src="../../admin/img/attesa.gif" alt="Ricerca in corso" width="20" height="21">
}
// il link al file non deve essere usato
usaLink = false;
// impostazione richiesta asincrona in GET
// del file specificato
ajax.open("get", svltRequest, 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)
{
// annulliamo la funzione di verifica tempo
verificaTempoTrascorso = function(){};
// verifica della risposta da parte del server
if(statusText[ajax.status] === "OK"){
// operazione avvenuta con successo
elemento.innerHTML = ajax.responseText;
//post elaborazioni???
if(postProcess!=null)
postProcess();
}
else
{
// errore di caricamento
elemento.innerHTML = "Impossibile effettuare l'operazione richiesta.<br />";
elemento.innerHTML += "Errore riscontrato: " + statusText[ajax.status];
}
}
// se la richiesta non è stata ancora ultimata
// è possibile sfruttare la variabile massimaAttesa
// per verificare se il controllo sul tempo trascorso
// sia stato creato o meno.
// Essendo tale valore un intero rappresentante i secondi
// ma non essendo ancora stato riassegnato nel corrispettivo
// in millesimi, questo else if può garantire che
// il codice al suo interno verrà eseguito una sola volta
else if(massimaAttesa < 1000)
{
// conversione di massimaAttesain millisecondi
massimaAttesa= massimaAttesa * 1000;
// il controllo sul tempo trascorso deve essere
// asincrono a questa funzione poichè non è detto
// che il cambio di stato della richiesta
// venga effettuato in tempi utili.
// Una funzione apposita per la verifica
// è la soluzione più indicata
verificaTempoTrascorso = function()
{
// ogni chiamata asincrona a questa funzione
// dovrà verificare la durata dell'interazione
// è necessario quindi ridichiarare la variabile
// al fine di ottenere il nuovo oggetto Date
dataChiamata = new Date();
// Se il tempo trascorso è maggiore della
// massima attesa ...
if((dataChiamata.getTime() - inizioChiamata) > massimaAttesa)
{
// ... interrompiamo la richiesta ed
// informarmiamo l'utente di quanto avvenuto.
// Quindi riassegnamo onreadystatechange ad una
// funzione vuota, poichè quest'evento sarà
// sollevato chiamando il metodo abort()
ajax.onreadystatechange = function(){return;};
// è possibile a questo punto richiamare il metodo abort
// ed annullare le operazioni dell'oggetto XMLHttpRequest
ajax.abort();
// creiamo un elemento per avvertire l'utente
// del fallimento della richiesta da aggiungere
// a quello predisposto per mostrare il risultato.
// Usiamo il metodo createElement() del document e
// non innerHTML,che potrebbe riscrivere il link selezionato
// annullando l'assegnazione del parametro fittizio.
// Avendo annullato l'utilità dell'oggetto XMLHttpRequest
// è possibile anche riciclare la variabile 'ajax'.
ajax = document.createElement("p");
ajax.innerHTML =
"Spiacente, richiesta fallita.<br />" +
"La prego di ritentare tra qualche istante.";
elemento.appendChild(ajax);
}
// se invece il tempo è inferiore al timeout
else
{
// si richiama questa stessa funzione, con un tempo
// che non dovrà essere ne alto ne troppo basso.
setTimeout(verificaTempoTrascorso, 100);
}
};
// definita la funzione non resta che avviarla
verificaTempoTrascorso();
};
}
// invio richiesta
ajax.send(null);
}
return usaLink;
}
////////////////////////////////////////////////////
//
function mostraAttesa(testo) {
// variabili di funzione
var
// totale dei puntini mostrati
puntini = 0,
// elemento contenente il testo
// oppure il nodo testuale all'interno
// dello stesso elemento
testoIntrattenimento = Ab.prendiElementoDaId("testo-temporaneo"),
// 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 = testo + testoAggiunto;
// controllo sul totale puntini
// se inferiori a 4
if(puntini < 4)
// si aggiunge un altro punto
puntini++;
// altrimenti si ricomincia da nessun punto
else
puntini = 0;
// richiamo alla stessa funzione con intervallo non
// inferiore ai 250 millisecondi
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(testo);
// ... ed assegnarlo all'elemento
Ab.prendiElementoDaId("testo-temporaneo").appendChild(testoIntrattenimento);
// per poter richiamare la funzione
animaTesto();
};
};
//////////////////////////////////////////////////////
// fetch
// chiama la servlet passandogli i comandi e ritorna un valore che viene inserito o nella divList
// oppure passato come parametro alla funzione postProcess
// DA TESTARE A FONDO...
//////////////////////////////////////////////////////
function fetch(servlet, command, divList, postProcess, async, type) {
//gestione chiamate asincrone
if(async!= undefined && async!=null){
$("#_async").val(async);
//imposto una immagine di attesa
$("#"+divList).html("<img src='"+webApp+"/admin/_V3/_img/attesa.gif' width='16' height='16'>");
//alert('pio');
}
else
{
$("#_async").val("");
}
if (async==undefined) {
async=true;
}
if (type==undefined) {
type = "html";
}
$.ajax({
type: "POST",
url: servlet,
data: command,
dataType: type,
async: async,
success: function(msg)
{
$("#_async").val("");
if ("#"+divList!=null){
$("#"+divList).html(msg);
if(postProcess!=null){
Ab.executeProcess(postProcess,msg);
}
}
else if(postProcess!=null){
Ab.executeProcess(postProcess, msg);
}
},
error: function()
{
$("#"+divList).html("Chiamata fallita, si prega di riprovare...");
//alert("Chiamata fallita, si prega di riprovare...");
$("#_async").val("");
}
});
}
//********************************************************
//********************************************************
// attesa sulle chiamate ajax sincrone
//********************************************************
//********************************************************
$body = $("body");
$(document).on({
ajaxStart: function() {
//console.log("loading partito");
if($('#_async').val()==="" || $('#_async').val()==="false"){
$body.addClass("loading");
}
else
{
//alert('pio');
}
},
ajaxStop: function() {
//console.log("loading fermato");
if($('#_async').val()==="" || $('#_async').val()==="false"){
$body.removeClass("loading");
}
}
});