//alert ('formval');
// ----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by an older browser:
// in this case validation must be left to the server.
//
// Update Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//
// Update Oct 2005: minor tidy-up: unused parameter removed
//
// Update Jun 2006: minor improvements to variable names and layout
// ----------------------------------------------------------------------
var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_fieldname;	// retain fieldname for timer thread

// --------------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// --------------------------------------------

function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '');
}


// --------------------------------------------
//                  //setfocus
// Delayed focus setting to get around IE bug
// --------------------------------------------

function setFocusDelayed()
{
  global_fieldname.focus();
}

function setfocus(fieldname)
{
  // save fieldname in global variable so value retained when routine exits
  global_fieldname = fieldname;
  setTimeout( 'setFocusDelayed()', 100 );
}


// --------------------------------------------
//                  msg
// Display warn/error message in HTML element.
// commonCheck routine must have previously been called
// --------------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // class to give element ("warn" or "error")
             message) // string to display
{
  // setting an empty string can give problems if later set to a 
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
  // simply use a space, but IE demands something more, like a non-breaking space.)
  var dispmessage;
  if (emptyString.test(message)) 
    dispmessage = String.fromCharCode(nbsp);    
  else  
    dispmessage = message;

  var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;  
  
  elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

// --------------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed), 
//         false (validation failed) or 
//         proceed (don't know yet)
// --------------------------------------------

var proceed = 2;  

function commonCheck    (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.getElementById) 
    return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(errorfield);
  if (!elem.firstChild) return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text) return true;  // errorfield is wrong type of node  

	
  if (emptyString.test(fieldname.value) || fieldname.value == undefined ) {
    if (required) {
		//alert("req");
		
     // msg (errorfield, "error", "This field is required.");
	 getErrorMsg(fieldname, errorfield);
								
															
	  
	  //fieldname.select();
	  //setfocus(fieldname);
	  $(fieldname).next().show();
      
      removeValidated(fieldname);
								
	  return false;
    }
    else {
		//alert("true");
      //msg (errorfield, "warn", "");   // OK
	  $(fieldname).removeClass('defaultField');
	  $(fieldname).next().hide();
	  addValidated(fieldname);
	  return true;
    }
  }
  return proceed;
}

// --------------------------------------------
//            validateLettersOnly
// Validate if only letters and designated symbols have been entered
// Returns true if so 
// --------------------------------------------

