﻿function GetCardType(number) {
    $("#cardIcon").show();
    $("#cardIcon").removeClass("hide");
    $("#spanAllowedCreditDebitCardTypesMessage").hide();
    $("#spanAllowedCreditDebitCardTypesMessage").addClass("hide");
    $("#spanCardNumber").hide();
    $("#spanCardNumber").addClass("hide");

    var AllowedCardTypes = $("#hdnAllowedCreditDebitCardTypes").val();

    $("span.card-icon").removeClass("visa-card");
    $("span.card-icon").removeClass("master-card");
    $("span.card-icon").removeClass("express-card");
    $("span.card-icon").removeClass("discover-card");
    var isMatched = false;
    var isRegexMatched = false;
    isAllowedCard = true;



    // visa
    var re = new RegExp("^4");
    if (number.match(re) != null) {
        $("#hdnCardType").val("visa");
        $("span.card-icon").addClass("visa-card");
        $("#CvvNumber").attr("maxlength", 3);
        isMatched = true;
        $("#cvv-card").show();
        $("#amex-card").hide();
        isRegexMatched = true;
        if (AllowedCardTypes.indexOf("VISA") <= 0) {
            $("#spanAllowedCreditDebitCardTypesMessage").show();
            $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");

            isAllowedCard = false;
            isMatched = isAllowedCard;
        }
    }

    // Mastercard
    // Updated for Mastercard 2017 BINs expansion
    re = new RegExp("^5");
    if (number.match(re) != null) {
        $("#hdnCardType").val("mastercard");
        $("span.card-icon").addClass("master-card");
        $("#CvvNumber").attr("maxlength", 3);
        isMatched = true;
        $("#cvv-card").show();
        $("#amex-card").hide();
        isRegexMatched = true;
        if (AllowedCardTypes.indexOf("MasterCard") <= 0) {
            $("#spanAllowedCreditDebitCardTypesMessage").show();
            $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");

            isAllowedCard = false;
            isMatched = isAllowedCard;
        }
    }

    // AMEX
    re = new RegExp("^3[47]");
    if (number.match(re) != null) {
        $("#hdnCardType").val("amex");
        $("span.card-icon").addClass("express-card");
        $("#CvvNumber").attr("maxlength", 4);
        isMatched = true;
        $("#cvv-card").hide();
        $("#amex-card").show();
        isRegexMatched = true;
        //cvvNumberDigits = 4;
        if (AllowedCardTypes.indexOf("American Express") <= 0) {
            $("#spanAllowedCreditDebitCardTypesMessage").show();
            $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");

            isAllowedCard = false;
            isMatched = isAllowedCard;
        }
    }

    // Discover
    re = new RegExp("^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)");
    if (number.match(re) != null) {
        $("#hdnCardType").val("discover");
        $("span.card-icon").addClass("discover-card");
        $("#CvvNumber").attr("maxlength", 3);
        isMatched = true;
        $("#cvv-card").show();
        $("#amex-card").hide();
        isRegexMatched = true;
        if (AllowedCardTypes.indexOf("Discover") <= 0) {
            $("#spanAllowedCreditDebitCardTypesMessage").show();
            $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");

            isAllowedCard = false;
            isMatched = isAllowedCard;
        }
    }

    if (!isMatched && $("#hdnCardNumber").val() != "" && isAllowedCard && isRegexMatched) {
        $("#spanCardNumber").show();
        $("#spanCardNumber").removeClass("hide");
        $("#spanAllowedCreditDebitCardTypesMessage").hide();
        $("#spanAllowedCreditDebitCardTypesMessage").addClass("hide");
    }
    else if (!isRegexMatched && $("#hdnCardNumber").val() != "") {
        $("#spanCardNumber").hide();
        $("#spanCardNumber").addClass("hide");
        $("#spanAllowedCreditDebitCardTypesMessage").show();
        $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");

    }

    return isMatched;
}
$(document).ready(function () {

    $("#CardNumber").on("focus", function (e) {

        if ($('#CardNumber').val().indexOf('*') > -1) {
            $("#CardNumber").val($("#hdnCardNumber").val());
        }

    });

    $("#CardNumber").on("blur", function (e) {
        var CCNumber = $('#CardNumber').val();
        CCNumber.trim().toString().replace(/\W/gi, '').replace(/(.{4})/g, '$1 ');
        if (CCNumber.trim().length < 15) {
            isValidCard = false;
        } else {
            isValidCard = valid_credit_card($("#CardNumber").val());
        }
        var validCard = GetCardType(CCNumber); // check for hidden var to use or not?

        if (!isValidCard) {
            $("#spanAllowedCreditDebitCardTypesMessage").show();
            $("#spanAllowedCreditDebitCardTypesMessage").removeClass("hide");
        }
        else {
            if (validCard) {
                $("#spanAllowedCreditDebitCardTypesMessage").hide();
                $("#spanAllowedCreditDebitCardTypesMessage").addClass("hide");
                $("#hdnCardNumber").val($("#CardNumber").val());
                $("#CardNumber").val($("#CardNumber").val().replace(/\W/gi, '').replace(/(.{4})/g, '$1 ').trim());
                var lastIndex = $("#CardNumber").val().lastIndexOf(" ");
                var str = $("#CardNumber").val().substr(0, lastIndex).replace(/[0-9]/g, '*') + ' ' + $("#CardNumber").val().substr(lastIndex + 1);
                $("#CardNumber").val(str);

                //check cvv
                validateCvv();
            }

        }

    });

    $("#CardNumber").on("keydown", function (e) { //use key down
        var keyCode = e.keyCode || e.which;
        keyCode = keyCode >= 96 ? keyCode - 48 : keyCode;
        if (!(keyCode === 8 || keyCode === 37 || keyCode === 39 || keyCode === 46 || ((keyCode >= 48 && keyCode <= 57))) || e.shiftKey) {
            e.preventDefault();
            return false;
        }
        var CCNumber = $('#CardNumber').val().replace(/ /g, '').toString();
        GetCardType(CCNumber);

    });


    $('#CvvNumber').on("blur", function () {
        validateCvv();
    });

$("#CardNumber").on("paste", function (e) {
    e.preventDefault();
    return false;
});


});

