//DEFAULTS

debugpost=0;
auditelement1='';
auditelement2='';
changecolor='red';
overrowcolor='lightskyblue';
overcellcolor='deepskyblue';

String.prototype.trim = function() {return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');}
String.prototype.ltrim = function() {return this.replace(/^\s+/,"");}
String.prototype.rtrim = function() {return this.replace(/\s+$/,"");}

function trim(s) {return s.replace(/^\s\s*/, '').replace(/\s\s*$/, '');}

function $() {
 var elements = new Array(),i,element;
 for (i = 0; i < arguments.length; i++) {
  element = arguments[i];
  if (typeof element == 'string') element = document.getElementById(element);
  if (arguments.length == 1) return element;
  elements.push(element);
 }
 return elements;
}

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};

function setvis(objectid,vis) {
 var disp=""; 
 if (vis==0) {disp="none"}; 
 if (document.getElementById && $(objectid) != null) $(objectid).style.display=disp;
 else if (document.layers && document.layers[objectid] != null) document.layers[objectid].display=disp;
 else if (document.all) document.all[objectid].style.display=disp;}

// Remove existing content of an element
function clearChildNodes(elemID) {var elem = $(elemID); while (elem.childNodes.length > 0) {elem.removeChild(elem.firstChild);}}

function posterrordefault(xmlhttp) {
 alert("**** HTTP POST ERROR ****\n"+xmlhttp.responseText);
}

var dmsg='';
function makepostrequest(url, parameters, callbackfunc,errorfunc) {
 var async = false, xmlhttp = null, usercallback = null, usererror = null, success = false; 
 dmsg ='';
 if (auditelement1>'') {$(auditelement1).innerHTML='PostURL: '+url+"\nParams:  "+parameters+"\n";}
 if (auditelement2>'') {dmsg='Waiting...';$(auditelement2).innerHTML=dmsg;}

 if (window.XMLHttpRequest) {
  xmlhttp = new XMLHttpRequest();if (xmlhttp.overrideMimeType) {xmlhttp.overrideMimeType('text/html');}
 } else if (window.ActiveXObject) {
  try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}}
 }
 if (xmlhttp) {
  if (errorfunc) {usererror=errorfunc;} else {if (debugpost!=0) {usererror=posterrordefault;}}
  if (callbackfunc) {
    usercallback = callbackfunc; async=true;
    xmlhttp.onreadystatechange = function () {
     if (auditelement2>'') {dmsg=dmsg+"["+xmlhttp.readyState+"]"; $(auditelement2).innerHTML=dmsg;}
     if (xmlhttp.readyState == 4) {
//      if (auditelement2>'') {dmsg=dmsg+"["+xmlhttp.readyState+"]"+xmlhttp.responseText.substr(0,5000); $(auditelement2).innerHTML=dmsg;}
      if ((xmlhttp.status == 200)||(xmlhttp.status == 0)) {
        if (auditelement2>'') {dmsg=dmsg+"\nDone:"+xmlhttp.readyState+':'+xmlhttp.status+'\n'+xmlhttp.responseText.substr(0,4000); $(auditelement2).innerHTML=dmsg;}
        usercallback(xmlhttp);} 
      else {if (usererror) {usererror(xmlhttp);}

      }
     }
    }
  } else {async=false;}  
  xmlhttp.open('POST',url,async);
  xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//  xmlhttp.setRequestHeader("Content-length", parameters.length);
//  xmlhttp.setRequestHeader("Connection", "close");
  xmlhttp.send(parameters);
  return xmlhttp;
 } else {return null;}
}

function makegetrequest(url, callbackfunc) {
 var async = true; var xmlhttp = null;  var usercallback = null;
 if (window.XMLHttpRequest) { 
  xmlhttp = new XMLHttpRequest();if (xmlhttp.overrideMimeType) {xmlhttp.overrideMimeType('text/html');}
 } else if (window.ActiveXObject) {
  try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}}
 }

 if (xmlhttp) { 
  if (callbackfunc) {
    usercallback = callbackfunc; async=true;
    xmlhttp.onreadystatechange = function () {
     if (xmlhttp.readyState == 4) {if ((xmlhttp.status == 200)||(xmlhttp.status == 0)) {usercallback(xmlhttp);}} 
    }
  } else {async=false;}  

  xmlhttp.open('GET',url,async);
  xmlhttp.send(null);
  return xmlhttp;
 } else {return null;}

}


