/* Minification failed. Returning unminified contents.
(40,76-77): run-time error JS1100: Expected ',': =
 */
var logger = createSheetMusicDirectLogger();

function parseToDataList(response) {
    var data = {
            Categories: response.Store
        };

    response.BestSellers.forEach(function(elem) {
        data.Categories.unshift(elem);
    });

    return data;
}

function responseHandler(response, callback) {
    callback(parseToDataList(response));
}

function errorHandler(xhRequest, errorText) {
    if (logger) {
        logger.error('could not load homepage store. Error = ' + errorText, JSON.stringify(xhRequest));
    }
}

function fetchStoreData(localizationObj, callback) {
    $.ajax({
        method: 'POST',
        header: {
            Accept: "application/json; charset=utf-8"
        },
        contentType:"application/json; charset=utf-8",
        cache: true,
        url: '/endpoints/catalogue/store/carousels',
        data: JSON.stringify(localizationObj),
        success: function(data) { return responseHandler(data, callback, localizationObj); },
        error: errorHandler
    }, 'json');
}

function buildCarousel(element, data, localizationObj, skipCompileTemplate = false) {
    if (!skipCompileTemplate) {
        data.PageName = localizationObj.PageName;
        data.HideWrapper = localizationObj.HideWrapper;

        Handlebars.registerHelper('formatCurrency', sheetmusicdirect.EcommerceUtils.formatCurrency);
        Handlebars.registerHelper('getCulture', sheetmusicdirect.EcommerceUtils.getCulture);
        Handlebars.registerHelper('getPathForCulture', sheetmusicdirect.EcommerceUtils.getPathForCulture);
        Handlebars.registerHelper('getGlyphiconStyle', sheetmusicdirect.EcommerceUtils.getGlyphiconStyle);
        Handlebars.registerHelper('trimDecimalPlaces', function (item) {
            return Number(item).toFixed(2);
        });

        Handlebars.getTemplate = function (name) {
            if (Handlebars.templates === undefined || Handlebars.templates[name] === undefined) {
                $.ajax({
                    url: '/fortnight/js/templates/html/' + name + '.html',
                    success: function (data) {
                        if (Handlebars.templates === undefined) {
                            Handlebars.templates = {};
                        }
                        Handlebars.templates[name] = Handlebars.compile(data);
                    },
                    async: false
                });
            }
            return Handlebars.templates[name];
        };

        var compiledTemplate = Handlebars.getTemplate('redesign-carousel');
        var html = compiledTemplate(data);

        element.html(html);
    }

    $('.cover-art').each(function (index, element) {
        var coverArtImage = $(element);

        if (coverArtImage.attr('src') === "") {
            coverArtImage.attr('src', imageLocations.GetPlaceHolderImageLocation());
            coverArtImage.addClass('border');
        }

        var sourceImage = coverArtImage.attr('src');

        if (sourceImage.includes("large.jpg"))
            coverArtImage.attr('src', sourceImage.replace('large.jpg', 'medium.jpg'));

        if (sourceImage.includes("lg.jpg"))
            coverArtImage.attr('src', sourceImage.replace('lg.jpg', 'md.jpg'));

        if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
            coverArtImage.attr('src', sourceImage.replace('large.jpg', 'small.jpg'));
        }
    });

    var isFirstCategory = true;

    $.each($('.category'), function () {
        var category = $(this);

        var productsToShow = (isFirstCategory) ? 4 : 6;

        var moveLeft = function () {
            var leftButton = category.find('.left');
            $(leftButton).click();
        };

        var moveRight = function () {
            var rightButton = category.find('.right');
            $(rightButton).click();
        };

        var swipeHandler = function (event, direction, distance, duration, fingerCount) {
            if (direction === 'right') {
                moveLeft();
            } else if (direction === 'left') {
                moveRight();
            }
        };

        var tapHandler = function (event, target) {
            var href = $(target).parent().attr('href');
            if (href !== undefined && href !== '') {
                window.location = href;
            }
        };

        // Move the opposite direction as the swipe
        category.swipe({
            swipeLeft: swipeHandler,
            swipeRight: swipeHandler
        });

        category.find('.overlay-container a').swipe({
            swipeLeft: swipeHandler,
            swipeRight: swipeHandler,
            tap: tapHandler,
            excludedElements: []
        });

        category.find('.mycarousel').carouFredSel({
            circular: false,
            infinite: false,
            auto: false,
            items: {
                visible: productsToShow,
                minimum: productsToShow
            },
            scroll: {
                items: productsToShow
            },
            prev: {
                key: 'left',
                button: function () {
                    return category.find('.left');
                }
            },
            next: {
                key: 'right',
                button: function () {
                    return category.find('.right');
                }
            },
            pagination: function () {
                return category.find('.pagination');
            }
        });

        isFirstCategory = false;
    });
}

