function validator()
{
   this.inputName               = new Array();   
   this.validationType          = new Array();   
   this.formName                = new Array();
   this.errorMessage            = new Array();
   this.formSubmitObject        = "";
   this.length                  = 0;
   this.emptyErrorMessage       = "The required field is missing: ";
   this.showError               = true;
   this.min_pass_length		= 0;
   this.max_pass_length		= 0;

   this.validate        = validate;
   this.required        = required;
   this.unrequired	= unrequired;
   this.isInputValid    = isInputValid;
   this.displayError    = displayError;
   this.isEmailValid    = isEmailValid;
   this.isEmailListValid = isEmailListValid; 
   this.isEitherValid   = isEitherValid;
   this.isLengthValid   = isLengthValid;
   this.isCCExpValid    = isCCExpValid;
   this.isCCNumValid    = isCCNumValid;
   this.isPassWordValid = isPassWordValid;
   this.isPhoneValid    = isPhoneValid;
   this.isZipValid      = isZipValid;
   this.getIndex        = getIndex;
}

function setFormSubmitObject(formName)
{
   this.formSubmitObject= eval("document."+formName);
}

function getFormObject(formNameTemp)
{
   if(typeof inputNameTemp == 'string')
   {
      formName = eval("document."+formNameTemp);
   }else{
      formName = formNameTemp;
   }
   return formName;
}
function getInputObject(formNameTemp,inputNameTemp)
{

   if((typeof formNameTemp == 'string') && (typeof inputNameTemp == 'string') )
   {
      // inputName = eval("document."+formNameTemp+"."+inputNameTemp);

      formName = eval("document."+formNameTemp);
      inputName = formName.elements[ inputNameTemp ];
   }else if(typeof inputNameTemp == 'string'){
      formName = getFormObject(formNameTemp);
      inputName = formName[inputNameTemp];
   }else{
      inputName = inputNameTemp;
   }
   return inputName;
}

function validate(formObject)
{
   for(i=0;i<this.length;i++)
   {

      if(this.validationType[i] == null || this.validationType[i] == "REGULAR" )
      {
         if(this.isInputValid(this.formName[i],this.inputName[i])==false)
         {
            return false;
         }
      }
      else if(this.validationType[i] == "EITHER")
      {
          if(this.isEitherValid( this.formName[i], this.inputName[i] ) == false)
          {
            return false;
          }
      }
      else if(this.validationType[i] == "LENGTH")
      {
         params = this.inputName[i].replace(/ /g,"").split("&");
         if(this.isLengthValid( this.formName[i], params[0], params[1] ) == false)
         {
           return false;
         }
      }
      else if(this.validationType[i] == "PASSWORD")
      {
         pwds = this.inputName[i].replace(/ /g,"").split("&");

         if(this.isPassWordValid( this.formName[i], pwds[0], pwds[1] ) == false)
         {
           return false;
         }
      }
      else if(this.validationType[i] == "CC_EXP")
      {
         args = this.inputName[i].replace(/ /g,"").split("&");
         if(this.isCCExpValid(this.formName[i],args[0],args[1])==false)
         {
           return false;
         }
      }
      else if(this.validationType[i] == "CC_NUM")
      {
         args = this.inputName[i].replace(/ /g,"").split("&");
         if(this.isCCNumValid(this.formName[i],args[0],args[1])==false)
         {
           return false;
         }
      }
      else if(this.validationType[i] == "EMAIL")
      {
         email = this.inputName[i];
         if(this.isEmailValid(this.formName[i],email)==false)
         {
            return false;
            
         }
      }
     else if (this.validationType[i] == "EMAIL_LIST") {
	 email = this.inputName[i];
    	 if (this.isEmailListValid(this.formName[i],email)==false)
	 {
 	    return false;
	 }
      }
      else if(this.validationType[i] == "ZIP")
      {
         zip = this.inputName[i];
         if(this.isZipValid(this.formName[i],zip)==false)
         {
            return false;
         }
      }
      else if(this.validationType[i] == "PHONE")
      {
         phone = this.inputName[i];
         if(this.isPhoneValid(this.formName[i],phone)==false)
         {
            return false;
         }
      }

   } 

   if(formObject!=null)
   {
      formSubmitObject = formObject;
   }

   return true;
}

