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 ) {
year = eval("20" + year);
var now = new Date();							// this function is designed to be Y2K compliant.
var expiresIn = new Date(year,month,0,0,0);
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,cardVerficationCode,cardName) {
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 != 14 ) {
alert("Please enter a valid Diners Club 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;
		}

		if (cardVerficationCode.length != 0)
		{
				if ((cardVerficationCode.length <3) || (cardVerficationCode.length >4))
				{
					alert("Sorry! The credit card verification code cannot be less than three characters");
					return false;
				}

				if (isNaN(cardVerficationCode))
				{
					alert("Sorry! The credit card verification code must be numeric only");
					return false;
				}
		}
		else
		{
			alert("Sorry! The credit card verification code cannot be blank");
			return false;
		}


		if (cardName.length == 0)
		{
			alert("Sorry! The credit card holder name cannot be blank");
			return false;
		}

		if (chkalpha(cardName))
		{
			alert("Sorry! The credit card holder name contains some invalid characters");
			return false;
		}
		
		return true; // at this point card has not been proven to be invalid
}


function chkalpha(str){
  var re =  /^[a-zA-Z]+$/;
	if (re.test(str))
	{
		return true;
	}
	else
	{
		return false;
	}
}


