function toggleCartView() {
    jQuery("#innerCart").toggle();
}

function gotoCheckout(el) {
    let zipCode = $('#zipCode');

    if (zipCode.length && zipCode.val().length === 0) {
        return zipCode.addClass('input-error').focus();
    }

    zipCode.removeClass('input-error');

    jQuery.ajax({
        url: $(el).data('src'),
        type: 'POST',
        cache: false,
        data: {
            'amountToPay': $('#amountToPay').val(),
            'discountAmount': $('#discountAmount').val(),
            'couponCode': $('#couponCode').val(),
            'totalTaxAmount': $('#totalTaxAmount').val(),
            'totalShippingAmount': $('#totalShippingAmount').val(),
            'zipCode': $('#zipCode').val()
        },
        global: false,
        beforeSend: function () {
            if (!$("#ajaxContainer").length) {
                $("body").prepend('<div class="modal fade" id="ajaxContainer"></div>');
            }
            jQuery("#innerCart").hide();
            showLoading();

        },
        success: function (data) {
            jQuery("#ajaxContainer").html(data);
            hideLoading();
            $('#ajaxContainer').modal('show');

        }
    });
}

function gotoCheckout2(el) {
    let zipCode = $('#zipCode');

    if (zipCode.length && zipCode.val().length === 0) {
        return zipCode.addClass('input-error').focus();
    }

    zipCode.removeClass('input-error');

    jQuery.ajax({
        url: $(el).data('src'),
        type: 'POST',
        cache: false,
        data: {
            'amountToPay': $('#amountToPay').val(),
            'discountAmount': $('#discountAmount').val(),
            'couponCode': $('#couponCode').val(),
            'totalTaxAmount': $('#totalTaxAmount').val(),
            'totalShippingAmount': $('#totalShippingAmount').val(),
            'zipCode': $('#zipCode').val()
        },
        global: false,
        beforeSend: function () {
            if (!$("#ajaxContainer").length) {
                $("body").prepend('<div class="modal fade" id="ajaxContainer"></div>');
            }
            jQuery("#innerCart").hide();
            showLoading();

        },
        success: function (data) {
            jQuery("#ajaxContainer").html(data);
            hideLoading();
            $('#ajaxContainer').modal('show');
            initStripeCredit();
        }
    });
}

function initStripeCredit() {
    // Create a Stripe client.
    var stripe = Stripe($('#stripePublicKey').val());

    // Create an instance of Elements.
    var elements = stripe.elements();

    // Custom styling can be passed to options when creating an Element.
    // (Note that this demo uses a wider set of styles than the guide below.)
    var style = {
        base: {
            color: '#32325d',
            fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
            fontSmoothing: 'antialiased',
            fontSize: '16px',
            '::placeholder': {
                color: '#aab7c4'
            }
        },
        invalid: {
            color: '#fa755a',
            iconColor: '#fa755a'
        }
    };

    // Create an instance of the card Element.
    var card = elements.create('card', {style: style});

    // Add an instance of the card Element into the `card-element` <div>.
    card.mount('#card-element');

    // Handle real-time validation errors from the card Element.
    card.addEventListener('change', function (event) {
        var displayError = document.getElementById('card-errors');
        if (event.error) {
            displayError.textContent = event.error.message;
        } else {
            displayError.textContent = '';
        }
    });

    // Handle form submission.
    var form = document.getElementById('checkoutForm2');

    form.addEventListener('submit', function (event) {
        event.preventDefault();
        let fname = document.getElementById('conceptrix_bandvistabundle_storeorder_fullName').value;
        let address1 = document.getElementById('conceptrix_bandvistabundle_storeorder_address1').value;
        let address2 = document.getElementById('conceptrix_bandvistabundle_storeorder_address2').value;
        let city = document.getElementById('conceptrix_bandvistabundle_storeorder_city').value;
        let state = document.getElementById('conceptrix_bandvistabundle_storeorder_state').value;
        let zip = document.getElementById('conceptrix_bandvistabundle_storeorder_zip').value;

        stripe.createToken(card, {
            name: fname,
            address_line1: address1,
            address_line2: address2,
            address_city: city,
            address_state: state,
            address_zip: zip,
            address_country: 'US'
        }).then(function (result) {
            if (result.error) {
                // Inform the user if there was an error.
                var errorElement = document.getElementById('card-errors');
                errorElement.textContent = result.error.message;
            } else {
                // Send the token to your server.
                stripeTokenHandler(result.token);
            }
        });
    });
}

