//*********************************************************************
// Validation functions (validation.js)
// Purpose: Functions to perform all kinds of form element validations
// Copyright (C) 1999 CIT Small Business Lending Corp.
// modified by PVS 4/12/1999
//*********************************************************************

var required = new Array()
var min = new Array()
var max = new Array()
var minlen = new Array()
var maxlen = new Array()
var validate = new Array()
var crossvalidate = new Array()
var labels=new Array()
var errflg=false
var validationflg=false
var modflag=new Array()
var fieldmodflag=new Array()

if (ie) window.onload=callregister
function callregister() {
 return register(); 

}

function minmax(field,val) {//this is an object contructor
 this.name=field
 this.value=val
}

function strlen(field,val) {//this is an object contructor
 this.name=field
 this.length=val
}

function valfunc(field,func) {//this is an object contructor
 this.name=field
 this.func=func
}

function crossval(field1,field2,func) {//this is an object contructor
 this.name1=field1
 this.name2=field2
 this.func=func
}

function setLabel() { //form element name & label pairs
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
  j=i*2
  labels[arguments[j]]=arguments[j+1]
 }
}

function clearRequired(name) {//to remove required field from required array
 var len=required.length
 for (i=0;i<len;i++) {
  if (required[i]==name) required[i]='';
  }
}

function setRequired() {//could be a list of fields
 if (!validationflg) formsubmit();
 var len = arguments.length
  for (i=0;i<len;i++) {
   required[required.length]=arguments[i]
  }
}

function isRequired(name) {//check if a field is required
 var len=required.length
  for (i=0;i<len;i++) {
   if(required[i]==name) return true
  }
 return false
}

function checkRequired() {//loops thru required array to check for empty fields
 var len=required.length
 var obj,objval
 var len1,bchk=false
 for (i=0;i<len;i++) {
   if (required[i]!=''){
 	obj=getObject(required[i])
 	if (obj!=null &&obj.type!=null){ //added 6.3.99 PVS
 	 if (ns&& obj.type.indexOf('select')!=-1){ //PVS 7.1.99
	  objval=obj.options[obj.options.selectedIndex].value 
 	 } else { 
 	  objval=ltrim(obj.value) //added 6.18.99 PVS
 	 }
	 if(objval==""||objval==null) {
      label=labels[required[i]]
 	  if(label==""||label==null){label=obj.name}
 	  setError("Please enter a value for "+label+" field.")
     }
    }else { //added 6.3.99 PVS
     len1=obj.length
     for(var j=0;j<len1;j++) {
      if (obj[j].checked){
       bchk=true;
       break;
      }
     }
     if (!bchk) {
      label=labels[required[i]]
      setError("Please enter a value for "+label+" field.")
      }
    }
   }
 }
}

function setProtect() {//could be a list of fields
 if (!validationflg) formsubmit();
 var len = arguments.length
 for (i=0;i<len;i++) {
   if (getObject(arguments[i])) getObject(arguments[i]).onfocus=new Function('this.blur()')  
 }
}

function setMin() {//fields name, min value. Only for nos 
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
   j=i*2
   min[min.length]=new minmax(arguments[j],arguments[j+1])
 }
}

function setMinLength() {//fields name, min value. Only for strings
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
   j=i*2
   minlen[minlen.length]=new minmax(arguments[j],arguments[j+1])
 }
}

function checkMin() {
 var len=min.length
 var obj,val,objval
 for (i=0;i<len;i++) {
 	obj=getObject(min[i].name)
 	objval=obj.value
 	val=min[i].value
 	if (objval!="" && parseInt(Number(objval),10)<val){
	   setError("Minimum value for "+ getLabel(min[i].name) + " field is "+val)
	}
 }
}

function checkMinLen() {
 var len=minlen.length
 var obj,val,objval
 for (i=0;i<len;i++) {
 	obj=getObject(minlen[i].name)
 	objval=trim(obj.value)
 	val=minlen[i].value
	if(objval!="" && objval.length<val) {
	  setError("Please enter at least " + val + " characters in " + getLabel(minlen[i].name) + " field.")
	}
 }
}

function checkMax() {
 var len=max.length
 var obj,val,objval
 for (i=0;i<len;i++) {
 	obj=getObject(max[i].name)
 	objval=obj.value
 	val=max[i].value
 	if(objval!="" && parseInt(Number(objval),10)>val){
	  setError("Maximum value for "+ getLabel(max[i].name) + " field is "+val)	
	}
 }
}