function getDefaultOptions() {
    /*!IMPORTANT RULE: Because of some bugs in Owl Carousel half-items don't work well unless you loop.
     To make for a friendlier and more intuitive experience, the rules of operation must be:
     1) If items are set to x.5, loop must be set to true, because otherwise the carousel becomes unusable.*/
    return {
        loop: false,
        margin: 23,
        nav: true,
        dots: false,
        responsiveClass: true,
        responsive: {
            0: {
                loop:true,
                items: 2.5,
                nav: false,
                margin: 13
            },
            569: {
                items: 3,
                nav: false,
                margin: 20,
            },
            600: {
                items: 4,
                nav: false,
                margin: 24
            },
            769: {
                items: 5,
                slideBy:5,
                nav: true,
                margin: 24
            },
            992: {
                items: 5,
                slideBy:6,
                nav:true,
                margin: 24
            },
            1025: {
                items: 6,
                nav: true,
                slideBy: 6,
                margin: 24
            }
        }
    }
}

function getMaxItemsForCarouselFromScreenWidth() {
    var defaultOptions = getDefaultOptions();
    var maxItems = 6;
    Object.getOwnPropertyNames(defaultOptions.responsive).sort(function(a, b) { return b - a; }).forEach(function(elem) {
        if (window.innerWidth < Number(elem))
            maxItems = defaultOptions.responsive[elem].items;
    });
    return maxItems;
}

function activateHomepageBannerSlider() {
    var mainSliderElement = $('.main-slider');
    mainSliderElement.owlCarousel({
        items: 1,
        loop: true,
        responsiveClass: true,
        autoplay: true,
        autoplayTimeout: 10000,
        smartSpeed: 1000,
        nav: false,
        responsive: {
            0: {
                items: 1,
                dots: false,
            },
            480: {
                items: 1,
                dots: true
            },
            768: {
                items: 1,
                dots: true,
            },
            991: {
                items: 1,
            }
        }
    });
    $(".main-slider .owl-dots").wrap("<div class='dots-container'></div>");

    observeCarousel(mainSliderElement);
}

var activateCarousels = function () {
    var defaultOptions = getDefaultOptions();
    $.each($('#storeContainer .owl-carousel'),
        function(index, elem) {
            var options = $.extend(true, {}, defaultOptions);
            var carousel = $(elem);

            //var maxItems = getMaxItemsForCarouselFromScreenWidth();
            //var itemsInCarousel = carousel.find('.item').length;
            //var isCarouselSmallerThanMaxItemAllowance = itemsInCarousel < maxItems;
            //var isCarouselSmallerThanTwiceMaxItemAllowance = itemsInCarousel < maxItems * 2;
            //if (isCarouselSmallerThanMaxItemAllowance) {
            //    options.loop = false;
            //}
            //if (isCarouselSmallerThanTwiceMaxItemAllowance && options.nav) {
            //    //git issue: https://github.com/OwlCarousel2/OwlCarousel2/issues/984
            //    //git pull request: https://github.com/OwlCarousel2/OwlCarousel2/pull/2349
            //    //workaround as suggested in pull request until new version is ready. This is as of version 2.3.4

            //    //I've added options.nav == true as part of the condition because if you don't it causes an infinite loop scroll when you've set loop to false.
            //    options.rewind = true;
            //}

            carousel.owlCarousel(options);
            observeCarousel(carousel);
        });
    
    getVisibleElementsAfterCarouselsActivated();
}
function isWrapperHiddenOnCurrentPage(pageName) {
    var hiddenWrapperPages = ['promotion-page', 'product-page'];
    if (hiddenWrapperPages.filter(function(elem) { return elem === pageName }).length)
        return true;
    return false;
}