function ckerr(res) {
 if (res === undefined) {res='';}
 if ((res.substring(0,6)=='<br />')||(res.substring(0,1)=='*')) {alert(res); return false;} else {return true;}
}

function clearnode(elem,isbranch) {
 while (elem.childNodes.length>0) {clearnode(elem.firstChild,true);}
 try {elem.innerHTML='';} catch (error) {}
 if (isbranch) {elem.parentNode.removeChild(elem);}
}

//tabdelim to array[ln0..n,fld0..n]
function loadarray(a,txt) {
 var lns,n,i;
 a.length=0;
 lns=txt.split('\n');
 for (n=0; n<lns.length-1; n++) {
  flds=lns[n].split('\t');
  a[n]=new Array();
  for (i=0; i<flds.length; i++) {a[n][i]=flds[i]}
 }
}

function getfvalues(fobj,changed) {
 var str='',v='',i,current;
 for(i = 0;i < fobj.elements.length;i++) {
  v=''; current=fobj.elements[i];
  if ((changed==0)||(current.style.color==changecolor)) {
   try {
    v=current.id.replace('.','_');
    switch(current.type) { 
     case "text": case "hidden": case "password": case "textarea": 
      v += '='+encodeURIComponent(current.value); break; 
     case "select-one": 
      v += '='+encodeURIComponent(current.options[current.selectedIndex].value); break;
     case "select-multiple": 
      break; //for (var j=0; j<el.options.length; j++) {if (el.options[j].selected) {this.addField(el.name,el.options[j].value);}} break;
     case "button": case "submit": case "reset": case "file": case "image":
      break;
     case "checkbox": case "radio": 
      if (current.checked) {v += '=1';} else {v += '=0';}  break;
     default: 
      alert('?GetElementType:'+v+':'+current.type); break;
    }
   } catch(e) {alert('?GetElement '+v);} 
   if (v) {str += '&' + v};
  }
 } 
 return str.substr(1);
}

function setfvalues(fobj,vals) {
 var x=vals.split("`"), v='', i,n,current;
 for (i=0; i<x.length; i++) {
  v=''; current=fobj.elements[i];
  try {
   v=current.id;
   switch(current.type) {
    case "text": case "hidden": case "password": case "textarea": current.value=x[i]; break;
    case "checkbox": current.checked=((x[i]=='1')||(x[i]=='True'))?true:false; break;
    case "select-one": current.selectedIndex=0;for (n = 0; n < current.length; ++n) if (current[n].value == x[i]) current.selectedIndex = n; break;
    default: alert('?SetElementType:'+v+':'+current.type+':'+x[i]); break;
   }
  } catch(e) {alert('?SetElement '+v);}
 }
}

function tmint(intime) {
 if (intime<'0') {s=-1;
 } else {
  var d='0123456789:',p,n,t,s='';
  intime=intime.toUpperCase();
  if (intime.indexOf('P')>0) {p=1;} else {p=0;}
  for (n=0; n<intime.length; n++) {if (d.indexOf(intime.charAt(n))>=0) {s=s+intime.charAt(n);}}
  s=s+':0:0';
  s=s.split(':');
  t=(1*s[0]);
  if ((p==1)&&(t<12)) {t=t+12;}
  if ((p==0)&&(t==12)) {t=0;}
  s=(1*t)*100+(1*s[1]);
 }
 return s;
}
function tmstr(intime) {
 if (intime<0) {t='';
 }else {
  var h=Math.floor(intime/100),p,t;
  if (h>11) {p=1; if (h>12) {h=h-12;}} else {p=0; if (h==0) {h=12;}}
  h=10000+(h*100)+(intime%100); h=''+h;
  t=h.substr(1,2)+':'+h.substr(3,2);
  if (p==1) {t=t+' PM';} else {t=t+' AM';}
 }
 return t
}
function dateint(indate) {
 if (indate=='') {
  var today=new Date();
  return (today.getFullYear()*10000)+((today.getMonth()+1)*100)+today.getDate();
 } else { 
  var d=indate.split('/');
  if ((d[2]*1)<50) {d[2]=2000+(d[2]*1);}
  if ((d[2]*1)<100) {d[2]=1900+(d[2]*1);}
  return (d[2]*10000)+(d[0]*100)+(d[1]*1);
 }
}
function datefmt(indate) {
 if (indate!='')  {
  da=indate.split('/');
  m=da[0]*1; d=da[1]*1; y=da[2]*1; 
  if (y==0) {y=2007;}
  if (y<50) {y=y+2000}; if (y<100) {y=y+1900};
  if ((da.length!=3)||(m<1)||(m>12)||(d<1)||(d>31)||(y<1900)||(y>2019)) {alert(indate+' is not a valid date');}
  return ""+m+"/"+d+"/"+y;
 } else {return "";}
}

