Step1Message = "Credit card is not known.\nCredit card number is invalid.";
Step2Message = "Credit card number is invalid.";
Step3Message = "Credit card is not known.";
DisplayAllOkayMessage = "";
////////////////////////////////////////
//
//    N O T E S :
//
// Three global variables are set when function Validate() is called.
//
// Variable Name     Value
// ^^^^^^^^^^^^^     ^^^^^
// ccType          - The name of the credit card, if determinable. 
//                   Otherwise null.
// ccNumberOkay    - Digit 1 if the credit card number is of a valid 
//                   format. Otherwise digit 0.
// ccNumberChecked - The credit card number that was checked (all spaces 
//                   and non-digit characters stripped out). Example:
//                   CC # 1234-5678-901-234 is checked as 12345678901234
//
////////////////////////////////////////
ccType = '';
ccNumberOkay = 0;
ccNumberChecked = '';

function StripNonDigits(number) {
    var Re = /\d+/g;
    if(Re.lastIndex > 1) { Re.lastIndex = 0; }
    var Array = Re.exec(number);
    if(Re.lastIndex < 1) { return 'X'; }
    var ss = Array.join();
    while(Re.lastIndex > 0 && Re.lastIndex < number.length) {
        Array = Re.exec(number);
        if(Array) { ss += Array.join(); }
        }
    return ss;
} // StripNonDigits()


function GetType(number) {
    var len = number.length;
    var Re = /^5[1-5]/;
        if(Re.lastIndex > 1) { Re.lastIndex = 0; }
            var Array = Re.exec(number);
                if(Array && len == 16) { return 'MC'; }
    Re = /^4/;
        if(Re.lastIndex > 1) { Re.lastIndex = 0; }
            Array = Re.exec(number);
                if(Array && (len == 13 || len == 16)) { return 'VISA'; }
    Re = /^3[4|7]/;
        if(Re.lastIndex > 1) { Re.lastIndex = 0; }
            Array = Re.exec(number);
                if(Array && len == 15) { return 'AMEX'; }
    Re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
        if(Re.lastIndex > 1) { Re.lastIndex = 0; }
            Array = Re.exec(number);
                if(Array && (len == 16)) { return 'DISC'; }
    Re = /^3[0,6,8]\d{12}$/;
        if(Re.lastIndex > 1) { Re.lastIndex = 0; }
            Array = Re.exec(number);
                if(Array && (len == 14)) { return 'DIN'; }
    return '';
} // GetType()


function Reverse(number) {
    var n = '';
    for(i = number.length; i >= 0; i--) { n += number.substr(i,1); }
    return n;
} // Reverse()


function AddedTogether(number) {
    var n = 0;
    for(i = 0; i < number.length; i++) {
        var s = number.substr(i,1);
        var si = parseInt(s,10);
        if(i % 2 > 0) {
            var ii = si * 2;
            if(ii < 10) { n += ii; }
            else {
                var ss = ' ' + ii;
                for(xi = 1; xi < ss.length; xi++) {
                    var xs = ss.substr(xi,1);
                    var xsi = parseInt(xs,10);
                    n += xsi;
                    } // for
                } // else
            } // if
        else { n += si; }
        } // for
    return n;
} // AddedTogether()


function Mod10(n) {
    var reversed = Reverse(n);
    var total = AddedTogether(reversed);
    if(total % 10 > 0) { return 0; }
    return 1;
} // Mod10()


function checkDate(month, year) {
	year = '20' + year;
	today = new Date();
	expiry = new Date(year, month);
	if (today.getTime() > expiry.getTime()) {
		return false;
	} else {
		return true;
	}
}

function Validate(n) {
    ccNumberChecked = StripNonDigits(n);
    if(ccNumberChecked == 'X') {
        alert('Please enter a credit card number.');
        return false;
    }
	
    ccType = GetType(ccNumberChecked);
    thisccType=document.paymentForm.CC_Type[document.paymentForm.CC_Type.selectedIndex].value;

    ccNumberOkay = Mod10(ccNumberChecked);
    var fourth = '-- Credit Card --\n' + ccType + '\n' + ccNumberChecked;
    if(Step1Message.length > 0 && ccType.length < 2 && ccNumberOkay == 0) {
        alert(Step1Message);
        return false;
        }
    else if(Step2Message.length > 0 && ccNumberOkay == 0) {
        alert(Step2Message);
        return false;
        }
    else if(Step3Message.length > 0 && ccType.length < 2) {
        alert(Step3Message);
        return false;
        }
    else if(DisplayAllOkayMessage == "y" || DisplayAllOkayMessage == "Y") {
        alert(fourth);
        }
    else if(ccType!=thisccType) {
        alert('The credit card number supplied does not match the selected Credit Card type.');
        return false;
        }
    return true;
}

