function mod10( cardNumber ) { // LUHN Formula for validation of credit card numbers.
var ar = new Array( cardNumber.length );
var i = 0,sum = 0;


for( i = 0; i < cardNumber.length; ++i ) {
ar[i] = parseInt(cardNumber.charAt(i));
}
for( i = ar.length -2; i >= 0; i-=2 ) { // you have to start from the right, and work back.
ar[i] *= 2;							 // every second digit starting with the right most (check digit)
if( ar[i] > 9 ) ar[i]-=9;			 // will be doubled, and summed with the skipped digits.
}										 // if the double digit is > 9, ADD those individual digits together 


for( i = 0; i < ar.length; ++i ) {
sum += ar[i];						 // if the sum is divisible by 10 mod10 succeeds
}
return (((sum%10)==0)?true:false);	 	
}


function expired( month, year ) {
var now = new Date();							// this function is designed to be Y2K compliant.
var expiresIn = new Date(year,month,1,0,0);		// create an expired on date object with valid thru expiration date
//expiresIn.setMonth(expiresIn.getMonth()+1);		// adjust the month, to first day, hour, minute & second of expired month

if( expiresIn.getTime() < now.getTime()) return true;
return false;									// then we get the milliseconds, and do a long integer comparison
}


function validateCard(cardNumber,cardType,cardMonth,cardYear) {
if( cardNumber.length == 0 ) {						//most of these checks are self- explanatory
alert("Please enter a valid card number.");
return false;				
}

/*
if(document.getElementById('cardType').options.selectedIndex == "0" ) {						//most of these checks are self-explanatory
alert("Please select a card type.");
return false;				
}
*/

for( var i = 0; i < cardNumber.length; ++i ) {		// make sure the number is all digits.. (by design)
var c = cardNumber.charAt(i);


if( c < '0' || c > '9' ) {
alert("Please enter a valid card number. Use only digits. Do not use spaces or hyphens.");
return false;
}
}
var length = cardNumber.length;			//perform card specific length and prefix tests

var cardTypeIndex = 0;
if (document.getElementById('OrderProgram1_cardType') != null) {
	cardTypeIndex = document.getElementById('OrderProgram1_cardType').options.selectedIndex;
} else if (document.getElementById('cardType') != null) {
	cardTypeIndex = document.getElementById('cardType').options.selectedIndex;
}

switch(cardTypeIndex) {
case 3:


if( length != 15 ) {
alert("Please enter a valid American Express Card number.");
return false;				
}
var prefix = parseInt( cardNumber.substring(0,2));


if( prefix != 34 && prefix != 37 ) {
alert("Please enter a valid American Express Card number.");
return false;				
}
break;
case 2:


if( length != 16 ) {
alert("Please enter a valid Discover Card number.");
return false;				
}
var prefix = parseInt( cardNumber.substring(0,4));


if( prefix != 6011 ) {
alert("Please enter a valid Discover Card number.");
return false;				
}
break;
case 1:


if( length != 16 ) {
alert("Please enter a valid MasterCard number.");
return false;				
}
var prefix = parseInt( cardNumber.substring(0,2));


if( prefix < 51 || prefix > 55) {
alert("Please enter a valid MasterCard Card number.");
return false;				
}
break;
case 0:


if( length != 16 && length != 13 ) {
alert("Please enter a valid Visa Card number.");
return false;				
}
var prefix = parseInt( cardNumber.substring(0,1));


if( prefix != 4 ) {
	alert("Please enter a valid Visa Card number.");
	return false;				
}
break;
}
if( !mod10( cardNumber ) ) { 		// run the check digit algorithm
alert("The credit card number you entered is not in the range of card numbers possible with the card type you specified. Please check the number and the card type.");
return false;
}
if( expired( cardMonth, cardYear ) ) {							// check if entered date is already expired.
alert("Sorry! The expiration date you have entered would make this card invalid.");
return false;
}

return true; // at this point card has not been proven to be invalid
}