// FORM VALIDATION FUNCTIONS
function validRequired(formField,fieldLabel) {
	var result = true;
	
	if (formField.value == "")
	{
		alert('Please enter a ' + fieldLabel);
		formField.focus();
		result = false;
	}
	
	return result;
}

function validPhone(formField, fieldLabel, required) {
	var result = true;
	if (required && !validRequired(formField,fieldLabel))
		result = false;
	if (result) {
		var strng = formField.value;
		var stripped = strng.replace(/[\(\)\.\-\ ]/g, '');
		//strip out acceptable non-numeric characters
		if (isNaN(parseInt(stripped)) && stripped != '') {
		   alert(fieldLabel + ' contains illegal characters.');
		   formField.focus();
		   result = false;
		}
		// Then we count the length of the number. It should have exactly ten digits — any more or less, and we reject it.
		else if (!(stripped.length >= 10) && stripped != '') {
			alert(fieldLabel + ' is the wrong length. Make sure you included an area code.\n');
			formField.focus();
			result = false;
		}
	}
	return result;
}

function validEmail(formField, required, hidealert){
	if (required || strlen(formField.value) > 0) {
		var testresults
		var str=formField.value
		var filter=/^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
		if (filter.test(str))
		testresults=true
		else{
			if (!hidealert)
				alert("Please input your valid email address!")
				formField.focus();
		testresults=false
		}
		return (testresults)
	}
	else return true;
}

function allDigits(str) {
	return inValidCharSet(str,"0123456789.");
}

function inValidCharSet(str,charset) {
	var result = true;

	// Note: doesn't use regular expressions to avoid early Mac browser bugs	
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}
	
	return result;
}

function validNum(formField,fieldLabel,required) {
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;
  
 	if (result)
 	{
 		if (!allDigits(formField.value))
 		{
 			alert('Please enter a number for the ' + fieldLabel +' field.');
			formField.focus();		
			result = false;
		}
	} 
	
	return result;
}

function validZip(formField, fieldLabel, required) {
	result = true;
	if (required && !validRequired(formField,fieldLabel))
		result = false;
	var valid = "0123456789-";
	var hyphencount = 0;
	zip = formField.value;
	if (zip!='') {
		if (zip.length!=5 && zip.length!=10) {
			alert("Please enter your 5 digit or 5 digit+4 zip code.");
			formField.focus();
			return false;
		}
		for (var i=0; i < zip.length; i++) {
			temp = "" + zip.substring(i, i+1);
			if (temp == "-") hyphencount++;
			if (valid.indexOf(temp) == "-1") {
				alert("Invalid characters in your zip code.  Please try again.");
				formField.focus();
				return false;
			}
			if ((hyphencount > 1) || ((zip.length==10) && ""+zip.charAt(5)!="-")) {
				alert("The hyphen character should be used with a properly formatted 5 digit+four zip code, like '12345-6789'.   Please try again.");
				formField.focus();
				return false;
		   }
		}
	}
	return result;
}
// Validate State against javascript array of US States (pulled from db)
function validState(formField, fieldLabel, required) {
	var result = true;
	var strng = formField.value;
	if (required && !validRequired(formField,fieldLabel))
		result = false;
	if (result && strng.length>0) {
		// Check against database of US States.  If it doesn't match, reject it.
		for (cnt=0; cnt < vstates.length; cnt++) {
			if (vstates[cnt].toUpperCase()==strng.toUpperCase()) {
				return true;
			}
		}
		// otherwise no match was found
		alert(fieldLabel + ' is not a valid US state.  Please enter the correct 2 digit abbreviation.\n');
		formField.focus();
		result = false;
	}
	return result;
}

function validCCExp(monthFormField, yearFormField) {
	var result = true;
	var ccmonth = monthFormField.value;
	var ccyear = yearFormField.value;
	if (ccyear < thisyear) {
		result = false;
	}
	else if (ccyear == thisyear && ccmonth < thismonth) {
		result = false;
	}
	if (result == false) {
		alert("Credit card expiration date has passed.  Please enter a valid expiration date.");
		monthFormField.focus();
	}
	return result;
}

function validCCNum(ccTypeField, ccNumField, required) {
	var result = true;
	if (required && !validNum(ccNumField,"Credit Card Number", 1))
		return false;
	var cctype;
	for( i=0; i<ccTypeField.length; ++i)
		if (ccTypeField[i].checked)
			cctype = ccTypeField[i].value;
	var ccnum = ccNumField.value.replace(/[\(\)\.\-\ ]/g, '');
	// if credit card is selected, check against length and prefix
	var validLength = 1;
	var validPrefix = 1;
	var digits = "";
	switch (cctype) {
		case 'visa':
			// length = 13,16; prefix = 4;
			digits = "13 or 16"; ccName = "Visa";
			validLength = (ccnum.length == 13 || ccnum.length == 16);
			validPrefix = (ccnum.substr(0,1) == 4);
			break;
		case 'mc':
			// length = 16; prefix = 51-55;
			digits = "16"; ccName = "MasterCard";
			validLength = (ccnum.length == 16);
			prefixDigits = parseInt(ccnum.substr(0,2));
			validPrefix = (prefixDigits >= 51 && prefixDigits <= 55);
			break;
		case 'amex':
			// length = 15; prefix = 34, 37;
			digits = "15";  ccName = "American Express";
			validLength = (ccnum.length == 15);
			validPrefix = (ccnum.substr(0,2) == 34 || ccnum.substr(0,2) == 37);
			break;
		case 'discover':
			// length = 16; prefix = 6011;
			digits = "16";  ccName = "Discover";
			validLength = (ccnum.length == 16);
			validPrefix = (ccnum.substr(0,4) == 6011);
			break;
	}
	if (!validPrefix) {
		alert("The Credit Card number you entered is an invalid " + ccName + " number. Please check that the numbers are correct, and try again.");
		ccNumField.focus();
		result = false;
	}
	else if (!validLength) {
		alert(ccName + " credit cards contain " + digits + " digits.  You've entered " + ccnum.length + ".  Please check the number carefully and try again.");
		ccNumField.focus();
		result = false;
	}

	return result;
}