document.write("<script language='javascript' src='js/JSUtil.js'></script>");
/***********************************************************************************************
FormValidation
Last Update 03/01/2004 ValentinA
Purpose: Verifies that user has completed all required fields in a form
Requirements: 
1.	Uses W3C DOM Level 1 Specification and HTML 4.0: Browser should be compliant.  
2.	Uses JSUtil.js

Example:
  Instantiate a FormValidator object with the string value of the form name as a parameter
     var myFV = new FormValidator( ‘myForm’ );
  Use the validate() function to determine if the form has all required data
     if( myFV.validate() ){ document.myForm.submit();}

For Required Elements:     
  In order to use this class <input> tags must have additional user defined attributes:
<input type="type" [fieldtype="field types"] name="name" [desc = #CDATA] [ required = "yes" ] >
From HTML 4.0
  1. type = [ text | password | radio | select-one | select-multiple | textarea ] 
User Defined
  2. fieldtype  = [ email | ss | numeric | zipcode | price | alpha | alphanumeric | phone | arc ]
  3. [ desc ] = CDATA 
  4. required = "yes"

  The desc attribute is used in an alert() which, will list what field(s) is(are) missing.
  Best Practice - use a friendly name or the label name
  Example: First Name:<input type="text" name="firstName" desc="Your First Name" required=”yes”>
  
  The fieldtype attribute is used to dertermine if the value of a textfield or area has valid data
  Example: E-mail:<input type="text" fieldtype="email" name="email" size="20" desc="E-mail" required="yes">
  
  It is NOT necessary to use desc attributes with non-required fields.
  One MUST include type in the following cases:
   <SELECT type="[select-one | select-multiple]" >  
   <TEXTAREA type="textarea" >
  
To make a set of required radio(toggle) buttons, one MUST label ALL required buttons 
  Example:
     Yes<input type="Radio" name="myRadio" value="yes" desc="Radio Group" required="yes"><br>
     No<input type="Radio" name="myRadio" value="No" desc="Radio Group" required="yes"><br>
     Maybe<input type="Radio" name="myRadio" value="maybe" desc="Radio Group" required="yes"><br>


*************************************************************************************************/

/*****************************************************
  Constructor Returns FormValidator object
******************************************************/
function FormValidator( strForm ) {
  //"Instance Variables"
  this.requiredField = new Array(); //Array of ElementValidator2 objects
  this.formValidName = eval("document."+strForm); //added to support submitForm() method
  //alert(this.formValidName);    
  //"Instance Methods"
  this.validate = validate;  
  this.createArrays = createArrays;
  this.getRequiredFieldByName = getRequiredFieldByName;
  this.submitForm = submitForm;

  var formElements = eval("document." + strForm + ".elements");
  //alert(this.formElements.length);   
  this.createArrays( strForm, formElements ); 
  //alert(this.requiredField.length);  

} //end constructor


/******************************************
  Loads array of required field elements
*******************************************/
function createArrays( argForm, formElements ){
  var length = formElements.length;
  for (var i=0; i < length; i++) {
    var name = formElements[i].getAttribute("name");  
    //alert(name);
    var required = formElements[i].getAttribute("required");
    var reqRegExp = /yes/i
    if ( !reqRegExp.test( required ) ){
      required = "no";
    }

    var type = formElements[i].getAttribute("fieldtype");

    if ( isNull(type) || type == "" ) { 
      type = formElements[i].getAttribute("type");
    }     
    
    var desc = formElements[i].getAttribute("desc");
    var value = trim( formElements[i].value );

    if (  this.getRequiredFieldByName( name ) == null ) { //element does not already exist in the form

      var pattern = /select/i; 
      if ( pattern.test(type)  ) {
        value =  eval( "document."+ argForm +"."+ name + ".selectedIndex");
      } //select
    
      pattern = /radio/i; 
      if ( pattern.test(type) ) {     
        value = getCheckedButton(argForm, name, type);       
      }  //radio button
      
      var elementV = new FieldValidator( argForm, name, type, desc, value, required );
      var newIndex = this.requiredField.length;
      this.requiredField[newIndex] = elementV; //I wish we could use a java.util.vector or java.util.arrayList

    } //if exists

  }  

} //end of createArrays