function checkMaxLen() {
 var len=maxlen.length
 var obj,val,objval
 for (i=0;i<len;i++) {
 	obj=getObject(maxlen[i].name)
 	objval=trim(obj.value)
 	val=maxlen[i].value
	if(objval!="" && objval.length>val) {
	  setError("Please enter maximum of " + val + " characters in " + getLabel(maxlen[i].name) + " field.")
    }
 }
}

function checkValidate() {
 var len=validate.length
 var objname,func
 for (i=0;i<len;i++) {
    objname=validate[i].name
    func=validate[i].func   
    eval(func+'("'+objname+'")')
 }
}

function setMax() {//fields name, max value . Only for nos 
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
   j=i*2
   max[max.length]=new minmax(arguments[j],arguments[j+1])
 }
}

function setMaxLength() {//fields name, max value . Only for strings
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
   j=i*2
   maxlen[maxlen.length]=new minmax(arguments[j],arguments[j+1])
 }
}

function setValidate() {//fields name & validation function name pair
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/2,10)
 for (i=0;i<len;i++) {
   j=i*2
   validate[validate.length]=new valfunc(arguments[j],arguments[j+1])
 }
}

function setCrossValidate() {//2 field names & validation function name
 if (!validationflg) formsubmit();
 var len = parseInt(arguments.length/3,10)
 for (i=0;i<len;i++) {
   j=i*3
   crossvalidate[crossvalidate.length]=new crossval(arguments[j],arguments[j+1],arguments[j+2])
 }
}

function checkCrossValidate() {
 var len=crossvalidate.length
 var objname1,objname2,func
 for (i=0;i<len;i++) {
    objname1=crossvalidate[i].name1
    objname2=crossvalidate[i].name2
    func=crossvalidate[i].func
    eval(func+'("'+objname1+'","'+objname2+'")')
 }
}

function isEmail(name){
	var emailstr=getObject(name).value
	if ( emailstr != "" )
	{
		var emailPat=/^(.+)@(.+)$/
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
		var validChars="\[^\\s" + specialChars + "\]"
		var quotedUser="(\"[^\"]*\")"
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
		var atom=validChars + '+'
		var word="(" + atom + "|" + quotedUser + ")"
		// The following pattern describes the structure of the user
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
		/* The following pattern describes the structure of a normal symbolic
		   domain, as opposed to ipDomainPat, shown above. */
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")

		var matchArray=emailstr.match(emailPat)
		if (matchArray==null) {
		  /* Too many/few @'s or something; basically, this address doesn't
		     even fit the general mould of a valid e-mail address. */
			setError("Email address seems incorrect (check @ and .'s)")
			return; 
		}
		var user=matchArray[1]
		var domain=matchArray[2]

		// See if "user" is valid 
		if (user.match(userPat)==null) {
		    // user is not valid
		    setError("Email username doesn't seem to be valid.")
		    return; 
		}

		/* if the e-mail address is at an IP address (as opposed to a symbolic
		   host name) make sure the IP address is valid. */
		var IPArray=domain.match(ipDomainPat)
		if (IPArray!=null) {
		    // this is an IP address
			  for (var i=1;i<=4;i++) {
			    if (IPArray[i]>255) {
			        setError("Email destination IP address is invalid!")
				return; 
			    }
		    }
		    return; 
		}

		// Domain is symbolic name
		var domainArray=domain.match(domainPat)
		if (domainArray==null) {
			setError("Email domain name doesn't seem to be valid. Remove any extra spaces at the end of the email ID.")
		    return; 
		}

		/* domain name seems valid, but now make sure that it ends in a
		   three-letter word (like com, edu, gov) or a two-letter word,
		   representing country (uk, nl), and that there's a hostname preceding 
		   the domain or country. */

		/* Now we need to break up the domain to get a count of how many atoms
		   it consists of. */
		var atomPat=new RegExp(atom,"g")
		var domArr=domain.match(atomPat)
		var len=domArr.length
		if (domArr[domArr.length-1].length<2 || 
		    domArr[domArr.length-1].length>3) {
		   // the address must end in a two letter or three letter word.
		   setError("Email address must end in a three-letter domain, or two letter country.")
		   return; 
		}

		// Make sure there's a host name preceding the domain.
		if (len<2) {
		   setError("Email address is missing a hostname!")
		   return;
		}

		// If we've gotten this far, everything's valid!
		return;

	}
}

function getLabel(fieldnm) {
 var label=labels[fieldnm]
 if (label==""||label==null) {
  label=getObject(fieldnm).name
 }
 return label;
}

