// functions for the credit card validation
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,0,0,0);             // create an expired on date object with valid thru expiration date

	expiresIn.setMonth(expiresIn.getMonth());             // adjust the month, to first day, hour, minute & second of expired month

//alert (now.getTime() + "   " + expiresIn.getTime());
	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) {
	var missing_crd = "";
	//alert ("function called " + cardNumber + " " + cardType + " " + cardMonth + " " + cardYear);
	if( cardNumber.length == 0 ) {                                          //most of these checks are self explanitory
		//alert("Please enter a valid card number.");
		missing_crd += "Please enter a valid card number.\n";        
		return missing_crd;              
	}
	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.");
			missing_crd += "Please enter a valid card number. Use only digits. do not use spaces or hyphens.";
			return missing_crd;
		}
	}
	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.");
				missing_crd +="Please enter a valid American Express Card number.";
				return missing_crd;
			}
			var prefix = parseInt( cardNumber.substring(0,2));
			if( prefix != 34 && prefix != 37 ) {
				//alert("Please enter a valid American Express Card number.");
				missing_crd += "Please enter a valid American Express Card number.";
				return missing_crd;
			}
			break;
		case 'd':
			if( length != 16 ) {
				//alert("Please enter a valid Discover Card number.");
				missing_crd += "Please enter a valid Discover Card number.";
				return missing_crd;
			}
			var prefix = parseInt( cardNumber.substring(0,4));
			if( prefix != 6011 ) {
				//alert("Please enter a valid Discover Card number.");
				missing_crd += "Please enter a valid Discover Card number.";
				return missing_crd;
			}
			break;
		case 'm':
			if( length != 16 ) {
				//alert("Please enter a valid MasterCard number.");
				missing_crd += "Please enter a valid MasterCard number.";
				return missing_crd;
			}
			var prefix = parseInt( cardNumber.substring(0,2));
			if( prefix < 51 || prefix > 55) {
				//alert("Please enter a valid MasterCard Card number.");
				missing_crd += "Please enter a valid MasterCard Card number."
			return missing_crd;
			}
			break;
		case 'v':
			if( length != 16 && length != 13 ) {
				//alert("Please enter a valid Visa Card number.");
				missing_crd += "Please enter a valid Visa Card number.";
				return missing_crd;
			}
			var prefix = parseInt( cardNumber.substring(0,1));
			if( prefix != 4 ) {
				//alert("Please enter a valid Visa Card number.");
				missing_crd += "Please enter a valid Visa Card number.";   
				return missing_crd;                                                                                        
			}
			break;
		}

		if( !mod10( cardNumber ) ) {            // run the check digit algorithm
			missing_crd += "Sorry! this is not a valid credit card number.";
			//alert("Sorry! this is not a valid credit card number.");
			//return false;
			return missing_crd;
		}
		
		if( expired( cardMonth, cardYear ) ) { // check if entered date is already expired.
			missing_crd += "Sorry! The expiration date you have entered would make this card invalid.";
			//alert("Sorry! The expiration date you have entered would make this card invalid.");
			//return false;
			return missing_crd;
		}
        return missing_crd;                                                           
		//return true; // at this point card has not been proven to be invalid
}