function heightfmt(inheight) {
 var c='', feet=''; inches=''; digits=('0','1','2','3','4','5','6','7','8','9','.'); seps=('F',"'",',','/','-');
 inheight=inheight.toUpperCase();
 for (var i =0; i<inheight.length; i++) {
  c=inheight.charAt(i);
  if (((c>='0')&&(c<='9'))||(c=='.')) {inches=inches+c;}
  if ((c=='F')||(c=="'")||(c==',')||(c=='/')||(c=='-'))   {feet=inches; inches='';}
 }
 feet=1*feet; inches=1*inches;
 if ((feet<1)&&(inches<12)) {feet=inches; inches=0;}
 inheight=12*feet+inches;
 return inheight;
}

function numfmt(innum) {
 digits=('0','1','2','3','4','5','6','7','8','9','.');
 var c='', n='';
 for (var i =0; i<innum.length; i++) {
  c=innum.charAt(i);
  if (((c>='0')&&(c<='9'))||(c=='.')) {n=n+c;}
 }
 return n;
}

/*
function formatNumber(num,dec,thou,pnt,curr1,curr2,n1,n2) {
 var x = Math.round(num * 1 * Math.pow(10,dec));
 if (x >= 0) n1=n2='';
 var y = (''+Math.abs(x)).split('');
 var z = y.length - dec; 
 if (z<0) z--; 
 for(var i = z; i < 0; i++) y.unshift('0');
 y.splice(z, 0, pnt); 
 while (z > 3) {z-=3; y.splice(z,0,thou);}
 var r = curr1+n1+y.join('')+n2+curr2;
 return r;
}
*/
function fillselect(s,vals,sep) {
 if (!(sep>"")) {sep=",";}
 s.options.length=0; var c=vals.split(sep);
 for (var n=0; n<c.length; n++) {
   var v=c[n].split(':'); 
   if (v.length<2) {v[1]=v[0]};
   s.options[s.length] = new Option(v[1],v[0]);
 }
}
function setselect(s,desc) {
 var l=s.options.length; var found=false;
 for (var n=0; n<l; n++) {
  if ((s.options[n].text==desc)||(s.options[n].value==desc)||((n==0)&&(desc==''))) {
   s.options[n].selected=true; found=true;
  }
 }
 if (found==false) {
  var dl=desc.length;
  for (var n=0; n<l; n++) {
   if ((s.options[n].text.substring(0,dl)==desc)||(s.options[n].value==desc)||((n==0)&&(desc==''))) {
    s.options[n].selected=true; found=true;
   }
  }
 }
 if (found==false) {
  s.options[s.length] = new Option(desc,desc);
  s.options[s.length-1].selected=true;
 }
// s.value=s.options[s.selectedIndex].text;
}
function getselect(s) {
 v=s.options[s.selectedIndex].value;
 return v;
}

function qoverrow(e) {var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target}; sender.parentNode.style.backgroundColor=overrowcolor;}
function qoutrow(e) {var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target}; sender.parentNode.style.backgroundColor='';}
function qovercell(e) {var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target}; sender.parentNode.style.backgroundColor=overrowcolor; sender.style.backgroundColor=overcellcolor;}
function qoutcell(e) {var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target}; sender.parentNode.style.backgroundColor=''; sender.style.backgroundColor='';}
function qclickrow(e) {
 var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target};
 var r=sender.parentNode.rowIndex;
 if (sender.tagName=='TH') {} else {qclick(r);}
