  /*
    Generic Form Validation Written by Ron Goldberg 04/05/04 ---ron.goldberg1@verizon.net
	* Use of this script contingent upon leaving all comments unchanged and visible
    * Supports any number of form fields
	* Required form controls with customizable and default messages
	* Validation form controls with customizable and default messages
    * Validation for Date, Phone, Numeric, Email, Zip Code, Credit Card, and Soc. Security entries
	* Focus back to field with background color change on error
	* Luhn 10 Checksum Algorithm for Card Validation...accurately determines type of card and 
	  assures valid numbers
	* Detects expired card Expiration Dates
	* Select Controls populate Card Types, Expiration Months and Years dynamically
  */

  
// Enter Default validation messages below or leave as is:
var validate_phone_msg = "Phone may be entered with or without dashes\n e.g. 123-456-7890 or 1234567890";
var validate_date_msg  = "Date must be entered like 01/03/04";
var validate_zip_msg   = "Zip must be entered like 76543";
var validate_numeric_msg   = "Only numbers should be entered here";
var validate_ssn_msg = "Social Security Numbers may be entered with or without dashes\n e.g. 123-45-6789 or 123456789";
var default_required_msg   = "Please enter some text";
var default_required_select_msg   = "Please make a selection from the dropdown";
//requiredChoice variable represents background color of required elements after focus is returned
var requiredChoice = '#d8eff2';
//End Configuration 

/*Do NOT change below this line
------------------------------------------------------------------------------
*/