function validateEmail()
{

}

function getIndex( formName, inputName )
{

   for ( i = 0; i < this.length; ++i ) {

	if ( this.formName[i] == formName && this.inputName[i] == inputName ) {

		return i;
	}
   }
   return -1;
}

function required(formName,inputName,message,validationType)
{

  index = this.getIndex( formName, inputName );

  if ( index < 0 ) {
   	this.formName[this.length]	 = formName;
   	this.inputName[this.length]	 = inputName;
   	this.validationType[this.length] = validationType;
	this.errorMessage[this.length] 	 = message;
   	this.length++;
  }
  else {

	this.validationType[ index ] 	 = validationType;
  }
}

function unrequired(formName,inputName,validationType)
{

  index = this.getIndex( formName, inputName );

  if ( index >= 0 ) {
	this.validationType[ index ] = "NONE";
  }
}


function displayError(formName,inputName,errorType)
{
  if(this.showError==false) return;

  index = this.getIndex( formName,inputName );

  if ( index >= 0 ) {
    if ( this.errorMessage[ index ] != null ) {
	alert( this.errorMessage[index] );
	return;
    }
  }

  if(errorType=="EMPTY") {
      alert(this.emptyErrorMessage+' '+inputName);
  }
}

function isInputValid(formNameTmp,inputName,suppressError)
{
   formName     = getFormObject(formNameTmp);
   elementName  = getInputObject(formNameTmp,inputName);


   if ( ! formName ) {
     alert( "Error getting Form: " + formNameTmp );
     return false;
   }

   if ( ! elementName ) {
     alert( "Error getting Element: " + inputName );
     return false;
   }


   if ( (elementName.type == "text") || (elementName.type == "textarea") || (elementName.type == "hidden") || (elementName.type == "file") || elementName.type == "password" ) 
   {
      if(elementName.value=='')
      {
      	 if ( suppressError != true ) {
              this.displayError(formNameTmp,elementName.name,"EMPTY");
              elementName.focus();
         }
         return false;
      }
   }
   else if(elementName.type=='select-one'|| elementName.type=='select')
   {
      index=elementName.selectedIndex;
      if(index==-1 || elementName.options[index].value == "")
      {
      	 if ( suppressError != true ) {
             this.displayError(formNameTmp,elementName.name,"EMPTY");
             elementName.focus();
         }
         return false;
      }
   }
   else if(elementName.type=='checkbox') 
   {
      if(elementName.checked==false)
      {
      	 if ( suppressError != true ) {
             this.displayError(formNameTmp,inputName,"EMPTY");
         }
         return false;
      }
   }
   else if( elementName[0].type=='radio') 
   {
	var r;
	for ( r = 0; r < elementName.length; ++r ) {
      	    if(elementName[r].checked == true ) {
		return true;
	    }
	}
	if ( suppressError != true ) {
            this.displayError(formNameTmp,inputName,"EMPTY");
        }
        return false;
   }
   else if(elementName.type==null) 
   {
      radioLength=elementName.length;
      if(!(radioLength>0))
      {
        //alert('element not defined'); 
        return false; 
      }
      for(j=0;j<radioLength;j++)
      {
         //alert(elementName[j].name+" "+j+" checked = "+elementName[j].checked)
         if(elementName[j].checked==true)
         {
            return true;
         }
      }
      if ( suppressError != true ) {
          this.displayError(formNameTmp,inputName,"EMPTY");
      }
      return false;
   }
   else
   {
      if(elementName.value=='')
      {
         if ( suppressError != true ) {
             this.displayError(formNameTmp,elementName.name,"EMPTY");
             elementName.focus();
         }
         return false;
      }
   }
   return true;
}