// Submit the form with the token ID.
function stripeTokenHandler(token) {
    // Insert the token ID into the form so it gets submitted to the server
    var form = document.getElementById('checkoutForm2');
    var hiddenInput = document.createElement('input');
    hiddenInput.setAttribute('type', 'hidden');
    hiddenInput.setAttribute('name', 'stripeToken');
    hiddenInput.setAttribute('value', token.id);
    form.appendChild(hiddenInput);

    jQuery.ajax({
        url: $('#checkoutForm2').attr('action'),
        type: 'POST',
        cache: false,
        data: jQuery("#checkoutForm2").serialize(),
        global: false,
        beforeSend: function () {
            showLoading();
            $('#audioPlayer').remove();

        },
        success: function (data) {
            window.location.href = data.return;
        },
        error: function (data) {
            window.location.href = data.cancel_return;
        }
    });
}

function calculateShipping() {
    let zipCode = $('#zipCode').val();
    let coupon = $('#cartcouponcode').val();

    if (zipCode == '') {
        return false;
    }

    jQuery.ajax({
        url: jQuery("#updateCart").data('src'),
        type: 'POST',
        cache: false,
        data: {'zipCode': zipCode, 'couponCode': coupon},
        global: false,
        beforeSend: function () {
            jQuery("#innerCart").hide();
            showLoading();
        },
        success: function (data) {
            jQuery("#cartContainer").html(data);
            // initializeStripe();
            jQuery("#innerCart").show();
            hideLoading();

            if ($('#coupon-status').hasClass('label-success')) {
                let code = $('#cartcouponcode').val();
                sessionStorage.setItem('couponCode', code);
            }

            if (zipCode) {
                sessionStorage.setItem('zipCode', zipCode);
            }
        }
    });
}

function redeemCartCoupon(el) {
    let coupon = $('#cartcouponcode').val();
    let zipCode = $('#zipCode').val();

    if (coupon === '') {
        return false;
    }

    jQuery.ajax({
        url: jQuery("#updateCart").data('src'),
        type: 'POST',
        cache: false,
        data: {'couponCode': coupon, 'zipCode': zipCode},
        global: false,
        beforeSend: function () {
            jQuery("#innerCart").hide();
            showLoading();
        },
        success: function (data) {
            jQuery("#cartContainer").html(data);
            // initializeStripe();
            jQuery("#innerCart").show();
            hideLoading();

            if ($('#coupon-status').hasClass('label-success')) {
                let code = $('#cartcouponcode').val();
                sessionStorage.setItem('couponCode', code);
            }

            if (zipCode) {
                sessionStorage.setItem('zipCode', zipCode);
            }
        }
    });
}

function showProductDialog(proUrl) {
    jQuery.ajax({
        url: proUrl,
        type: 'GET',
        cache: false,
        data: null,
        global: false,
        beforeSend: function () {
            if (!$("#ajaxContainer").length) {
                $("body").prepend('<div class="modal fade" id="ajaxContainer"></div>');
            }
            jQuery("#innerCart").hide();
            showLoading();

        },
        success: function (data) {
            jQuery("#ajaxContainer").html(data);
            hideLoading();
            $('#ajaxContainer').modal('show');

        }
    });
}

function showLoading() {
    if (!$("#ajaxLoader").length) {
        $("body").prepend('<div class="ajaxLoader" id="ajaxLoader" style="display:none;"><div class="loadingInner"></div></div>');
    }

    $("#ajaxLoader").show();
}

function hideLoading() {
    $("#ajaxLoader").hide();
}

function getUrlParameter(sParam) {
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++) {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam) {
            return sParameterName[1];
        }
    }
}

function loadListEvent(url, widgetId) {
    $('#calanderListView_' + widgetId).show();
    $('#calanderView_' + widgetId).hide();

    //upcomingEventExpandedListViewRoute
    // var url = $("#upcomingEventListViewRoute").val();

    jQuery.ajax({
        url: url,
        type: 'POST',
        cache: false,
        global: false,
        data: {showPastEvent: $('#showPastEvent').val()},
        beforeSend: function () {
            $("#calanderListView_" + widgetId).addClass('fadein');
        },
        success: function (msg) {
            jQuery("#calanderListView_" + widgetId).html(msg);
            $("#calanderListView_" + widgetId).removeClass('fadein');
            stButtons.locateElements();

        }
    });

}

