(function () {
    var loadScript = function (url, callback) {

        var script = document.createElement("script");
        script.type = "text/javascript";

        // If the browser is Internet Explorer.
        if (script.readyState) {
            script.onreadystatechange = function () {
                if (script.readyState == "loaded" || script.readyState == "complete") {
                    script.onreadystatechange = null;
                    callback();
                }
            };
            // For any other browser.
        } else {
            script.onload = function () {
                callback();
            };
        }

        script.src = url;
        document.getElementsByTagName("head")[0].appendChild(script);

    };

    /* ----------------------------------------------------------------------------------- */
    var myAppJavaScript = function ($) {

        var app_url = 'https://loy.shopapps.site';

// leanModal v1.1 by Ray Stone - http://finelysliced.com.au
// Dual licensed under the MIT and GPL
// Modified by BOLD Commerce

        !function (n) {
            n.fn.extend({
                leanModal: function () {
                    function o(o) {
                        o.fadeIn(200), t.fadeIn(200), n("body").addClass("bold-modal-open")
                    }

                    function e(o) {
                        n("body").removeClass("bold-modal-open"), t.fadeOut(200), o.fadeOut(200)
                    }

                    var t = n("<div id='lean_overlay'></div>");
                    return n("body").append(t), this.each(function () {
                        var a = n(this).attr("href"), d = n(a);
                        d.appendTo(t), d.click(function (n) {
                            n.stopPropagation()
                        }), t.click(function () {
                            e(d)
                        }), n(a + " .bold-modal-close-btn").click(function (n) {
                            e(d), n.preventDefault()
                        }), n(this).click(function (n) {
                            o(d), n.preventDefault()
                        })
                    })
                }
            })
        }($);

        function displayRewardPoints(data) {
            var $earnSection = $(".bold-loyalties-earn");
            $earnSection.find('fieldset').remove();

            var html = generateMessage(data);
            $earnSection.append(html);

            var variant = getVariant(data);
            if (!variant || !variant.base_points) return;
            if (variant.points_can_be_earned == 1 && variant.exclusion === null) {
                var html = data.translations.frontend_base_earn_message
                .replace('[points]', '<strong class="bold_loyalties_points">' + variant.base_points + '</strong>')
                .replace('[point_name]', BoldApps.Loyalties.shop.metafields.plural_point_name)
                .replace('[program_name]', BoldApps.Loyalties.shop.metafields.name);

                $(".bold-loyalties-base-earn").html('');
                $(".bold-loyalties-base-earn").append('<p>' + html + '</p>');
            } else {
                $(".bold-loyalties-base-earn").html('');
            }


        }

        function generateMessage(data) {
            var body = getMessageBody(data);
            if (!body) {
                return;
            }
            var template = "<fieldset>" + getMessageTitle(data)
                + body + "</fieldset>";
            return template;
        }

        function getMessageBody(data) {

            var variant = getVariant(data);
            if (!variant) return;

            var points = calculatePoints(variant);

            if (points == 0 || variant.points_can_be_earned === 0 || !variant.hasSources) {
                return;
            }

            return BoldApps.Loyalties.ProductDisplaySettings.body.text
                .replace('[points]', '<strong class="bold_loyalties_points">' + points + '</strong>')
                .replace('[point_name]', BoldApps.Loyalties.shop.metafields.plural_point_name)
                .replace('[program_name]', BoldApps.Loyalties.shop.metafields.name);

        }

        function calculateOnlyBonusPoints(variant) {

            if (variant.is_earning_excluded) {
                return false;
            }

            return Math.round(variant.bonus_points);
        }

        function calculatePoints(variant) {

            var points = 0;

            if (variant.is_earning_excluded) {
                points = 0;
            } else if (variant.bonus_points) {
                points = variant.bonus_points;
            }

            return Math.round(points * 100) / 100;
        }

        function getVariant(data) {

            var variantId = getVariantIdFromDOM();
            var variant = null;

            if (data && data.product && data.product.variants) {
                variant = $.grep(data.product.variants, function (v) {
                    return v.variantid == variantId;
                });

                if (variant[0]) {
                    variant[0].fromAjax = true;
                }

            } else {
                variant = $.grep(BoldApps.Loyalties.product.variants, function (v) {
                    return v.id == variantId;
                });

                if (variant[0]) {
                    variant[0].fromAjax = false;
                }

            }

            return variant[0];
        }

        function getMessageTitle(data) {
            if (!BoldApps.Loyalties.ProductDisplaySettings.title.show) {
                return "";
            }
            return "<legend>" + BoldApps.Loyalties.shop.metafields.plural_point_name + "</legend>";
        }

        function isCheckoutEnabled() {
          return window.BOLD && BOLD.checkout && (typeof BOLD.checkout.isEnabled === 'undefined' || BOLD.checkout.isEnabled());
        }

        function showProductDataSuccess(data) {
            if (pointsCanBeEarned()) {
                displayRewardPoints(data);
            }

		if(pointsCanBeRedeemed()) {
                if (!BoldApps.Loyalties.customer) {
                    $('.bold-loyalties-redeem-amount').hide();
                    if(!isCheckoutEnabled() || !data.isCheckoutInstalled) {
                        $('.bold-loyalties-redeem').html('<a href="/account/login" class="buy-with-rewards buy-with-rewards-login btn secondary">' + data.translations.login_to_redeem + '</a>');
                    }

                    return false;
                }

                if (data.customer && data.customer.tier && data.customer.tier.points_can_be_redeemed == 0) {
                    $('.bold-loyalties-redeem-amount').hide();
                    return;
                }

                displayRedeemed(data);

                if(!isCheckoutEnabled() || !data.isCheckoutInstalled) {
                    var variant_id = getVariantIdFromDOM();
                    $('#bold_loyalties_redeem_variant').val(variant_id);
                }
            } else {
                $('.bold-loyalties-redeem-amount').hide();
                return;
            }
        }

        function showProductDataError() {
            $('.bold-loyalties-redeem-amount').hide();
        }

        function getProductData() {
            var uuid = null;
            var customerId = null;

            if (BoldApps.Loyalties.customer) {
                customerId = BoldApps.Loyalties.customer.id;
                // if a customer's metafields haven't been synced the uuid will be undefined
                uuid = BoldApps.Loyalties.customer.metafields.uuid || '';
            }

            var data = {
                ci: customerId,
                uuid: uuid,
                pi: BoldApps.Loyalties.product.id,
                h: BoldApps.Loyalties.product.handle,
                d: BoldApps.Loyalties.shop.domain,
                pd: BoldApps.Loyalties.shop.permanent_domain,
            };

            return $.ajax({
                url: app_url + "/front_end/product",
                type: "GET",
                dataType: "json",
                data: data
            });
        }

        function getVariantIdFromDOM() {
            var element = $('.bold-loyalties-variant input[name=id], .bold-loyalties-variant select[name=id], .bold-loyalties-variant [name="id[]"]');
            if (element.length === 0) {
                element = $('[name=id][value!=""]');
            }
            if (element.length === 0) {
                element = $('[name="id[]"][value!=""]');
            }

            return element.val();
        }

        function calc_options_total() {
            var i;
            var checked_variant = $(".shappify_option:visible .price-change:checked, .shappify_option:visible .price-change:selected");
            var total = 0;
            for (i = 0; i < checked_variant.length; i++) {
                total = Number($(checked_variant[i]).attr("data-price")) + Number(total);
            }
            return total * 100;
        }

        function displayRedeemed(data) {

            var variant = getVariant(data);
            if (!variant) return;

            var variantFromDOM = $.grep(BoldApps.Loyalties.product.variants, function (v) {
                return v.id == variant.variantid;
            })[0];

            if (variant.is_redeeming_excluded) {
                $('.bold-loyalties-redeem-amount').hide();
                $('.bold-loyalties-redeem').hide();
                return;
            }

            var productRedemptionMultiplier = variant.redemption_multiplier;
            if (!productRedemptionMultiplier || productRedemptionMultiplier == 0) {
                productRedemptionMultiplier = 1;
            }

            var price = variant.price;

            // check if we have to add more points if they are using options
            price += calc_options_total();

            var redemption_ratio = BoldApps.Loyalties.shop.metafields.redemption_ratio;
            if (data.bonus_redemption_ratio) {
                redemption_ratio = data.bonus_redemption_ratio;
            }

            var productWorthInPoints = Math.ceil(((price / 100) * redemption_ratio) * productRedemptionMultiplier);

            $('.bold-loyalties-redeem-amount .bold-placeholder').text(Math.round(productWorthInPoints).toLocaleString('en') + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);

            if (!variantFromDOM || variantFromDOM.available === false) {
                $('.bold-loyalties-redeem-amount').hide();
            } else {
                $('.bold-loyalties-redeem-amount').show();
            }

            if (!variant.fromAjax || !BoldApps.Loyalties.customer || !BoldApps.Loyalties.customer.uuid) {
                return false;
            }

            // don't need to setup the redeem button stuff if checkout is installed
            if(isCheckoutEnabled() && data.isCheckoutInstalled) {
                return false;
            }

            var redeemContainer = $('.bold-loyalties-redeem');
            redeemContainer.html('<a href="#bold-loyalties-shipping-modal" class="buy-with-rewards btn secondary"></a>');
            var redeemButton = redeemContainer.find('.buy-with-rewards');
            var pointsPrice = Math.ceil(((variant.price / 100) * redemption_ratio) * productRedemptionMultiplier);
            var pointsLeft = pointsPrice - data.customer.balance;
            pointsLeft = Math.ceil(pointsLeft);

            if (parseInt(pointsLeft) <= 0) {
                redeemButton.html(
                    data.translations.redeem_btn_sufficient
                        .replace('[points]', pointsPrice.toLocaleString('en'))
                        .replace('[point_name]', BoldApps.Loyalties.shop.metafields.plural_point_name)
                        .replace('[program_name]', BoldApps.Loyalties.shop.metafields.name)
                );
                redeemContainer.find('.bold-loyalties-pointsleft').remove();

                if (variantFromDOM && variantFromDOM.available === true) {
                    redeemButton.removeClass('disabled');
                    if (data.shop.shipping_extra) {
                        redeemContainer.append('<br /><small>' + data.translations.additional_shipping_costs + '</small>');
                    }

                    redeemButton.leanModal();

                    $('.shipping-edit-btn').on('click', function (e) {
                        $('#shipping-address').show();
                        $('#shipping-address-collapsed').hide();
                        e.preventDefault();
                    });

                    if (isRedeemFormValid($('#bold-loyalties-shipping-modal form')) && $('#shipping-address-collapsed').length > 0) {
                        $('#shipping-address').hide();
                        $('#shipping-address-collapsed').show();
                    } else {
                        $('#shipping-address').show();
                        $('#shipping-address-collapsed').hide();
                    }

                    redeemButton.on('click', function () {
                        if (!variantFromDOM) {
                            showShippingPoints(variantFromDOM.id, pointsPrice, data.customer.balance, data.translations);
                        }

                        if (variantFromDOM.featured_image !== null) {
                            $('.redeem-product-info').find('.product-img').attr('src', variantFromDOM.featured_image.src);
                        } else {
                            $('.redeem-product-info').find('.product-img').remove();
                        }

                        $('.redeem-product-info').find('.product-name').text(variantFromDOM.name);
                        $('.redeem-product-info').find('.product-points').html('<strong>' + pointsPrice.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name + ' </strong><br /> (' + data.currency_sym + parseFloat(variant.price / 100).toFixed(2) + ')');

                    })

                    if (!variantFromDOM) {
                        $('#checkout_shipping_address_country, .province, #checkout_shipping_address_zip', '#bold-loyalties-shipping-modal').on('change', function () {
                            showShippingPoints(variantFromDOM.id, pointsPrice, data.customer.balance, data.translations)
                        });
                    } else {
                        var balanceAfterPurchase = (data.customer.balance - pointsPrice).toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name
                        $('.redeem-product-info').find('.total-shipping').html(0 + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name + ' (' + data.currency_sym + '0.00)');
                        $('.redeem-product-info').find('.total').text(pointsPrice.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);
                        $('.redeem-product-info').find('.remaining-balance').text(balanceAfterPurchase);
                    }

                } else {
                    redeemButton.addClass('disabled');
                }
            } else {
                redeemButton.addClass('disabled');
                redeemButton.html(
                    data.translations.redeem_btn_insufficient
                        .replace('[points]', pointsLeft.toLocaleString('en'))
                        .replace('[point_name]', BoldApps.Loyalties.shop.metafields.plural_point_name)
                        .replace('[program_name]', BoldApps.Loyalties.shop.metafields.name)
                );
            }

            redeemContainer.show();

            $('#bold-loyalties-shipping-modal form').unbind('submit').on('submit', function () {
                // live lookup the selected variant in case our onchange didn't fire
                var variant_id = getVariantIdFromDOM();
                $('#bold_loyalties_redeem_variant').val(variant_id);

                var form = $(this);
                form.find('input[type=submit]').attr('disabled', true);
                if (!isRedeemFormValid(form)) {
                    form.find('.error').remove();
                    form.find('#shipping-address').append('<p class="error"><small>You have entered an invalid shipping address. Please try again.</small></p>');

                    return false;
                }
                var parent = form.parent();
                var url = $(this).attr('action');

                var options = getProductOptions();
                var data = form.serializeArray();
                data.push({name: 'customer_id', value: BoldApps.Loyalties.customer.id});
                data.push({name: 'options', value: JSON.stringify(options)});

                $.ajax({
                    url: url,
                    type: "POST",
                    dataType: "json",
                    data: data
                }).then(function (data) {
                    if (data.success === false) {
                        form.find('.error').remove();
                        form.append('<p class="error"><small>' + data.message + '</small></p>');
                        form.find('input[type=submit]').attr('disabled', false);
                        return false;
                    }
                    form.find('.section__body').remove();
                    form.find('.bold-success').show();
                });

                return false;
            });
        }

        function getProductOptions() {

            var options = [];

            $(".shappify_option [name^='properties']").each(function (key, element) {
                var element = $(element);
                if (element.is(':checkbox') && !element.is(':checked')) {
                    return;
                }

                var name = element.attr('name').replace('properties[', '').replace(']', '');

                var option = {
                    name: name,
                    value: element.val(),
                    variantid: null
                };

                if (option.value === '') return;

                if (element.hasClass('price-change')) {
                    option.variantid = $(element).data('variant');
                }
                ;
                if (element.find('option:selected').hasClass('price-change')) {
                    option.variantid = $(element).find('option:selected').data('variant');
                }

                options.push(option);
            });

            return options;

        }

        function isRedeemFormValid(form) {
            var firstName = form.find('#checkout_shipping_address_first_name').val(),
                lastName = form.find('#checkout_shipping_address_last_name').val(),
                address = form.find('#checkout_shipping_address_address1').val(),
                address2 = form.find('#checkout_shipping_address_address2').val(),
                city = form.find('#checkout_shipping_address_city').val(),
                country = form.find('#checkout_shipping_address_country').val(),
                province = form.find('.province').val(),
                zip = form.find('#checkout_shipping_address_zip').val(),
                phone = form.find('#checkout_shipping_address_phone').val();

            if (firstName == '' || lastName == '' || address == '' || city == '' || country == '') {
                return false;
            }

            return true;
        }

        function pointsCanBeEarned() {
            return BoldApps.Loyalties.shop.metafields.active === 1
                && BoldApps.Loyalties.shop.metafields.points_can_be_earned === 1;
        }

        function pointsCanBeRedeemed() {
            return BoldApps.Loyalties.shop.metafields.active === 1
                && BoldApps.Loyalties.shop.metafields.points_can_be_redeemed === 1
        }

        function getCartShippingRatesForDestination(shipping_address, variantid) {
            return $.ajax({
                url: app_url + "/front_end/shipping_rates",
                type: "GET",
                dataType: "json",
                data: jQuery.param({
                    'shipping_address': shipping_address,
                    'variantid': variantid,
                    pd: BoldApps.Loyalties.shop.permanent_domain
                }),
            });
        }

        function getCheapestShippingRate(shippingRates) {
            var cheapestShippingRate = shippingRates[0];
            $.each(shippingRates, function (shippingRate) {
                if (shippingRate.price < cheapestShippingRate.price) {
                    cheapestShippingRate = shippingRate
                }
            });
            return cheapestShippingRate;
        }

        function showShippingPoints(variantid, productWorthInPoints, balance, translations) {
            var form = $('#bold-loyalties-shipping-modal form');
            $('#bold-loyalties-shipping-modal .error').remove();

            form.find('input[type=submit]').attr('disabled', true).addClass('disabled');

            var shippingAddress = {
                zip: form.find('#checkout_shipping_address_zip').val(),
                country: form.find('#checkout_shipping_address_country').val(),
                province: form.find('.province').val()
            };

            $('.redeem-product-info').find('.total-shipping').text(translations.calculating);
            $('.redeem-product-info').find('.total').text(translations.calculating);
            $('.redeem-product-info').find('.remaining-balance').text(translations.calculating);

            getCartShippingRatesForDestination(shippingAddress, variantid).then(function (result) {

                if (result.error) {
                    form.find('.call-to-action').prepend('<p class="error"><small>' + result.error + '</small></p>');
                    form.find('input[type=submit]').attr('disabled', true).addClass('disabled');
                    return false;
                }

                var shippingRate = result.shippingRate;
                var shippingWorthInPoints = result.shippingWorthInPoints;
                var totalWorthInPoints = Math.floor(balance - (productWorthInPoints + shippingWorthInPoints));

			if(shippingRate !== null) {
				$('.redeem-product-info').find('.label-shipping').text(shippingRate.name);
                $('.redeem-product-info').find('.total-shipping').text(shippingWorthInPoints.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name + ' ($' + shippingRate.price + ')');
			} else {
                $('.redeem-product-info').find('.total-shipping').text(shippingWorthInPoints.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);
            }

            $('.redeem-product-info').find('.total-shipping').text(shippingWorthInPoints.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);
			$('.redeem-product-info').find('.total').text((productWorthInPoints + shippingWorthInPoints).toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);
			$('.redeem-product-info').find('.remaining-balance').text(totalWorthInPoints.toLocaleString() + ' ' + BoldApps.Loyalties.shop.metafields.plural_point_name);
			if(totalWorthInPoints < 0) {
				$('.redeem-product-info').find('.remaining-balance').addClass('cant-afford');
			} else {
				$('.redeem-product-info').find('.remaining-balance').removeClass('cant-afford');
			}

                if ((productWorthInPoints + shippingWorthInPoints) <= balance) {
                    form.find('input[type=submit]').attr('disabled', false).removeClass('disabled');
                } else {
                    var pointsLeft = Math.abs(Math.floor(balance - (productWorthInPoints + shippingWorthInPoints)));
                    var points_short_message = translations.points_short_message.replace('[points]', pointsLeft).replace('[point_name]', BoldApps.Loyalties.shop.metafields.plural_point_name);
                    form.find('.call-to-action').prepend('<p class="error"><small>' + points_short_message + '</small></p>');
                }

            }, function () {
                form.find('.call-to-action').prepend('<p class="error"><small>An error occured.</small></p>');
            });
        }

        (function init() {

            BoldApps.Loyalties.Helpers = BoldApps.Loyalties.Helpers || {};
            BoldApps.Loyalties.Helpers.initProduct = function() {
                if (pointsCanBeEarned() || pointsCanBeRedeemed()) {
                    var productXhr = getProductData();
                    productXhr.then(showProductDataSuccess, showProductDataError);
                }
            }

            $("#bold-loyalties-shipping-modal").appendTo('body');

            if (pointsCanBeEarned() || pointsCanBeRedeemed()) {
                var productXhr = getProductData();
                productXhr.then(showProductDataSuccess, showProductDataError);

                setTimeout(function () {
                    $(document).on("change", "[name=id],.single-option-selector, .shappify_option [name^='properties']", function () {
                        productXhr.then(showProductDataSuccess, showProductDataError);
                    });
                }, 2000);
            }

        }());

    };


    if ((typeof jQuery === 'undefined') || (parseInt(jQuery.fn.jquery) === 1 && parseFloat(jQuery.fn.jquery.replace(/^1\./, "")) < 9.1)) {
        loadScript('//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', function () {
            jQuery191 = jQuery.noConflict(true);
            myAppJavaScript(jQuery191);
        });
    } else {
        myAppJavaScript(jQuery);
    }

})();
