var reValEmail = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9]{1,}[a-z0-9_\-\.]*)(\.[a-z]{2,4}(\.[a-z]{2}){0,2})$/i;
var reLTrim = /^\s+/;
var reRTrim = /\s+$/;
var objForm = document.forms['objForm'];
var strErr = '';
var strErrHead = "The following information is missing or invalid:     \n____________________________________\n\n";
var strErrFoot = "____________________________________\nPlease re-enter and submit again.";
var strErrLineBegin = "     -  ";
var strErrLineEnd = "\n";

function addError() {
	var i,value,iArgLen=arguments.length;
	for(i=0;i<iArgLen;i++){
		value = arguments[i];
		if(typeof value!='undefined' && value!=null && value!='') {
			strErr += strErrLineBegin + value + strErrLineEnd;
			break;
		}
	}
}

function hasErrors(oForm) {
	if (!oForm) oForm = objForm;
	if (strErr != '') {
		return true;
	} else {
		return false;
	}
}

function popError(blnUseHeadFoot) {
	if (strErr != '') {
		if (blnUseHeadFoot == undefined || blnUseHeadFoot == true) {
			alert(strErrHead + strErr + strErrFoot);
		} else {
			alert(strErr);
		}
		strErr = '';
	}
}

function trimField(oField) {
	if (oField.value) {
		if (oField.value != '') {
			oField.value = oField.value.replace(reLTrim,"").replace(reRTrim,"");
			return true;
		}
	}
	return false;
}

function trimAllText(oForm) {
	if (!oForm) oForm = objForm;
	for (var i = 0; i < oForm.elements.length; i++) {
		if (oForm.elements[i].type == 'text') {
			trimField(oForm.elements[i]);
		}
	}
}
function getValueOf(element) {
	if(element.length != null) var type = element[0].type;
	if((typeof(type) == 'undefined') || (type == 0)) var type = element.type;
	switch(type){
		case 'undefined': break;
		case "radio":
			if (element.length) {
				for(var x=0; x < element.length; x++) {
					if(element[x].checked == true) return element[x].value;
				}
			} else {
				return element.value;
			}
			break;
		case "checkbox":
			var aValues = new Array();
			if (element.length) {
				for(var x=0; x < element.length; x++) {
					if(element[x].checked == true) aValues[aValues.length] = element[x].value;
				}
				if (aValues.length > 0) return aValues;
			} else {
				return element.value;
			}
			break;
		case 'select-multiple':
			var aValues = new Array();
			if (element.length) {
				for(var x=0; x < element.length; x++) {
					if(element[x].selected == true) aValues[aValues.length] = element[x].value;
				}
				if (aValues.length > 0) return aValues;
			} else {
				return element.value;
			}
			break;
		default: return element.value;
	}
	return false;
}

function valRequired(strFieldName, strErrorText) {
	var oField = objForm[strFieldName], bHasValue = false;
	if (oField) {
		if (getValueOf(oField)) {
			return true;
		} else {
			addError(strErrorText, strFieldName);
		}
	}
	return false;
}

function valEmail(strFieldName, strErrorText) {
	var oField = objForm[strFieldName];
	if (oField) {
		sValue = getValueOf(oField);
		if (sValue) {
			if (!reValEmail.test(sValue)) {
				addError(strErrorText, strFieldName);
				return false;
			}
		}
		return true;
	}
	return false;
}

function valRange(strFieldName, strMin, strMax, strErrorText) {
	var oField = objForm[strFieldName];
	if (oField) {
		sValue = getValueOf(oField);
		if (sValue) {
			if (typeof(strMin) == 'number' && typeof(strMax) == 'number') {
				sValue = parseInt(sValue, 10);
				if (isNaN(sValue)) {
					addError(strErrorText, strFieldName);
					return false;
				}
			} else {
				strMin = strMin.toString();
				strMax = strMax.toString();
				sValue = sValue.toString();
			}
			if (sValue < strMin || sValue > strMax) {
				addError(strErrorText, strFieldName);
				return false;
			}
		}
		return true;
	}
	return false;
}

function valMaxlength(strFieldName, intMax, strErrorText) {
	var oField = objForm[strFieldName];
	intMax = parseInt(intMax, 10);
	if (oField && intMax && !isNaN(intMax)) {
		sValue = getValueOf(oField);
		if (sValue) {
			if (sValue.length > intMax) {
				addError(strErrorText, strFieldName+" is currently "+sValue.length+" characters.\n         The maximum length is "+intMax+" characters.");
				return false;
			}
		}
		return true;
	}
	return false;
}

function valRegEx(strFieldName, strRegEx, strErrorText) {
	var oField = objForm[strFieldName];
	if (oField && strRegEx) {
		sValue = getValueOf(oField);
		if (sValue) {
			var re = new RegExp(strRegEx);
			if (!re.test(sValue)) {
				addError(strErrorText, strFieldName);
				return false;
			}
		}
		return true;
	}
	return false;
}