function observeCarousel(carousel) {
    var $targetChildren = carousel.find('.owl-item').filter(':not(.cloned)').find('.item');
    var config = {attributes: true };

    var observer = new MutationObserver(function (mutations) {

        var visibleElements = [];
        for (var m = 0; m < mutations.length; m++) {
            var mutation = mutations[m];

            if (mutation.attributeName === "class") {
                var attributeValue = $(mutation.target).prop(mutation.attributeName);

                if (attributeValue.indexOf('active') !== -1) {
                    visibleElements.push(mutation.target);
                }
            }
        }

        decorateVisiblePageElementsForAnalytics(visibleElements);
    });

    for (var i = 0; i < $targetChildren.length; i++) {
        var target = $targetChildren[i].closest('.owl-item');
        observer.observe(target, config);
    }
}

function getVisibleElementsAfterCarouselsActivated() {
    var visibleItems = $('.owl-item.active').filter(':not(.cloned)').toArray();
    decorateVisiblePageElementsForAnalytics(visibleItems);
}

$.fn.buildStore = function (culture, currency, country, showPrice, isActiveSubscriber) {
    var self = this;
    if ($(self).length) {
        var storeIds = $(self).map(function () {
            return $(this).data('storeid');
        }).get();

        var params = {
            culture: culture,
            currency: currency,
            country: country,
            showPrice: showPrice,
            storeIds: storeIds,
            isActiveSubscriber: isActiveSubscriber == 'True'
        };

        fetchStoreData(params,
            function(data) {
                self.each(function () {

                    var carousel = $(this);
                    params.PageName = carousel.data('page-name');
                    if (!params.PageName)
                        params.PageName = 'default';

                    params.HideWrapper = isWrapperHiddenOnCurrentPage(params.PageName);

                    if (carousel.hasClass('bestsellers-carousel')) {
                        buildCarousel(carousel, ({
                            categories: data.Categories[1] // index 0 == original dynamic bestsellers. This implementation will return the first carousel in the store.
                        }), params);
                    } else {
                        buildCarousel(carousel, ({
                            categories: data.Categories.filter(function (carousel) {
                                return !carousel.Type;
                            })
                        }), params);
                    }

                });
                activateCarousels();
            });
    }
};

$.fn.buildStoreWithData = function (data) {
    if (data.Categories.length) {
        var carousel = $(this);
        var params = {};
        params.PageName = carousel.data('page-name');
        if (!params.PageName)
            params.PageName = 'default';

        params.HideWrapper = isWrapperHiddenOnCurrentPage(params.PageName);

        buildCarousel(carousel, ({
            categories: data.Categories.filter(function (carousel) {
                return !carousel.Type;
            })
        }), params);

        activateCarousels();
    }
};

$.fn.buildStoreWithoutData = function () {
        var carousel = $(this);
        var params = {};
        params.PageName = carousel.data('page-name');
        if (!params.PageName)
            params.PageName = 'default';

        params.HideWrapper = isWrapperHiddenOnCurrentPage(params.PageName);

        buildCarousel(carousel, null, params, true);

        activateCarousels();
};
;
var mobileDeviceWidth = 975;
var isMobileNav;
var isMenuOpen;
var logger = createSheetMusicDirectLogger();