function refreshCaptcha(widgetId) {
    var img = document.getElementById('captchaimg_' + widgetId);
    img.src = img.src.substring(0, img.src.lastIndexOf("?")) + "?rand=" + Math.random() * 1000 + "&widget_id=" + widgetId;
}

function slide() {
    $('#filterable' + i).show("slide", {direction: "right"}, 1000);
    var k = i - 1;
    $('#filterable' + k).hide("slide", {direction: "left"}, 1000);

    if (i >= n) {
        i = 0;
        $('#filterable' + i).show("slide", {direction: "right"}, 1000);
    }
    i = i + 1;
}

function fade() {
    $('#filterable' + i).fadeIn(1000);
    var k = i - 1;
    $('#filterable' + k).fadeOut(1000);

    if (i >= n) {
        i = 0;
        $('#filterable' + i).fadeIn(1000);
    }
    i = i + 1;
}

function debounced(delay, fn) {
    let timerId;
    return function (...args) {
        if (timerId) {
            clearTimeout(timerId);
        }
        timerId = setTimeout(() => {
            fn(...args);
            timerId = null;
        }, delay);
    }
}

function initializeStripe() {
    // good place to hook in as re init

    if ($('#coupon-status').hasClass('label-success')) {
        let code = $('#cartcouponcode').val();
        sessionStorage.setItem('couponCode', code);
    }

    if ($('#stripePublicKey').val() !== undefined && $('#stripePublicKey').val() !== '') {

        const stripe = Stripe($('#stripePublicKey').val());

        let displayItems = [];
        let shippingNeeded = false;
        let taxValue = parseFloat($('#totalTaxAmount').val());
        let discountValue = parseFloat($('#discountAmount').val());

        $('.shopping-cart-main .item-section[data-product-type]').each(function () {
            let append = '';
            if ($(this).find('.attributes').length) {
                append = ' / ' + $(this).find('.attributes .attributeName').text().trim() + ' ' + $(this).find('.attributes .attributeTitle').text().trim();
            }

            let y = [];
            y['amount'] = Math.ceil(parseFloat($(this).data('product-price')) * 100);
            y['label'] = $(this).find('.productName').text() + append;
            if ($(this).data('product-type') === 'merchandise') {
                shippingNeeded = true;
            }
            displayItems.push(Object.assign({}, y));
        });

        if (discountValue > 0) {
            let discount = [];
            discount['amount'] = Math.ceil(parseFloat(discountValue) * 100);
            discount['label'] = 'Discount';
            displayItems.push(Object.assign({}, discount));
        }

        if (taxValue > 0) {
            let tax = [];
            tax['amount'] = Math.ceil(parseFloat(taxValue) * 100);
            tax['label'] = 'Tax';
            displayItems.push(Object.assign({}, tax));
        }

        window.paymentRequest = stripe.paymentRequest({
            country: 'US',
            currency: $('#currencyCode').val(),
            total: {
                label: 'Total',
                amount: Math.ceil(parseFloat($('#amountToPay').val()) * 100),
            },
            requestPayerName: true,
            requestPayerEmail: true,
            requestShipping: shippingNeeded,
            displayItems: displayItems
        });

        const elements = stripe.elements();
        const prButton = elements.create('paymentRequestButton', {
            paymentRequest,
        });

        (async () => {
            // Check the availability of the Payment Request API first.
            const result = await paymentRequest.canMakePayment();
            if (result) {
                prButton.mount('#payment-request-button');
            } else {
                document.getElementById('payment-request-button').style.display = 'none';
            }
        })();

        paymentRequest.on('token', async (ev) => {
            // Send the token to your server to charge it!
            const response = await fetch($('#stripeURL').val(), {
                method: 'POST',
                body: JSON.stringify({token: ev.token.id, couponCode: $('#cartcouponcode').val()}),
                headers: {'content-type': 'application/json'},
            });

            const responseData = await response.json();

            if (response.ok) {
                // Report to the browser that the payment was successful, prompting
                // it to close the browser payment interface.
                ev.complete('success');
                sessionStorage.removeItem('couponCode');
                window.location.href = responseData.return;
            } else {
                // Report to the browser that the payment failed, prompting it to
                // re-show the payment interface, or show an error message and close
                // the payment interface.
                ev.complete('fail');
                window.location.href = responseData.cancel_return;
            }
        });

        paymentRequest.on('shippingaddresschange', async (ev) => {
            if (ev.shippingAddress.country !== 'US') {
                ev.updateWith({status: 'invalid_shipping_address'});
            } else {
                // Perform server-side request to fetch shipping options
                const response = await fetch($('#stripeShippingURL').val(), {
                    method: 'POST',
                    body: JSON.stringify({shippingAddress: ev.shippingAddress}),
                    headers: {'content-type': 'application/json'}
                });
                const result = await response.json();

                let y = [];
                y['amount'] = parseInt(result.supportedShippingOptions[0].amount);
                y['label'] = result.supportedShippingOptions[0].label + " Shipping";

                displayItems.push(Object.assign({}, y));

                ev.updateWith({
                    status: 'success',
                    shippingOptions: result.supportedShippingOptions,
                    total: {
                        label: 'Total',
                        amount: Math.ceil((parseFloat($('#amountToPay').val()) * 100 + parseFloat(result.supportedShippingOptions[0].amount)))
                    },
                    displayItems: displayItems
                });
            }
        });

        paymentRequest.on('shippingoptionchange', async (ev) => {
            // remove old shipping
            displayItems.forEach(function (item, index, object) {
                if (item.label.includes(' Shipping')) {
                    object.splice(index, 1);
                }
            });

            let y = [];
            y['amount'] = ev.shippingOption.amount;
            y['label'] = ev.shippingOption.label + " Shipping";
            displayItems.push(Object.assign({}, y));

            ev.updateWith({
                status: 'success',
                total: {
                    label: 'Total',
                    amount: ((parseFloat($('#amountToPay').val()) * 100 + parseFloat(ev.shippingOption.amount)))
                },
                displayItems: displayItems
            });
        });
    }
}

