var da=document.all, ie=(da)?1:0, ns=(document.layers)?1:0
var arAll=new Array('','-- all --'), arSelect=new Array('','-- select --')
var rt=true, xFi='pid~x'
function dw(s){if(!s)return;document.write(s)}
function HTMLEncode(s){return !s?'':s.replace(/\"/g,'&quot;').replace(/\'/g,/*'&#039;'*/'\\\\\'')}
function HTMLDecode(s){return !s?'':s.replace(/&quot;/gi,'"')/*.replace(/&#039;/g,'\'')*/}

// -- Page Navigation Object ------------------------------------------
function objNavPage(page,pageCount){this.page=page;this.pageCount=pageCount;this.move=_navPageMove}
  function _navPageMove(i){if(i>0){return Math.min(this.page+i,this.pageCount)}else{return Math.max(this.page+i,1)}}

// -- Submit Pass-Thru Object -----------------------------------------
function objSPT(){
  var el
	this.pval=new Array() // js value pointer (e.g. 'document.fm1.txt1.value')
	this.ival=new Array() // initial values (previously submitted)
	this.add=function(fn,pval){this.pval[fn]=pval}
  this.val=function(s){return !this.ival[s]?'':this.ival[s]} // overcome ival return undefined when blank was submitted
  this.out=function(){var out=''; for(var i in this.pval)if(eval(this.pval[i]).toString())out+='\''+i+'\',\''+HTMLEncode(eval(this.pval[i]).toString()/*.replace(/\&/g,'%26')*/)+'\','; return out.substring(0,out.length-1)}
	this.init=function(arr){var argv; if(arr.length>0){eval('argv=new Array('+arr+')');for(var i=0;i<argv.length;i+=2)this.ival[argv[i]]=''+HTMLDecode(argv[i+1])}}
	this.reset=function(){for(var i in this.pval){if(this.ival[i]&&this.pval[i].indexOf('(')==-1)if(this.pval[i].indexOf('.checked')==-1)eval(this.pval[i]+'=this.ival[\''+i+'\']');else eval(this.pval[i]+'='+this.ival[i])}}
  this.clear=function(){if(!ns&&el)for(i=0;i<el.length;i++){if(el[i].type=='text')el[i].value='';if(el[i].type=='select-one')el[i].selectedIndex=0;}}
  this.enumerate=function(fm,idTag){
		if(ns)return false
		if(el=document.all.item(idTag))
			for(i=0;i<el.length;i++)
				if(eval(fm+'.'+el[i].name))
					switch(el[i].tagName){
						case 'INPUT':this.add(el[i].name,fm+'.'+el[i].name+(el[i].type=='checkbox'?'.checked':'.value')); break
						case 'SELECT':this.add(el[i].name,'getSelectValue('+fm+'.'+el[i].name+')'); break
					}
	}
}

// -- SQL Condition Object --------------------------------------------
function objSQL(){
  function sqlFormat(s){return s.replace(/\'/g,"''").replace(/\"/g,'')}
  function capValue(s,d){return d&&s!=''?d+s+d:s}
	function getValue(s){return eval(s).replace(/ +$/,'')/*.replace(/\&/g,'%26')*/}
  function sqlValue(s,d,c,o){return (o.indexOf('noquo')==-1?'\'':'')+sqlFormat( c.indexOf('like')>=0 ? '%'+capValue(s,d)+'%' : (s=="''"?'':capValue(s,d)) )+(o.indexOf('noquo')==-1?'\'':'')}
  function getMValue(k,s,d,c){ // k=key{e.g. field1,field2,field3}, s=value_to_compare, d=delim, c={+=|+like|&=|&like}
    function dreplace(s,d1,d2){ var o='',ar=s.split(d1); for(var i=0;i<ar.length;i++)o+=ar[i]+(i<ar.length-1?(ar[i].indexOf('(')>=1?d1:d2):''); return o }
    var o='',ANDOR=c.indexOf('+')>=0?' OR ':' AND '
    var opt=getMField(1,k,':') // noquo;delim={ }
    c=c.replace(/\+/g,'').replace(/\&/g,'').replace(/(^ +)|( +$)/g,'') // clean '+', '&' & space padding from comparitor
    // s=s.replace(/([, ]+)/g,' ').replace(/(^ +)|( +$)/g,'') // unify delim & space padding
    if(opt.indexOf('delim=')==-1)opt+=';delim={,};delim={ }'
    var delim='', ar=opt.split(';')
    for(var i=0;i<ar.length;i++)
      if(ar[i].indexOf('delim=')>=0){
        var dtmp=ar[i].replace(/(delim=\{)|(\})/g,'')
        if(delim=='')delim=dtmp
        var re=new RegExp('(['+dtmp+']+)','g')
        s=s.replace(re,delim).replace(/(^ +)|( +$)/g,'') // unify delim & space padding
      }
    s=s.replace(new RegExp('(['+delim+']+)','g'),delim).replace(new RegExp('(^'+delim+'+)|('+delim+'+$)','g'),'') // unify delim & space padding
    // if(s)for(var ar=s.split(delim),s='',j=0;j<ar.length;j++) s+=(j>0?ANDOR:'')+getMField(0,k,':')+' '+c+' '+sqlValue(ar[j],d,c,opt)
    // return s
    var  arD=s.split(delim), kv=getMField(0,k,':'), ANDOR_K=getMField(0,kv,' ') // k=[and|or ]field1,field2,field3,... {default = and}
    if(kv.indexOf(' ')<0){ANDOR_K=' OR '}else{ANDOR_K=' '+ANDOR_K+' '; kv=getMField(1,kv,' ')}
    // var arK=kv.split(',')
    var arK=dreplace(kv,',','|').split('|')
    if(s)
      for(var j=0;j<arD.length;j++){ // delim
        for(var i=0,o2='';i<arK.length;i++) // fields
          o2+=(i>0?ANDOR_K:'')+arK[i]+' '+c+' '+sqlValue(arD[j],d,c,opt) // gen field permutations for one delim keyword
        o+=(j>0?ANDOR:'')+(arD.length>1?'(':'')+o2+(arD.length>1?')':'') // if more than 1 keyword, put result around parentheses
      }
    return o
  }
	this.val=new Array() // js value pointer (e.g. 'document.fm1.skills.value')
	this.cmp=new Array() // format: and|or [not] =|+=|like|+like|between
	this.cap=new Array()
	this.add=function(cmp,fn,val,cap){while(this.val[fn]){fn+=' '};this.val[fn]=val;this.cmp[fn]=cmp,this.cap[fn]=cap?cap:''} // e.g. add('and|or new'|'and|or like'|'and|or ='|..., 'TXT1', 'fm1.skills.value')
	this.out=function(cmp_top){
    if(!cmp_top)cmp_top='AND'
		var cmp,val,out=''
		for(var i in this.val){
      val=getValue(this.val[i])
//			if(eval(this.val[i]).length>0){ // if not blank
			if(val.length>0){ // if not blank
        cmp=this.cmp[i].replace(/(^ *and *)|(^ *or *)|( *not *)/gi,'') // cmp=comparator{=|+=|like|+like|between}
				if(this.cmp[i].indexOf('and')>=0){out+=(out.length>0?' AND ':'')}else{out+=(out.length>0?' OR ':'')}
        if(this.cmp[i].indexOf('not')>=0){out+='NOT '}
        if(this.cmp[i].indexOf('between')>=0){ // between {assume never capped}
          if(val.indexOf('and')==-1)cmp='>'    //   if val not {x and y}, change cmp to >
          out+=i+' '+cmp+' '+sqlFormat(val)
        }else if(this.cmp[i].indexOf('+')>=0 || this.cmp[i].indexOf('&')>=0){ // +=|+like or &=|&like
          // cmp=cmp.replace(/\+/g,'').replace(/(^ +)|( +$)/g,'') // clean '+' & space padding
          out+='('+getMValue(i,val,this.cap[i],cmp)+')'
        }else{                                 // =|like
//        val=getValue(this.val[i],this.cap[i])
          out+=getMField(0,i,':')+' '+cmp+' '+sqlValue(val,this.cap[i],cmp,getMField(1,i,':'))
        }
			}
		}
    return(out.length>0?' '+cmp_top+' ('+out+')':'')
	}
}

// -- gxListbox class -------------------------------------------------
function gxListbox(array,param,obj){
	this.array=array;	this.param=param;	this.obj=obj
	this.listbox=function(sel,pfx,x){var out='<select '+this.param+(x?' '+x:'')+'>';for(var i=0;i<this.array.length;i+=2){out+='<option value="'+this.array[i]+'"'+(sel==this.array[i]?' selected':'')+'>'+(pfx&&this.array[i]!=''?pfx.replace(/VAL/,this.array[i]):'')+this.array[i+1]+'</option>'};return out+'</select>'}
	this.selectedValue=function(){return eval(this.obj).options[eval(this.obj).selectedIndex].value}
	this.selectedText=function(){return eval(this.obj).options[eval(this.obj).selectedIndex].text}
	this.valueIndex=function(value){var obj=eval(this.obj); for(var i=0;i<obj.options.length;i++){if(obj.options[i].value==value)return i;};return 0}
	this.valueText=function(value){for(var i=0;i<this.array.length;i+=2){if(this.array[i]==value)return this.array[i+1];};return ''}
	this.selectValue=function(value){eval(this.obj).selectedIndex=this.valueIndex(value)}
	this.modValue=function(pat,arg){for(var i=0;i<this.array.length;i+=2)this.array[i]=pat.replace(/VAL/,this.array[i]).replace(/ARG/,arg)}
	this.reload=function(array){
		var lst=eval(this.obj); this.array=array
	  while(lst.length>0)lst.options[0]=null
	  for(var i=0;i<array.length;i+=2){lst.options[i/2]=new Option(array[i+1],array[i])}
	  if(lst.options[0]){lst.options[0].selected=true}
	}
}
function gxTextbox(fn,lst,sel){ // fieldname, gxListbox_object, other_selection_value
  this.textbox=function(x,v){
    return '<input type=text name="gx_'+fn+'" '+x+
      ' onchange=gxTextbox_onchange(this,"'+lst+'","'+sel+'")'+
      ' onkeyup=gxTextbox_onkeyup(this,"'+lst+'","'+sel+'")'+
      ' value="'+this.tvalue(v?v:'')+'"><input type=hidden name='+fn+' value="'+(v?v:'')+'">'
  }
  this.lvalue=function(v){return(eval(lst).valueText(v)==''?sel:v)}
  this.tvalue=function(v){return(eval(lst).valueText(v)==''?v:'')}
  this.value=function(v){return(eval(lst).valueText(v)==''?v:eval(lst).valueText(v))}
  this.onchange=function(lst){lst.form['gx_'+fn].value='';lst.form[fn].value=lst.options[lst.selectedIndex].value}
  this.refresh=function(){var v=da[fn].value; da['gx_'+fn].value=this.tvalue(v); eval(lst).selectValue(this.lvalue(v))}
}
function gxTextbox_action(){} // overloadable
function gxTextbox_onchange(txt,lst,sel){txt.form[txt.name.replace(/gx_/,'')].value=txt.value; eval(lst).selectValue(sel); gxTextbox_action(txt,lst,sel)}
function gxTextbox_onkeyup(txt,lst,sel){if(txt.form[txt.name].value!=''){gxTextbox_onchange(txt,lst,sel)}}

// -- General Functions -----------------------------------------------
function pgArray(n){var t=new Array;for(var i=0;i<n;i++)t[2*i]=t[2*i+1]=i+1;return t}

function execObj(){
  this.cmd=new Array()
  this.add=function(s){this.cmd[this.cmd.length]=s}
  this.run=function(a){for(var i=0;i<this.cmd.length;i++)eval(this.cmd[i].replace(/ARG/,a))}
}
var gInitList=new execObj()

var rootSkin='/sys/skin/',mySkin,thSkin,arSkin
function incSkin(f){dw('<'+'script src='+rootSkin+f.replace(/:/g,'/')+'/def.js><'+'/script>')}
function dwSkin(k,t,t2){var sn=(k.indexOf('::')==-1?mySkin+'_':'')+k.replace(/:+/g,'_').replace(/ +/g,''), cap=(k.indexOf('title')>-1?'':arSkin[mySkin]); arSkin[mySkin]=arSkin[sn+'2']; if(!t)t=''; if(!t2)t2=''; dw(cap+arSkin[sn].replace(/TAG/,t).replace(/TAG2/,t2))}
function aTag(name,url,img,img2,w,h,x,x2,x3){
  var txt='',mfx=''
  if(img2&&img2.indexOf('txt:')==0){txt=img2.replace(/txt:/,'');img2=''}
	if(img2&&img2!='')mfx='onmouseover="fi(\''+img2+'\',\''+name+'\');'+(x2?x2:'')+'" onmouseout="fi(\''+img+'\',\''+name+'\');'+(x3?x3:'')+'"'
	return '<A href="'+url+'" '+mfx+' '+(x?x:'')+'>'+(img!=''?'<IMG border=0 name="'+name+'" src="'+img+'"'+(w?' WIDTH='+w:'')+(h?' HEIGHT='+h:'')+(txt!=''?' hspace=3 align=absmiddle':'')+'>':'')+txt+'</A>'
}
function ATag(u,i,i2,w,h,x,x2,x3){return aTag(document.uniqueID,u,i,i2,w,h,x,x2,x3)} // IE Only

function getQueryItems(){
	var idx=document.URL.indexOf('?'),params=new Array()
	if(idx!=-1){var pairs=document.URL.substring(idx+1,document.URL.length).split('&')
		for(var i=0;i<pairs.length;i++){nameVal=pairs[i].split('=');params[nameVal[0]]=unescape(nameVal[1])}
	}return params
}
var queryItems=getQueryItems()

function getMField(n,s,d){if(!d)d='|';var ar=s.split(d);return(n<ar.length?ar[n]:'')}
function setMField(n,s,d,v){var ar=s.split(d); ar[n]=v; for(var i=0,s='';i<ar.length;i++)s+=ar[i]+(i<ar.length-1?d:''); return s}
function getVField(s,f,d){ // see testVField.asp for usage
  if(!d)d='|'
  s=d+s+d
  var p=s.indexOf(f+'=')
  if(p==-1)p=s.indexOf(f)
  if(p==-1)return ''
  var s2=s.substring(p+f.length,s.indexOf(d,p))
  if(s2.indexOf('=')==0)return s2.substr(1)
  return true
}
function setVField(s,f,v,d,fCap){
  if(!d)d='|'
  var ar=s.split(d)
  for(var i=0;i<ar.length;i++)if(ar[i].indexOf(f)==0)if(ar[i]==f||ar[i].charAt(f.length)=='=')break // i<ar.length if found
  ar[i]=v ? f+(typeof v=='boolean' && v==true?'':'='+v) : '' // replace key (i<ar.length) OR add to end (i==ar.length)
  s=ar.join(d)
  var d2=d.replace(/\|/g,'\\|')
  var re=new RegExp('^('+d2+')*|('+d2+')*$','gi') // remove cap delims
  var re2=new RegExp(d2+d2,'gi') // remove double delims
  var cap=fCap?d:''
  var out=s.replace(re,'').replace(re2,d)
  return out ? cap + out + cap : out
}