// alert('click '+sender.tagName+ ' row'+r);
}
function qclickcell(e) {
 var sender; if (window.event) {sender=window.event.srcElement} else {sender=e.target};
 var c=sender.cellIndex; var r=sender.parentNode.rowIndex;
 if (sender.tagName=='TH') {} else {qclick(r,c);}
// alert('click '+sender.tagName+ ' row'+r+' column'+c);
}

function qinit(tblid,startrow,startcol) { 
//must define a function qclick(rowwnum,colnum)
//leave off startcol to just highlight rows - then define qclick(rownum)

 var t=$(tblid),rw,r,c; 
 t.style.cursor="pointer"; t.style.tableLayout="fixed";
 for (rw=startrow; rw<t.rows.length; rw++) {
  var r=t.rows[rw];
  if (startcol>"") {
   for (c=startcol; c<r.cells.length; c++) {r.cells[c].onmouseover=qovercell; r.cells[c].onmouseout=qoutcell; r.cells[c].onclick=qclickcell;}
  } else {
   r.onmouseover=qoverrow; r.onmouseout=qoutrow; r.onclick=qclickrow;
  }
 }
}

function qinitrows(tblid) { //must define a function clickfunc(rownum)
 t=$(tblid); t.style.cursor="pointer"; t.style.tableLayout="fixed"; 
 for (n=1; n<t.rows.length; n++) {t.rows[n].onmouseover=qoverrow; t.rows[n].onmouseout=qoutrow; t.rows[n].onclick=qclickrow;}
}
function qinitcells(tblid,startcol) { //must define a function clickfunc(cellnum,rownum)
 t=$(tblid); t.style.cursor="pointer"; t.style.tableLayout="fixed";
 for (n=1; n<t.rows.length; n++) {
  var r=t.rows[n]; for (var c=startcol; c<r.cells.length; c++) {r.cells[c].onmouseover=qovercell; r.cells[c].onmouseout=qoutcell; r.cells[c].onclick=qclickcell;}
 }
}

function activatetab(tab) {
 if ((tab)&&(tab.tagName=='A')) {
  var t=tab.parentNode.parentNode.getElementsByTagName('A');
  for (var n=0; n<t.length; n++) {t[n].className="";}
  tab.className="active";
 }
}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

function setleft(object,pos) {
 if (document.getElementById && document.getElementById(object) != null) node = document.getElementById(object).style.left=pos;
 else if (document.layers && document.layers[object] != null) document.layers[object].left=pos;
 else if (document.all) document.all[object].style.left=pos;}

var divxpos="0px";

function showdiv(divid) {
 var l=divid.length-1;
 var dv=document.getElementsByTagName('div');
 for (var i = 0; i < dv.length; i++) {
  var d=dv[i];
  if (d.id==divid) {setleft(divid,divxpos);} else {
   if (d.id.substring(0,l) == divid.substring(0,l)) {setleft(d.id,"-5000px")}
  }
 }
}

function popopen(popdiv) {
 if (!document.getElementById('popshim')) {
  var d=document.createElement("div");
  d.id='popshim';
  document.body.appendChild(d);
 }
 $(popdiv).style.zIndex="1000";
 showdiv(popdiv);
 setleft(popdiv,'10px');
 setleft('popshim','0px');
 e=$(popdiv).getElementsByTagName('FORM');
 if (e) {e=e[0];} 
 if (e) {
   try {e.elements[0].focus();} catch(err) {}
 }
}

function popclose() {
 if (!document.getElementById('popshim')) {
  var d=document.createElement("div");
  d.id='popshim';
  document.body.appendChild(d);
 }
 showdiv('popz');
 setleft('popshim','-5000px');
}

function st(msg) {
 if (!document.getElementById('stdiv')) {
  var d=document.createElement("div");
  d.id='stdiv';
  document.body.appendChild(d);
 }
 $('stdiv').innerHTML=msg;
}

