function mod10( CC_number ) { // LUHN Formula for validation of credit card numbers.
var ar = new Array( CC_number.length );
var i = 0,sum = 0;


for( i = 0; i < CC_number.length; ++i ) {
ar[i] = parseInt(CC_number.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,0,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( now.getTime() < expiresIn.getTime() ) return false;
return true;									// then we get the miliseconds, and do a long integer comparison
}


function validateCard(CC_number,CC_type,CC_expiration_month,CC_expiration_year) {
if( CC_number.length == 0 ) {						//most of these checks are self explanitory
alert("Please enter a valid card number.");
return false;				
}

if(document.forms.creditcardform.CC_type.options.selectedIndex == "0" ) {						//most of these checks are self explanitory
alert("Please select a card type.");
return false;				
}


for( var i = 0; i < CC_number.length; ++i ) {		// make sure the number is all digits.. (by design)
var c = CC_number.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 = CC_number.length;			//perform card specific length and prefix tests
var CC_type = (document.forms.creditcardform.CC_type.value).charAt(0);

switch(document.forms.creditcardform.CC_type.options.selectedIndex) {
case 1:


if( length != 15 ) {
alert("Please enter a valid American Express Card number.");
return false;				
}
var prefix = parseInt( CC_number.substring(0,2));


if( prefix != 34 && prefix != 37 ) {
alert("Please enter a valid American Express Card number.");
return false;				
}
break;
case 4:


if( length != 16 ) {
alert("Please enter a valid Discover Card number.");
return false;				
}
var prefix = parseInt( CC_number.substring(0,4));


if( prefix != 6011 ) {
alert("Please enter a valid Discover Card number.");
return false;				
}
break;
case 3:


if( length != 16 ) {
alert("Please enter a valid MasterCard number.");
return false;				
}
var prefix = parseInt( CC_number.substring(0,2));


if( prefix < 51 || prefix > 55) {
alert("Please enter a valid MasterCard Card number.");
return false;				
}
break;
case 2:


if( length != 16 && length != 13 ) {
alert("Please enter a valid Visa Card number.");
return false;				
}
var prefix = parseInt( CC_number.substring(0,1));


if( prefix != 4 ) {
	alert("Please enter a valid Visa Card number.");
	return false;				
}
break;
}
if( !mod10( CC_number ) ) { 		// 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( CC_expiration_month, CC_expiration_year ) ) {							// 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
}