Premessa
Avendo visto nel capitolo precedente come collegare la porzione del Controller che deve gestire l'Interfaccia Grafica della nostra web application con la porzione che implementa i Business Components lato server, concentriamo ora la nostra attenzione sulla costruzione della GUI.
La Graphical User Interface e' probabilmente la parte della nostra web application piu' critica, poiche' e' cio' che l'utente finale utilizza direttamente e che quindi e' piu' soggetta a critiche e a richieste di modifica.
Se la nostra applicazione deve essere utilizzata da molti utenti prepariamoci al fatto che probabilmente la GUI non andra' bene a tutti gli utenti. Ci sara' sempre qualcuno che chiedera' un comportamento particolare personalizzato per qualche componente visuale. ;)
E prepariamoci anche al fatto che ci sara' sempre un utente che - non si sa mai come ci riescano - riuscira' a scovare il piu' piccolo difetto di funzionamento assolutamente impossibile da prevedere in anticipo.
Con GUI sto intendendo non solo i componenti visuali che vengono mostrati sulla finestra del nostro browser, le caselle di testo, i menu a tendina, le tabelle, le immagini e cosi' via, ma anche tutta la logica del controller sottostante che deve gestire l'interazione con l'utente, ovvero cosa debba succedere quando un utente clicca un bottone oppure seleziona una voce da un combobox.
Quindi tutta quella parte di codice javascript che nella nostra applicazione web definisce i vari eventhandler da collegare agli eventi gestiti dal browser in collegamento agli oggetti mostrati.
Progettazione web tradizionale
Nella creazione di interfacce grafiche web tradizionali si utilizzano gli oggetti visuali nel codice HTML collegando gli eventhandler agli attributi-eventi all'interno dei tag:
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
<td>
<a href="#" target="_blank">
<img src="./image/info_out.gif"
onmouseout="javascript:cambiaImmagine(this);"
onmouseover="this.src='./image/info_on.gif'"
width="27"
height="27"
alt=""
border="0">
</a>
<img src="./image/faq_out.gif"
onmouseout="javascript:cambiaImmagine(this);"
onmouseover="this.src='./image/faq_On.gif'"
width="27"
height="28"
alt=""
border="0">
<A href="mailto:PERSEO_USER_SUPPORT@eni.it">
<img src="./image/mail_out.gif"
onmouseout="javascript:cambiaImmagine(this);"
onmouseover="this.src='./image/mailOn.gif'"
width="30"
height="28"
alt=""
border="0">
</a>
</td>
</tr>
</table>
Questo approccio per costruire una interfaccia grafica ha degli svantaggi evidenti:
- Occorre definire gli oggetti usando il codice HTML
- Occorre definire gli eventhandler usando codice Javascript
- Occorre definire il layout degli oggetti usando i fogli di stile - CSS
- Bisogna collegare gli eventhandler agli eventi all'interno dei tag HTML
Se poi si ha l'esigenza di modificare in runtime la forma di un oggetto, o il contenuto, o la disposizione nel layout della pagina, o il comportamento in risposta ad un evento, in reazione ad una richiesta asincrona al server, si possono seguire almeno due strade che pero' risultano alla lunga abbastanza tortuose se le modifiche non sono minime:
- ricarico dal server la porzione di codice html che modifica l'oggetto preesistente avendo cura di mantenere i collegamenti con gli eventhandler richiamati al suo interno.
- agisco con javascript sul Document Object Model per modificare l'oggetto riflesso nell'albero del DOM in memoria per modificare le caratteristiche visuali o comportamentali da variare
Svantaggi
Nella prima delle due opzioni si avra' una proliferazione sul server di snippet html per implementare le varie versioni modificate degli oggetti (o di gruppi di oggetti), mentre la seconda opzione comporta un appesantimento nel codice javascript con la gestione di numerose operazioni di manipolazione del DOM.
Vantaggi
La prima opzione sicuramente offre una elevata velocita' di esecuzione dovendo caricare dal server pochi bytes di codice html in sostituzione di quello repcedente, la seconda invece permette una gestione unificata e centralizzata all'interno del controller lato client.
A questo punto ci chiediamo se sia possibile avere una gestione unificata a livello del nostro controller javascript ma che non ci obblighi a scrivere troppo codice per modificare le caratteristiche dei nostri componenti visuali.
Soluzione
Ci vengono in soccorso percio' i Frameworks basati sui componenti lato client menzionati nel capitolo precedente: ExtJs ed ActiveWidgets. In questo modo potremo definire la nostra Interfaccia Grafica direttamente in Javascript, scavalcando quasi completamente il codice HTML, avendo in aggiunta a disposizione un set esteso di oggetti visuali con la possibilita' di poter scegliere diversi stili per il look-and-feel ed un insieme di API per la gestione di tutte le caratteistiche visuali e comportamentali.
Oltre agli oggetti classici solitamente questi framework forniscono anche oggetti visuali complessi preconfezionati, quali possono essere ad esempio i Treemenu, le Grid Editabili, i Canvas, le Window, gli Accordion e tanti altri.
Noi vedremo alcuni esempi di questi due framework, lasciando ai loro siti ufficiali una spiegazione approfondita ed esaustiva relativamente al loro utilizzo.
ActiveWidgets
Come riportato anche sul sito ufficiale, si tratta di una Libreria di Componenti Javascript per semplificare lo sviluppo di applicazioni web (e specialmente quelle Ajax) e renderle piu' produttive, fornendo un set di componenti visuali di uso comune ed un modello di programmazione semplice degli stessi.
ActiveWidgets e' indipendete dal web server e puo' funzionare in collegamento con qualsiasi ambiente server-side o con pagine html statiche. I componenti visuali vengono generati in runtime dalla libreria javascript che agisce da generatore di codice html direttamente sul client.
Durante il caricamento della pagina il browser esegue gli script javascript creando i componenti visuali, li configura, e quindi inserisce il codice html generato da ogni componente al posto giusto all'interno di una pagina html molto semplice che agisce da contenitore globale per il trasferimento degli script dal server sul client.
Da questo punto il codice html del componente viene generato e connesso al frammento della pagina html contenitore. Il componente quindi gestisce le interazioni con l'utente finale e aggiorna l'html in accordo con le variazioni dei dati , fornendo una semplice API per la manipolazione del contenuto, comportamento e stile visuale dei componenti.
Tutto cio' avviene lato client senza dover contattare il web server. In questo modello il server viene coinvolto solo per la gestione dei dati mentre l'interfaccia visuale e l'interazione con l'utente diventano responsabilita' del client.
Esempio 1
Vediamo ora alcuni esempi di utilizzo di questa libreria:
<script>
// create ActiveWidgets component
var obj = new AW.UI.Button;
// set the display text
obj.setControlText("Click me");
// assign click event handler
obj.onControlClicked = function(){
this.setControlText("Hello World!");
};
// add component to the page
document.write(obj);
</script>
In questo esempio si crea un componente "Button" con un testo iniziale "Click me" ed un eventhandler associato ad un evento interno del componente onControlClicked che fa cambiare il testo associato al bottone.
Per aggiungere effettivamente il componente alla pagina web si deve utilizzare il metodo window.write(obj) cui viene passato l'oggetto da renderizzare.
Esempio 2
Vediamo ora un secondo esempio, leggermente piu' complesso:
<script>
var myCells = [
["MSFT","Microsoft Corporation", "314,571.156"],
["ORCL", "Oracle Corporation", "62,615.266"]
];
var myHeaders = ["Ticker", "Company Name", "Market Cap."];
// create grid object
var obj = new AW.UI.Grid;
// assign cells and headers text
obj.setCellText(myCells);
obj.setHeaderText(myHeaders);
// set number of columns/rows
obj.setColumnCount(3);
obj.setRowCount(2);
// write grid to the page
document.write(obj);
</script>
In questo caso costruiamo una tabella-Grid con tre colonne, una riga di header e due righe di contenuto. Come possiamo vedere dal codice, a parte conoscere la sintassi esatta da utilizzare nel modello di programmazione fornito, la logica di costruzione degli elementi che compongono il nostro oggetto e' molto lineare nella sua semplicita'.
Esempio 3
<script>
var btn = new AW.UI.Button;
btn.setId("btn");
btn.setControlText("Change text");
btn.onClick = function(){
txt.setControlText("Hello World!");
};
var txt = new AW.UI.Input;
txt.setControlText("Input");
txt.setControlImage("search");
document.write(btn);
document.write(txt);
</script>
In questo esempio definiamo un bottone ed un textinput (casella di testo) con un testo di default "Input". Associamo anche all'evento onClick del bottone un eventhandler che reimposta il valore del testo mostrato nell'oggetto textinput. Poi colleghiamo i due componenti alla pagina html globale.
Come si puo' vedere si costruisce in modo molto veloce, intuitivo e semplice una GUI e il relativo Controllore lato client all'interno del codice Javascript che puo' anche essere messo in un file .js a se stante separandolo dal codice html del contenitore esterno globale.
Se dovessimo caricare dati da remoto con una richiesta ajax sarebbe sufficiente includere una chiamata al metodo executeRequest() come visto nei capitoli precedenti all'interno dell'eventhandler opportuno in risposta all'attivazione di una qualche interazione con l'utente.
Riassunto
Quanto mostrato intende essere un semplice spunto di utilizzo di questo framework, per mostrare le potenzialita' offerte allo sviluppatore di web applications ajax.
E' anche possibile racchiudere poi i metodi base forniti dalle API di ActiveWidgets in wrapper personalizzati per semplificare la costruzione dei vari oggetti , per integrarle magari con le nostre API viste in precedenza.
Si possono cosi' implementare interfacce grafiche complesse molto reattive che sicuramente possono incontrare il gradimento anche degli utenti piu' esigenti.
Come esempio riporto un esempio di codice che implementa un pannello con 4 tab con all'interno di ciascuno delle pseudo-griglie composte dinamicamente da textinput non modificabili, combobox e textinput modificabili recuperando i valori di inizializzazione dal database server effettuando le opportune chiamate verso il controllore lato server come visto nel capitolo precedente.
Si tratta di un servizio complesso utile per mostrare fino in fondo cosa si puo' fare usando questa libreria
var counter=0;
var actualStatus="";
bMenuOnClick = function(){window.close();};
bAlertOnClick = function(){alert('Prova:'+this.getId());};
bChangeMacroStatus = function(){confirmDialog('Warning','Vuoi cambiare lo stato di abilitazione della Macro? ',handleChangeStatus)};
findStatus = function(){
try{
myp.init();
myp.addPar("101");
exQuery("MacroDPDV","getActualStatus",dispActualStatus);
}catch(err){
errmsgxxx('Preparing getActualStatus',err.message);
}
function dispActualStatus(){
var d=this.req.responseText;
var j=d.parseJSON();
try{
if(controlReceivedData(dummyGrid,d,false,true,"No Record To Edit")){
lStatus.setControlText("Stato attuale della Macro: "+j.r[0].VALORE);
this.req=null;
}
}catch(err){
errmsgxxx('Function dispNPWIP',d+";"+err.message);
}
return "Stato attuale della Macro: "+actualStatus;
};
return "Stato attuale della Macro: "+actualStatus;
};
handleChangeStatus=function(btn){
if(btn=="yes"){
try{
myp.init();
exQuery("MacroDPDV","changeStatus",dispChangeStatus);
}catch(err){
errmsgxxx('Preparing changeStatus',err.message);
}
function dispChangeStatus(){
var d=this.req.responseText;
retmsg(d);
findStatus();
this.req=null;
};
}
};
var box =cOb("f","box");
var tabs =cOb("t","tabs");tabs.setItemText(["Valore DP/DV per Campo", "Parametri Globali", "Provenienza Dati per Campo", "Provenienza Dati per Pozzo"]);tabs.setItemCount(4);tabs.setSelectedItems([0]);output+=tabs;
var frame1 =cOb("f","frame1");
var frame2 =cOb("f","frame2");
var g_title =cOb("g","g_title",'',"PERSEO - Impostazione parametri MACRO DP/DV");
var bMenu =cOb("b","bMenu",'',"Close",'','',bMenuOnClick);
var bChange =cOb("b","bChange",'',"Change",'','',bChangeMacroStatus);
var lStatus =cOb("l","lStatus",'',findStatus);
dw(output);
var btna=cOb("b","btna",'',"btn1",'','',bAlertOnClick);
var btnb=cOb("b","btnb",'',"btn2",'','',bAlertOnClick);
var btnc=cOb("b","btnc",'',"btn3",'','',bAlertOnClick);
var dummyGrid =new AW.UI.Grid; dummyGrid.setId("dummyGrid");
var box2 =new AW.HTML.DIV; box2.setId("box2");
var bSave =new AW.UI.Button;bSave.setId("bSave");bSave.setControlText("Save");
var lCountry =new AW.UI.Label; lCountry.setId("lCountry");lCountry.setControlText("Country:");
var lCountryVal=new AW.UI.Label; lCountryVal.setId("lCountryVal");lCountryVal.setControlText("...loading value...");
var h1 =new AW.UI.Input; h1.setId("h1");h1.setControlText("CODICE CAMPO");h1.setStyle("background","lightblue");h1.setStyle("color","azure");h1.getContent('box/text').setAttribute('readonly',true);
var h2 =new AW.UI.Input; h2.setId("h2");h2.setStyle("background","lightblue");h2.setControlText("LAST UPDATE");h2.getContent('box/text').setAttribute('readonly',true);
var h3 =new AW.UI.Input; h3.setId("h3");h3.setStyle("background","lavender");h3.setControlText("DP_DV_CAMPO");h3.getContent('box/text').setAttribute('readonly',true);
var h4 =new AW.UI.Input; h4.setId("h4");h4.setStyle("background","lavender");h4.setControlText("NOTE");h4.getContent('box/text').setAttribute('readonly',true);
var h5 =new AW.UI.Input; h5.setId("h5");h5.setStyle("background","lavender");h5.setControlText("VALUE");h5.getContent('box/text').setAttribute('readonly',true);
var h6 =new AW.UI.Input; h6.setId("h6");h6.setStyle("background","lightblue");h6.setControlText("PREV VALUE");h6.getContent('box/text').setAttribute('readonly',true);
var h7 =new AW.UI.Input; h7.setId("h7");h7.setStyle("background","lightblue");h7.setControlText("");h7.getContent('box/text').setAttribute('readonly',true);
var result="ok";
var left=0;var myData=new Array();var globOut="";var bufferx="";var buffer="";var vdate="";bufferx=bSave+h1+h2+h3+h4;
var initPageT1=(function(){
buffer="";
try{
myp.init();
myp.addPar("101");
exQuery("MacroDPDV","getCampi",dispNP);
}catch(err){
errmsgxxx('Preparing getNPWIP',err.message);
}
function dispNP(){
var d=this.req.responseText;
try{
if(controlReceivedData(dummyGrid,d,false,true,"No Record To Edit")){
buildGrid(d);
this.req=null;
}
}catch(err){
errmsgxxx('Function dispNPWIP',d+";"+err.message);
}
};
});
var buildGrid=(function(res){
var d=res.parseJSON();
var top=0;
var output="";
var len=d.count;
for(i=0;i<len;i++){
myData[i]=new Array();
myData[i][0]={idx:"col0"+i,valx:d.r[i].C_CAMPO};
}
lCountryVal.setControlText(d.r[0].C_CAMPO);
for(i=0;i<len;i++){
var el1=buildCol1(i,top,d,myData);
top+=19;
}
getId('ppp').innerHTML=buffer;
setTimeout('endwait()',1);
});
var buildCol1=(function(id,top,d,myData){
var dim=184;
myData[i][1]={idx:"col1"+id,valx:d.r[id].C_CAMPO};
var el=new AW.UI.Input;
el.setId("col1"+id);
el.setControlText(d.r[id].C_CAMPO+" - "+d.r[id].N_CMP);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el2=buildCol2(id,top,dim,d,myData);
return true;
});
var buildCol2=(function(id,top,dim,d,myData){
left+=dim-1;
var dim=150;
myData[i][2]={idx:"col2"+id,valx:d.r[id].DATAINS};
var el=new AW.UI.Input;
el.setId("col2"+id);
el.setControlText(d.r[id].DATAINS);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el4=buildCol4(id,top,dim-1,d,myData);
return true;
});
var buildCol4=(function(id,top,dim,d,myData){
left+=dim;
var dim=179;
myData[i][3]={idx:"col3"+id,valx:d.r[id].DP_DV_CAMPO};
var el=new AW.UI.Input;
el.setId("col3"+id);
el.setControlText(d.r[id].DP_DV_CAMPO);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',false);
el.onControlValidating = function(txt) {
if(isNaN(parseInt(txt)) parseInt(txt)<=0){
errmsgxxx('Validating','Value must be a number >=0');
el.setStyle("background","#ffbfbf");
result="ko";
return;
}else{
el.setStyle("background","#fff");
result="ok";
}
insertVal(el.getId(),txt);
}
buffer+=el;
var el5=buildCol5(id,top,dim-1,d,myData);
return true;
});
var buildCol5=(function(id,top,dim,d,myData){
left+=dim;
var dim=321;
myData[i][4]={idx:"col4"+id,valx:d.r[id].NOTE};
var el=new AW.UI.Input;
el.setId("col4"+id);
el.setControlText(d.r[id].NOTE);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',false);
el.onControlValidating = function(txt) {
el.setStyle("background","#fff");
result="ok";
insertVal(el.getId(),txt);
}
buffer+=el;
left=0;
return true;
});
function initCmb(el,dim,subsid,dd,id){
var obj=el;
var cl="ew_uman";
var meth="getWResJSON";
var dim=dim;
var op1=false;
var dbg=false;
var sync=true;
myp.init();
myp.addPar(subsid);
var vars="";
function val(x){
return "&value"+x+"=";
};
for(xx=0;xx<myp.data.length;xx++){
vars+=val(xx+1)+myp.data[xx].toString();
}
var strParamsx=bcNm+"valGE"+bcFx+"getMastroJSON"+vars;
dbg==true ? alert(strParamsx) : null;
var loaderx=new net.ContentLoader(lib+strParamsx,handler,null,"POST",'','','','',sync);
function handler(){
try{
var dati=this.req.responseText;
var d=dati.parseJSON();
if(dbg){alert("debug: "+dati);}
if(d=="undefined" d==undefined){
cE(this.req.responseText,"dispose "+obj.getId());
}
}catch(err){
alert(err.message+" -- "+this.req.responseText);
var d=[1];
}
setCombo(el,d,dim);
if(dd.count==1){
setComboValue(obj,"first");
}else{
setComboText(obj,dd.r[id].MASTRO_NM);
}
obj.setControlDisabled(false);
};
}
function checkNull(txt){if(txt=="" txt ==undefined txt=="undefined"){return "null";}else{return txt;}}
function creaOutput(){globOut="";var l=myData.length;for(r=0;r<l;r++){globOut+=checkNull(myData[r][0].valx)+";";globOut+=checkNull(myData[r][3].valx)+";";globOut+=checkNull(myData[r][4].valx)+";";}alert(globOut);}
function insertVal(id,txt){myData[id.substr(4,id.length-4)][(parseInt(id.substr(3,1)))].valx=txt;}
function portaDatiSulDB(){if(result=="ok"){try{myp.init();myp.addPar(globOut);exQuery("valGE","saveUpdates",disp_portaDatiSulDB,true);}catch(err){errmsgxxx('Preparing portaDatiSulDB',err.message);}function disp_portaDatiSulDB(){try{var d=this.req.responseText;var j=d.parseJSON();retmsg(d);}catch(err){errmsgxxx('Function portaDatiSulDB',err.message);}}}else{errmsgxxx('Saving','Some negative values...cannot save');}}
var h21 = new AW.UI.Input; h21.setId("h21"); h21.setControlText("");
var h22 = new AW.UI.Input; h22.setId("h22"); h22.setControlText("");
var l21 = new AW.UI.Label; l21.setId("l21"); l21.setControlText("Durata Minima della zona di linearita'"); l21.setStyle("color","darkblue");
var l22 = new AW.UI.Label; l22.setId("l22"); l22.setControlText("Percentuale di soglia degli spike"); l22.setStyle("color","darkblue");
var l23 = new AW.UI.Label; l23.setId("l23"); l23.setControlText("h."); l23.setStyle("color","darkblue");
var l24 = new AW.UI.Label; l24.setId("l24"); l24.setControlText("%"); l24.setStyle("color","darkblue");
var buffery="";
buffery=bSave+l21+l22+l23+l24;
var initPageT2=(function(){
buffer="";
try{
myp.init();
myp.addPar("101");
exQuery("MacroDPDV","getGlobalPars",dispGlobalPars);
}catch(err){
errmsgxxx('Preparing getNPWIP',err.message);
}
function dispGlobalPars(){
var d=this.req.responseText;
var j=d.parseJSON();
try{
if(controlReceivedData(dummyGrid,d,false,true,"No Record To Edit")){
h21.setControlText(j.r[0].LINEARITY);
h22.setControlText(j.r[0].SPIKE);
this.req=null;
}
}catch(err){
errmsgxxx('Function dispNPWIP',d+";"+err.message);
}
};
});
var h31a =new AW.UI.Input; h31a.setId("h31a");h31a.setControlText("CODICE e NOME CAMPO"); h31a.setStyle("background","lightblue");h31a.setStyle("color","azure"); h31a.getContent('box/text').setAttribute('readonly',true);
var h32a =new AW.UI.Input; h32a.setId("h32a");h32a.setControlText("NOTE"); h32a.setStyle("background","lightblue");h32a.getContent('box/text').setAttribute('readonly',true);
var h33a =new AW.UI.Input; h33a.setId("h33a");h33a.setControlText("SOURCE STHP"); h33a.setStyle("background","lavender"); h33a.getContent('box/text').setAttribute('readonly',true);
var h34a =new AW.UI.Input; h34a.setId("h34a");h34a.setControlText(""); h34a.setStyle("background","lavender"); h34a.getContent('box/text').setAttribute('readonly',true);
var bufferw="";
bufferw=bSave+h31a+h32a+h33a;
var initPageT3a=(function(){
buffer="";
try{
myp.init();
myp.addPar("101");
exQuery("MacroDPDV","getFieldSthp",dispNPa);
}catch(err){
errmsgxxx('Preparing getFieldSthp',err.message);
}
function dispNPa(){
var d=this.req.responseText;
try{
if(controlReceivedData(dummyGrid,d,false,true,"No Record To Edit")){
buildGrid3a(d);
this.req=null;
}
}catch(err){
errmsgxxx('Function dispNPa',d+";"+err.message);
}
};
});
var buildGrid3a=(function(res){
var d=res.parseJSON();
var top=0;
var output="";
var len=d.count;
for(i=0;i<len;i++){
myData[i]=new Array();
myData[i][0]={idx:"col0"+i,valx:d.r[i].C_CAMPO};
}
lCountryVal.setControlText(d.r[0].C_CAMPO);
for(i=0;i<len;i++){
var el1=buildCol13a(i,top,d,myData);
top+=19;
}
getId('ppp').innerHTML=buffer;
setTimeout('endwait()',1);
});
var buildCol13a=(function(id,top,d,myData){
var dim=284;
myData[i][1]={idx:"col1"+id,valx:d.r[id].C_CAMPO};
var el=new AW.UI.Input;
el.setId("col1"+id);
el.setControlText(d.r[id].C_CAMPO+" - "+d.r[id].N_CMP);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el2=buildCol33a(id,top,dim,d,myData);
return true;
});
var buildCol33a=(function(id,top,dim,d,myData){
left+=dim-1;
var dim=321;
myData[i][2]={idx:"col2"+id,valx:"null"};
var el=new AW.UI.Input;
el.setId("col2"+id);
el.setControlText(d.r[id].CMT);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el4=buildCol43a(id,top,dim-1,d,myData);
return true;
});
var buildCol43a=(function(id,top,dim,d,myData){
left+=dim;
var dim=228;
myData[i][3]={idx:"col3"+id,valx:d.r[id].STHP};
var el=new AW.UI.Combo;
el.setId("col3"+id);
el.setControlText(d.r[id].STHP);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
el.setItemText(["FIELD","WELL","MIXED"]);
el.setItemCount(3);
el.setItemValue(["F","W","X"]);
var popup= el.getPopupTemplate();
popup.setStyle("width",220);
popup.setStyle("height",17*6);
setComboValue(el,d.r[id].STHP);
buffer+=el;
el.onControlValidating = function(txt) {
insertVal3a(el.getId(),el.getItemValue(el.getSelectedItems()));
}
var el5=buildCol53a(id,top,dim-1,d,myData);
return true;
});
var buildCol53a=(function(id,top,dim,d,myData){
left+=dim;
var dim=121;
myData[i][4]={idx:"col4"+id,valx:d.r[id].NOTE};
left=0;
return true;
});
function initCmb3a(el,dim,subsid,dd,id){
var obj=el;
var cl="MacroDPDV";
var meth="getWF";
var dim=dim;
var op1=false;
var dbg=false;
var sync=true;
myp.init();
myp.addPar(subsid);
var vars="";
function val(x){
return "&value"+x+"=";
};
for(xx=0;xx<myp.data.length;xx++){
vars+=val(xx+1)+myp.data[xx].toString();
}
var strParamsx=bcNm+"MacroDPDV"+bcFx+"getWF"+vars;
dbg==true ? alert(strParamsx) : null;
var loaderx=new net.ContentLoader(lib+strParamsx,handler,null,"POST",'','','','',sync);
function handler(){
try{
var dati=this.req.responseText;
var d=dati.parseJSON();
if(dbg){alert("debug: "+dati);}
if(d=="undefined" d==undefined){
cE(this.req.responseText,"dispose "+obj.getId());
}
}catch(err){
alert(err.message+" -- "+this.req.responseText);
var d=[1];
}
setCombo(el,d,dim);
if(dd.count==1){
setComboValue(obj,"first");
}else{
setComboText(obj,dd.r[id].STHP);
}
obj.setControlDisabled(false);
};
}
function insertVal3a(id,txt){myData[id.substr(4,id.length-4)][(parseInt(id.substr(3,1)))].valx=txt;}
function portaDatiSulDB3a(){if(result=="ok"){try{myp.init();myp.addPar(globOut);exQuery("valGE","saveUpdates",disp_portaDatiSulDB,true);}catch(err){errmsgxxx('Preparing portaDatiSulDB',err.message);}function disp_portaDatiSulDB(){try{var d=this.req.responseText;var j=d.parseJSON();retmsg(d);}catch(err){errmsgxxx('Function portaDatiSulDB',err.message);}}}else{errmsgxxx('Saving','Some negative values...cannot save');}}
var h31 =new AW.UI.Input; h31.setId("h31");h31.setControlText("CODICE e NOME CAMPO"); h31.setStyle("background","lightblue");h31.setStyle("color","azure"); h31.getContent('box/text').setAttribute('readonly',true);
var h32 =new AW.UI.Input; h32.setId("h32");h32.setControlText("CODICE e NOME POZZO"); h32.setStyle("background","lightblue");h32.getContent('box/text').setAttribute('readonly',true);
var h33 =new AW.UI.Input; h33.setId("h33");h33.setControlText("SOURCE STHP"); h33.setStyle("background","lavender"); h33.getContent('box/text').setAttribute('readonly',true);
var h34 =new AW.UI.Input; h34.setId("h34");h34.setControlText(""); h34.setStyle("background","lavender"); h34.getContent('box/text').setAttribute('readonly',true);
var bufferz="";
bufferz=bSave+h31+h32+h33;
var initPageT3=(function(){
buffer="";
try{
myp.init();
myp.addPar("101");
exQuery("MacroDPDV","getSthp",dispNP);
}catch(err){
errmsgxxx('Preparing getNPWIP',err.message);
}
function dispNP(){
var d=this.req.responseText;
try{
if(controlReceivedData(dummyGrid,d,false,true,"No Record To Edit")){
buildGrid3(d);
this.req=null;
}
}catch(err){
errmsgxxx('Function dispNPWIP',d+";"+err.message);
}
};
});
var buildGrid3=(function(res){
var d=res.parseJSON();
var top=0;
var output="";
var len=d.count;
for(i=0;i<len;i++){
myData[i]=new Array();
myData[i][0]={idx:"col0"+i,valx:d.r[i].C_POZZO};
}
lCountryVal.setControlText(d.r[0].C_CAMPO);
for(i=0;i<len;i++){
var el1=buildCol13(i,top,d,myData);
top+=19;
}
getId('ppp').innerHTML=buffer;
setTimeout('endwait()',1);
});
var buildCol13=(function(id,top,d,myData){
var dim=284;
myData[i][1]={idx:"col1"+id,valx:d.r[id].C_CAMPO};
var el=new AW.UI.Input;
el.setId("col1"+id);
el.setControlText(d.r[id].C_CAMPO+" - "+d.r[id].N_CMP);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el2=buildCol23(id,top,dim,d,myData);
return true;
});
var buildCol23=(function(id,top,dim,d,myData){
left+=dim-1;
var dim=321;
myData[i][2]={idx:"col2"+id,valx:d.r[id].C_POZZO};
var el=new AW.UI.Input;
el.setId("col2"+id);
el.setControlText(d.r[id].C_POZZO+" - "+d.r[id].N_POZZO);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("background","lavender");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
buffer+=el;
var el4=buildCol43(id,top,dim-1,d,myData);
return true;
});
var buildCol43=(function(id,top,dim,d,myData){
left+=dim;
var dim=228;
myData[i][3]={idx:"col3"+id,valx:d.r[id].STHP};
var el=new AW.UI.Combo;
el.setId("col3"+id);
el.setControlText(d.r[id].STHP);
el.setStyle("width",dim);
el.setStyle("height","20");
el.setStyle("top",top);
el.setStyle("left",left);
el.getContent('box/text').setAttribute('readonly',true);
el.setItemText(["FIELD","WELL"]);
el.setItemCount(3);
el.setItemValue(["F","W"]);
var popup= el.getPopupTemplate();
popup.setStyle("width",220);
popup.setStyle("height",17*6);
setComboValue(el,d.r[id].STHP);
buffer+=el;
el.onControlValidating = function(txt) {
insertVal3(el.getId(),el.getItemValue(el.getSelectedItems()));
}
var el5=buildCol53(id,top,dim-1,d,myData);
return true;
});
var buildCol53=(function(id,top,dim,d,myData){
left+=dim;
var dim=121;
myData[i][4]={idx:"col4"+id,valx:d.r[id].NOTE};
left=0;
return true;
});
function initCmb3(el,dim,subsid,dd,id){
var obj=el;
var cl="MacroDPDV";
var meth="getWF";
var dim=dim;
var op1=false;
var dbg=false;
var sync=true;
myp.init();
myp.addPar(subsid);
var vars="";
function val(x){
return "&value"+x+"=";
};
for(xx=0;xx<myp.data.length;xx++){
vars+=val(xx+1)+myp.data[xx].toString();
}
var strParamsx=bcNm+"MacroDPDV"+bcFx+"getWF"+vars;
dbg==true ? alert(strParamsx) : null;
var loaderx=new net.ContentLoader(lib+strParamsx,handler,null,"POST",'','','','',sync);
function handler(){
try{
var dati=this.req.responseText;
var d=dati.parseJSON();
if(dbg){alert("debug: "+dati);}
if(d=="undefined" d==undefined){
cE(this.req.responseText,"dispose "+obj.getId());
}
}catch(err){
alert(err.message+" -- "+this.req.responseText);
var d=[1];
}
setCombo(el,d,dim);
if(dd.count==1){
setComboValue(obj,"first");
}else{
setComboText(obj,dd.r[id].STHP);
}
obj.setControlDisabled(false);
};
}
function insertVal3(id,txt){myData[id.substr(4,id.length-4)][(parseInt(id.substr(3,1)))].valx=txt;}
function portaDatiSulDB3(){if(result=="ok"){try{myp.init();myp.addPar(globOut);exQuery("valGE","saveUpdates",disp_portaDatiSulDB,true);}catch(err){errmsgxxx('Preparing portaDatiSulDB',err.message);}function disp_portaDatiSulDB(){try{var d=this.req.responseText;var j=d.parseJSON();retmsg(d);}catch(err){errmsgxxx('Function portaDatiSulDB',err.message);}}}else{errmsgxxx('Saving','Some negative values...cannot save');}}
setTimeout('initPageT1()',2);
setTimeout('loadmsg(\"Initializing Grid Data\")',1);
var page1 = [bufferx];
var page2 = [buffery];
var page3 = [bufferw];
var page4 = [bufferz];
var pages = [page1, page2, page3, page4];
frame2.element().innerHTML = page1;
tabs.onCurrentItemChanged = function(i){
frame2.element().innerHTML = pages[i].join("");
if(i==0){
getId('ppp').innerHTML="";
bSave.onClick = function(){creaOutput();};
setTimeout('initPageT1()',2);
setTimeout('loadmsg(\"Initializing Grid Data\")',1);
}else if(i==1){
getId('ppp').innerHTML="";
bSave.onClick = function(){alert("secondo tab");};
getId('ppp').innerHTML=h21+h22;
setTimeout('initPageT2()',2);
}
else if(i==2){
getId('ppp').innerHTML="";
bSave.onClick = function(){creaOutput();};
setTimeout('initPageT3a()',2);
setTimeout('loadmsg(\"Initializing Grid Data\")',1);
}
else if(i==3){
getId('ppp').innerHTML="";
bSave.onClick = function(){creaOutput();};
setTimeout('initPageT3()',2);
setTimeout('loadmsg(\"Initializing Grid Data\")',1);
}
else{
}
if (frame2.$browser=="opera"){document.body.className += ""}
}