// active computing javascript library -------------------------------------------------------------

var jsAt,jsCurs,jsErr='',jsFLD=Array(),jsMHrz,jsMVrt,jsSpawn=false,jsTAB=Array();

function jsBlur(fld) {jsAt=fld;}

function jsClear() {
  var ans,def,fld,FLD,obj,sbs; if (jsSpawn==true) {jsTask(mnuExit);}
  FLD=document.getElementById('scr'); if (!FLD) {return;} FLD=FLD.getElementsByTagName('*');
  if (jsTAB.length==0) {for (sbs=0; sbs<FLD.length; sbs++) {
    obj=FLD[sbs]; switch (obj.className) {case 'but': case 'chk': case 'key': case 'rad': case 'sel': case 'txt': jsTAB[obj.tabIndex]=obj; break;}
  }}
  for (sbs=0; sbs<FLD.length; sbs++) {
    obj=FLD[sbs]; if (obj.id!='') {
      fld=obj.id.replace(/[0-9]/g,''); def=''; if (jsFLD[fld]) {if (jsFLD[fld].Dflt) {def=jsFLD[fld].Dflt;}}
      switch (obj.className) {
        case '': case 'but': case 'scr': break;
        case 'chk': jsPut('N',obj); break;
        case 'grd': def=edit(obj.id,'N'); jsPut(def,obj); break;
        default: jsPut(def,obj); break;
      } 
    }
  }
  jsMenuHide('Update'); jsMenuHide('Delete'); jsMenuHide('Copy'); jsMenuHide('Paste');
  if (jsTAB.length>0) {jsTAB[1].focus();}
}

function jsClick(fld) {doTask(fld); if (jsErr!='') {alert(jsErr); jsErr=''; fld.focus(); jsAt=fld; return;}}

function jsFocus(fld) {
  var tmp=jsFLD[edit(fld.id,'A')]; if (tmp) {if (tmp['File']) {jsMenuShow('Search');} else {jsMenuHide('Search');}}
  if (jsAt) {
    if (fld.tabIndex<=jsAt.tabIndex) {return;}
    var act=false; switch (fld.className) {case 'but': case 'grd': case 'key': case 'sel': case 'txt': act=true;}
    if (act) {doTask(jsAt); if (jsErr!='') {alert(jsErr); jsErr=''; jsAt.focus(); jsAt=fld; return;}}
  }
  if (fld.className=='grd'||fld.className=='key'||fld.className=='txt') {fld.select();}
  
}

function jsGet(obj) {
  var fld,fmt,KEY,OPT,val; if (typeof(obj)=='string') {obj=document.getElementById(obj);} fld=obj.id.replace(/[0-9]/g,'');
  switch (obj.className) {
    case '': if (obj.id.substring(0,3)=='mnu') {return mid(obj.firstChild.nodeValue,'(',')');} return '';
    case 'but': case 'hid': return trim(obj.value);
    case 'chk': return (obj.checked)?'Y':'N';
    case 'grd': case 'key': case 'txt': val=trim(obj.value); fmt=''; if (jsFLD[fld]) {if (jsFLD[fld].Frmt) {fmt=jsFLD[fld].Frmt}} val=edit(val,fmt+'V'); jsPut(val,obj); return val;
    case 'opt': OPT=jsFLD[fld].Rnge.split(','); KEY=OPT[0].split('-'); if (KEY.length==1) {KEY=OPT[0].split('');} for (sbs=0; sbs<KEY.length; sbs++) {if (OPT[sbs+1]==obj.innerText) {return KEY[sbs];}}   
    case 'sel': return trim(obj.value);
    default: return trim(obj.innerText);
  }
}

function jsGetAll(opt) {
  var ans,fld,FLD,idx,obj,sbs,trg,use;
  FLD=document.getElementById('scr'); if (!FLD) {alert('jsGetAll - No Data Screen declared'); return;}
  FLD=FLD.getElementsByTagName('*'); ans='';
  for (sbs=0; sbs<FLD.length; sbs++) { 
    obj=FLD[sbs]; use=false; fld=obj.id.replace(/[0-9]/g,''); 
    switch (obj.className) {
      case 'chk': case 'key': case 'mta': case 'rad': case 'sel': case 'txt': use=true; trg=obj.id.substr(1); break;
      default: if (jsFLD[fld]) {if (jsFLD[fld].Frmt) {if (jsFLD[fld].Frmt.indexOf('I')>-1) {use=true; trg=obj.id.substr(1); if (jsFLD[fld].Data.substr(0,4)==hFile.value) {
        idx=trg.replace(/[A-Za-z]/g,''); trg=jsFLD[fld].Data.substr(5)+idx;
      }}}} 
    } 
    if (use) {ans+='|'+trg+'='+trim(jsGet(obj));
    }    
  }
  return ans.substr(1);
}

