function validator()
{
   this.inputName               = new Array();   
   this.validationType          = new Array();   
   this.formName                = new Array();
   this.errorMessage            = new Array();
   this.formSubmitObject        = "";
   this.cardType                = ""; //added clm
   this.firstDigit              = 0; //added clm
   this.ccMonth                 = 0;
   this.ccYear                  = 0;
   this.length                  = 0;
   this.emptyErrorMessage       = "The required field is missing: ";
   this.showError               = true;
   this.rOption                 = "";
   this.rValue                  = "";
   
   this.validate        	= validate;
   this.validateAndSubmit 	= validateAndSubmit;
   this.required        	= required;
   this.unrequired		    = unrequired;
   this.isInputValid    	= isInputValid;
   this.displayError    	= displayError;
   this.isEmailValid    	= isEmailValid;
   this.isPassWordValid 	= isPassWordValid;
   this.isPhoneValid    	= isPhoneValid;
   this.isZipValid      	= isZipValid;
   this.getIndex        	= getIndex;
   this.isMinChecked      = isMinChecked;
   this.isMinEntered      = isMinEntered;
      
//------- cc functions------------------
   this.isDateValid       = isDateValid;
   this.isCCValid         = isCCValid;
   this.validCCFormat     = validCCFormat;
   this.validLength       = validLength;
   this.validDigit        = validDigit;
//--------------------------------------

}

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);
   }else if(typeof inputNameTemp == 'string'){
      formName = getFormObject(formNameTemp);
      inputName = formName[inputNameTemp];
   }else{
      inputName = inputNameTemp;
   }
   return inputName;
}

function validateAndSubmit(formObject)
{
  if ( this.validate(formObject) ) {
     formObject.submit();
  }
}

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] == "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] == "EMAIL")
      {
         email = this.inputName[i];
         if(this.isEmailValid(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;
         }
      }

//code to verify CC# is valid format; quick & dirty
//borrowed from AABB
//need card type before we can validate card format
//cmarlin 5/11/01

      else if(this.validationType[i] == "CARDTYPE")
      {

         if(this.isInputValid(this.formName[i],this.inputName[i])==false)
         {
//comment out if radio buttons
//           elementName  = getInputObject(this.formName[i],this.inputName[i]);
//           elementName.focus();
           return false;
         }

        //assumes this is a select list
        // this.cardType = eval(this.formName[i] + '.' + this.inputName[i] + '.options[' + this.formName[i] + '.' + this.inputName[i] + '.selectedIndex].value');

        //assumes this is radio buttons
        this.cardType = this.rValue;
      }

      else if(this.validationType[i] == "CREDIT")
      {

         credit = this.inputName[i];
         if(this.isCCValid(this.cardType,this.formName[i],credit)==false)
         {
            return false;
         }
      }


      else if(this.validationType[i] == "CCMONTH")
      {
        //assumes this is a select list         
         if(this.isInputValid(this.formName[i],this.inputName[i])==false)
         {
           elementName  = getInputObject(this.formName[i],this.inputName[i]);
           elementName.focus();
           return false;
         }

         this.ccMonth = Number(eval(this.formName[i] + '.' + this.inputName[i] + '.options[' + this.formName[i] + '.' + this.inputName[i] + '.selectedIndex].value')) + 1;

      }

      else if(this.validationType[i] == "CCYEAR")
      {
         elementName  = getInputObject(this.formName[i],this.inputName[i]);

        //assumes this is a select list         
         if(this.isInputValid(this.formName[i],this.inputName[i])==false)
         {
           elementName.focus();
           return false;
         }

         this.ccYear = String(eval(this.formName[i] + '.' + this.inputName[i] + '.options[' + this.formName[i] + '.' + this.inputName[i] + '.selectedIndex].value'));

         eDate = String(this.ccMonth) + '/1/' + this.ccYear;
         if(this.isDateValid(eDate)==false)
         {
           elementName.focus();
           alert('Your card expiration date has passed.');
           return false;
         }

      }

      else if(this.validationType[i] == "MIN_CHECKED")
      {/////////////////////////////////////////////////////////////////////

         if(this.isMinChecked(this.formName[i],this.inputName[i])==false)
         {
           // this.displayError(formName,this.inputName[i]);
           return false;
         }
      } /////////////////////////////////////////////////////////////////////


      else if(this.validationType[i] == "MIN_ENTERED")
      { /////////////////////////////////////////////////////////////////////
         if(this.isMinEntered(this.formName[i],this.inputName[i])==false)
         {
           // this.displayError(formName,this.inputName[i]);
           return false;
         }
      } /////////////////////////////////////////////////////////////////////


   } 

   if(formObject!=null)
   {
      formSubmitObject = formObject;
   }
   // formSubmitObject.submit();
   return true;
   // return;
}

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,validationType)
{
   //formName=eval("document."+formNameTmp);
   //elementName = eval("document."+formNameTmp+"."+inputName);
   //alert("name = "+elementName+ " length= "+elementName.length);

   formName     = getFormObject(formNameTmp);
   elementName  = getInputObject(formNameTmp,inputName);

   if ( (elementName.type == "text") || (elementName.type == "textarea") || (elementName.type == "hidden") ) 
   {
      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 ) {
        this.rOption = r;       
        this.rValue = elementName[r].value; 
    		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 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-z]{2,5}$/) == 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 isPassWordValid(formName,pwd1Temp,pwd2Temp)
{
   pwd1=getInputObject(formName,pwd1Temp).value;
   pwd2=getInputObject(formName,pwd2Temp).value;
   
   //the modify_user form does not require passwords unless they are being changed
   if(formName=='user_modify' && pwd1 == "" && pwd2=="") return true; 
   
   if(!(pwd1==pwd2))
   {
      alert("The password you provided does not match the confirmation password. Please try again!");
      return false;
   }

   if(pwd1.length < 4 || pwd2.length < 4)
   {
      alert("Passwords must be 4 to 8 characters long. Please try again!");
      return false;
   }

   if(pwd1.length > 8 || pwd2.length > 8)
   {
      alert("Passwords must be 4 to 8 characters long. Please try again!");
      return false;
   }
   return true;
}