function isPhone(fieldnm) {
	var checkOK = "0123456789-- \t\r\n\f";
	var checkStr = getObject(fieldnm).value;
	var allValid = true;
	var len=checkStr.length
	
	for (k = 0;  k < len;  k++) {
	  ch = checkStr.charAt(k);
     if (checkOK.indexOf(ch)!=-1) {
 	     allValid=true
	  } else {
	    allValid=false
		 break
	  }
    }
    if (!allValid) {
		setError("Please enter only digit, whitespace and - characters in " + getLabel(fieldnm) + " field."); 
	   return false
	 }
   return true
}

function isDate(fieldnm) {
 var obj=getObject(fieldnm)
 var index1,index2
 var dt,mth,yr
 var fleapyr=false
 var datestr=obj.value
 var label=getLabel(fieldnm)
 
 if (datestr=="") return false
 
 index1=datestr.indexOf("/")
 if (index1<1 || index1>2){
	setError("Please enter date value in mm/dd/yyyy format in "+label+" field")
	return false;
 }
 mth=datestr.substring(0,index1)
 if (!checknum(mth)){
	setError("Please enter numerical value for month in "+label+" field")
	return false;
 }
 mth=parseInt(mth,10)
 if(mth<1 || mth>12) {
	setError("Please enter a month value between 1 and 12 in "+label+" field")
	return false
 }
		
 index2=datestr.indexOf("/",index1+1)
 if (index2<3 || index2>5){
	setError("Please enter date value in mm/dd/yyyy format in "+label+" field")
	return false;}
	
 dt=datestr.substring(index1+1,index2)
 if (!checknum(dt)){
	setError("Please enter numerical value for date in "+label+" field")
	return false;
 } 
 dt=parseInt(dt,10)
 yr=datestr.substring(index2+1,datestr.length)
 if (!checknum(yr)) {
	setError("Please enter numerical value for year in "+label+" field")
	return false
 }

 if (yr.length!=4) {
	setError("Please enter 4 digit year value in "+label+" field")
	return false;
 }
 yr=parseInt(yr,10)

 if (yr%4==0){
  maxdays=new Array(31,31,29,31,30,31,30,31,31,30,31,30,31)
  fleapyr=true
 } else {
  maxdays=new Array(31,31,28,31,30,31,30,31,31,30,31,30,31)
 }

 if (dt>maxdays[mth]||dt<1){
  setError("Please enter correct date value for the month in "+label+" field")
  return false
 }
 return true;
}

function isGEtoday(fieldnm){
 var todaydt=new Date();
 var dt=getObject(fieldnm).value
 if (dt==null||dt=='') return true;
 var fielddt = new Date(dt+" 23:59:59");
 if (fielddt.getTime()>=todaydt.getTime()){ return true}
 else {	setError("The date value in "+getLabel(fieldnm)+" field should be same or past today's date");
		return false};
}

function isGTtoday(fieldnm){
 var todaydt=new Date();
 var dt=getObject(fieldnm).value
 if (dt==null||dt=='') return true;
 var fielddt = new Date(dt);
 if (fielddt.getTime()>todaydt.getTime()){ return true}
 else { setError("The date value in "+getLabel(fieldnm)+" field should be past today's date");
		return false};
}


function isLEtoday(fieldnm){
 var todaydt=new Date();
 var dt=getObject(fieldnm).value
 if (dt==null||dt=='') return true;
 var fielddt = new Date(dt);
 if (fielddt.getTime()<=todaydt.getTime()){ return true}
 else { setError("The date value in "+getLabel(fieldnm)+" field should be prior to or same as today's date");
		return false};
}

function isLTtoday(fieldnm){
 var todaydt=new Date();
 var dt=getObject(fieldnm).value
 if (dt==null||dt=='') return true;
 var fielddt = new Date(dt+" 23:59:59");
 if (fielddt.getTime()<todaydt.getTime()){ return true}
 else {	setError("The date value in "+getLabel(fieldnm)+" field should be prior to today's date");
		return false};
}

function checknum(numstr) {
 if (isNaN(parseInt(Number(numstr),10))){
	  return false
 } else {
	return true
 }
}

function isNumber(fieldnm) {
 var numstr=getObject(fieldnm).value
 if (isNaN(parseInt(Number(numstr),10))){
	setError("Please enter a numeric value in "+getLabel(fieldnm)+" field")
	return false
  }
 return true
}