function jsGrid(grd,lin,val) {
  var act,col,dst,fld,lns,org,sav=Array();
  fld=jsFLD[grd]['Rnge'].split(','); lns=fld[0]*1; org=lin*1; dst=edit(val,'N')*1; act=edit(val,'UA'); act=act.substr(0,1); jsPut(lin,grd+lin);
  switch (act) {
    case 'C': for (lin=lns; lin>org; lin--) {for (col=1; col<fld.length; col++) {jsPut(jsGet(fld[col]+(lin-1)),fld[col]+lin);}} jsErr=''; return false;
    case 'D': for (lin=org*1; lin<lns; lin++) {for (col=1; col<fld.length; col++) {jsPut(jsGet(fld[col]+(lin+1)),fld[col]+lin);}}
      for (col=1; col<fld.length; col++) {jsPut('',fld[col]+lns);} jsErr=''; doTask(grd+lin); return false;
    case 'I': for (lin=lns; lin>org; lin--) {for (col=1; col<fld.length; col++) {jsPut(jsGet(fld[col]+(lin-1)),fld[col]+lin);}}
      for (col=1; col<fld.length; col++) {jsPut('',fld[col]+org);} jsErr=''; return false;
    case 'M': if (dst<1||dst>lns) {jsErr='Invalid line command, try from M1 to M'+lns; return;}
      if (org!=dst) {
        for (col=1; col<fld.length; col++) {sav[col]=jsGet(fld[col]+org);} if (org<dst) {jsGrid(grd,org,'D'); jsGrid(grd,dst,'I');}
        if (org>dst) {jsGrid(grd,org,'D'); jsGrid(grd,dst,'I');} for (col=1; col<fld.length; col++) {jsPut(sav[col],fld[col]+dst);} 
      } jsErr=''; break;
    case '': if (dst<1||dst>lns) {jsErr='Invalid line command, try from 1 to '+lns; return;} 
      jsPut(org,grd+org); if (org!=dst) {jsAt=document.getElementById(grd+dst); jsAt.focus();} return;
    default: jsErr='Enter required line number, [C]opy, [D]elete, [I]nsert, or M1 to M'+lns+' to move lines'; return;
  }
}

function jsGridTotals(grd) {
  var arr,chr,col,GRD,IDX=Array(),obj,OUT=Array(),tot,trg,val;
  GRD=jsFLD['g'+grd]['Rnge'].split(','); arr=GRD[0]*1; trg=document.getElementById('d'+grd); 
  if (trg) {tot=0; for (sbs=1; sbs<=arr; sbs++) {obj=document.getElementById(GRD[1]+sbs); val=jsGet(obj); if (val!=''&&val!=0) {tot++;}} jsPut(tot,trg); jsErr='';}
  for (col=1; col<GRD.length; col++) {
    chr=GRD[col].substr(0,1);
    if (chr=='t') {obj=document.getElementById('d'+GRD[col].substr(1)); if (obj) {IDX.push(GRD[col]); OUT.push('d'+GRD[col].substr(1));}}
    if (chr=='d') {obj=document.getElementById('e'+GRD[col].substr(1)); if (obj) {IDX.push(GRD[col]); OUT.push('e'+GRD[col].substr(1));}}
  }
  for (col=0; col<IDX.length; col++) {
    tot=0; 
    for (sbs=1; sbs<=arr; sbs++) {
      obj=document.getElementById(IDX[col]+sbs); val=jsGet(obj); tot+=val*1;
    } 
    jsPut(tot,OUT[col]); jsErr='';
  }
}

