//v 1.25
//10-05-2017 aggiunto Ab.disabledEventPropagation
//01-10-2015 creato resetAllRI... corretto ancora bug
//30-09-2015 ancora...
//29-09-2015 divLista.html non è mai vuoto. Utilizzato contenuto
//28-09-2015 corretto bug "#"+divLista
//21-09-2015 gestito il vai avanti tramite attributo enablenodb sul campo di ricerca
//15-09-2015 ricerca ajax su caricaListaSMono. gestito il va comunque avanti
//01-08-2015 ricerca ajax. su invio va comnque avanti, nasconde il div lista e cambia css sul campo di ricerca
//24-04-2015 gestione campo indietro
//12-01-2014 azzero la chiave se il campo di ricerca è vuoto
//15-09-2014 _ablia.js
//29-03-2014 modificato per utilizzare executeProcess(postProcess,ppArgs)
//07-02-2014 selectAjKey testato funzione sulla selezione quando al posto del nextfocus ho uno script con parametri
//compatibile con abliajar Abl_16_70_26_070214
//hideList isListVisible e showList spostato qui e implementato con jquery (anzi no ...problemi con explorer... ma va!!)
//aggiunto postCr utilizzato nella distinzione tra nextfocus e funzione da eseguire sia
//su caricaLista che su selectAj
//06-06-2013 aggirnato immagine attesa
//03/09/2012 corretto errore su selectAjKey nel caso di esecuzione di una funzione
//22/07/2011 ignoro stasto cmd(mela) e cmd tab su mac
//26/06/2011 gestione selectAjKey con nextField o script o funzione da eseguire (trova e())
//13-11 2008 gestione automazione 1 record si/no opzionale caricaLista caricaListaM caricaListaS caricaListaSM
//09-11-2008 aggiornato caricaListaS per gestione continuo a ricercare
//06-11-2008 gestione postProcess per il caso in cui trovo 1 solo record.
//05-11-2008 gestito ricerca su nchar + ricerca solo sul submit
//30-10-2008 gestito la concomitanza di piu searchTextBox. In pratica l'elemento della lista
var debug=false,
timerPartenza;
function caricaLista(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,useSubmit) {
caricaListaMono(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,useSubmit,false);
}
function caricaListaM(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,useSubmit) {
caricaListaMono(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,useSubmit,true);
}
////////////////////////////////////////////////
//sendAjaxGetLista
//NNNBB il postProcess in questo caso è il classico
//onclick per gestire l'elemento unico (useMon=true su
//caricalistaxxx )
///////////////////////////////////////////////
function sendAjaxGetLista(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
if(!isListVisible(divLista))
{
showList(divLista);
//metto la gif
//elemento.innerHTML="Ricerca in corso ....."+"
";
elemento.innerHTML="Ricerca in corso .....";
//
}
// 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.
";
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.
" +
"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;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//utilizzare caricaLista(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,true/false,true/false)
function caricaListaMono(svltRequest,searchTxt,divLista,RI,theEvent,nChar,nextField,useSubmit,useMono) {
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//vediamo che dobbiamo fare
var evtKey=theEvent.keyCode,
field=theEvent.target.id;
//alert(evtKey);
//40 basso 13 invio 9 tab indietro, 16 ctrl, 111 f1 -->122 f12 , 27 esc
//mac 224 tasto cmd(mela) 0=cmd+tab
if(evtKey==224 ||evtKey==0 ||evtKey==9 ||evtKey==16 ||evtKey==17 ||evtKey==111||(evtKey>=113 && evtKey<=122 ))
{
//facciamo nulla
return;
}
else if(evtKey==27)
{
escapeKey(divLista)
}
if (evtKey==13)
{
//se ho la lista attiva perndo il primo e vado al next field
//altrimenti vado al next field
var contenuto = "";
//divlista.html è sempre !=!!
if ($("#"+divLista).html() != "")
{
contenuto = $("#"+divLista).find("#stRow").html().replace("", "").replace("", "").replace("
","");
}
if(isListVisible(divLista) && contenuto.trim().length > 0)
{
$("#" + searchTxt).removeClass("ajstNoDb");
var sk= Ab.prendiElementoDaId(divLista+"_1");
sk.onclick();
}
else
{
if(useSubmit==true)
{
submitForm(theEvent);
}
else
{
if(nextField!="")
{
//faccio il next focus o
//eseguo lo script
postCr(nextField);
}
}
//if($("#"+divLista).length == 0)
if(contenuto.trim().length == 0)
{
//campo non nel db
if($("#" + searchTxt).attr("enablenodb")=="true")
{//alert('pio');
if(isListVisible(divLista)){
$("#" + searchTxt).addClass("ajstNoDb");
//cancello solo l'id
//ma dovrei cancellare tutto fuori che searchtext!!!!
resetId(RI);
hideList(divLista);
}
}
else
{
if(isListVisible(divLista)){
//$("#" + searchTxt).val("");
resetAllRI(RI);
hideList(divLista);
}
}
}
}
}
else if (evtKey==40)
{
//freccia giu' --> vado al primo elemento
if(isListVisible(divLista))
{
selectTElement(divLista+"_"+1);
Ab.prendiElementoDaId(divLista+"_1").focus();
}
}
else if (evtKey==112)
{
if ($('[nextField="' + field + '"]').val() != undefined)
{
$('[nextField="' + field + '"]').focus();
}
else
{
$('[name="'+Ab.rendiPrevField(field)+'"]').focus();
}
}
else
{
if(timerPartenza){
clearTimeout(timerPartenza);
timerPartenza = null;
}
//resetto l'id
//resetId(RI);
//if(!isListVisible(divLista))
//alert(evtKey);
var searchTxtElement=Ab.prendiElementoDaId(searchTxt);
if(searchTxtElement.value.length==0)
resetId(RI);
if(searchTxtElement.value.length>=nChar)
{
timerPartenza = setTimeout(function()
{
//inizio ricerca tramite ajax
if (svltRequest.charAt(0)=="/")
{//path assoluto
svltRequest=webApp+svltRequest;
}
//non utilizzo NSF ma lo gestisco da qui
if(nextField=="")
nextField=searchTxt;
//devo gestiore il % e sostituirlo con %25
var st=searchTxtElement.value;
st=st.replace('%','%25');
////////////////////////////////////////////////////////////////////////////////////77
svltRequest=svltRequest+st+"&cmd=ajSt&RI="+RI+"&nextField="+nextField+"&divList="+divLista;
//alert(svltRequest);
//request ajax
//preparo prima il postProcess
if(useMono)
{
postProcess=function()
{
//automazione mono record
if(Ab.prendiElementoDaId(divLista+"_tnr").value==1)
{
Ab.prendiElementoDaId(divLista+"_1").onclick();
}
};
}
else{
postProcess=function(){};
}
Ab.disabledEventPropagation(theEvent);
sendAjaxGetLista(svltRequest,divLista,postProcess);
//automazione 1 record
}, 500);
}
}
}
//utilizzare caricaLista(svltRequest,searchTxt,divLista,RI,theEvent,nextField,true/false)
// faccio la ricerca solo con il submit.
//Il submit nei parametri mi identifica se voglio lanciare il sumbit form
function caricaListaS(svltRequest,searchTxt,divLista,RI,theEvent,nextField,useSubmit)
{
caricaListaSMono(svltRequest,searchTxt,divLista,RI,theEvent,nextField,useSubmit,false);
}
function caricaListaSM(svltRequest,searchTxt,divLista,RI,theEvent,nextField,useSubmit)
{
caricaListaSMono(svltRequest,searchTxt,divLista,RI,theEvent,nextField,useSubmit,true);
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//utilizzare caricaLista(svltRequest,searchTxt,divLista,RI,theEvent,nextField,true/false,true/false)
// faccio la ricerca solo con il submit.
//paramtro useMono per automazione ricerca primo elemento automatica
//Il submit nei parametri mi identifica se voglio lanciare il sumbit form
function caricaListaSMono(svltRequest,searchTxt,divLista,RI,theEvent,nextField,useSubmit,useMono)
{
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// console.log("caricaListaSMono");
var nChar=1;
//vediamo che dobbiamo fare
evtKey=theEvent.keyCode;
//alert(evtKey);
//40 basso 13 invio 9 tab indietro, 16 ctrl, 111 f1 -->122 f12 , 27 esc
//mac 224 tasto cmd(mela) 0=cmd+tab
if(evtKey==224 ||evtKey==0 ||evtKey==9 ||evtKey==16 ||evtKey==17 ||(evtKey>=111 && evtKey<=122 ))
{
//facciamo nulla
return;
}
else if(evtKey==27 )
{ //esc
escapeKey(divLista)
}
//else if(evtKey==8 ||evtKey==46 ||evtKey==37 ||evtKey==39)
else if(evtKey!=13 && evtKey!=40)
{// 8delIndietro 46canc 37frecciasx 39frecciadx
//cambiato in qualsiasi tasto fuorche i precedenti o invio
//mi ripreparo per una nuova ricerca
hideList(divLista);
resetId(RI);
return;
}
if (evtKey==13)
{
//se ho la lista attiva perndo il primo e vado al next field
//altrimenti vado al next field
//in questo caso vuol dire che sono al secondo invio
if(isListVisible(divLista))
{
//se non ci sono elementi, sto inserendo qualcosa che non è nel db
var contenuto = "";
//divLista lenght non è mai !=0
//if ($("#"+divLista).html() != "")
{
contenuto = $("#"+divLista).find("#stRow").html().replace("", "").replace("", "").replace("","");
}
if(contenuto.trim().length == 0)
{
//campo non nel db
if($("#" + searchTxt).attr("enablenodb")=="true")
{//alert('pio2');
if(isListVisible(divLista)){
$("#" + searchTxt).addClass("ajstNoDb");
//cancello solo l'id
//ma dovrei cancellare tutto fuori che searchtext!!!!
resetId(RI);
hideList(divLista);
}
postCr(nextField);
}
else
{
if(isListVisible(divLista)){
resetAllRI(RI);
//$("#" + searchTxt).val("");
hideList(divLista);
}
}
}
else
{
//prendo il primo elemento e faccio click
var sk= Ab.prendiElementoDaId(divLista+"_1");
sk.onclick();
}
}
else
{ //alert(getSTId(RI).value);
//dovrei fare il submit se l'id non è nullo
if(getSTId(RI).value=="")
{
//faccio la request
var searchTxtElement=Ab.prendiElementoDaId(searchTxt);
if(searchTxtElement.value.length>=nChar)
{
//inizio ricerca tramite ajax
if (svltRequest.charAt(0)=="/")
{//path assoluto
svltRequest=webApp+svltRequest;
}
//non utilizzo NSF ma lo gestisco da qui
if(nextField=="")
nextField=searchTxt;
////////////////////////////////////////////////////////////////////////////////////77
//devo gestiore il % e sostituirlo con %25
var st=searchTxtElement.value;
st=st.replace('%','%25');
svltRequest=svltRequest+st+"&cmd=ajSt&RI="+RI+"&nextField="+nextField+"&divList="+divLista;
//alert(svltRequest);
//request ajax
//preparo prima il postProcess
if(useMono)
{
postProcess=function()
{
//automazione mono record
if(Ab.prendiElementoDaId(divLista+"_tnr").value==1)
{
Ab.prendiElementoDaId(divLista+"_1").onclick();
}
};
}
else{
postProcess=function(){};
}
Ab.disabledEventPropagation(theEvent);
sendAjaxGetLista(svltRequest,divLista,postProcess);
}
}else
{
//flusso standard
if(useSubmit==true)
{
Ab.submitForm(theEvent);
}
else
{
if(nextField!="")
{
//faccio il next focus o
//eseguo lo script
postCr(nextField);
}
}
}
}
}
else if (evtKey==40)
{
//freccia giu' --> vado al primo elemento
if(isListVisible(divLista))
{
selectTElement(divLista+"_"+1);
Ab.prendiElementoDaId(divLista+"_1").focus();
}
}
else
{
//resetto l'id
//mi serve per la ricerca con submit
resetId(RI);
//if(!isListVisible(divLista))
//alert(evtKey);
//in questo caso non faccio la richiesta perche' non ho premuto invio
}
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function getSTId(RI)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
//resetto l'id che deve essere il primo della RI
if(RI!="")
{
//returnItem è del tipo nomeModulo.nomeCampo
nomeModulo=RI.substring(0,RI.indexOf('.'));
nomeCampo=RI.substring(RI.indexOf('.')+1,RI.indexOf(','));
//if(debug==true){
// alert("nomeCampo:"+nomeCampo+" modulo: "+nomeModulo);
//}
return document[nomeModulo][nomeCampo];
//prendiElementoDaId(nomeCampo).value="xx";
}
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function resetAllRI(RI)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
if(RI!="")
{
var arr = RI.split(",");
var row;
for (i=0; i<(arr.length); i++)
{
row=arr[i].split(".");
nomeModulo=row[0];
nomeCampo=row[1];
$("#"+nomeModulo+" #"+nomeCampo).val("");
//(document[nomeModulo][nomeCampo]).value="";
}
}
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function resetId(RI)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
//resetto l'id che deve essere il primo della RI
getSTId(RI).value="";
/*
if(RI!="")
{
//returnItem è del tipo nomeModulo.nomeCampo
nomeModulo=RI.substring(0,RI.indexOf('.'));
nomeCampo=RI.substring(RI.indexOf('.')+1,RI.indexOf(','));
//if(debug==true){
// alert("nomeCampo:"+nomeCampo+" modulo: "+nomeModulo);
//}
document[nomeModulo][nomeCampo].value="";
//prendiElementoDaId(nomeCampo).value="xx";
}*/
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function selectAjKey()
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
//in questo caso mi aspetto tante coppie del tipo valore,modulo.campo
//07-02-2014 non passo mai un postprocess!!!
// i valori in più sono 2!!!
//il primo valore in piu se ha le parentesi è una funzione da eseguire
//altrimenti è il campo su cui eseguire il nextField
//il secondo valore la div lista che mi serve per
//nasconderla
var returnItemKey,returnItemDesc,nomeModulo,nomeCampo,args=selectAjKey.arguments;
var i;
for (i=0; i<(args.length-2); i+=2)
{
returnItemValue=args[i];
returnItemField=args[i+1];
//debug
//alert("riv: "+returnItemValue+" rif: "+returnItemField);
if(returnItemField!="")
{
//returnItem è del tipo nomeModulo.nomeCampo
nomeModulo=returnItemField.substring(0,returnItemField.indexOf('.'));
nomeCampo=returnItemField.substring(returnItemField.indexOf('.')+1,returnItemField.length);
if(debug==true)
alert(nomeCampo+": "+returnItemValue);
// self.opener.document[nomeModulo][nomeCampo].value=returnItemValue;
if (!document[nomeModulo][nomeCampo])
{
alert("Impossibile recuperare il campo: " + nomeCampo + " nel modulo: " + nomeModulo);
}
else
{
document[nomeModulo][nomeCampo].value=returnItemValue;
}
// document[nomeModulo][nomeCampo].value=returnItemValue;
}
}
//qui fare dei test chiamando uno script
//gestione focus
if(i1)
newId=id-1;
// else
// alert('siamo arrivati in cima');
}
//alert(newId);
unselectTElement(divLista+"_"+id);
selectTElement(divLista+"_"+newId);
Ab.prendiElementoDaId(divLista+"_"+newId).focus();
}
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function hideList(theDivList)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
//oltre a nasconderla, la svuoto anche....
//questo perchè mi introduce un numero di campi in più
//dipendente dalla fetch che possono darmi noia quando
//ad esempio devo trovarmi il campo successivo
//a quello da cui parte la lista
/* {
$("div#"+theDivList).hide(100);
$("div#"+theDivList).html("");
}
else
{
var theDivListStyle= prendiElementoDaId(theDivList).style;
theDivListStyle.visibility = "hidden";
$("div#"+theDivList).html("");
}*/
//var theDivListStyle= prendiElementoDaId(theDivList).style;
//theDivListStyle.visibility = "hidden";
$("div#"+theDivList).parent().css("visibility","hidden");
//console.log($("div#"+theDivList).parent().attr("class"));
$("div#"+theDivList).html("");
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function showList(theDivList)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
$("div#"+theDivList).parent().css("visibility","visible");
$("div#"+theDivList).css("display","block");
/*if (ns4 || mz7 || chro)
{
theDivListStyle.visibility = "visible";
$("div#"+theDivList).show(1);
}
else
{
theDivListStyle.visibility = "visible";
//theDivListStyle.display = "block";
}*/
/*var theDivListStyle= prendiElementoDaId(theDivList).style;
theDivListStyle.visibility = "visible";
theDivListStyle.display = "block"; */
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
function isListVisible(theDivList)
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
{
/*if (ns4 || mz7 || chro)
{
if($("div#"+theDivList).is(':visible'))
return true;
else
return false;
}
else
{
var theDivListStyle= prendiElementoDaId(theDivList).style;
if(theDivListStyle.visibility == "hidden")
return false;
else
return true;
}*/
if($("div#"+theDivList).css("visibility")=="hidden")
return false;
else
return true;
/* var theDivListStyle= prendiElementoDaId(theDivList).style;
if(theDivListStyle.visibility == "hidden")
return false;
else
return true;*/
}
//////////////////////////////////////////////////
// postCr: Dopo il Cr (key 13) faccio il setfocus oppure
// eseguo una funzione javascript
////////////////////////////////////////////////
function postCr(pproc)
{
var idx1=pproc.indexOf("(");
if(idx1>0)
{
Ab.executeProcess(pproc, "");
}
else
{
Ab.setFocus(pproc);
}
}
/////////////////////////////////////////////
/////////////////////////////////////////////
// cosa succede se premo escape (27) sul campo
/////////////////////////////////////////////
/////////////////////////////////////////////
function escapeKey(divLista)
{
//esc
if( $("div#"+divLista).parent().css("visibility")=="hidden")
{
//gestione comando per tornare indietro
if($("#pageType").val()=="D"){
if(typeof backEscape == 'function')
{
backEscape();
}
else
{
//Ab.dashboard();
}
}
else if($("#pageType").val()=="R"){
if(typeof backEscapeCR == 'function')
{
backEscapeCR();
}
else
{
//Ab.dashboard();
}
}
}
else
{
hideList(divLista);
return;
}
}