//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 ....."+"Ricerca in corso"; elemento.innerHTML="Ricerca in corso ....."; //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; } }