function jsKeyed(evt) {
  var chr,fld,key,OBJ,sbs;
  if (document.all) {
    chr=evt.keyCode;
    if (evt.ctrlKey) {key='^'+unescape('%'+evt.keyCode.toString(16));}
    if (chr>111&&chr<124) {key='F'+(chr-111);}
    if (key!=''&&key!=undefined) {
      OBJ=document.getElementById('nav').getElementsByTagName('A'); 
      for (sbs=0; sbs<OBJ.length; sbs++) {
        if (OBJ[sbs].innerText.indexOf(key)>-1) {evt.returnValue=false; evt.cancelBubble=true; evt.keyCode=0; window.location.href=OBJ[sbs].href; return;}
      }
    }
    if (document.activeElement.className!='but') {if (chr==13) {chr=9; evt.keyCode=9;}}
  } else {
    chr=evt.which;
    if (chr==13) {fld=jsTAB[document.activeElement.tabIndex+1]; if (fld) {fld.focus(); jsFocus(fld);}}
  }
}

function jsIO(act,map,key,dat) {
  var ans,req,sbs,sys,tmp,wrk=Array(),url; if (key==undefined) {key='';} if (dat==undefined) {dat='';}
  url=document.URL; 
  sbs=url.lastIndexOf('.php'); url=url.substr(0,sbs+4)+'?&IOAct='+act+'&IOMap='+map+'&IOKey='+edit(key,'&')+'&IODat='+edit(dat,'&'); //alert('jsIO<- '+url);
  try {req=new ActiveXObject('Msxml2.XMLHTTP')
    } catch (e) {try {req=new ActiveXObject('Microsoft.XMLHTTP')
      } catch (e) {try {req=new XMLHttpRequest();
        } catch (e) {alert ('jsIO - Browser does not support XMLHttpRequest'); return '';}}}
  req.open('POST',url,false,null,null); 
  req.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); req.send(url);
  if (req.status!=200) {alert('jsIO - URL not found (Error '+req.status+'... '+url+')'); return '';} ans=req.responseText; //alert('jsIO-> '+ans);
  if (ans.substr(0,1)=='?'||ans.substr(0,5)=='Array'||ans.indexOf('<b>Fatal')>0||ans.indexOf('<b>Warning')>0||ans.indexOf('<b>Parse error')>0) {alert(ans); return '';} 
  if (ans.indexOf('|')<0) {return ans;} if (ans.indexOf('=')<0) {return ans.split('|');}
  return jsIOMap(ans);
}

function jsIOMap(tmp) {
  var arr,fld,lev,pos,rhs,val,wrk=Array(); tmp+='|';
  while (tmp!='') {
    pos=tmp.indexOf('='); fld=tmp.substr(0,pos); val=tmp.substr(pos+1);
    if (val.substr(0,1)=='{') {
      rhs=0; lev=0; arr='';
      while (arr=='') {rhs++; switch (val.substr(rhs,1)) {case '{': lev++; break; case '}': if (lev>0) {lev--;} else {tmp=val.substr(rhs+2); arr=val.substr(1,rhs-1);} break;}} wrk[fld]=jsIOMap(arr);
    } else {
      pos=val.indexOf('|'); tmp=val.substr(pos+1); val=val.substr(0,pos); wrk[fld]=val;
    }
  }
  return wrk;
}       

function jsMenuHide(itm,val) {
  var obj,wrk;
  if (document.getElementById('bar'+itm)) {document.getElementById('bar'+itm).style.visibility='hidden';}
  if (document.getElementById('mnu'+itm)) {document.getElementById('mnu'+itm).disabled=true;}
  if (document.getElementById('icn'+itm)) {document.getElementById('icn'+itm).style.visibility='hidden';}
  if (val!=undefined) {jsPut(val,document.getElementById('mnu'+itm));}
}

function jsMenuShow(itm,val) {
  var obj,wrk;
  if (document.getElementById('bar'+itm)) {document.getElementById('bar'+itm).style.visibility='visible';}
  if (document.getElementById('mnu'+itm)) {document.getElementById('mnu'+itm).disabled=false;}
  if (document.getElementById('icn'+itm)) {document.getElementById('icn'+itm).style.visibility='visible';}
  if (val!=undefined) {jsPut(val,document.getElementById('mnu'+itm));}
}

function jsMouse(icn) {
  var FLD,sbs; FLD=document.getElementById('scr'); if (!FLD) {return;}
  if (jsCurs!=icn) {FLD=FLD.getElementsByTagName('*'); for (sbs=0; sbs<FLD.length; sbs++) if (FLD[sbs].style.cursor) FLD[sbs].style.cursor=icn; jsCurs=icn;}
}

function jsMouseAt(evt) {jsMHrz=evt.clientX+document.body.scrollLeft; jsMVrt=evt.clientY+document.body.scrollTop;}