function isPosInteger(fieldnm) {
 val=getObject(fieldnm).value
 if(isNumber(fieldnm)) {
   if(parseInt(Number(val),10)>=0) { 
	return true
    } else {
	setError("Please enter a positive numeric value in "+getLabel(fieldnm)+" field")
	return false
    }
  }
}

function isGTE(fieldnm1,fieldnm2) {
 var val1=parseInt(Number(getObject(fieldnm1).value),10)
 var val2=parseInt(Number(getObject(fieldnm2).value),10)
 if (val1==0 && val2==0) return false
 if (val1<val2){
	setError("The value in  "+getLabel(fieldnm1)+" field should be greater than or equal to "+getLabel(fieldnm2)+" field")
	return false
  }
 return true
}

function isGT(fieldnm1,fieldnm2) {
 var val1=parseInt(Number(getObject(fieldnm1).value),10)
 var val2=parseInt(Number(getObject(fieldnm2).value),10)
 if (val1==0 && val2==0) return false
 if (val1<=val2){
	setError("The value in  "+getLabel(fieldnm1)+" field should be greater than  "+getLabel(fieldnm2)+" field")
	return false
  }
 return true
}

function isEQ(fieldnm1,fieldnm2) {
 var val1=parseInt(Number(getObject(fieldnm1).value),10)
 var val2=parseInt(Number(getObject(fieldnm2).value),10)
 if (val1==0 && val2==0) return true
 if (val1!=val2){
	setError("The value in "+getLabel(fieldnm1)+" field should be same as "+getLabel(fieldnm2)+" field")
	return false
  }
 return true
}

function isNEQ(fieldnm1,fieldnm2) {
 var val1=parseInt(Number(getObject(fieldnm1).value),10)
 var val2=parseInt(Number(getObject(fieldnm2).value),10)
 if (val1==0 && val2==0) return false
 if (val1==val2){
	setError("The value in "+getLabel(fieldnm1)+" field should not be the same as "+getLabel(fieldnm2)+" field")
	return false
  }
 return true
}

function isSame(fieldnm1,fieldnm2) {
 var val1=getObject(fieldnm1).value
 var val2=getObject(fieldnm2).value
 if (val1!=val2){
	setError("The value in "+getLabel(fieldnm1)+" field should be same as "+getLabel(fieldnm2)+" field")
	return false
  }
 return true
}

function isdateGE(fieldnm1,fieldnm2) {
 var dt1=getObject(fieldnm1).value;
 var dt2=getObject(fieldnm2).value;
 if (dt1==null||dt1==''||dt2==null||dt2=='') return true;
 var fielddt1 = new Date(dt1);
 var fielddt2 = new Date(dt2);
 if (fielddt1.getTime()>=fielddt2.getTime()){ return true}
 else {	setError("The date value in "+getLabel(fieldnm2)+" field should be same or prior to "+getLabel(fieldnm1)+ " field");
		return false};
}

function isdateGT(fieldnm1,fieldnm2) {
 var dt1=getObject(fieldnm1).value;
 var dt2=getObject(fieldnm2).value;
 if (dt1==null||dt1==''||dt2==null||dt2=='') return true;
 var fielddt1 = new Date(dt1);
 var fielddt2 = new Date(dt2);
 if (fielddt1.getTime()>fielddt2.getTime()){ return true}
 else { setError("The date value in "+getLabel(fieldnm2)+" field should be prior to "+getLabel(fieldnm1)+ " field");
		return false};
}

function clearModify(docstr) {
 var totelem,str
 var docobj=eval(docstr)
 var len=docobj.forms.length
 for (i=0;i<len;i++) {
  modflag[i] =false
  totelem=docobj.forms[i].elements.length
  for (j=0;j<totelem;j++) {
   elemnt=docobj.forms[i].elements[j]
   str=docstr+".forms["+i+"].elements["+j+"]"
   switch (elemnt.type) {
	case 'checkbox':
	 elemnt.onclick=new Function('return setModified('+str+')')
	 break
	case 'radio':
	 elemnt.onclick=new Function('return setModified('+str+')')
	 break
	case 'text':
	 elemnt.onchange=new Function('return setModified('+str+')')
	 break
	case 'textarea':
	 elemnt.onchange=new Function('return setModified('+str+')')
	 break
	case 'password':
	 elemnt.onchange=new Function('return setModified('+str+')')
	 break
	case 'select-one':
	 elemnt.onchange=new Function('return setModified('+str+')')
	 break
	case 'select-multiple':
	 elemnt.onchange=new Function('return setModified('+str+')')
 	 break
    }
   }
 }
}