//check cvv pattern

function validateCvv() {
    var cardType = $("#hdnCardType").val();
    var cvvNumberDigits = cardType == 'amex' ? 4 : 3;
    var cvvpattern = new RegExp("^[0-9]{" + cvvNumberDigits + "}$");
    var cvv = $('#CvvNumber').val();
    if (cvv !== '' && cvv.match(cvvpattern) == null) {
        $('#spanCvvNumber').removeClass("hide")
        $('#spanCvvNumber').show();
    }
    else {
        $('#spanCvvNumber').addClass("hide");
        $('#spanCvvNumber').hide();
    }
}
// Takes a credit card string value and returns true on valid number
function valid_credit_card(value) {
    // Accept only digits, dashes or spaces
    if (/[^0-9-\s]+/.test(value)) return false;

    // The Luhn Algorithm. It's so pretty.
    let nCheck = 0, bEven = false;
    value = value.replace(/\D/g, "");

    for (var n = value.length - 1; n >= 0; n--) {
        var cDigit = value.charAt(n),
            nDigit = parseInt(cDigit, 10);

        if (bEven && (nDigit *= 2) > 9) nDigit -= 9;

        nCheck += nDigit;
        bEven = !bEven;
    }

    return (nCheck % 10) == 0;
}

function ClearPaymentFieldsDataAndErrorMsg() {
    if ($('#hdnFromReviewEditSection').val() == 0) {
        $("#frmPayments span.field-validation-valid").hide();
        $("#frmPayments input").removeClass("input-validation-error");
        $("#frmPayments select").removeClass("input-validation-error");
        $("#frmPayments input.form-control").val("");
        $("#frmPayments select.form-control").val("");
        $("span.card-icon").removeClass("visa-card");
        $("span.card-icon").removeClass("master-card");
        $("span.card-icon").removeClass("express-card");
        $("span.card-icon").removeClass("discover-card");
        $("#frmPayments input").siblings("label").removeClass("active");
        $("#frmPayments select").siblings("label").removeClass("active");
        $("#frmPayments .lblExpiryDate").addClass("active");
    }
}