function jsPage(pag) {
  var anc,ext,url,win,wrk;
  if ((pag.indexOf('http:')>-1||pag.indexOf('www.')>-1)&&(pag.indexOf('hSrvr')==-1)) {
    window.open(pag,'preview','toolbar,status,resizable,scrollbars,width=1088,height=720'); return;
  }
  ext=mid(pag,'&',''); pag=mid(pag+'&','','&'); if (ext!='') {ext='&'+ext;}
  anc=mid(pag,':',''); pag=mid(pag+':','',':'); if (anc!='') {anc=':'+anc;}
  url=hSrvr.value+'?&Page='+pag+anc+ext;
  win=jsIO('window',pag); if (win=='') {window.location.href=url; return;}
  wrk=win.split('x'); par='';
  if (win.indexOf('L')>=0) {par+='location,';}
  if (win.indexOf('T')>=0) {par+='toolbar,';}
  if (win.indexOf('S')>=0) {par+='scrollbars,'; wrk[0]=wrk[0]*1+2;} 
  if (win.indexOf('R')>=0) {par+='resizable,';}
  par+='height='+(wrk[1]*18+96)+',width='+(wrk[0]*8+16);
  preview=window.open(url,pag,par); preview.focus();
}

function jsPrint() {
  var css,f2p,FLD,frm,icn,obj,pag,sbs,tmp,ttl;
  frm=document.getElementById('form').innerHTML;
  css=mid(frm,'<SPAN id=css>','</SPAN>');
  icn=mid(frm,'<!-- Icon -->','<!-- End -->');
  ttl=mid(frm,'<!-- Title -->','<!-- End -->');
  pag=mid(frm,'<!-- Page -->','<!-- End -->');
  f2p=mid(frm,'<!-- F2 Print -->','<!-- End -->');
  if (f2p!='') {pag=f2p; icn=''; ttl='';}
  pag=midrem(pag,' onblur=jsBlur(this);'); pag=midrem(pag,' onfocus=jsFocus(this);'); pag=midrem(pag,' onclick=jsClick(this);'); 
  if (document.all) {
    pag=pag.replace(/<INPUT style/gi,'<INPUT readonly style');
    pag=pag.replace(/<SELECT style/gi,'<SELECT disabled style');
    css=midrem(css,'HTML {','}'); css=midrem(css,'BODY {','}');  
  } else {
    pag=pag.replace(/<input id=/gi,'<input readonly id=');
    pag=pag.replace(/<select id=/gi,'<select disabled id=');
    css=midrem(css,'HTML, BODY {','}');
  }
  doc=window.open('','print','resizable,scrollbars,left=100,top=100'); doc.document.open(); 
  tmp='<HTML><HEAD><TITLE>Screen Print (v'+jsGet(hVers)+')</TITLE></HEAD>\n';
  tmp+='<BODY id=form leftmargin=0 topmargin=0 marginheight=0 marginwidth=0>\n';
  tmp+='<TABLE border=0 class=pag cellSpacing=0 cellPadding=0><TBODY><TR><TD vAlign=top>\n';
  tmp+=css+'\n';
  tmp+='  <TABLE border=0 width=100% cellSpacing=0 cellPadding=0><TBODY>\n';
  tmp+="    <TR><TD class=pag vAlign=top>\n";
  tmp+='      <TABLE class=pag cellspacing=4 cellpadding=4 border=0><TBODY>\n';
  if (ttl!='') {tmp+='        <TR class=ph1><TD> '+icn+' '+ttl+'</TD></TR>\n';}
  tmp+='        <TR class=pag><TD>'+pag+'</TD></TR>\n';
  tmp+='      </TBODY></TABLE>\n';
  tmp+='    </TD></TR>\n';
  tmp+='  </TBODY></TABLE>\n';
  tmp+='  <SCRIPT language=javascript><!-- Begin\n';
  FLD=document.getElementById('scr'); 
  if (FLD) {FLD=FLD.getElementsByTagName('*'); for (sbs=0; sbs<FLD.length; sbs++) {obj=FLD[sbs]; switch (obj.className) {
    case 'chk': case 'key': case 'rad': case 'sel': case 'txt': tmp+='    '+obj.id.replace(/[0-9]/g,'')+".value='"+jsGet(obj)+"';\n";
  }}}
  tmp+='  // --></SCRIPT>\n';
  tmp+='</TD></TR></TBODY></TABLE></BODY></HTML>\n';
  doc.document.write(tmp); doc.document.close(); doc.focus(); 
}