function formvalidate() {
 checkRequired();
 checkMin();
 checkMax();
 checkMinLen();
 checkMaxLen();
 checkValidate();
 checkCrossValidate();
 postvalidate();
 if (errflg) {
  errmsg()
  return false
 } else {
  return true
 }
}

function formsubmit(docstr) {
 if (docstr==null) docstr='window.document'
 var docobj=eval(docstr)
 if(!docobj) {
   docobj=window.document
 }
 var len=docobj.forms.length
 validationflg=true
 clearModify(docstr)
 for (i=0;i<len;i++) {
    docobj.forms[i].onsubmit=formvalidate
 }
 if(ns) {
  var j
  var len1=docobj.layers.length
  if (len1>0) {
   for (j=0;j<len1;j++) {
    if (eval(docstr+'.layers['+j+']').visibility!="hide") formsubmit(docstr+'.layers['+j+'].document')
   }
  } else {return }
 }
 return 
}

function isModified(objnm) {
 if (fieldmodflag[objnm]) {
   return fieldmodflag[objnm]
  } else {
   return false
  }
}

function isformModified(formobj) {
 var iend=document.forms.length
 for (i=0;i<iend;i++) {
	if (document.forms[i]==formobj){ return modflag[i]}	
 }
}

function setModified(field) {
 if (!postmodified(field)){ return false}
 var fieldnm=eval(field).name
 fieldmodflag[fieldnm]=true
 var iend=document.forms.length
 var dirty=false
 for (i=0;i<iend;i++) {
  jend=document.forms[i].elements.length
  for (j=0;j<jend;j++){
    if (document.forms[i].elements[j]==field){ 
		modflag[i]=true
		dirty=true
		break
    }	
  }
  if(dirty) break;
 }
 return true;
}

function msgbox(msg) {
 alert(msg);
}

function newwin(w,h,name) {
 var winstr='scrollbars,resizable,width='+w+',height='+h
 if (ns){
  winstr+=',screenX='+Math.round((screen.availWidth-w)/2)
  winstr+=',screenX='+Math.round((screen.availHeight-h)/2)
 }  else if(ie) {
  winstr+=',left='+Math.round((screen.availWidth-w)/2)
  winstr+=',top='+Math.round((screen.availHeight-h)/2)
 }
 var win=open("error.htm",name,winstr)
 return win
}

var errormsg=""
function setError(msg) {
 errflg=true
 errormsg+="<tr><td bgcolor='#efefef' colspan=3><font color='red' size=2 face='verdana,Arial, Helvetica, sans-serif'>&#149;&nbsp;"+msg+"</font></td></tr>"
}

//var errwin
function errmsg(){
 //if (!errwin) {top.errwinno++;var nm='Error'+top.errwinno;alert(nm);errwin=newwin(450,300,nm)}
 top.errwinno++;
 var nm='Error'+top.errwinno;
 //alert(nm);
 errwin=newwin(450,350,nm)
 var errHTML

 //errHTML = '<HTML><HEAD><TITLE>Error Message</TITLE></HEAD>'
 //errHTML+='<BODY><script language=Javascript>var parentwin</script>'
 //errHTML+='<b>'+errormsg+'</b>'

errHTML='<form name="form1"><table width="100%" border=0 bgcolor="#999999" cellspacing=1 cellpadding=0 >'
errHTML+='<tr><td bgcolor="#dddddd" colspan=3><font color="#ef9408" size=3 face="verdana,Arial, Helvetica, sans-serif"><b>Error List</i></font></td></tr>'
errHTML+='<tr height=15 bgcolor="white"><td colspan=3 >&nbsp;</td></tr>'+errormsg+'<tr  bgcolor="white"><td colspan=3>&nbsp;</td></tr>'
errHTML+='<tr bgcolor="white"><td width="25%">&nbsp</td><td align=center bgcolor="#dddddd"><a style="text-decoration:none" href="javascript:parent.close();"><font color="#ef9408" size=2 face="verdana,Arial, Helvetica, sans-serif"><b>>> CLOSE <<</b></font></a></td><td width="30%">&nbsp;</td></tr></table></form>'

 //errHTML+='</BODY></HTML>'
 while(true){
  if (errwin.document) {
   errwin.document.clear();
   errwin.document.write(errHTML);
   //errwin.parentwin=window;
   errwin.document.close();
   break;
  }
 }
 errormsg=""
 errflg=false
 errwin.focus()
 return errwin
}
