

function FormValidation(FormObj) {
   // Run through each text field in this form and call the field validation code
   // Assumes each field has a validation function named the same as the field name
   var Name,CleanName,i,Char;
   for (i=0;i<FormObj.length;i++){
      if ('text'    == FormObj.elements[i].type ||
          'textarea'== FormObj.elements[i].type){ // validate only the text fields
         Name=FormObj.elements[i].name;
         CleanName=Name+"1"; // Field Name changed slightly so not same as field name
         //alert('Processing:'+ CleanName+"(FormObj."+Name+")")
         if (!eval(CleanName+"(FormObj."+Name+")")) return false; // If field fails validation, stop
      }
   }
   if (CustomValidation(FormObj)) return true; // Supplied by programmer; Custom for each form
   return false;
}

function ErrorMsg(FormObj,Text){
   if(confirm(Text)){
    var FocusCode="document."+(FormObj.form.name)+"."+FormObj.name+".focus()"
    setTimeout(FocusCode,50) // need to wait for tab key to finish transfer before jumping back 
   } 
}

function StripNum(Val)   {
   //  Remove decorations (commas, dollar signs) from number
   var RefString = "-.0123456789", TempChar, OutString = "";
   Val = "" + Val; // Make sure Val is character string
   // Only keep chars in Val that are valid numeric chars (i.e. in "RefString")
   if(Val.length == 0) return ("");
   for (var i=0; i<Val.length; i++){
      TempChar=Val.substring(i, i+1);
      if (RefString.indexOf (TempChar, 0) != -1) OutString=OutString+TempChar; // TempChar is valid number
   }
   return (OutString);
}

function CommaFmt(Num) {
  // Add commas to large numbers
  var Result,IX,Trailer
  Result = "";
  var Neg=""
  if (Num < 0) {
    Neg="-";
    Num = Math.abs(Num)
  }
  Num=Num.toString()
  IX=Num.indexOf('.',0);
  if (IX<0) {
	  IX=Num.length
	} else {
	  Num=Num+"00"	
	}	
  if ((Num.length-IX)>3) Num=Num.substring(0,IX+3) // only 2 decimal places past .
  if (IX<=4) return Num; // too short for commas
  Result=Num.substring(IX,Num.length)
  Num=Num.substring(0,IX)
  while (Num.length > 3) {
    Result = "," + Num.substring(Num.length-3,Num.length)+ Result;
    Num = Num.substring(0,Num.length-3)
  }
  Result = Neg + Num + Result;
  return Result;
}

function isDate(Value) {
   // return false if Value is not a valid date
   var IX=Value.indexOf('/',0);
   if (-1==IX) return false;
   var MM=1*Value.substring(0,IX);
   Value=Value.substring(IX+1);
   IX=Value.indexOf('/',0);
   if (-1==IX) return false;
   var DD=1*Value.substring(0,IX);
   var YY=1*Value.substring(IX+1);
   if (isNaN(DD)) return false;
   if (isNaN(MM)) return false;
   if (isNaN(YY)) return false;
   if ((MM<1)||(MM>12)) return false;
   if ((DD<1)||(DD>32)) return false;
   if (YY<0) return false;
   if (YY>2100) return false;
   var Ndays=28;
   if (0==YY%4) Ndays=29;
   if ((MM==2)&&(DD>Ndays)) return false
   if (((MM==6)||(MM==9)||(MM==11))&&(DD>30)) return false;
   return true // must be ok
}

function isNum(cNum) {
	cNum=parseFloat(StripNum(cNum))
	return (!isNaN(cNum));
}

function isNumFmt(FormObj)  {
   // Return false if Field isn't in numeric Format or empty"
   // Also reformat to x,xxx.xx format
   var Val = StripNum(FormObj.value);
   FormObj.value = Val;
   if (Val.length == 0) return(true);
   Val=parseFloat(Val);
   if (isNaN(Val)) {
      ErrorMsg(FormObj,'Please enter a valid number');
      return(false);
   }
   FormObj.value = CommaFmt(Val);
   return true;
}

function isNumRange(FormObj,Low,High) {
   // Return false if Field isn't in integer Format or empty and within range
   // Also reformat to x,xxx format
   var Val=StripNum(FormObj.value);
   FormObj.value=Val;
   if (Val.length==0) return(true);
   Val=parseFloat(Val);
   if (isNaN(Val)) {
      ErrorMsg(FormObj,'Please enter a valid number');
    return(false);
   }
   if ((Val<Low) || (High<Val)) {
      ErrorMsg(FormObj,'Please enter a whole number between '+Low+' and '+High);
      return(false);
   }
   FormObj.value=CommaFmt(Val);
   return true;
}