function validateLettersOnly( fieldname, errorfield, required ) // id of element to receive error msg
{
  //alert("validateLettersOnly");
  var stat = commonCheck (fieldname, errorfield, required);
  if (stat != proceed) return stat;
  //alert(stat);
  
  							var lettersonly = /[^a-zA-Z\-_ ’'‘]/gi;
							if ( lettersonly.test(fieldname.value) ) {
								//alert("bad input");
								
								//msg (errorfield, "error", "Only letters, spaces and the characters ' and - are allowed.");
								getErrorMsg(fieldname, errorfield);
															
															
								//fieldname.value = "";
								//fieldname.select();
								//setfocus(fieldname);
								$(fieldname).next().show();
								
								removeValidated(fieldname);

								return false;
							} else {
								$(fieldname).removeClass('defaultField');
								$(fieldname).next().hide();
								
								addValidated(fieldname);
								
								return true;
							}
							
}


// --------------------------------------------
//            validatePresent
// Returns true if so 
// --------------------------------------------

function validatePresent( fieldname, errorfield, required ) // id of element to receive error msg
{
  //alert("validatePresent");
  var stat = commonCheck (fieldname, errorfield, required);
  //alert(stat);
  
  if (stat != proceed) { 
  	return stat; 
	//alert(stat);
  } else { 
  	//alert("proceed"); 
	$(fieldname).removeClass('defaultField');
    $(fieldname).next().hide();
    addValidated(fieldname);
	return true;	
  }
  
							
}


// --------------------------------------------
//            validateIDCode
// Returns true if so 
// --------------------------------------------

function validateIDCode( fieldname, errorfield, required ) // id of element to receive error msg
{
  //alert("validatePresent");
  var stat = commonCheck (fieldname, errorfield, required);
  //alert(stat);
  
  if (stat != proceed) { 
  	return stat; 
  } else { 
  	//alert("proceed"); 
	
	//Troy to add stuff here
	
	//Leave this stuff though
	$(fieldname).removeClass('defaultField');
    $(fieldname).next().hide();
    addValidated(fieldname);
	return true;	
  }
  
							
}


// --------------------------------------------
//            validateCreditCard
// Returns true if so 
// --------------------------------------------

function validateCreditCard( fieldname, errorfield, required ) // id of element to receive error msg
{
  //alert("validateCreditCard");
  var stat = commonCheck (fieldname, errorfield, required);
  //alert(stat);
  
  if (stat != proceed) { 
  	return stat; 
  } else { 
  	//alert("proceed"); 
	
	
			var ccstring = fieldname.value; // set the cc string to some credit card number
			
			var invalid = 0;
			var p_ccstring = ""; // all non-number junk will be parsed out
			var running_total = 0;
			var temp;
			// go through ccstring and remove all non-numbers
			for (var i = 0; i < ccstring.length; i++) {
					temp = parseInt(ccstring.charAt(i));
					if (!(isNaN(temp))) p_ccstring = p_ccstring + temp; // string context
			}
			
			
			// go through LUHN formula
			// PASS 1
			for (i = p_ccstring.length - 2; i >= 0; i -= 2) {
					temp = parseInt(p_ccstring.charAt(i)) * 2;
					temp = temp + ""; // change number to string context for manipulation below
					if (temp.length == 2) running_total += parseInt(temp.charAt(0)) + parseInt(temp.charAt(1)) + 0;
					else running_total += parseInt(temp);
			}
			
			
			// PASS 2
			for (i = p_ccstring.length - 1; i >= 0; i -= 2) {
					running_total += parseInt(p_ccstring.charAt(i));
			}
			
			// now, run MOD 10 on running_total
			invalid = running_total % 10;
			//alert (running_total);
			//alert (ccstring);
			//alert (invalid);
			
			if (running_total == 0)
					invalid = 1;
			if (ccstring == 0)
					invalid = 1;
			if (invalid) {
								getErrorMsg(fieldname, errorfield);
								$(fieldname).next().show();
								removeValidated(fieldname);
								return false;
			} else {
				
				$(fieldname).removeClass('defaultField');
				$(fieldname).next().hide();
				addValidated(fieldname);
				return true;
	
			}
	
	
	
	
	
	
  }
  
							
}


// --------------------------------------------
//            validateDate
// Returns true if so 
// --------------------------------------------

function validateDate( fieldname, errorfield, required ) // id of element to receive error msg
{
  //alert("validateDate");
  var stat = commonCheck (fieldname, errorfield, required);
  //alert(stat);
  
  if (stat != proceed) { 
  	return stat; 
  } else { 
  	//alert("proceed"); 
	
  
	var datePat = /(\d{2})(-)(\d{2})(-)(\d{2})$/;
	var dateStr = trim(fieldname.value);
	// To require a 4 digit year entry, use this line instead:
	// var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
	//alert(dateStr);
	
	var matchArray = dateStr.match(datePat); // is the format ok?
	//alert(matchArray);
	if (matchArray == null) {
		getErrorMsg(fieldname, errorfield);
		$(fieldname).next().show();
		removeValidated(fieldname);
		return false;
	} else {
		month = matchArray[1]; // parse date into variables
		day = matchArray[3];
		year = matchArray[4];
		
		if (month < 1 || month > 12 || day < 1 || day > 31 || ((month==4 || month==6 || month==9 || month==11) && day==31) ) {
			getErrorMsg(fieldname, errorfield);
			$(fieldname).next().show();
			removeValidated(fieldname);
			return false;
		} else {
			
			if (month == 2) { // check for february 29th
				var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
				if (day>29 || (day==29 && !isleap)) {
					getErrorMsg(fieldname, errorfield);
					$(fieldname).next().show();
					removeValidated(fieldname);
					return false;
				} else {
					$(fieldname).removeClass('defaultField');
				  $(fieldname).next().hide();
				  addValidated(fieldname);
				  return true;
				}
			} else {
				  $(fieldname).removeClass('defaultField');
				  $(fieldname).next().hide();
				  addValidated(fieldname);
				  return true;
			}
	
	
			  
		}
	
		
	}
	
	
  }
  
							
}




// --------------------------------------------
//            validateRadioOptionSelected
// Validate if something has been entered
// Returns true if so 
// --------------------------------------------

function validateRadioOptionSelected( fieldname, errorfield, required ) // id of element to receive error msg
{
	//alert("validateRadioOptionSelected");

	// set var radio_choice to false
	var radio_choice = false;
	//alert(fieldname);
	//alert(fieldname.length);
	// Loop from zero to the one minus the number of radio button selections
	for (counter = 0; counter < fieldname.length; counter++) {
		
		// If a radio button has been selected it will return true
		// (If not it will return false)
		if (fieldname[counter].checked) {
			//alert("checked");
			radio_choice = true; 
		}
	}

	
	
	
	if ( !radio_choice ) {
		
		
			if (required) {
				//alert("radio required");
			    var myNewString = errorfield.replace("_errormsg", "");
				getErrorMsg(myNewString, errorfield);
				$('#'+errorfield).show();
				removeValidated(fieldname);
				return false;
			}
			else {
			  	$('#'+errorfield).hide();
			  	addValidated(fieldname);
			  	return true;
			}
	
	
	
	} else {
			$('#'+errorfield).hide();	
			addValidated(fieldname);
			return true;
	}
							
							
	  
  //var stat = commonCheck (fieldname, errorfield, required);
  //if (stat != proceed) return stat;
}


// --------------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validateEmail  (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (fieldname, errorfield, required);
  if (stat != proceed) return stat;

  var tfld = trim(fieldname.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/  ;
  if (!email.test(tfld)) {
    //msg (errorfield, "error", "Please enter a valid e-mail address.");
	getErrorMsg(fieldname, errorfield);
    //fieldname.select();
	$(fieldname).next().show();
	removeValidated(fieldname);
    return false;
	
  } else {
	  
	  //second round check
	  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
	  if (!email2.test(tfld)) {
		//msg (errorfield, "warn", "This is an unusal email format - please check if it is correct.");
		getErrorMsg(fieldname, errorfield);
		$(fieldname).removeClass('defaultField');
		$(fieldname).next().hide();
		addValidated(fieldname);
		return true;
	  } else {
		    $(fieldname).removeClass('defaultField');
			$(fieldname).next().hide();
			addValidated(fieldname);
			return true;
	  }
  
  }

  
  
  
}


// --------------------------------------------
//            validatePhone
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validatePhone  (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  //alert("check phone"+required);
  var stat = commonCheck (fieldname, errorfield, required);
  if (stat != proceed) return stat;

  var tfld = trim(fieldname.value);  // value of field with whitespace trimmed off
  var telnr = /^(\d{1})(\d{1})(\d{1})(-{1})(\d{1})(\d{1})(\d{1})(-{1})(\d{4})$/;
  
  if (!telnr.test(tfld)) {
    //msg (errorfield, "error", "Exactly 10 Digits are allowed in the format 555-555-5555");
	getErrorMsg(fieldname, errorfield);
    //fieldname.select();
	$(fieldname).next().show();
	removeValidated(fieldname);
    return false;
  } else {
	  $(fieldname).removeClass('defaultField');
	  $(fieldname).next().hide();
	  addValidated(fieldname);
	  return true;
  }
  
  
  
}

// --------------------------------------------
//            validateWebsite
// Validate website
// Returns true if so (and also if could not be executed because of old browser)
// --------------------------------------------

function validateWebsite  (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (fieldname, errorfield, required);
  //alert(stat);
  if (stat != proceed) return stat;

  var tfld = trim(fieldname.value);  // value of field with whitespace trimmed off
  var website = new RegExp();
  website.compile("^(ftp://|http://|https://)?([A-Za-z0-9-_]\\.)?[A-Za-z0-9-_%&\?\/.=]+\\.([A-Za-z]{2,4})+(/[a-z])?");
  

  if (!website.test(tfld)) {
	  //alert("failed");
    //msg (errorfield, "error", "The website address you entered is not in a valid format.");
	getErrorMsg(fieldname, errorfield);
    //fieldname.select();
	$(fieldname).next().show();
	removeValidated(fieldname);
    return false;
  } else {
	  //alert("passed");
	  $(fieldname).removeClass('defaultField');
	  $(fieldname).next().hide();
	  addValidated(fieldname);
	  return true;
  }
  
  
}



// --------------------------------------------
//             validateZipcode
// Returns true if OK 
// --------------------------------------------

function validateZipcode    (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (fieldname, errorfield, required);
  if (stat != proceed) return stat;

  var tfld = trim(fieldname.value);
  var zipcodeRE = /^[0-9]{5}$/
  if (!zipcodeRE.test(tfld)) {
    //msg (errorfield, "error", "Please enter a 5 digit zipcode.");
	getErrorMsg(fieldname, errorfield);
    //fieldname.select();
	$(fieldname).next().show();
	removeValidated(fieldname);
	
    return false;
  } else {
	  $(fieldname).removeClass('defaultField');
	  $(fieldname).next().hide();
	  addValidated(fieldname);
	  return true;
  }
}


// --------------------------------------------
//             validateState
// Returns true if OK 
// --------------------------------------------

function validateState    (fieldname,   // element to be validated
                         errorfield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (fieldname, errorfield, required);
  if (stat != proceed) return stat;

  var tfld = trim(fieldname.value);
  var stateRE = /^[A-Z]{2}$/
  if (!stateRE.test(tfld)) {
    //msg (errorfield, "error", "Please enter your two-letter state abbreviation in capital letters.");
	getErrorMsg(fieldname, errorfield);
    //fieldname.select();
	$(fieldname).next().show();
	removeValidated(fieldname);
	
    return false;
  } else {
	  $(fieldname).removeClass('defaultField');
	  $(fieldname).next().hide();
	  addValidated(fieldname);
	  return true;
  }
}

function removeValidated(fieldname) {
	//remove from validated list
	/*
	var idx = validatedFields.indexOf(fieldname.name); // Find the index
	if(idx!=-1) validatedFields.splice(idx, 1); // Remove it if really found!
	*/
	
  var i = 0;
  for(i=0;i<validatedFields.length;i++) {
    	if(validatedFields[i]==fieldname.name) {
			validatedFields.splice(i, 1);
		}
  }
 // return validatedFields[i] == string ? i : -1;
	  
	//alert(validatedFields.length+" "+fieldname.name+" removed.");
}

function addValidated(fieldname) {
	//add to validated list
	validatedFields.push(fieldname.name);
	//alert(validatedFields.length+" "+fieldname.name+" added.");
}


function getErrorMsg(fieldname, errorfield) {  

//getErrorMsg(myNewString, errorfield);

//alert(fieldname);
//alert(errorfield);

var checkingField = fieldname.name;
if (!checkingField) {
	var checkingField = fieldname;
}
//alert("Field "+checkingField);

	
	for ( j=0; j < errorMessagesJS.length; j++ ) {
			//alert(fieldname.name);
			//alert("Error "+errorMessagesJS[j][0]);
			if (checkingField == errorMessagesJS[j][0]) {
					//alert("matched");
					$error_msg = errorMessagesJS[j][1];
					//alert($error_msg);
	  				msg (errorfield, "error", $error_msg);
					//break;
			} else {
					/*
					alert("NOT matched");
					$error_msg = "This field has an error. Please correct it before proceeding.";
	  				msg (errorfield, "error", $error_msg);
					*/
			}
														
	}
	  
}