function fetchNavigation(culture, country, isSubscriber) {
    $.ajax({
        method: "GET",
        header: {
            Accept: "application/json; charset=utf-8"
        },
        cache: true,
        url: '/endpoints/navigation/subnavigation/' + culture + '/' + country + '/' + isSubscriber,
        success: buildNavigation,
        error: errorHandler
    }, "json");
    
}

function buildNavigation(data) {
    data = JSON.parse(data);
    var element = $(".dynamicNavAnchor");

    for (var index in data.Navigation) {
        for (var j in data.Navigation[index].Children) {

                var maxCols = 3;
                var maxEntries = 18;

                var breadCrumbColumns = [];

                for (var i = 0; i < maxCols; i++) {
                    breadCrumbColumns.push([]);
                }

            for (var i = 0; i < maxEntries * maxCols; i++) {
                var subchild = null;
                if (data.Navigation[index].Children[j] && data.Navigation[index].Children[j].Children) {
                    subchild = (i < data.Navigation[index].Children[j].Children.length) ? data.Navigation[index].Children[j].Children[i] : null;
                }
                var subchildIndex = Math.floor(i / maxEntries);
                (subchild != null) && breadCrumbColumns[subchildIndex].push(subchild);
            }
            for (var i = 0; i < breadCrumbColumns.length; i++) {
                if (breadCrumbColumns[i].length === 0 && i > 0) {
                    breadCrumbColumns[i] = (i === 1) ? data.Ads.adOne : data.Ads.adTwo;
                }
            }
            if (data.Navigation[index].Children[j]) {
                data.Navigation[index].Children[j].breadCrumbColumns = breadCrumbColumns;
            }
        }
    }

    Handlebars.getTemplate = function (name) {
        if (Handlebars.templates === undefined || Handlebars.templates[name] === undefined) {
            $.ajax({
                url: '/fortnight/js/templates/html/' + name + '.html',
                success: function (data) {
                    if (Handlebars.templates === undefined) {
                        Handlebars.templates = {};
                    }
                    Handlebars.templates[name] = Handlebars.compile(data);
                },
                async: false
            });
        }
        return Handlebars.templates[name];
    };

    Handlebars.registerHelper('ifEquals', function (arg1, arg2, options) {
        return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
    });

    var template = Handlebars.getTemplate('navigation');
    var html = template({ 'navigation': data.Navigation});

    element.after(html);

    bindNavigation();
    isMobileNav;
    $('.navbar-toggler-icon').click(function () {
        isMobileNav = true;
        $('.nav-link').addClass('nav-active');
    });
}

function toggleMobileMenuTab(clickedElement) {
    if ($(clickedElement).find('.mega-menu-dropdown').css('display') == "block") {
        $(clickedElement).find('.mega-menu-dropdown').slideUp();
        $(clickedElement).removeClass('has-submenu');
    }
    else {
        if ($(clickedElement).hasClass('has-submenu')) {
            $(clickedElement).find('.mega-menu-dropdown').slideUp();
            $(clickedElement).removeClass('has-submenu');
        } else {
            $('li.nav-link').find('.mega-menu-dropdown').slideUp();
            $(clickedElement).find('.mega-menu-dropdown').slideDown();
            $('li.nav-link').removeClass('has-submenu');
            $(clickedElement).addClass('has-submenu');
        }
    }
}

function toggleMobileSubmenuTab(clickedElement) {
    if ($(clickedElement).next('.sub-sub-menu').css('display') == "none") {
        $('.sub-nav li a').next('.sub-sub-menu').slideUp();
        $(clickedElement).next('.sub-sub-menu').slideDown();
        $('.sub-nav li a').parent().removeClass('sub-nav-open');
        $(clickedElement).parent().addClass('sub-nav-open');
    } else {
        $(clickedElement).next('.sub-sub-menu').slideUp();
        $(clickedElement).parent().removeClass('sub-nav-open');
    }
}

