home *** CD-ROM | disk | FTP | other *** search
/ Delphi Anthology / aDELPHI.iso / Runimage / Delphi50 / Source / Webmidas / xmldisp.js < prev    next >
Text File  |  1999-08-11  |  13KB  |  527 lines

  1. //Copyright Inprise Corporation 1999, all rights reserved, to be used with Borlands Midas-technology only, 
  2. //unless special permission has been given.
  3. var xmldisp_vers="1.0";
  4. var szNotUpdateable="disabled";
  5. var iUpKey=38, iDownKey=40; 
  6.  
  7. new xmlDisplay(null,null,null);
  8. xmlDisplay.prototype.fldcnt=0;
  9. xmlDisplay.prototype.rows=0;
  10. xmlDisplay.prototype.bDontPost=0;
  11. xmlDisplay.prototype.scrolloffs=0;
  12. xmlDisplay.prototype.page=0;
  13. xmlDisplay.prototype.fldfirst=0;
  14. xmlDisplay.prototype.KeyMap=null;
  15. xmlDisplay.prototype.focusflag=0;
  16. //methods
  17. xmlDisplay.prototype.getFldDes=function(i){return this.src.Fields.Field[this.names[i]];}
  18. xmlDisplay.prototype.selectRow=function(r){var pos=this.page*this.rows+r+this.scrolloffs;return this.src.setPos(pos);}
  19.  
  20. xmlDisplay.prototype.getValue=GridGetValue;
  21. xmlDisplay.prototype.putValue=GridPutValue;
  22. xmlDisplay.prototype.getRow=GridGetRow;
  23. xmlDisplay.prototype.valchanged=GridValChanged;
  24. xmlDisplay.prototype.setFocus=GridSetFocus;
  25. xmlDisplay.prototype.xvalidate=GridValidate; 
  26. xmlDisplay.prototype.scroll=GridScroll;
  27. xmlDisplay.prototype.refr=GridRefr;
  28. //public
  29. xmlDisplay.prototype.post=GridPost;
  30. xmlDisplay.prototype.postall=function(){if (this.src.forcepost()) return;this.post();}
  31. xmlDisplay.prototype.removeRow=GridDelete;
  32. xmlDisplay.prototype.newRow=GridNew;
  33. xmlDisplay.prototype.undo=GridUndo;
  34.  
  35. xmlDisplay.prototype.first=GridFirst;
  36. xmlDisplay.prototype.last=GridLast;
  37. xmlDisplay.prototype.pgup=pgBackw;
  38. xmlDisplay.prototype.pgdown=pgForw;
  39. xmlDisplay.prototype.up=GridUp;//pre-rec
  40. xmlDisplay.prototype.down=GridDown;//next-rec
  41. xmlDisplay.prototype.left=GridL;//prev-field
  42. xmlDisplay.prototype.right=GridR;//next-field
  43. xmlDisplay.prototype.sort=function(n){if(this.src.forcepost())return;var i;for(i=0;i<this.fldcnt;i++){if (this.names[i]==n){this.fCol=i;break;}}this.src.sort(n);this.first();}
  44. xmlDisplay.prototype.xfocus=GridFocus;
  45. xmlDisplay.prototype.keys=GridKeys;
  46. xmlDisplay.prototype.setKeyMap=GridSetKeys;
  47. xmlDisplay.prototype.OnError=function(s){alert(s);return null;}
  48.  
  49. var fset=0;
  50.  
  51. function xmlDisplay(src,fldids,names,rstate)
  52. {
  53. this.src=src;
  54. this.fldids=fldids;
  55. this.names=names;
  56. this.rstate=rstate;
  57. if(src==null||src.doc=="") return null;
  58.  
  59. src.regobj(this);
  60. if(fldids){this.fldcnt=fldids.length}else{if(names){this.fldcnt=names.length}else{this.fldcnt=this.src.FieldCnt}};
  61. this.rows=0;
  62. var i;
  63. for(i=0;i<this.fldcnt;i++)
  64. {
  65.  var ref=fldids[i]; 
  66.  var t=ref.type;if(t==null)t=ref[0].type;
  67.  if(t=="text"||t=="textarea")
  68.  {
  69.   var l=ref.length;
  70.   if(isNaN(l)) l=1;
  71.   if(this.rows==0) this.rows=l;
  72.   if(l!=this.rows){this.OnError(names[i]+": inconsistent row-count");if(l<this.rows) this.rows=l;}
  73.  }
  74.  var f=this.getFldDes(i);
  75.  if(f==null) return this.OnError(names[i]+": name not found in rowset");
  76.  
  77.  if(this.rows!=0){
  78.  if(this.rows==1)
  79.  {
  80.   if(ref.setAttribute)
  81.   {
  82.    if(f.readonly==1) ref.setAttribute(szNotUpdateable,1);
  83.    if(f.maxlength>0&&f.Type!=szUni) ref.setAttribute("maxLength",f.maxlength);
  84.   }
  85.  }
  86.  else
  87.  {
  88.   var j;
  89.   for(j=0;j<ref.length;j++)
  90.   {
  91.    if(ref[j].setAttribute)
  92.    {
  93.     if(f.readonly==1) ref[j].setAttribute(szNotUpdateable,1);
  94.     if(f.maxlength>0) ref[j].setAttribute("maxLength",f.maxlength);
  95.    }
  96.   }
  97.  }
  98.  }
  99.  if(f.readonly==1&&i==this.fldfirst) this.fldfirst++;
  100. }
  101. this.fRow=0;
  102. this.fCol=0;
  103.  
  104. //Init
  105. this.selectRow(0);
  106. this.refr(1);
  107. if(fset==0&&this.src.parent==null){this.setFocus(0,this.fldfirst);fset++;}
  108. //this.keys=GridKeys;
  109. if(this.rows==1)
  110. {
  111. this.setKeyMap(iUpKey,"left");
  112. this.setKeyMap(iDownKey,"right");
  113. }
  114. else
  115. {
  116. this.setKeyMap(iUpKey,"up");
  117. this.setKeyMap(iDownKey,"down");
  118. }
  119. this.setKeyMap(33,"pgup");
  120. this.setKeyMap(34,"pgdown");
  121. this.setKeyMap(45,"newRow");
  122. this.setKeyMap(13,"right"); 
  123. return this;
  124. }
  125.  
  126. function GridKeys(el)
  127. {
  128. var e,k;
  129. e=self.event;
  130. if(!e) return true;
  131. if(e!=null){k=e.keyCode;}else{k=e.which;}
  132.  
  133. var found=false;
  134. var r,c;
  135.  
  136. for(c=0;c<this.fldcnt;c++)
  137. {
  138.  var ref=this.fldids[c];
  139.  if(this.rows==1){if (ref==el) found= true;}
  140.  else
  141.  {
  142.   for(r=0; r<this.rows;r++)
  143.    {if(ref[r]==el){found=true; break;}}
  144.  }
  145.  if(found) break;
  146. if(!found) return true;
  147.  
  148. if(this.KeyMap==null) return true;
  149. var a=this.KeyMap[k.toString()];
  150. if(a==null||this[a]==null){return true;}
  151. a="this."+a+"();";
  152. eval(a);
  153. return true;  
  154. }
  155.  
  156. function GridL()
  157. {
  158. var r=this.fRow,c=this.fCol;
  159. do{if(c>0)c--;else c=this.fldcnt-1;}
  160. while(this.getFldDes(c).readonly==1&&c!=this.fCol)
  161. this.setFocus(r,c);
  162. }
  163.  
  164. function GridR()
  165. {
  166. var r=this.fRow,c=this.fCol;
  167. do{if(c< this.fldcnt-1)c++;else c=0;}
  168. while(this.getFldDes(c).readonly==1&&c!=this.fCol)
  169. this.setFocus(r,c);
  170. }
  171.  
  172. function GridDown()
  173. {
  174. var r=this.fRow, c=this.fCol;
  175. if(this.rows==1){this.pgdown();return;}
  176. if(r<this.rows-1){r++;}else{this.scroll(1);return;}
  177. this.setFocus(r,c);
  178. }
  179.  
  180. function GridUp()
  181. {
  182. var r=this.fRow,c=this.fCol;
  183. if(this.rows==1){this.pgup();return;}
  184. if(r>0) r--;else{this.scroll(-1);return;}
  185. this.setFocus(r,c);
  186. }
  187.  
  188. function pgBackw()
  189. {
  190. if(this.page>0||this.scrolloffs)
  191. {
  192.  if(this.src.forcepost()) return;
  193.  if(this.page) this.page--;else{this.fRow+=this.scrolloffs-this.rows;this.scrolloffs=0}
  194.  if(this.scrolloffs<0&&this.page==0){this.scrolloffs=0;this.fRow=0;}
  195.  if(this.rows==1) this.selectRow(0);
  196.  else this.refr(1);
  197. }
  198. else this.fRow=0;
  199. this.setFocus(this.fRow, this.fCol);
  200. }
  201.  
  202. function pgForw()
  203. {
  204. if(this.rows*(this.page+2)<this.src.RowCnt) 
  205. {
  206.  if(this.src.forcepost()) return;
  207.  this.page++;
  208.  if(this.rows==1) this.selectRow(0);else this.refr(1);
  209. }
  210. else{this.last();return;}
  211. this.setFocus(this.fRow,this.fCol);
  212. }
  213.  
  214. function GridScroll(inc)
  215. {
  216. if(inc>0)
  217. {
  218.  if(this.page*this.rows+this.fRow+this.scrolloffs>=this.src.RowCnt) return;
  219.  if(this.scrolloffs==this.rows-1){this.scrolloffs=0;this.page++;}
  220.  else this.scrolloffs++;
  221. }
  222. else
  223. {
  224.  if(-this.scrolloffs==this.rows-1){if(this.page>0){this.scrolloffs=0;this.page--;}}
  225.  else{this.scrolloffs--;if(this.page*this.rows+this.scrolloffs<0)this.scrolloffs=0}
  226. }
  227. var r=this.fRow;
  228. this.selectRow(r);
  229. this.refr(1);
  230. this.setFocus(r,this.fCol);
  231. }
  232.  
  233. function GridSetFocus(r,c)
  234. {
  235. if(c>=this.fldcnt||r>=this.rows) return;
  236. var ref=this.fldids[c];
  237. if(this.rows>1) ref=ref[r];
  238. if(ref.disabled||ref.readonly) return; 
  239. if(ref.focus!=null){this.focusflag=1;ref.focus();if(this.focusflag==1)this.xfocus(r,c);}
  240. }
  241.  
  242. function GridFocus(r,c)
  243. {
  244. var ref;
  245. this.focusflag=0;
  246. if(c==null)
  247.  if(r==null){r=this.fRow;c=this.fCol;ref=this.fldids[c];}
  248.  else
  249.  {
  250.   var i,j,ref,found=0;
  251.   for(j=0;j<this.fldcnt;j++)
  252.   {
  253.    ref=this.fldids[j];
  254.    if(this.rows==1){if(ref==r){r=0;c=j;found=1;break;}}   
  255.    else for(i=0;i<this.rows;i++) if(ref[i]==r){r=i;c=j;found=1;break;}
  256.    if(found) break;
  257.   }  
  258.   if(found==0)return;
  259.  }
  260. }
  261. else ref=this.fldids[c];
  262. if(this.rows>1) ref=ref[r];
  263. var f=this.getFldDes(c);
  264. var p=this.page*this.rows+this.scrolloffs;
  265. if(f&&f.readonly==1)
  266. {
  267.  if(ref.getAttribute&&ref.getAttribute("disabled")==true){}//explorer only
  268.  else ref.blur();
  269.  return;
  270. }
  271. else
  272. {
  273.  if(r!=this.fRow&&this.bDontPost==0)
  274.  {if(this.src.noIns!=0&&(p+r)>=this.src.RowCnt){ref.blur();return;}
  275.    if(this.src.forcepost()!=0)return;
  276.  }
  277.  if(c!=this.fCol){if(this.src.noUpd!=0&&p+this.fRow<this.src.RowCnt&&this.valchanged(p,this.fRow,this.fCol)!=0){this.refr(1);}
  278.      else if(this.valchanged(p,this.fRow,this.fCol)!=0&&this.xvalidate(this.fRow,this.fCol,0)==0)return;}
  279.  this.fRow=r;
  280.  this.fCol=c;
  281.  if(this.rows>1) this.selectRow(r);
  282.  if(ref.select!=null) ref.select();
  283.  this.bDontPost=0;
  284. }
  285. }
  286.  
  287. function GridUndo()
  288. {
  289. var r=this.fRow;
  290. if(r==-1) return;
  291. var pos=this.page*this.rows+r+this.scrolloffs;
  292. if(pos>=0&&pos<this.src.RowCnt)
  293. {
  294.  this.src.undo(pos);
  295.  if(pos&&pos>=this.src.RowCnt) this.last();
  296.  else this.setFocus(r,this.fCol);
  297. }
  298. if(pos>=this.src.RowCnt){this.refr(1);this.last();}
  299. }
  300.  
  301. function GridNew()
  302. {
  303. if(this.src.noIns) return;
  304. if(this.src.forcepost()) return;
  305. var pages=0,r=this.src.RowCnt%this.rows;
  306. pages=(this.src.RowCnt-r)/this.rows;
  307. if(r==0&&pages)
  308. {
  309.  if(this.rows==1) pages++;
  310.  else this.scrolloffs=1;
  311.  r=this.rows-1;
  312.  this.page=pages-1;
  313. }
  314. else{this.scrolloffs=0;this.page=pages;}
  315. this.refr(1);
  316. this.setFocus(r,this.fldfirst);
  317. }
  318.  
  319. function GridFirst()
  320. {
  321. if(this.src.forcepost()) return;
  322. this.scrolloffs=0;
  323. this.page=0;
  324. if(this.rows==1) this.selectRow(0);else{if(this.src.pos!=0)this.refr(1);}
  325. this.setFocus(0,this.fCol);
  326. }
  327.  
  328. function GridLast()
  329. {
  330. if(this.src.forcepost()) return;
  331. var r=this.src.RowCnt%this.rows ;
  332. pages=(this.src.RowCnt-r)/this.rows;
  333. if(r==0){r=this.rows-1;this.page=pages-1;this.scrolloffs=0;}
  334. else{this.scrolloffs=0;this.page=pages;r--;}
  335.  
  336. if(this.rows==1) this.selectRow(0);
  337. else this.refr(1);
  338. this.setFocus(r,this.fCol);
  339. }
  340.  
  341. function GridValChanged(pos,r,c)
  342. {
  343. var f=this.getFldDes(c);
  344. var val="";
  345. if(pos+r<this.src.RowCnt)
  346. {if(f){val=f.Value(pos+r);if(val) val=f.todisp(val);}}
  347. else
  348. {
  349.  if(this.getValue(c,r)!="")return 1;
  350.  return 0;
  351. }
  352. var gval=this.getValue(c,r);
  353. if(val==gval) return 0;
  354.  
  355. if(f&&(f.Type=="string"||f.Type==szUni||f.subtype=="Text"))
  356.   if(txtnorm(val)==txtnorm(gval)) return 0;
  357. if(f&&f.readonly==1){this.OnError(f.name+" : Cannot change readonly field");return 0;}
  358. return 1;
  359. }
  360.  
  361. function txtnorm(s){var v=new Array();v=s.split("\r\n");s=v.join(" ");v=s.split("\n");s=v.join(" ");v=s.split("\r");s=v.join(" ");return s;}
  362.  
  363. function GridValidate(r,c,q)
  364. {
  365. if(this.bDontPost) return 0;
  366. var ref;
  367. if(c==null)
  368.  var i,j,ref,found=0;
  369.  for(j=0;j<this.fldcnt;j++)
  370.  {
  371.   ref=this.fldids[j];
  372.   if(this.rows==1){if (ref==r) {r=0;c=j;found=1;break;}}   
  373.   else for(i=0;i<this.rows;i++) if(ref[i]==r){r=i;c=j;found=1;break;}
  374.   if(found) break;
  375.  }  
  376.  if(found==0) return 1;
  377. }
  378.  
  379. var v=this.getValue(c,r);
  380. var f=this.getFldDes(c);
  381. var res="";
  382. if(f){if(f.required!=0&&v==""&&q==0)res=v;else res=f.validate(v);}
  383. if(res!=null){v=res;this.putValue(c,r,v);return 1;}
  384.  
  385. this.setFocus(r,c);
  386. return 0;
  387. }
  388.  
  389. function GridGetRow(row)
  390. {
  391. var i,f,v,r=new Array();
  392. for(i=0;i<this.fldcnt;i++)
  393. {
  394.  v=this.getValue(i,row);
  395.  f=this.getFldDes(i);
  396.  if(f) r[this.names[i]]=f.frdisp(v);
  397. }
  398. return r;
  399. }
  400.  
  401. function GridPutValue(col,row,val)
  402. {
  403. var ref=this.fldids[col];
  404. if(this.rows==1)
  405. {
  406.  if(ref.type=="select-one"){var le=ref.length,i;for(i=0;i<le;i++)if(ref[i].value==val)ref[i].selected=true;else ref[i].selected=false;}else
  407.  if(ref.type=="text"||ref.type=="textarea"||ref.type=="select-one") ref.value=val;
  408.  else
  409.  if(ref[0].type=="radio")
  410.  {
  411.   var i;
  412.   for(i=0;i<ref.length;i++)
  413.   {
  414.    if(ref[i].value==val){ref[i].checked=true; break;}
  415.    else ref[i].checked=false;
  416.   } 
  417.  }
  418. }
  419. else ref[row].value = val;
  420. }
  421.  
  422. function GridGetValue(col,row)
  423. {
  424. var ref=this.fldids[col];
  425. if(this.rows==1)
  426. {
  427.  if(ref.type=="select-one"){var le=ref.length,i;for(i=0;i<le;i++)if(ref[i].selected)return ref[i].value;return ""}
  428.  if(ref.type=="text"||ref.type=="textarea") return ref.value;
  429.  if(ref[0].type=="radio")
  430.  {
  431.   var i;
  432.   for(i=0;i<ref.length;i++)
  433.   {if(ref[i].checked==true) return ref[i].value;}
  434.  }
  435.  return "";
  436. }
  437. return ref[row].value;
  438. }
  439.  
  440. function GridDelete()
  441. {
  442. if(this.src.noDel) return;
  443. if(this.src.forcepost()) return;
  444. var r=this.fRow;
  445. if(r==-1) return;
  446. var pos=this.page*this.rows+r+this.scrolloffs;
  447. if(pos>=0&&pos<this.src.RowCnt)
  448. {
  449.  this.src.deletex(pos);
  450.  if(pos&&pos>=this.src.RowCnt) this.last();
  451.  else this.setFocus(r,this.fldfirst);
  452. }
  453. }
  454.  
  455. function GridRefr(r)
  456. {
  457. if(r==0&&this.rows>1) return;
  458. var i,j, pos;
  459. if(r==2){this.scrolloffs=0;this.fRow=0;this.page=0}
  460. if(this.rows==1) {if (this.page<this.src.RowCnt){pos=this.src.pos;this.page=pos;}else pos=this.page}
  461. else pos=this.page*this.rows+this.scrolloffs;
  462. if(pos<0) pos=0;
  463.  
  464. for(i=0;i<this.rows;i++)
  465. {
  466. for(j=0;j<this.fldcnt;j++)
  467. {
  468.  var val="";
  469.  if(pos<this.src.RowCnt)
  470.  {
  471.   var f=this.getFldDes(j);
  472.   if(f){val=f.Value(pos);if(val)val=f.todisp(val);}
  473.  }
  474.  this.putValue(j,i,val);
  475. }
  476. if(this.rstate)
  477. {
  478.  var st=this.src.RowState(pos);
  479.  if(this.rows==1) this.rstate.value=st;else this.rstate[i].value=st;
  480. }
  481. pos++;
  482. }
  483. }
  484.  
  485. function GridPost()
  486. {
  487. if(this.bDontPost) return 1;
  488. var src=this.src;
  489. var j,r=this.fRow,pos=this.page*this.rows+this.scrolloffs;
  490. var bMod=0,err=0,bIns=(pos+r>=src.RowCnt)?1:0;
  491. var row=null;
  492.  
  493. for(j=0;j<this.fldcnt;j++)
  494. {
  495.  if(this.valchanged(pos,r,j))
  496.  { 
  497.   if((bIns==0&&src.noUpd!=0)||(bIns!=0&&src.noIns)){this.refr(1);return 0;}
  498.   f=this.getFldDes(j);
  499.   if(f&&f.readonly!=0)continue;
  500.   bMod=1;
  501.   if(this.xvalidate(r,j,1)==0) return 1;
  502.   if(row==null)row=new Array();
  503.   var f,v;
  504.   v=this.getValue(j,r);
  505.   if(f)row[this.names[j]]=f.frdisp(v);
  506.  }
  507. }
  508. if(bMod)
  509. {
  510.  if(bIns)
  511.  {
  512.   for(j=0;j<this.fldcnt;j++) if(this.xvalidate(r,j,1)==0) return 1;
  513.  }
  514.  if(bIns==0){err=src.modify(pos+r,row);}else{err=src.insert(row,1);}
  515. }
  516. return err;
  517. }
  518.  
  519. function GridSetKeys(key,action,param)
  520. {
  521. if(this.KeyMap==null) this.KeyMap=new Array();
  522. this.KeyMap[key.toString()]=action;
  523. }
  524.