function jsPut(val,obj) {
  var fld,fmt,msk,wrk;  if (val==undefined) {val='';}
  if (typeof(obj)=='string') {obj=document.getElementById(obj);} fld=obj.id.replace(/[0-9]/g,''); 
  fmt=''; if (jsFLD[fld]) {if (jsFLD[fld].Frmt) {fmt=jsFLD[fld].Frmt;}}
  switch (obj.className) {
    case '': if (obj.id.substring(0,3)=='mnu') {wrk=trim(obj.firstChild.nodeValue); wrk=mid(wrk+'(','','('); if (val!='') {val=' ('+val+')';} obj.firstChild.nodeValue=wrk+val;} break;
    case 'chk': case 'flg': case 'rad': obj.checked=(val=='Y'); break;
    case 'img': val=val.toLowerCase(); msk=jsFLD[fld].File; obj.src=msk.replace(/\?/gi,val); break;
    case 'grd': case 'key': case 'sel': case 'txt': obj.value=edit(val,fmt); break;
    case 'opt': obj.innerText=coded(val,jsFLD[fld]['Rnge']); break;
    default: obj.innerText=edit(val,fmt); break;
  }
}

function jsRecall(ans,fld) {
  var nxt; if (!ans) {return;} if (!fld) {jsClear(); fld=jsTAB[1];} 
  if (typeof(fld)=='string') {fld=document.getElementById(fld);}
  jsPut(ans,fld); nxt=fld.tabIndex+1; jsTAB[nxt].focus();
}

function jsSound(fnam,cmnd) {
  var tmp='<EMBED src="'+fnam+'"';
  tmp+=(cmnd==undefined)?' width="1" height="1"':' width="376" height="44"';
  tmp+=' type="application/x-mplayer2" autostart="true"<\/EMBED>';
  document.getElementById('sound').innerHTML=tmp;
}

function jsTask(obj) {
  var tmp;
  switch (obj.id) {
    case 'mnuPrint': jsPrint(); break;
    case 'mnuClear': jsClear(); break;
    case 'mnuExit': window.opener=null; window.open('','_self',''); window.close(); break;  
    case 'mnuCopy': jsMenuHide('Paste',jsGet(jsTAB[1])); jsMenuShow('Recall',jsGet(jsTAB[1])); jsClear(); break;
    case 'mnuSearch': jsPage('Search&List='+jsFLD[edit(jsAt.id,'A')]['File']+'&Sect=&Back='+jsAt.id); break;
    case 'mnuFirst': jsRecall(jsIO('first',hFile.value)); break;
    case 'mnuPrevious': tmp=jsGet(jsTAB[1]); if (tmp==''&&document.getElementById('mnuRecall')) {tmp=jsGet('mnuRecall');} jsRecall(jsIO('previous',hFile.value,tmp)); break;
    case 'mnuNew': jsRecall(jsIO('new',hFile.value,'')); break;
    case 'mnuNext': tmp=jsGet(jsTAB[1]); if (tmp==''&&document.getElementById('mnuRecall')) {tmp=jsGet('mnuRecall');} jsRecall(jsIO('next',hFile.value,tmp)); break;
    case 'mnuLast': jsRecall(jsIO('last',hFile.value)); break;
    case 'mnuRecall': jsRecall(jsGet(mnuRecall)); break;
    case 'mnuGuide': jsPage('Guide'); break;
    case 'mnuAbout': jsPage('About'); break;
  }
}

