

function CheckCardNumber(ccNumber,ccType) {

	if (ccNumber.value.length == 0) {
		alert("Please enter a Card Number.");
		ccNumber.focus();
		ccNumber.select();
		return false;
	}

	switch (ccType.options[ccType.selectedIndex].value) {
		case 'Visa' : var ccReg = /^4\d{12}(\d{3})?$/; break;
		case 'Master Card' : var ccReg = /^5[1-5]\d{14}$/; break;
		case 'DISC' : var ccReg = /^6011\d{12}$/; break;
		case 'AMEX' : var ccReg = /^3[4|7]\d{13}$/; break;		
		case 'DINERS'	: var ccReg = /^3[0|6|8]\d{12}$/; break;
		case 'ENROUTE'	: var ccReg = /^2[014|149]\d{11}$/; break;
		case 'JCB'		: var ccReg = /^3[088|096|112|158|337|528]\d{12}$/; break;
		case 'Switch'	: var ccReg = /^(49030[2-9]|49033[5-9]|49110[1-2]|4911(7[4-9]|8[1-2])|4936[0-9]{2}|564182|6333[0-4][0-9]|6759[0-9]{2})\d{10}(\d{2,3})?$/; break;
		case 'Delta'	: var ccReg = /^4(1373[3-7]|462[0-9]{2}|5397[8|9]|54313|5443[2-5]|54742|567(2[5-9]|3[0-9]|4[0-5])|658[3-7][0-9]|659(0[1-9]|[1-4][0-9]|50)|844[09|10]|909[6-7][0-9]|9218[1|2]|98824)\d{10}$/; break;
		case 'Solo'		: var ccReg = /^(6334[5-9][0-9]|6767[0-9]{2})\d{10}(\d{2,3})?$/; break;
		// Add additonal card types here
		default			: alert('Error! Card Type not found!'); return false;
		}
	var formatOK = ccReg.test(ccNumber.value);
	var luhnOK = validateLUHN(ccNumber.value);	
	if (!formatOK || !luhnOK) {
		alert("The card type / card number is invalid");
		return false;
	}

	return true;
}

function validateLUHN(ccString) {
	var odds = "";
	var evens = "";
	var i=1;
	
	for (i=ccString.length-2; i>=0; i=i-2) {
		var digit = parseInt(ccString.charAt(i)) * 2;
		odds += digit+"";
		}
	for (i=ccString.length-1; i>=0; i=i-2)
		evens += ccString.charAt(i);
	var luhnStr = odds + evens;
	var checkSum = 0;
	for (i=0; i<luhnStr.length; i++)
		checkSum += parseInt(luhnStr.charAt(i));	
	return (checkSum % 10 == 0);
}
