438 lines
13 KiB
JavaScript
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");
|
|
}
|
|
}
|
|
});
|