$(document).ready(function () {

    $("body").on("click", "#showHideBar", function (ev) {
        $('#frame').toggle();
    });

    $("body").on("submit", "#addtoCartForm", function (ev) {
        ev.preventDefault();

        var data = $(this).serializeArray();
        data.push({name: "couponCode", value: $('#cartcouponcode').val()});

        jQuery.ajax({
            url: $(this).attr('action'),
            type: 'POST',
            cache: false,
            data: $.param(data),
            global: false,
            beforeSend: function () {
                showLoading();
            },
            success: function (data) {
                jQuery("#cartContainer").html(data);
                $('#ajaxContainer').modal('hide');
                hideLoading();

                // initializeStripe();
            },
            error: function (xhr, status, error) {
                var err = JSON.parse(xhr.responseText);
                $('#ajaxContainer').modal('hide');
                hideLoading();

                new Noty({
                    type: 'error',
                    layout: 'center',
                    text: err.error,
                    timeout: 1500
                }).show();
            }
        });

        return false;
    });

    $("body").on("submit", ".add-guest-entry-form", function (ev) {

        ev.preventDefault();

        var widgetId = $(this).data('widget-id');

        jQuery.ajax({
            url: $(this).attr('action'),
            type: 'POST',
            cache: false,
            data: jQuery(this).serialize(),
            global: false,
            beforeSend: function () {
                showLoading();
            },
            success: function (response) {

                $('#formErrors-' + widgetId).show();
                $('.add-guest-entry-form .form-group').removeClass('has-error');

                if (response.success == true) {
                    $("#add-guest-entry-form-" + widgetId).find("input[type=text], textarea").val("");
                    $("#add-guest-entry-form-" + widgetId).find("input[type=submit]").val("Posted");
                    $('#formErrors-' + widgetId).removeClass('alert-danger').addClass('alert-success').html(response.successMsg);
                    $('#widget-guest-book-' + widgetId).html(response.data);
                } else {
                    $('html, body').animate({
                        scrollTop: $('#formErrors-' + widgetId).offset().top - 60
                    }, 1000);
                    $('.add-guest-entry-form .form-group').addClass('has-error');
                    $('#formErrors-' + widgetId).removeClass('alert-success').addClass('alert-danger').html(response.errorMsg);
                }

                hideLoading();
            }
        });

        return false;
    });

    $("body").on("click", ".updateCart", function () {
        jQuery.ajax({
            url: $(this).data('src'),
            type: 'GET',
            cache: false,
            data: {
                'couponCode': (sessionStorage.getItem('couponCode') ? sessionStorage.getItem('couponCode') : $('#cartcouponcode').val()),
                'zipCode': (sessionStorage.getItem('zipCode') ? sessionStorage.getItem('zipCode') : $('#zipCode').val())
            },
            global: false,
            beforeSend: function () {
                jQuery("#innerCart").hide();
                showLoading();
            },
            success: function (data) {
                jQuery("#cartContainer").html(data);
                $('#ajaxContainer').modal('hide');
                hideLoading();
                // initializeStripe();
                $('#zipCode[type="text"]').tooltip({
                    trigger: 'focus',
                    container: 'body',
                    template: '<div class="tooltip" style="z-index: 6000"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
                });
            }
        });
    });

    $("body").on("click", ".shopNowBtn", function () {

        $("body").addClass('mobile-scroll-navigation');

        //jQuery("html, body").animate({ scrollTop: 0 }, "slow");
        var proUrl = $(this).data('src');
        showProductDialog(proUrl);
    });

    $("body").on("mouseover", "#topCart", function () {
        jQuery("#innerCart").show();
    });

    $("body").on("mouseout", "#topCart", function () {
        if (!$('input#cartcouponcode').is(":focus")) {
            let a = debounced(800, function () {
                jQuery("#innerCart").hide();
            });
        }
    });

    $("body").on("submit", "#checkoutForm", function () {

        jQuery.ajax({
            url: $(this).attr('action'),
            type: 'POST',
            cache: false,
            data: jQuery("#checkoutForm").serialize(),
            global: false,
            beforeSend: function () {
                showLoading();
                $('#audioPlayer').remove();

            },
            success: function (data) {
                console.error(data);

                if (data.error) {
                    jQuery("#errorMsg").html(data.error);
                } else {
                    $('#paypalAmount').val(data.amount);
                    $('#paypalEmail').val(data.email);
                    $('#paypalAddress1').val(data.address1);
                    $('#paypalAddress2').val(data.address2);
                    $('#paypalCity').val(data.city);
                    $('#paypalState').val(data.state);
                    $('#paypalZip').val(data.zip);
                    $('#return').val(data.return);
                    $('#cancel_return').val(data.cancel_return);
                    $('#paypalInvoice').val(data.order_id);
                    jQuery("#errorMsg").html("Please wait");
                    jQuery("#errorMsg").show();
                    $('#paypalCheckoutForm').submit();
                }
                jQuery("#updateCart").click();
            }
        });

        return false;
    });

    $("body").on("click", "#navigation ul li", function () {
        $("#navigation").hide();
    });

    $("body").on("click", ".zoom", function () {
        $('#zoom-image-modal').modal('show');
        $('#productImageModalImage').attr("src", $(this).attr("src"));


        if ($(this).attr('data-label')) {
            $('#popupModalLabel').html($(this).attr('data-label'));
        }
    });

    $(".widget img").each(function () {
        // $(this).addClass('img-responsive');
    });

    $(".widget embed").each(function () {
        $(this).addClass('img-responsive');
    });

    $("body").prepend('<div class="floating-main" id="cartContainer"></div>');

    jQuery("#updateCart").click();

    $('.lb-next, .lb-prev').addClass('noHistory').removeAttr('href');

    if ($('#cartCount').val() !== undefined) {
        jQuery.ajax({
            url: $('#cartCount').val(),
            type: 'GET',
            cache: false,
            global: false,
            success: function (data) {
                if (parseInt(data.total_items) > 0 && data.cart_url !== undefined) {
                    jQuery.ajax({
                        url: data.cart_url,
                        type: 'POST',
                        cache: false,
                        global: false,
                        success: function (data) {
                            jQuery("#cartContainer").html(data);
                            $('#ajaxContainer').modal('hide');
                        }
                    });
                }
            }
        });
    }
})
;