/****
function isInputValid(formNameTmp,inputName,validationType)
{
   formName     = getFormObject(formNameTmp);
   elementName  = getInputObject(formNameTmp,inputName);


   if ( ! formName ) {
     alert( "Error getting Form: " + formNameTmp );
     return false;
   }

   if ( ! elementName ) {
     alert( "Error getting Element: " + inputName );
     return false;
   }

   if ( (elementName.type == "text") || (elementName.type == "textarea") || (elementName.type == "hidden") || elementName.type == "password" ) 
   {
      if(elementName.value=='')
      {
         this.displayError(formNameTmp,elementName.name,"EMPTY");
         elementName.focus();
         return false;
      }
   }
   else if(elementName.type=='select-one'|| elementName.type=='select')
   {
      index=elementName.selectedIndex;
      if(index==-1 || elementName.options[index].value == "")
      {
         this.displayError(formNameTmp,elementName.name,"EMPTY");
         elementName.focus();
         return false;
      }
   }
   else if(elementName.type=='checkbox') 
   {
      if(elementName.checked==false)
      {
         this.displayError(formNameTmp,inputName,"EMPTY");
         return false;
      }
   }
   else if( elementName[0].type=='radio') 
   {
	var r;
	for ( r = 0; r < elementName.length; ++r ) {
      	    if(elementName[r].checked == true ) {
		return true;
	    }
	}

        this.displayError(formNameTmp,inputName,"EMPTY");
        return false;
   }
   else if(elementName.type==null) 
   {
      radioLength=elementName.length;
      if(!(radioLength>0))
      {
        //alert('element not defined'); 
        return false; 
      }
      for(j=0;j<radioLength;j++)
      {
         //alert(elementName[j].name+" "+j+" checked = "+elementName[j].checked)
         if(elementName[j].checked==true)
         {
            return true;
         }
      }
      this.displayError(formNameTmp,inputName,"EMPTY");
  
      return false;
   }
   else
   {
      if(elementName.value=='')
      {
         this.displayError(formNameTmp,elementName.name,"EMPTY");
         elementName.focus();
         return false;
      }
   }
   return true;
}
**/

function isEmailListValid( formName, fieldName )
{
	theField = getInputObject( formName, fieldName );

	if ( ! isEmailList( theField ) ) {
		this.displayError(formName, fieldName,"EMPTY");
		theField.focus();
		return false;
	}
	return true;
}

function isEmailList(Field) {
	strValue = getValue(Field);

	// delete all spaces near comma
	rexp = "/, /gi";
	strValue = strValue.replace(rexp, ',');
	rexp = "/ ,/gi";
	strValue = strValue.replace(rexp, ',');
	strArray = strValue.split(",");

	// regexp = /^([^$@\\ ]+)@((([^$@\\ \.]+)\.)+)([A-Za-z0-9]+)$/

	regexp = /^[A-Za-z0-9]+[A-Za-z0-9\_\-\.]*\@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,5}$/

	for (i=0; i < strArray.length; i++) {
		if (isEmpty(strArray[i])) return false;
		if (!regexp.test(strArray[i])) return false;
	}
	// set new field value (with removed spaces between comma and addresses)
	Field.value = strValue;
	return true;
}

function getValue(Field) {
	fieldType = Field.type;

	if (fieldType == "text") {
		return getTextValue(Field);
	} else if (fieldType == "hidden") {
		return getTextValue(Field);
	} else if (fieldType == "select-one") {
		return getListValue(Field);
	} else if (fieldType == "textarea") {
		return getTextValue(Field);
	} else if (fieldType == "file") {
		return getTextValue(Field);
	} else if (fieldType == "password") {
		return getTextValue(Field);
	} else if (fieldType == "checkbox") {
		return getCheckboxValue(Field);
	} else if (isNaN(fieldType)) {
		return getRadioValue(Field);
	} else {
		return getTextValue(Field);
	}
}



function isLengthValid(formName,fieldname,maxlength)
{
  elementObj  = getInputObject(formName,fieldname);
  length = elementObj.value.length;

  if ( length > maxlength ) {
    return false;
  }
  return true;
}

