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 )
{
	if( year.length < 4 ) year = '20' + 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(cardNumber,cardType,cardMonth,cardYear)
{
	if( cardNumber.length == 0 ) {						//most of these checks are self explanitory
		alert("Please enter a valid card number.");
		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

	switch( cardType ) {
	case 'a':
		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 'd':
		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 'm':
		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 'v':
		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("Sorry! This is not a valid credit card number.");
		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
}