//-- CHECKS THAT EXPIRATION DATE IS NOT IN THE PAST --
function isDateValid(eDate)
{
  //alert(eDate);
  var d = new Date();
  
  var today = d.getMonth()+1 + '/' + d.getDate() + '/' + d.getFullYear();
  //alert(today);
  
  var tDate = Date.parse(today);
  var xDate = Date.parse(eDate);

  //alert(tDate >= xDate);  
  if (tDate >= xDate){
    
    return false;
  }
  
  return true;   

}



//FUNCTIONS TO VALIDATE CREDIT CARD
//clm 5/11/01 -- borrowed from aabb
//----------------------------------------------------------------------
function isCCValid(str1,str2,str3){
//str1: credit card type  str2: form name str3: number field
   var fldCC=getInputObject(str2,str3);

	var CC = fldCC.value;
	//eval(str2 + '.' + str3 + '.value');

	var nameCC = str1;
//eval(str2 + '.' + str1 + '.options[' + str1 + '.selectedIndex].text');

	if (nameCC == 'American Express'){
		var lenCC = 15;
	}
	else
	{
		if (nameCC == 'Diners Club'){
			var lenCC = 14;
		}
		else
		{
			var lenCC = 16;
		}
	}


	var numCC = CC;
	
//USE THIS IF "-" AND " " ARE ALLOWED
//	var numCC = '';
//	for (var i = 0; i < CC.length; i++) {
//		var ch = CC.charAt(i);
//		if ((ch !== ' ')&&(ch !== '-')){
//			numCC = numCC + ch;
//		}
//	}


	var digitCC = numCC.charAt(0)
	

	if (!(this.validCCFormat(numCC))){
    fldCC.focus();
 		alert('Please only enter digits (0-9) for your credit card number. Do not use hyphens(-) or spaces.');
		return false;
	}

	if (!(this.validLength(numCC,lenCC))){
	  fldCC.focus();
		//alert('There should be ' + lenCC + ' digits in your credit card number.');
    alert('The payment method you selected does not match the credit card number you entered.  Please verify the information and try again.');
		return false;
	}

	if (!(this.validDigit(str2,nameCC,digitCC))){
    fldCC.focus();
		//alert('Your ' + nameCC + ' card number should begin with a ' + this.firstDigit + '.');
    alert('The payment method you selected does not match the credit card number you entered.  Please verify the information and try again.');
    return false;
	}


	return true;
}


//VALIDATE CC LENGTH
//-----------------------------------------------------------------------------
function validLength(item,len) {
   return (item.length == len);

}

//VALIDATE CC FIRST DIGIT
//-----------------------------------------------------------------------------
function validDigit(item,itemname, digit) {

	if ((itemname.toLowerCase() == "american express")||(itemname.toLowerCase() == "diners club")){
		this.firstDigit = 3;
	}
	if (itemname.toLowerCase() == "visa"){
		this.firstDigit = 4;
	}
	if (itemname.toLowerCase() == "mastercard" || itemname.toLowerCase() == "master card"){
		this.firstDigit = 5;
	}
	if (itemname.toLowerCase() == "discover"){
		this.firstDigit = 6;
	}

   //this.firstDigit = vfirstDigit;
   return (digit == this.firstDigit);

}


//VALIDATE CREDIT CARD FORMAT
//----------------------------------------------------------------------
function validCCFormat(item) {
   // Return false if characters are not allowed 
   for (var i = 0; i < item.length; i++) 
      {
      var ch = item.substring(i, i + 1);
       if (!(ch >= "0" && ch <= "9")){
        return false;
       }
      }
   return true;
}



//MAKE SURE MINIMUM NUMBER OF CHECKBOXES ARE CHECKED
//----------------------------------------------------------------------
function isMinChecked( formName, orig_field_name )
{
   var j;

   var args = orig_field_name.replace(/ /g,"").split("&");
   min  = args[0];

   num_checked = 0;

   for ( j = 1; j < args.length; j++ ) {

        fieldName = args[j];
        theField = getInputObject(formName,fieldName );

        if ( theField.checked ) {
          num_checked++;
        }
   }

   if ( num_checked < min ) {
     this.displayError(formName, orig_field_name );
     return false;
   }

   return true;
} /////////////////



//MAKE SURE MINIMUM NUMBER OF TEXTBOXES ARE FILLED (eg, 1 of a group of 4)
//----------------------------------------------------------------------
function isMinEntered( formName, orig_field_name )
{
   var j;

   var args = orig_field_name.replace(/ /g,"").split("&");
   min  = args[0];

   num_entered = 0;

   for ( j = 1; j < args.length; j++ ) {

        fieldName = args[j];
        theField = getInputObject(formName,fieldName );

        if (j == 1) {
          firstField = theField;
        }
        
        if ( theField.value != '0' ) {
            num_entered++;
        }

   }

   if ( num_entered < min ) {
     this.displayError(formName, orig_field_name );
     firstField.focus();
     return false;
   }

   return true;
} /////////////////



theValidator = new validator();