// Return false if "string" is empty or all blank
function isNotEmpty(String) {
	if (String.length == 0) {return (false);}
	for (var i=0; i < String.length; i++) {
		if (String.substring(i,i+1) != " ") {return (true);}
	}
	return (false);
}



function isEmpty(str) {
// Check whether string is empty.
   for (var intLoop = 0; intLoop < str.length; intLoop++)
   if (" " != str.charAt(intLoop))
      return(false);
   return(true);
}


function isPhoneFmt (FormObj)  {
   // Return false if field isn't in Phone Format (10 digit) or empty"
   // Also reformat phone to xxx-xxx-xxxx format
  var i,Tmp,String,NewString;
  String=FormObj.value;
  if (String.length == 0) {return (true);}
  NewString="";
  var NumChars = 0;
  var OKchars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz'
  for (var i=0; i < String.length; i++)  {
    Tmp = String.substring (i, i+1);
    if (OKchars.indexOf (Tmp, 0) > -1) {
       NewString=NewString+Tmp;
       NumChars=NumChars+1;
    }
  }
  if (0==NumChars) {return (true);}
  if (10<=NumChars) { // ok reformat
     String=""
     if ('1'==NewString.substring(0,1)) {
			String="1-"
			NewString=NewString.substring(1,NewString.length)			
		 }
     String+=NewString.substring(0,3)+"-";
     String+=NewString.substring(3,6)+"-";
     String+=NewString.substring(6,10)+" ";
     String+=NewString.substring(10,NewString.length);
     FormObj.value=String;
     return (true);
  }
  return (false);
}

function isEmailFmt(sEmail) {
   // Return true if this is probably an email address or empty
  // Valid email string must have a @ followed by a period
  if (false==isNotEmpty(sEmail)) return true; // Empty email ok
  var Loc1= sEmail.indexOf("@");
    var Loc2= sEmail.lastIndexOf(".");
  if (Loc1 == -1) return false; // must have an @ imbedded in string
  if (Loc2<Loc1) return false; // must have an . after the @
  if (2>(sEmail.length-Loc2)) return false; // more than 2 characters after .
return true;
}

function isLength(String,Len) {
   // return false if String has fewer than "Len" non-blank characters
  if (String.length == 0) return false;
  var count = 0;
  for (var i=0; i<String.length; ++i) {
       var ch = String.charAt(i);
       if (ch != ' ' & ch != '\t') count++;
  }
  if (count>=Len )return true;
  return false;
}

function isMoneyFmt (FormObj)  {
   // Return false if Field isn't in Money Format or empty"
   // Also reformat to $xxx.xx format
   var Val=StripNum(FormObj.value)
   FormObj.value=Val;
   if (Val.length==0) return(true);
   Val=parseFloat(Val)
   if (isNaN(Val)) {
      ErrorMsg(FormObj,'Please enter a valid dollar amount.');
    return(false);
   }
  FormObj.value="$"+CommaFmt(roundto(.01,Val))
   return true;
}

function isPct(FormObj) {
   // Return false if field isn't a percentage or empty"
   // Also reformat to xx% format
   var Value, NumVal
   Value=StripNum(FormObj.value)
   FormObj.value=Value
   if (Value.length==0) return(true);
   FormObj.value=Value + "%"
   NumVal=parseFloat(Value)
  if(isNaN(NumVal)) {
      ErrorMsg(FormObj,'Please enter a valid valid percentage');
     return(false);
  }
   if ((0<=NumVal) && (NumVal<=100)) return(true);
   ErrorMsg(FormObj,"Please enter a number between 0 and 100");
   return(false);
}

function isYear(FormObj) {
   // Return false if field isn't a valid year"
   var Value
   Value=StripNum(FormObj.value)
   if (Value.length==0) return(true);
   NumVal=parseFloat(Value)
  if(isNaN(NumVal)) {
     ErrorMsg(FormObj,"Please enter a valid year");
     return(false);
  }
  if ((0<=NumVal)&&(NumVal<50)) NumVal=2000+NumVal;
  if ((50<NumVal)&&(NumVal<100)) NumVal=1900+NumVal;
  FormObj.value=NumVal
  if ((1900<=NumVal) && (NumVal<=2050)) return(true);
   ErrorMsg(FormObj,"Please enter a year between 1900 and 2050");
  return(false);

}

function roundto(Factor, Num)   {
   // Round "Num" to nearest "Factor"
   /*    Ex: roundto (100, 2532)      --> 2500    (for nearest 100)
         roundto (1, 252.4284)    --> 252     (for nearest whole number)
         roundto (.01, 252.4284)  --> 252.43  (for dollars & cents)
         roundto (.125, 252.4284) --> 252.375 (for nearest 1/8th of a point)
   */
   if (Factor == 0) return (0); // No can do if factor is zero -- just return zero
   Num = Factor * (Math.floor(.5 + (Num/Factor)));
   return(Num);
}