/***********************************************************************************
  Returns the value of the name attribute if it exists in the requiredField array 
  Returns null if it does not exist
***********************************************************************************/
function getRequiredFieldByName( argName ) { 

  var length = this.requiredField.length;
  for ( var k=0; k < length; k++ ) {

    if (this.requiredField[k].fieldName == argName) {
      return this.requiredField[k].fieldName;
    } 

  } 

  return null;
} //end getRequiredFieldByName

 
/**************************************************
  Verifies all form elements are entered correctly
  Returns boolean value
***************************************************/
function validate() {
  var size = this.requiredField.length;
  var errMsg ="Please complete all of the following fields correctly \n";
  
  var emptyFields = new Array();

  for (var i = 0; i < size; i++) {
    var currentElement = this.requiredField[i];
    if ( !currentElement.isValid() ) {
      //element contains wrong information
      var newIndex = emptyFields.length;
      emptyFields[newIndex] = currentElement;
      errMsg += ( ( newIndex+1 ) + ". " + currentElement.desc+ "\n" ); //add Fieldname to error list
    }

  } 
  var errorIndex = emptyFields.length;  
  if ( errorIndex > 0 ) { //at least one field has incorrect information
    alert( errMsg );
    for(var i=0; i < errorIndex; i++) {
      highlightField( emptyFields[i] );
      if ( (i == 0) && ( emptyFields[i].fieldType != "radio" ) ) { //Place cursor in first incorrect field
        focusOn( emptyFields[i].formName, emptyFields[i].fieldName ); 
      } 
    } 
  return false; //information missing do not submit form
  } 
  else {
    return true; //All fields are correct submit form
  } 
} 

/*****************************************************
  Changes the color of the background of a field
******************************************************/
function highlightField( e ) {
  var s = eval("document." + e.formName + "." + e.fieldName);
  if (e.fieldType != "radio"){
    s.style.backgroundColor=('#FFFFCC');
  }
}
/*****************************************
* Submits the form to the action parameter
******************************************/
function submitForm( action ){
  this.formValidName.action = action;
  //window.status = this.formValidName.action;
  this.formValidName.submit();
}
/******************************************************/
// FormValidator End
/******************************************************/

/******************************************************
 FieldValidator - "Inner Class"
 Creates an Element for validation
 Last Update 11/10/2003 ASV
******************************************************/

/*******************************************************
   Constructor creates an Element Object for validation
********************************************************/
function FieldValidator( argFormName, argFieldName, argFieldType, argDescription, argValue, argRequired ) { 
  //"Instance Variables"
  this.formName = argFormName;
  this.fieldName = argFieldName;
  this.fieldType = argFieldType;
  
  if (argDescription != null) {
    this.desc = argDescription;
  }
  else {
    this.desc = argFieldName;
  }
  this.fieldValue = argValue;
  this.fieldRequired = argRequired;
 
  //Instance Methods
  this.isValid = isValid;
}

/************************************************
  Verifies that an element contains valid data
  Returns Boolean
  THANKS CA!!!!!
*************************************************/
function isValid() {
  var v = this.fieldValue; 
  var fT = this.fieldType;
  var r = this.fieldRequired;
  var pattern;

  if ( (v == "") && (r == "yes") ){   
    return false; //field is required and cannot be empty
  } 
  
  if ( ( v == "" ) && ( r == "no" ) ){ 
    return true; //field is not required therefore it can be empty
  }
  
  trimedValue = eval("document."+this.formName+"."+this.fieldName);

  switch ( fT ) { 
    
    case 'arc':
      trimedValue.value = v;
      pattern = /^[0-9]{8}$/ ;  //only ARC No
      break;
    case 'alpha':
      trimedValue.value = v;
      pattern = /[a-zA-Z]$/ ;  //only ALPHA
      break;
    case 'alphanumeric':
    case 'password':
      trimedValue.value = v;
      pattern = /^[a-zA-Z0-9]+$/ ; //only ALPHANUMERIC
      break;
    case 'numeric':
      trimedValue.value = v;
      pattern = /^\d{1,20}$/ ; //only NUMERIC
      break;
    case 'creditCard':
      if ( isValidNumber(v) ){
        return true;
      }
      else { 
        return false;
      }      
      break;
    case 'phone':
      trimedValue.value = v;
      pattern = /^[0-9]{3}\-[0-9]{3}\-[0-9]{4}$/ ; //only DIGITS in xxx-xx-xxxx form
      break;      
    case 'ss':
      trimedValue.value = v;
      pattern = /^[0-9]{3}\-[0-9]{2}\-[0-9]{4}$/ ; //only DIGITS in xxx-xx-xxxx form
      break;      
    case 'zipcode':
      trimedValue.value = v;
      pattern = /^\d{5}$|^\d{5}\-\d{4}/ ; //only DIGITS in xxxxx or xxxxx-xxxx form
      break;    
    case 'price':
      trimedValue.value = v;
      pattern = /^\d{1,13}(.\d{2})?$/ ; //only a TWO DECIMAL DIGIT double
      break;
    case 'email':
      trimedValue.value = v;
      pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/
      break;
    case 'select-one':
      if ( r == "no" ){
        return true; 
      }
      else {
        return isSelected( v, "one");
      }        
    case 'select-multiple':
      if ( r == "no" ){ 
        return true; 
      }
      else {
        return isSelected( v, "multiple");
      }    
    case 'radio':
      if ( (v == null) && (r == "yes") ){
        return false;
      } 
      else{
        return true;
      }
    case 'checkbox':
     return true;
    case 'date-US':
     return isValidDate(v,'MDY');
     break;
    default:
      trimedValue.value = v;
      return true;  //no recognized type
  
  }  //end switch    

   return pattern.test( v ); 
} //end isValid

/******************************************************/
// FieldValidator End
/******************************************************/