function deactivateAndHideNav(clickedElement) {
    $(clickedElement).parent('.nav-link ').removeClass('nav-active');
    $(clickedElement).parent('.nav-link ').find('.sub-nav li').removeClass('active');
    $(clickedElement).parent('.nav-link ').find('.mega-menu-dropdown').hide();
    isMenuOpen = false;
    isMobileNav = false;
}

function activateAndShowNav(clickedElement, winWidth) {
    $('.nav-link ').find('.sub-nav li').removeClass('active');
    $('.nav-link ').find('.mega-menu-dropdown').hide();
    if (winWidth > mobileDeviceWidth) {
        $('.nav-link ').removeClass('nav-active');
    }

    if ($(clickedElement).parent('.nav-link ').find('.mega-menu-dropdown').css('display') == "block") {
        if (isMobileNav != true) {
            $('.sub-nav li:first-child').addClass('active');
        }
    }
    if (isMobileNav == false && isMenuOpen == false) {
        $(clickedElement).parent('.nav-link ').addClass('nav-active');
        $(clickedElement).parent('.nav-link ').find('.sub-nav li:first-child').addClass('active');
        $(clickedElement).parent('.nav-link ').find('.mega-menu-dropdown').show();
    }
}

function bindNavigation() {

    $('a[href=""], a[href="#"]').on('click', function (e) {
        e.preventDefault();
    });

    $(document).on('click', '.nav-open .nav-link', function (e) {
        e.stopPropagation();
        toggleMobileMenuTab(this);
    });

    $(document).on('click', '.nav-open .sub-nav li a', function (e) {
        e.stopPropagation();
        toggleMobileSubmenuTab(this);
    });

    $('.nav-overlay').on('click', function () {
        if ($(".mega-menu-nav.nav-open").length) {
            $('.mega-menu-nav').removeClass('nav-open');
            $('.nav-link ').removeClass('nav-active');
            $(this).fadeOut('slow');
        }
    });

    function initMobileNav() {
        var winWidth = $(window).width();
        if (winWidth <= mobileDeviceWidth) {
            $('.sub-nav li').removeClass('active');
            if (!$(".mega-menu-nav.nav-open").length) {
                $('.navbar-toggler').on('click', function (e) {
                    $('.mega-menu-nav').addClass('nav-open');
                    $('.nav-overlay').fadeIn('slow');
                    $('.sub-nav li:first-child').removeClass('active');
                    $('.nav-link').find('.mega-menu-dropdown').hide();
                    $('.sub-sub-menu').hide();
                });
            }
            $('select.js-select').customSelect();
            $(".nav-link").unbind('mouseenter mouseleave');

        }
        else if (winWidth > mobileDeviceWidth) {
            $('.nav-link ').removeClass('nav-active');
            $(".mega-menu-dropdown").hide();
            $('.nav-overlay').fadeOut('fast');
            $('.mega-menu-nav').removeClass('nav-open');
            $('.nav-link').removeClass('has-submenu');
            $('.nav-link').find('.mega-menu-dropdown').removeAttr('style');
            $(".animateSlide").removeClass("is-visible");
            $('.sub-nav li:first-child').addClass('active');
            $('.sub-sub-menu').removeAttr('style');
            $('.sub-nav > li').hover(
                function () {
                    var _this = $(this);
                    openSubUl(_this, 'over');
                }, function () {
                    openSubUl(false, 'out');
                }
            );
            var openUl;
            function openSubUl(_this, hoverevent) {
                if (hoverevent == 'over') {
                    openUl = setTimeout(function () {
                        console.log(1);
                        $('.sub-nav > li.active').removeClass('active');
                        _this.addClass('active');
                    }, 200);
                } else {
                    clearTimeout(openUl);
                }
            }
        }
    }

    initMobileNav();

    isMenuOpen = false;
    isMobileNav = false;

    $(window).on('resize', function (event) {

        setTimeout(function () {
            initMobileNav();
            $('.select-dd .customSelect:not(:last)').remove();
        }, 1000);
        event.preventDefault();
    });

    $('.nav-link > a').on('click', function (e) {

        var winWidth = $(window).width();
        if (winWidth <= mobileDeviceWidth) {
            isMobileNav = true;
        }

        if ($('#navbarNavAltMarkup').hasClass('nav-open') == false) {
            isMobileNav = false;
        }
        if ($(this).parent('.nav-link ').hasClass('nav-active')) {
            deactivateAndHideNav(this);
        } else {
            activateAndShowNav(this, winWidth);
        }
        if ($('#navbarNavAltMarkup').hasClass('nav-open')) {
            $('.nav-link.nav-active a').css('background-color', '');
            $('.nav-link.nav-active a').css('box-shadow', '');
        }

    });

    $("body").click
        (
            function (e) {
                if (e.target.className != "" && e.target.className !== "navbar-nav" && e.target.className !== "sub-nav" && e.target.className !== "container") {
                    if ($('.mega-menu-dropdown').is(':visible')) {
                        isMenuOpen = false;
                        $('.nav-link ').find('.mega-menu-dropdown').hide();
                        $('.nav-link ').removeClass('nav-active');
                        $('.sub-nav li.active').removeClass('active');
                        $('.sub-nav li:first-child').addClass('active');
                    }
                }
            }
        );
};
function getLoaderHtml(el) {
    var isElementDark = el.hasClass('dark-loader');
    var isBackgroundLight = !isElementDark;
    var isLoaderSmall = el.hasClass('small-loader');

    var backgroundClass = (isBackgroundLight ? 'light' : 'dark') + '-background ';
    var sizeClass = 'loader-' + (isLoaderSmall ? 'small' : 'large') + ' ';
    var loaderButtonClass = el.isLoaderInButton ? 'btn-loader' : '';

    return '<div class="loader ' +
        backgroundClass +
        sizeClass +
        loaderButtonClass +
        '"> ' +
        '<div class= "bounce1"></div>' +
        '<div class="bounce2"></div>' +
        '<div class="bounce3"></div>' +
        '</div>';
}
function createLoader(el) {
    var loaderHtml = getLoaderHtml(el);

    if (el.elementToReplace)
        $(el.elementToReplace).hide();
    if (el.isLoaderParentButton)
        el.loaderParent.show();
    if (el.hasClass('hidden'))
        el.removeClass('hidden');
    if (el.isLoaderInButton && !el.isLoaderParentButton) {
        el.show();
        el.html(loaderHtml);
    }
    else
        el.replaceWith(loaderHtml);
}