function valCreditCard(fldCCNumber, fldCCType, fldExpMonth, fldExpYear, strErrorText) {
	if (objForm[fldCCNumber] && objForm[fldCCType] && objForm[fldExpMonth] && objForm[fldExpYear]) {
		var cc_num = getValueOf(objForm[fldCCNumber]);
		if (cc_num) {
			intReturn = validate_cc_number(getValueOf(objForm[fldCCType]), cc_num);
			if (intReturn) {
				switch (intReturn){
					case 1: case 8:	addError(strErrorText, 'Invalid Credit Card Type'); break;
					default:		addError(strErrorText, 'Invalid Credit Card Number'); break;
				}	
				return false;
			}
			intReturn = validate_cc_exp(getValueOf(objForm[fldExpMonth]), getValueOf(objForm[fldExpYear]));
			if (intReturn) {
				switch (intReturn){
					case 1:		addError(strErrorText, 'Invalid Credit Card Expiration Month'); break;
					case 2:		addError(strErrorText, 'Invalid Credit Card Expiration Year'); break;
					default:	addError(strErrorText, 'Invalid Credit Card Expiration Date'); break;
				}
				return false;
			}
			return true;
		}
	}
	return false;
}

function validate_cc_number(strCCType, strCCNumber) {
	/*	checks credit card number for checksum, length, type
	strCCNumber= credit card number (all non-numeric characters are being removed before check)
	vntCCExpDate must be > today and <= today + 10 years
	*/
	var c_CardValid = 0, c_BadCCType = 1, c_BadCCLength = 2, c_BadChecksum = 4, c_UnknownCCType = 8;
	var blnPrefixValid = false, blnLengthValid = false, i = 0;
	var lstCCLengths, lstCCPrefixs;
	// Get card properties
	switch (strCCType.toUpperCase()) {
		// American Express
		case "AMERICAN EXPRESS": lstCCLengths = '15'; lstCCPrefixs = '34,37'; break;
		// VISA / Delta
		case "VISA": lstCCLengths = '13,16'; lstCCPrefixs = '4'; break;
		// Mastercard/Eurocard
		case "MASTERCARD": lstCCLengths = '16'; lstCCPrefixs = '51,52,53,54,55'; break;
		// Discover
		case "DISCOVER": lstCCLengths = '16'; lstCCPrefixs = '6011'; break;
		// BankCard
		case "BANKCARD": lstCCLengths = '16'; lstCCPrefixs = '56'; break;
		// Diners Club / Carte Blanche
		case "DINERS CLUB": lstCCLengths = '14'; lstCCPrefixs = '300,301,302,303,304,305,36,38'; break;
		// EnRoute
		case "ENROUTE": lstCCLengths = '15'; lstCCPrefixs = '2014,2149'; break;
		// JCB
		case "JCB": lstCCLengths = '15,16'; lstCCPrefixs = '3,2131,1800'; break;
		// Unknown Card Type
		default:
			return c_UnknownCCType;
	}
	// Remove all non-digit characters from CC number string
	strCCNumber = strCCNumber.replace(/\D/g, "");
	//objForm['cc_num'].value = strCCNumber;
	// verify card number is correct length
	var arrCCLength = lstCCLengths.split(',');
	for (i = 0; i < arrCCLength.length; i++) {
		if (arrCCLength[i] == strCCNumber.length) {
			blnLengthValid = true;
			break;
		}
	}
	if (!blnLengthValid) {
		// credit card number is wrong length
		return c_BadCCLength;
	}
	var arrCCPrefix = lstCCPrefixs.split(',');
	// validate card type
	for (i = 0; i < arrCCPrefix.length; i++) {
		if (strCCNumber.indexOf(arrCCPrefix[i]) == 0) {
			blnPrefixValid = true;
			break;
		}
	}
	if (!blnPrefixValid) {
		// card type is invalid
		return c_BadCCType;
	}
	// validate card number against mod10 algorithm
	var blnOddEven = strCCNumber.length & 1, intSum = 0, chrDigit = 0;
	for (var i = 0; i < strCCNumber.length; i++) {
		var chrDigit = parseInt(strCCNumber.charAt(i));
		if (!((i & 1) ^ blnOddEven)) {
			chrDigit *= 2;
			if (chrDigit > 9) {
				chrDigit -= 9;
			}
		}
		intSum += chrDigit;
	}
	if (intSum % 10 == 0) {
		// checksum ok - valid credit card number
		return c_CardValid;
	} else {
		// checksum wrong - invalid credit card number
		return c_BadChecksum;
	}
}
	
function validate_cc_exp(intMonth, intYear) {
	var c_DateValid = 0, c_BadMonth = 1, c_BadYear = 2; c_BadExpDate = 4; dtmNow = new Date()
	intYear = parseInt(intYear, 10);
	if (isNaN(intYear)) return c_BadYear;
	if (intYear < 100) intYear += 2000;
	intMonth = parseInt(intMonth, 10);
	if (isNaN(intMonth)) return c_BadMonth;
	var dtmExp = new Date(intYear, intMonth);
	if (dtmNow.getTime() > dtmExp.getTime()) {
		return c_BadExpDate;
	} else {
		return c_DateValid;
	}
}