function jsVideo(url,wid,hig) {
  var frm,gap,hrz,mxh,mxw,tmp,vrt; 
  frm=document.getElementById('form'); mxw=frm.clientWidth; mxh=frm.clientHeight+frm.scrollTop;
  hrz=jsMHrz+16; if (hrz<0) {hrz=0;} gap=hrz+wid+10-mxw; if (gap>0) {hrz-=gap;}
  vrt=jsMVrt+16; if (vrt<0) {vrt=0;} gap=vrt+hig+26-mxh; if (gap>0) {vrt-=gap;}
  tmp='<TABLE cellspacing=0 cellpadding=2 border=2 width=100%><TR><TD bgcolor=#000><CENTER><FONT size=-1>\n';
  tmp+='  <DIV style="background:#000; background-image:url('+"'"+mid(url,'','.')+".jpg'"+'); background-repeat:no-repeat; background-position:top 50%; width:'+wid+'; height:'+hig+';">\n';
  tmp+='    <OBJECT ID="video" width='+wid+' height='+hig+' classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95" type="application/x-oleobject" VIEWASTEXT align="left">\n';
  tmp+='      <PARAM name="FileName" value="'+url+'">\n';
  tmp+='      <PARAM name="ShowControls" value=1>\n';
  tmp+='      <PARAM name="ShowStatusBar" value=1>\n';
  tmp+='      <PARAM name="TransparentAtStart" value=1>\n';
  tmp+='      <PARAM name="AutoStart" value=1>\n';
  tmp+='      <PARAM name="autoSize" value=0>\n';
  tmp+='      <PARAM name="displaySize" value=0>\n';
  tmp+='      <PARAM name="enableContextMenu" value=0>\n';
  tmp+='      <PARAM name="uiMode" value="invisible">\n';
  tmp+='      <EMBED type="application/x-mplayer2" pluginspage="http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/"\n';
  tmp+='        src="'+url+'" name="video-x" width='+wid+' height='+hig+' autoStart=1 transparentAtStart=1 animationAtStart=0 autoSize=0 \n';
  tmp+='        ShowStatusBar=0 ShowControls=1 displaySize=0 enableContextMenu=0 uiMode="invisible" align="center">\n';
  tmp+='    </OBJECT>\n';
  tmp+='  </DIV>\n';
  tmp+="  <BUTTON class=but onclick='tip.innerHTML="+'""'+";'>Click to close</BUTTON>\n";
  tmp+='</TD></TR></TABLE>';
  tip.innerHTML=tmp; tip.style.pixelLeft=hrz; tip.style.pixelTop=vrt; tip.style.pixelRight=hrz+wid; tip.style.pixelBottom=vrt+hig;
}

function jsViewer(url,wid,hig,flg) {
  var brd=2,frm,gap,hrz,mxh,mxw,tmp,vrt; 
  frm=document.getElementById('form'); mxw=frm.clientWidth; mxh=frm.clientHeight+frm.scrollTop; if (flg=='N') {brd=0;}
  hrz=jsMHrz-(wid/2); if (hrz<0) {hrz=0;} gap=hrz+wid+4-mxw; if (gap>0) {hrz-=gap;}
  vrt=jsMVrt+16; if (vrt<0) {vrt=0;} gap=vrt+hig+4-mxh; if (gap>0) {vrt-=gap;}
  tmp="<IMG src='"+url+"' alt='Click to close' onclick='tip.innerHTML="+'""'+";' width="+wid+' height='+hig+" style='border:"+brd+"px solid #000;'>\n"; 
  tip.innerHTML=tmp; tip.style.pixelLeft=hrz; tip.style.pixelTop=vrt; tip.style.pixelRight=hrz+wid; tip.style.pixelBottom=vrt+hig;
}

// equivalent javascript commands ------------------------------------------------------------------

function coded(val,opt) {
  var KEY,OPT,sbs;
  if (val=='') {return '';} OPT=opt.split(','); if (OPT[0].indexOf('-')==-1) {sbs=OPT[0].indexOf(val); return OPT[sbs+1];}
  KEY=OPT[0].split('-'); for (sbs=0; sbs<KEY.length; sbs++) {if (KEY[sbs]==val) {return OPT[sbs+1];}} return 'Unknown';
}