function formValidation(form){

     
	 for (i=0; i < form.elements.length; i++){
	
	   
	       // If element is required and a select control
	       if ((form.elements[i].required && form.elements[i].required == "yes") && (form.elements[i].type == "select-one" || form.elements[i].type == "select-multiple")){
		     var idx = form.elements[i].selectedIndex;
			 var val = form.elements[i].options[idx].value;
			    if (val == "" || val == "x"){
				     if (form.elements[i].required_msg){
				     alert (form.elements[i].required_msg);
					 }
					 else{
					 alert (default_required_select_msg + " for "+ form.elements[i].name);
					 }
					 form.elements[i].focus();
				     form.elements[i].style.backgroundColor=requiredChoice;
				     return false;
				}
		   }
		   
		   
		   // If element is required and a text or text area control
	       if ((form.elements[i].required) && form.elements[i].required == "yes" && form.elements[i].value =="" && (form.elements[i].type == "text" || form.elements[i].type == "textarea")){
		     if (form.elements[i].required_msg){
		     alert (form.elements[i].required_msg);
			 }
			 else{
			 alert (default_required_msg+ " " +"for "+ form.elements[i].name);
			 }
		    form.elements[i].focus();
		    form.elements[i].style.backgroundColor=requiredChoice;
		    return false;
		   }
		   
		   // If element is  a radio control
	       if ((form.elements[i].required) && form.elements[i].required == "yes" && form.elements[i].type == "radio"){
		   opt = -1;
		     group = form.elements[i]["name"];
			 len = form.elements[group].length;
			 obj = form.elements[group];
			    for (x=0;x<len;x++){
				   if(obj[x].checked){
				   opt = x;
				   }
				}
				if (opt == -1){
				   if (form.elements[i].required_msg){
		              alert (form.elements[i].required_msg);
			       }
				   else{
				      alert ("Please select a radio button for " +group);
				   }
				form.elements[i].focus();
				form.elements[i].style.backgroundColor=requiredChoice;
				return false;
				}
		   }
		   
		  		 		   
		   // *****************************VALIDATIONS *************************************************************
		   
		   // If element is to be validated as phone 
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "phone" && form.elements[i].value != ""){
		    var inputphone = form.elements[i].value;
		    var regexdashes = /^\d{3}[-]\d{3}[-]\d{4}$/;
			var regexallnums = /^\d{10}$/;
		       if (!regexdashes.test(inputphone) && !regexallnums.test(inputphone)){
			     alert (validate_phone_msg);
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
		   // If element is to be validated as Special phone with mask (configurable)
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "phoneSpecial" && form.elements[i].value != ""){
		    var inputphone = form.elements[i].value;
		    var newphone;
			var regexdashes = /^\d{3}[-|.]\d{3}[-|.]\d{4}$/;
			var regexnums = /^\d{10}$/;
		      if (regexnums.test(inputphone)){
				 newphone = inputphone.substring(0,3) + "." + inputphone.substring(3,6) + "." + inputphone.substring(6,10);
			     form.elements[i].value = newphone;
			   }
			   else if (regexdashes.test(inputphone)){
				 newphone = inputphone.substring(0,3) + "." + inputphone.substring(4,7) + "." + inputphone.substring(8,12);
			     form.elements[i].value = newphone;
			   }
			   else{
			     alert ("Please enter ONLY digits, with dots\n or dashes as separators, like:\n" +  "1112345678 or 111-2345-5678 or 111.234.5678");
			     form.elements[i].style.backgroundColor='#dedede';
				 form.elements[i].focus();
				 return false;
			   }
		   }
		   
		   // If element is to be validated as Date 
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "date" && form.elements[i].value != ""){
		    var inputdate = form.elements[i].value;
		    var regexdate = /^\d{2}[/]\d{2}[/]\d{2}$/;
			   if (!regexdate.test(inputdate)){
			     alert (validate_date_msg);
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
		   // If element is to be validated as Zip Code 
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "zip" && form.elements[i].value != ""){
		    var inputzip = form.elements[i].value;
		    var regexzip = /^\d{5}$/;
			   if (!regexzip.test(inputzip)){
			     alert (validate_zip_msg);
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
		   // If element is to be validated as Soc. Sec. Number 
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "ssn" && form.elements[i].value != ""){
		    var inputssn = form.elements[i].value;
		    var regexssn1 = /^\d{3}[-]\d{2}[-]\d{4}$/;
			var regexssn2 = /^\d{9}$/;
			   if (!regexssn1.test(inputssn)&& !regexssn2.test(inputssn)){
			     alert (validate_ssn_msg);
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
           
		   // If element is to be validated as Numeric 
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "number" && form.elements[i].value != ""){
		    var inputnum = form.elements[i].value;
		    var regexnum = /^\d+$/;
			   if (!regexnum.test(inputnum)){
			     alert (validate_numeric_msg);
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
		   
		   // If element is to be validated as Email
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "email" && form.elements[i].value != ""){
		    var inputemail = form.elements[i].value;
		    var regexemail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;//allows for sub domains
			   if (!regexemail.test(inputemail)){
			     alert ("Improperly formed email address...please re-enter");
				 form.elements[i].select();
				 form.elements[i].focus();
				 form.elements[i].style.backgroundColor='#dedede';
				 return false;
			   }
		   }
		   
		   // Begin Credit Card Validation  ****************************
	
		   if ((form.elements[i].validate_type) && form.elements[i].validate_type == "creditcard" && form.elements[i].value != ""){
		       
								
			    // check if the card type is valid
				if ((form.CardType.value != "V") && (form.CardType.value != "M") && (form.CardType.value != "A") && (form.CardType.value != "D")) {
				alert("Please select a card type.");
				form.CardType.focus();
				return false;
				}
				
				// Make sure it's a the right length for the Card Type
				cardLength = form.cardnum.value.length;
				cardLengthOK = ( ((form.CardType.value == "V") && ((cardLength == 13) || (cardLength == 16))) ||
				((form.CardType.value == "M") && (cardLength == 16)) ||
				((form.CardType.value == "A") && (cardLength == 15)) ||
				((form.CardType.value == "D") && (cardLength == 16)) );
				if (!(cardLengthOK)) {
				// not the right length
				
				alert("Please make sure you've entered all of the digits on your card.");
				form.cardnum.focus();
				form.cardnum.select();
				form.cardnum.style.backgroundColor='#dedede';
				return false;
				}
			
				// Check the first digit to see if it matches the card type
				cardStart = form.cardnum.value.substring(0,1);
				cardStartOK = ( ((form.CardType.value == "V") && (cardStart == "4")) ||
				((form.CardType.value == "M") && (cardStart == "5")) ||
				((form.CardType.value == "A") && (cardStart == "3")) ||
				((form.CardType.value == "D") && (cardStart == "6")) );
				if (!(cardStartOK)) {
				// card number's first digit doesn't match card type
				alert("Please make sure the card number you've entered matches the card type you selected.");
				form.cardnum.focus();
				form.cardnum.select();
				form.cardnum.style.backgroundColor='#dedede';
				return false;
				}
				
				// Everything appears OK so do the MOD 10 evaluation   
				var idx;
				var cc = new Array(16);
				var checksum = 0;
				var validcc;
				
				// assign each digit of the card number to a space in the array 
				for (idx = 0; idx < form.cardnum.value.length; idx++) {
				cc[idx] = Math.floor(form.cardnum.value.substring(idx, idx+1));
				}
				
				// walk through every other digit doing our magic
				// if the card number is sixteen digits then start at the
				// first digit (position 0), otherwise start from the
				// second (position 1)
				for (idx = (form.cardnum.value.length % 2); idx < form.cardnum.value.length; idx+=2) {
				var a = cc[idx] * 2;
					if (a >= 10) {
					var aStr = a.toString();
					var b = aStr.substring(0,1);
					var c = aStr.substring(1,2);
					cc[i] = Math.floor(b) + Math.floor(c);
					} 
					else {
					cc[idx] = a;
					}
				}
				
				// add up all of the digits in the array
				for (idx = 0; idx < form.cardnum.value.length; idx++) {
				checksum += Math.floor(cc[idx]);
				}
				
				// if the checksum is evenly divisble by 10
				// then this is a valid card number
				validcc = ((checksum % 10) == 0);
				/*
				if (!(validcc)){
				 alert ("Checksum appears invalid - Please check your card");
				 form.cardnum.focus();
				 form.cardnum.select();
				 form.cardnum.style.backgroundColor='#dedede';
				 return false;
				}
				*/
				if(form.ExpMon.value == ""){
				alert ("You must select an Expiration Month");
				form.ExpMon.focus();
				return false;
				}
				if(form.ExpYear.value == ""){
				alert ("You must select an Expiration Year");
				form.ExpYear.focus();
				return false;
				}
				
				// Check to see if Credit Card Exp Dates are expired:
				var months = new Array(12); 
				months[0] = "January"; 
				months[1] = "February"; 
				months[2] = "March"; 
				months[3] = "April"; 
				months[4] = "May"; 
				months[5] = "June"; 
				months[6] = "July"; 
				months[7] = "August"; 
				months[8] = "September"; 
				months[9] = "October"; 
				months[10] = "November"; 
				months[11] = "December"; 
				
				var thisdate = new Date;
				var thisyear = thisdate.getYear();
				var thismonth = thisdate.getMonth();
				
				for (idx=0; idx <months.length; idx++){
				   if (form.ExpMon.value == months[idx]){
				    comparemonth = idx;
				   }
				}
				if (comparemonth < thismonth && form.ExpYear.value <= thisyear){
				 alert ("Your card appears to be expired...please check and re-enter.");
				 form.ExpMon.focus();
				 return false;
				}
				
				
		   }
		   //End Credit Card Validation
		   		   
     }
	 //Close of Loop  
	 
	
	 
}
//Close of formValidation Function