$.fn.showPostbackSpinner = function () {
    this.each(function () {
        var element = $(this);
        if (!element.hasClass('pre-loader')) {
            console.log(element.get(0));
            console.log('Element cannot be converted into postback spinner');
        } else {
            element.get(0).dispatchEvent(new Event('initialize'));
        }
    });
};
$.fn.postbackEventSpinner = function () {
    this.each(function () {
        var spinner = $(this);
        spinner.loaderParent = spinner.parent();
        spinner.initializeLoader = function() { return createLoader(spinner); };
        spinner.get(0).addEventListener('initialize', function() { return createLoader(spinner) });
        spinner.hide();
        spinner.isLoaderParentButton = spinner.loaderParent.hasClass('btn');
        if (spinner.isLoaderParentButton)
            spinner.loaderParent.hide();

        spinner.isLoaderInButton = spinner.hasClass('btn') || spinner.isLoaderParentButton;

        spinner.elementToReplace = spinner.data('replacement');

        if (spinner.elementToReplace) {

            var clickTarget = spinner.elementToReplace;

            if (spinner.isLoaderParentButton)
                spinner.loaderParent.width($(spinner.elementToReplace));
            spinner.width($(spinner.elementToReplace));

            $(clickTarget).click(function() { return spinner.initializeLoader(); });
        }
    });
};

$(document).ready(function() {
    $('.pre-loader').postbackEventSpinner();
});
;
