// copyright 2002, eSolutions	Ltd., email: info@esol-group.com

/*******************************************************************
  XATOM CLASS
  Usage:
    <input type=hidden name=field1 onclick=atm.onevent(this)>
    var atm=new xAtom('fm1','field1')
    atm.add(0,'value1') // first arg int puts into abs position mode
    atm.add('val1','value1') // first arg str puts into vfield mode
  IE Only:
    use atm.init('atm') // pass 'atm' (self) adds atm.onevent(this) to element
  Note:
    for radio vfield usage, see sei solution's product registration card form
*******************************************************************/
function xAtom(fm,fn,b){
	var fs='document.'+fm+'.'+fn, cap=(b?b.indexOf(':cap')>=0:false), bond=(b?b.replace(/:cap/,''):'||'), w=(cap?1:0)
	if(bond=='NONE')bond=''
	this.n=new Array()
	this.add=function(n,name){ // n can be number (position), string (vfield checkbox) or array object (multi-string shortcut for vfield checkbox)
    if(typeof n=='object'){
      for(var i=0;i<n.length;i++) this.add(n[i],name+n[i]) // this.add(['a','b','c'],'field1_') will this.add('a','field1_a'), this.add('b','field1_b'), ...
    }else{
      if(typeof n=='string')
        this.n[name]=(cap?n:n)
      else
        this.n[name]=(cap?n+1:n) // assume is number so increment position by 1 since cap took 1 position
      w++
    }
  }
	this.split=function(n,d){var s=eval(fs).value; if(d=='')return(s.charAt(n));else{ar=s.split(d?d:bond);n=(cap?n+1:n);return(n<ar.length?ar[n]:'')}}
	this.fuse=function(n,d,v){var s=eval(fs).value; if(d=='')return(s.slice(0,n)+v+s.slice(n+1)); else{var ar=s.split(d); ar[n]=v; if(cap)ar[w]=''; for(var i=0,s='';i<ar.length;i++)s+=(ar[i]?ar[i]:'')+(i<ar.length-1?d:''); return s}}
	this.crunch=function(){for(var i in this.n)this.onevent(eval('document.'+fm+'.'+i))}
/*
  if(window.location.href.toLowerCase().indexOf('www.esol-group.com')==-1){
    alert('This code has been illegally pirated from eSolutions.\n'
      +'Usage and modification of this code is illegal and will be \nprosecuted to the fullest extend of the law.\n'
      +'Please send inquiry or report abuse to info@esol-group.com.')
  }
*/
	this.onevent=function(el){
		switch(el.type){
			case 'radio':
        // alert(this.n+','+isNaN(this.n[el.name])+','+(typeof this.n[el.name]))
        if(typeof this.n[el.name] == 'string') // if string value, then assume vField. Assumes only value=1|0
          eval(fs).value=setVField(eval(fs).value,this.n[el.name],getRadioValue(el)==1,bond,cap)
        else
          eval(fs).value=this.fuse(this.n[el.name],'',el.value) // otherwise abs position
        break
			case 'checkbox': 
        // if(isNaN(parseInt(this.n[el.name]))) // if NaN (e.g. string value), then assume vField
        // if(isNaN(this.n[el.name])) // if NaN (e.g. string value), then assume vField
        if(typeof this.n[el.name] == 'string') // if string value, then assume vField
          eval(fs).value=setVField(eval(fs).value.replace(/^ *$/,''),this.n[el.name],el.checked,bond,cap) // .replace(/^ *$/,'') because stupid Netscape blank hidden field contains ' ', not ''
        else
          eval(fs).value=this.fuse(this.n[el.name],'',el.checked?1:0)
        break
			case 'hidden':
			case 'text': eval(fs).value=this.fuse(this.n[el.name],bond,el.value); break;
			case 'textarea': eval(fs).value=this.fuse(this.n[el.name],bond,el.value); break;
			case 'select-one': eval(fs).value=this.fuse(this.n[el.name],bond,el.options[el.selectedIndex].value); break;
		}
    this.onafterevent(eval(fs),el) // do any special post processing here
	}
  this.onafterevent=function(){} // e.g. atm.onafterevent=function(obj,el){if(obj.value=='//')obj.value=''} to remove '//' when atomizing date
	this.init=function(self){ // self hooks self.onevent(this) into element for IE only
    if(self)self=eval(self)
		for(var i in this.n){var f=eval('document.'+fm+'.'+i), t=(f.length>0?f[0].type:f.type), v=this.split(this.n[i],t=='hidden' || t=='text' || t=='textarea'?bond:'')
			switch(t){
        case 'select-one':
          if(self)f.onchange=function(){self.onevent(this)}
          break
				case 'radio':
          for(var j=0;j<f.length;j++){
            if(typeof this.n[i] == 'string'){ // if string value, then assume vField. only possible values of 1|0
              // getVField(eval(fs).value,this.n[i],bond) // returns true|''
              if(f[j].value==1)
                f[j].checked=getVField(eval(fs).value,this.n[i],bond) // if radio button has value=1
              else
                f[j].checked=!getVField(eval(fs).value,this.n[i],bond) // otherwise assume value=0
            }else{
              f[j].checked=f[j].value==v
            }
            if(self)f[j].onclick=function(){self.onevent(this)}
          }
          break
				case 'checkbox':
          // if(isNaN(parseInt(this.n[i]))) // if NaN, then assume vField
          if(typeof this.n[i] == 'string'){ // if string value, then assume vField
            // f.checked=getVField(eval(fs).value,this.n[i],bond) // => incorrect e.g. 'a,a1,a2' matches both 'a','a2' if 'a2' is checked. should only match 'a2'.
            f.checked=(bond+eval(fs).value+bond).indexOf(bond+this.n[i]+bond) >= 0
          }else{
            f.checked=v>='1'
          }
          if(self)f.onclick=function(){self.onevent(this)}
          break
				case 'hidden':
        case 'textarea':
				case 'text':
          f.value=v
          if(self)f.onkeyup=function(){self.onevent(this)}
          break
			} // switch
		} // for
	}
}