function isEitherValid(formName,fieldnames)
{
    vals = fieldnames.replace(/ /g,"").split("&");
    
    for ( j = 0; j < vals.length; j++ ) {
	if ( isInputValid(formName,vals[j],true) ) {
		return true;
	}
    }

    field1 = getInputObject(formName,vals[0]);
    field1.focus();
    this.displayError(formName,fieldnames,"EMPTY");
    return false;
}

function isEmailValid(formName,emailTemp)
{ 
   emailName=getInputObject(formName,emailTemp);
   if(emailName.value.match(/^[A-Za-z0-9]+[A-Za-z0-9\_\-\.']*\@[A-Za-z0-9\.\_\-]+(\.[A-Za-z0-9\_\-])*$/) ==null)
   {
      emailName.focus();
      alert("The email address you provided is invalid. Please try again!");
      return false;
   }
   return true;
}

function isPhoneValid(formName,phoneTemp)
{
   phoneNumber=getInputObject(formName,phoneTemp);
   if(phoneNumber.value.match(/^1{0,1} *(-| ){0,1} *[\(]*[0-9]{0,3}[\)]* *(-| ){0,1} *[0-9]{3} *(-| ){0,1} *[0-9]{4}$/)
==null)
   {
      phoneNumber.focus();
      alert("The phone number you entered is invalid. Please try again!");
      return false;
   }
   return true;
}

function isZipValid(formName,zipTemp)
{
   zipCode=getInputObject(formName,zipTemp);
   if(zipCode.value.match(/^[0-9A-Za-z]*[\-]*[0-9A-Za-z]+$/)==null)
   {
      zipCode.focus();
      alert("The zipcode you entered is invalid. Please try again!");
      return false;
   }
   return true;
}

function isCCNumValid( formName, cc_num_fld, cc_type_fld )
{
  cc_num  = getInputObject(formName, cc_num_fld );
  cc_type = getInputObject(formName, cc_type_fld );
  
  cc_num = cc_num.value.replace( /- /g, "" );

  if ( cc_type == "Amex" || cc_type == "American Express" ) {

	return cc_num.value.match( /\d{15}/ );
  }

  return cc_num.value.match( /\d{16}/ );
}

function isCCExpValid( formName, cc_mon_fld, cc_year_fld )
{
   cc_mon  = getInputObject(formName,cc_mon_fld );
   cc_year = getInputObject(formName,cc_year_fld );

/**
<?php

$today = getdate(); 
echo "thismonth = " . $today[mon] . "\n";
echo "thisyear  = " . $today[year] . "\n";

?>
*/
   if ( cc_year > thisyear ) {
	return true;
   }
   else if ( cc_year < thisyear ) {
	return false;
   }

   if ( cc_month < thismonth ) {
	return false;
   }

   return true;
}

function isPassWordValid( formName, pwd1Temp, pwd2Temp )
{

   pwd1 = getInputObject( formName, pwd1Temp );
   pwd2 = getInputObject(formName,pwd2Temp);
   
   //the modify_user form does not require passwords unless they are being changed
   if(formName=='user_modify' && pwd1 == "" && pwd2=="") return true; 
   
   if(!(pwd1.value == pwd2.value))
   {
      alert("The password you provided does not match the confirmation password. Please try again!");
      return false;
   }

   if ( this.min_pass_length > 0 ) {
     if(pwd1.value.length < this.min_pass_length )
     {
      alert("Passwords must be at least " + this.min_pass_length + " characters long. Please try again!");
      return false;
     }
   }

   if ( this.max_pass_length > 0 ) {
     if(pwd1.value.length > this.max_pass_length )
     {
      alert("Passwords cannot be longer than " + this.max_pass_length + " characters long. Please try again!");
      return false;
     }
   }

   return true;
}

function isEmpty(s) {
	if (s == null || trim(s) == '') {
		return true;
	}
	else {
		return false;
	}
}


function getTextValue(Field) {
	return Field.value;
}

function trim(str) {
	while (str.substring(0,1) == " ") {
		str = str.substring(1,str.length);
	}
	while (str.substring(str.length-1,str.length) == " ") {
		str = str.substring(0,str.length-1);
	}
	return str;
}


theValidator = new validator();
