String.prototype.trim = function () {
	var reExtraSpace = /^\s+(.*?)\s+$/;
	return this.replace(reExtraSpace, "$1");
}

function handleCCSubmit() {
	var oInputCCFName = document.getElementById('fn');
	var oInputCCLName = document.getElementById('ln');
	
	if ((oInputCCFName == undefined) && (oInputCCLName == undefined)) {
		if ((oInputCCFName.value.trim().length == 0) || (oInputCCLName.value.trim().length == 0)) {
			alert('You must enter the name on the credit card.');
			return false;	
		}
	}	
	
	var oInputCCNumber = document.getElementById('ccNumber');

	if (! validateCCNumber(oInputCCNumber.value)) {
		alert('The credit card number you entered is invalid.  Please check the number and try again.');
		return false;	
	}

	var oInputCCCode = document.getElementById('ccCode');
	
	if (oInputCCCode.value.trim().length == 0) {
		alert('You must enter the security code on the credit card.');
		return false;	
	}

	var oInputCCMonth = document.getElementById('ccMonth');
	var oInputCCYear = document.getElementById('ccYear');
	
	var d = new Date;

	if ((oInputCCYear.value == d.getFullYear()) && (oInputCCMonth.value < (d.getMonth()+1))) {
		alert('Your credit card may be expired.  Please check that the expiration date you entered is correct.');
		return false;	
	}
	return true;	
}

function validateCCNumber(sText) {
	var sTextNoSpaces = sText.replace(/[\s\-]/g, "");
	
	if ((sTextNoSpaces.length == 13) && (parseInt(sTextNoSpaces.charAt(0)) == 4)) {
		return isValidVisa(sTextNoSpaces);
	} else if ((sTextNoSpaces.length == 15) && (parseInt(sTextNoSpaces.charAt(0)) == 3)) {
		return isValidAmex(sTextNoSpaces);
	} else if (sTextNoSpaces.length == 16) {
		if (parseInt(sTextNoSpaces.charAt(0)) == 4) {
			return isValidVisa(sTextNoSpaces);
		} else if (parseInt(sTextNoSpaces.charAt(0)) == 5) {
			return isValidMasterCard(sTextNoSpaces);
		} else if (parseInt(sTextNoSpaces.charAt(0)) == 6) {
			return isValidDiscover(sTextNoSpaces);
		}
	} 
	return false;
}
function isValidMasterCard(sText) {
	var reMasterCard = /^(5[1-5]\d{2})[\s\-]?(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{4})$/;
	
	if (reMasterCard.test(sText)) {
		return luhnCheckSum(RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4);
	} else {
		return false;
	}
}
function isValidVisa(sText) {
	var reVisa = /^(4\d{12}(?:\d{3})?)$/;
	
	if (reVisa.test(sText)) {
		return luhnCheckSum(RegExp.$1);
	} else {
		return false;
	}
}
function isValidAmex(sText) {
	var reAmex = /^(34|37)(\d{13})$/;
	
	if (reAmex.test(sText)) {
		return luhnCheckSum(RegExp.$1 + RegExp.$2);
	} else {
		return false;
	}
}
function isValidDiscover(sText) {
	var reDiscover = /^6((?:011\d{12})|(?:5\d{14}))$/;
	
	if (reDiscover.test(sText)) {
		return luhnCheckSum('6' + RegExp.$1);
	} else {
		return false;
	}
}
function luhnCheckSum(sCardNum) {
	var iOddSum = 0;
	var iEvenSum = 0;
	var bIsOdd = true;

	for (var i=sCardNum.length-1; i>=0; i--) {
		var iNum = parseInt(sCardNum.charAt(i));
		
		if (bIsOdd) {
			iOddSum += iNum;
		} else {
			iNum = iNum*2;
			if (iNum > 9) {
				iNum = eval(iNum.toString().split("").join("+"));
			}
			iEvenSum += iNum;
		}
		bIsOdd = !bIsOdd;
	}

	var iSum = iOddSum + iEvenSum;
	return (iSum % 10 == 0);
}