function edit(val,fmt) {
  var CHR,col,err,mnt,rhs=false,sav=val,sbs,TMP,tmp,tno; val=val+'';
  mnt=fmt.replace(/[A-Za-z\-]/g,''); fmt=fmt.replace(/[0-9.]/g,''); col=Math.floor(mnt); mnt=(mnt*10)%10; CHR=fmt.split(''); err='';
  for (sbs=0; sbs<fmt.length; sbs++) {
    switch (CHR[sbs]) {
      case '-': case 'D': case 'F': case 'I': case 'J': case 'M': case 'Q': case 'V': case 'W': case 'Z': break; // validation commands
      case 'A': val=val.replace(/[0-9]/g,''); break; // alpha only
      case 'E': val=val.toLowerCase();  val=val.replace(/ /g,''); email(val); break; //email validation
      case 'L': val=val.toLowerCase(); break; //lowercase
      case 'N': val=val.replace(/[A-Za-z]/g,''); break; //numeric only
      case 'P': TMP=val.split(''); tmp=''; for (tno=0; tno<TMP.length; tno++) {tmp+=(tno==0||TMP[tno-1]==' ')?TMP[tno].toUpperCase():TMP[tno];} val=tmp; break;
      case 'R': rhs=true; break; // right hand display
      case 'S': val=val.replace(/ /g,''); break; //no spaces
      case 'U': val=val.toUpperCase(); break; // uppercase
      case '&': tmp=val.split('&'); val=tmp.join('%26'); tmp=val.split('+'); val=tmp.join('%2B'); break; //convert ampersands to hex
      default: alert('Javascript Edit - Unknown Edit Command ['+CHR[sbs]+'] in '+fmt); return '';
    }
  }
  if (fmt.indexOf('Z')==-1&&val*1==0) {val='';}
  if (fmt.indexOf('Z')>-1||val*1!=0) {if (mnt>0) {val=String(parseInt(val*Math.pow(10,mnt))); tmp=val.length; while (tmp<mnt+1) {val='0'+val; tmp++;} val=val.substr(0,tmp-mnt)+'.'+val.substr(tmp-mnt);}}
  if (fmt.indexOf('-')>-1&&val*1==0) {val='-';}   
  if (fmt.indexOf('F')>-1&&val.length!=col) {jsErr='Invalid reply, answer must contain '+col+' characters';}
  if (fmt.indexOf('J')>-1||rhs==true) {if (col>0) {val=val.substr(0,col); tmp=''; for (sbs=col-val.length; sbs>0; sbs--) {tmp+=' ';} val=(rhs)?tmp+val:val+tmp;}}    
  if (fmt.indexOf('M')>-1&&val=='') {err='Invalid reply, answer is compulsory';}
  if (fmt.indexOf('V')==-1) {jsErr='';} return val;
  return val;
}

function email(val) {
  var dom,usr,sbs,tst;
  tst=/^[^@]{1,64}@[^@]{1,255}$/; if (!tst.test(val)) {jsErr='Ivalid Email address, incorrect sections'; return;}  
  usr=mid(val,'','@'); usr=usr.split('.');
  tst=/^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&?'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/; 
  for (sbs=0; sbs<usr.length; sbs++) {if (!tst.test(usr[sbs])) {jsErr='Ivalid Email address, invalid User section ['+usr[sbs]+']'; return;}}
  dom=mid(val,'@',''); dom=dom.split('.'); if (dom.length<2) {jsErr='Ivalid Email address, Domain name incorrect'; return;}
  tst=/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])?([A-Za-z0-9]+))$/; 
  for (sbs=0; sbs<dom.length; sbs++) {if (!tst.test(dom[sbs])) {jsErr='Ivalid Email address, invalid Domain section ['+dom[sbs]+']'; return;}}
  return;
}

function mid(dat,lhs,rhs) {var sbs=dat.indexOf(lhs); if (sbs<0) {return '';} dat=dat.substr(sbs+lhs.length); if (rhs=='') {return dat;} sbs=dat.indexOf(rhs); return dat.substr(0,sbs);}

function midrem(txt,ltx,rtx) {
  var lhs,pos,rhs,val; lhs=txt.indexOf(ltx); rhs=txt.indexOf(rtx,lhs); if (rtx==undefined) {rhs=lhs; rtx=ltx;}
  while (lhs>-1&&rhs>-1) {rhs+=rtx.length; txt=txt.substr(0,lhs)+txt.substr(rhs); lhs=txt.indexOf(ltx); rhs=txt.indexOf(rtx,lhs);} return txt;
}

function navHover() {
  var tmp=document.getElementById('nav');
  if (tmp) {tmp=tmp.getElementsByTagName('LI'); for (var i=0; i<tmp.length; i++) {
    tmp[i].onmouseover=function() {this.className+=' iehover';}
    tmp[i].onmouseout=function() {this.className=this.className.replace(new RegExp(' iehover\\b'),'');}
  }}
}
if (window.attachEvent) window.attachEvent("onload",navHover);

function trim(txt) {var lhs=0; var rhs=txt.length-1; while (lhs<rhs&&txt.substr(lhs,1)==' ') {lhs+=1;} while (rhs>0&&txt.substr(rhs,1)==' ') {rhs-=1;} return txt.substr(lhs,rhs-lhs+1);}

