/* Minification failed. Returning unminified contents.
(761,47-48): run-time error JS1014: Invalid character: `
(761,49-50): run-time error JS1193: Expected ',' or ')': {
(761,69-70): run-time error JS1195: Expected expression: /
(761,88-89): run-time error JS1014: Invalid character: `
(761,89-90): run-time error JS1195: Expected expression: )
(770,9-10): run-time error JS1195: Expected expression: )
(772,55-56): run-time error JS1004: Expected ';': {
(791,1-2): run-time error JS1002: Syntax error: }
(1205,29-30): run-time error JS1003: Expected ':': ,
(1205,33-34): run-time error JS1003: Expected ':': }
(1713,76-77): run-time error JS1195: Expected expression: )
(1713,79-80): run-time error JS1195: Expected expression: >
(1713,110-111): run-time error JS1004: Expected ';': )
(1714,80-81): run-time error JS1195: Expected expression: )
(1714,83-84): run-time error JS1195: Expected expression: >
(1714,114-115): run-time error JS1004: Expected ';': )
(1717,101-102): run-time error JS1197: Too many errors. The file might not be a JavaScript file: 5
(786,5,790,6): run-time error JS1018: 'return' statement outside of function: return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
(773,9-100): run-time error JS1018: 'return' statement outside of function: return "matrix(" + scale + ", 0, 0, " + scale + ", " + translateX + ", " + translateY + ")"
 */
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.locateReseller = function () {
    var _markers = [],
        _mapmarkers = [],
        _infoWindow,
        _map,
        _marketid = 1,
        //_endpoint = '/handlers/webretailer.ashx?mkt=',      //<-- PRODUCTION
        _endpoint = '/static/geo-data.json', //<-- DEBUG
        _containerSelector = $(".locate-reseller"),
        _directionsLink = "https://maps.google.com?saddr=Current+Location&daddr=";

    function loadMarkers() {
        var json = $('.js-locate-reseller__map').data('jsonstores');
        //$.getJSON(Panduro.stores.endpoint + Panduro.stores.marketid, function (data) {
        $.each(json, function (i, value) {
            if (parseFloat(value.Lat) != 0) {
                var marker = {
                    lat: parseFloat(value.Lat.replace(",", ".")),
                    lng: parseFloat(value.Lng.replace(",", ".")),
                    name: value.Name,
                    address1: value.Address1,
                    address2: value.Address2,
                    address3: value.Address3,
                    phone: value.Telephone,
                    storetypetext: value.StoreTypeText,
                    Id: value.ID
                }
                _markers.push(marker);

                var geomarker = new google.maps.Marker({
                    position: new google.maps.LatLng(marker.lat, marker.lng),
                    icon: '/static/images/maps/pin.png',
                });
                geomarker.addListener('click', function () {
                    $(".js-locate-reseller-store-select").val(marker.Id);
                    $(".js-locate-reseller-store-select").selectric("refresh");
                    $(".js-locate-reseller-store-select").trigger("change")

                });
                _mapmarkers.push(geomarker);

            }
        });

        //setTimeout(Panduro.stores.showStores, 200);
        var options = {
            imagePath: '/static/images/maps/m'
        };
        var markerCluster = new MarkerClusterer(_map, _mapmarkers, options);
        //});
    }

    function loadMap() {
        var $mapMarkup = $(".js-locate-reseller__map", _containerSelector);
        var defaultLat = $mapMarkup.data("defaultLat") ? $mapMarkup.data("defaultLat") : 59.334591;
        var defaultLan = $mapMarkup.data("defaultLng") ? $mapMarkup.data("defaultLng") : 18.063240;

        var mapOptions = {
            center: new google.maps.LatLng(defaultLat, defaultLan),
            zoom: 10,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        _infoWindow = new google.maps.InfoWindow();
        _map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var pos = {
                    lat: position.coords.latitude,
                    lng: position.coords.longitude
                };
                _infoWindow.setPosition(pos);
                _map.setCenter(pos);
            }, function () {
                handleLocationError(true, _infoWindow, _map.getCenter());
            });
        } else {
            handleLocationError(false, _infoWindow, _map.getCenter());
        }

        loadMarkers();
    }

    function initStoreSelect() {
        $(".js-locate-reseller-store-select").off().on("change",
            function () {
                var storeId = $(this).val();
            
                $(".store-list-detailed-store", $(this).closest(".locate-reseller"))
                    .addClass("hidden-force");

                var store = $(".store-list-detailed-store.store-" + $(this).val(), $(this).closest(".locate-reseller"));
                store.removeClass("hidden-force");

                var lat = store.data("lat");
                var lng = store.data("lng");
                changeMapPosition(lat, lng);
                $(".js-locate-reseller-store-select").selectric("refresh");
            }
        );

        if ($(".js-locate-reseller-store-select").val() != null && $(".js-locate-reseller-store-select").val() !== "") {
            var storeId = $(".js-locate-reseller-store-select").val();

            $(".store-list-detailed-store", $(".js-locate-reseller-store-select").closest(".locate-reseller"))
                .addClass("hidden-force");

            var store = $(".store-list-detailed-store.store-" + $(".js-locate-reseller-store-select").val(), $(".js-locate-reseller-store-select").closest(".locate-reseller"));
            store.removeClass("hidden-force");

            var lat = store.data("lat");
            var lng = store.data("lng");
            changeMapPosition(lat, lng);
            $(".js-locate-reseller-store-select").selectric("refresh");
        }
    }

    function initResellerSelect() {
       
        $(".js-store-list-retailer-select").off().on("change",
            function () {
                var storeUrl = $(this).val();
                window.location.href = storeUrl;
            });
    }

    function changeMapPosition(lat, lng) {
        var pos = {
            lat: lat,
            lng: lng
        };

        _infoWindow.setPosition(pos);
        _map.setCenter(pos);
        _map.setZoom(15);
    }

    function handleLocationError(browserHasGeolocation, infoWindow, pos) {
        infoWindow.setPosition(pos);
        infoWindow.setContent(browserHasGeolocation ?
                              'Error: The Geolocation service failed.' :
                              'Error: Your browser doesn\'t support geolocation.');
    }

    return {
        initialize: function () {
            if ($('.locate-reseller').length) {
                _marketid = $('.js-locate-reseller__map').data('market');
                loadMap();
                initStoreSelect();
                initResellerSelect();
            }
        }
    }
}();

//Panduro.locateReseller.initialize = function () {
//    if ($('.locate-reseller').length) {
//        Panduro.stores.loadMarkers();
//        Panduro.stores.loadMap();
//    }
//}



//Panduro.stores.addMarkers = function () {
//    $.each(Panduro.stores.markers, function () {
//        var latlng = new google.maps.LatLng(this.lat, this.lng);
//        var marker = new google.maps.Marker({
//            position: latlng,
//            map: Panduro.stores.map,
//            title: this.name
//        });
//    });
//}

//Panduro.stores.showStores = function () {
 
//    $(Panduro.stores.stores).html("");
//    var index = 0;
//    $.each(Panduro.stores.markers, function () {
//        if (index < 20) {
//            var storeName = this.name;
//            if ((this.storetypetext != undefined) && (this.storetypetext != "")) {
//                storeName += " - " + this.storetypetext;
//            }
//            var html = "<div class='store' data-lat='" + this.lat + "' data-lng='" + this.lng + "'><p class='store-name'>" + storeName + "</p><p>" + this.address1 + ", " + this.address2 + "</p><p>" + this.phone + "</p></div>";
//            $(Panduro.stores.stores).append(html);

//            $(Panduro.stores.stores + " .store").off().on("click", function () {
//                Panduro.stores.changeMapPosition($(this).data('lat'), $(this).data('lng'));
//                $(Panduro.stores.stores + " .store-active").removeClass("store-active");
//                $(this).addClass('store-active');
//            });
//        }
           
//        index++;
//    });

//    $(Panduro.stores.stores).scrollTop = 0;
//}

//Panduro.stores.loadMarkers = function () {
//    var json = $('.js-locate-reseller__map').data('jsonstores');
//    //$.getJSON(Panduro.stores.endpoint + Panduro.stores.marketid, function (data) {
//	$.each(json, function (i, value) {
//            var marker = new Object();
//            if (parseFloat(value.Lat) != 0) {
//                marker.lat = parseFloat(value.Lat.replace(",", "."));
//                marker.lng = parseFloat(value.Lng.replace(",", "."));
//                marker.name = value.Name;
//                marker.address1 = value.Address1;
//                marker.address2 = value.Address2;
//                marker.address3 = value.Address3;
//                marker.phone = value.Telephone;
//                marker.storetypetext = value.StoreTypeText;
//                Panduro.stores.markers.push(marker);
                
                
//                var geomarker = new google.maps.Marker({
//                    position: new google.maps.LatLng(marker.lat, marker.lng)
//                });
//                Panduro.stores.mapmarkers.push(geomarker);
                
//            }
//        });
//        setTimeout(Panduro.stores.showStores, 200);

//        var options = {
//            imagePath: '/static/images/maps/m'
//        };
//        var markerCluster = new MarkerClusterer(Panduro.stores.map, Panduro.stores.mapmarkers, options);
        
//    //});
//}

//Panduro.stores.sortByPosition = function(lat, lng) {
//    var comparePos = new google.maps.LatLng(lat, lng);
//    $.each(Panduro.stores.markers, function () {
//        var myLatlng = new google.maps.LatLng(this.lat, this.lng);
//        var distance = Panduro.stores.getDistance(myLatlng, comparePos);
//        this.distance = distance;
//    });

//    Panduro.stores.markers.sort(Panduro.stores.sortByDistance);
//    Panduro.stores.showStores();
//}

//Panduro.stores.sortByDistance = function(a, b) {
//    var a = a.distance;
//    var b = b.distance;
//    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
//}

//Panduro.stores.rad = function (x) {
//    return x * Math.PI / 180;
//};

//Panduro.stores.getDistance = function (p1, p2) {
//    var radius = 6378137;
//    var dLat = Panduro.stores.rad(p2.lat() - p1.lat());
//    var dLong = Panduro.stores.rad(p2.lng() - p1.lng());
//    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Panduro.stores.rad(p1.lat())) * Math.cos(Panduro.stores.rad(p2.lat())) * Math.sin(dLong / 2) * Math.sin(dLong / 2);
//    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
//    var d = radius * c;

//    return d;
//};

//Panduro.stores.changeMapPosition = function(lat, lng) {
//    var pos = {
//        lat: lat,
//        lng: lng
//    };

//    Panduro.stores.infoWindow.setPosition(pos);
//    Panduro.stores.map.setCenter(pos);
//    Panduro.stores.map.setZoom(15);
//}

//Panduro.stores.handleLocationError = function(browserHasGeolocation, infoWindow, pos) {
//    infoWindow.setPosition(pos);
//    infoWindow.setContent(browserHasGeolocation ?
//                          'Error: The Geolocation service failed.' :
//                          'Error: Your browser doesn\'t support geolocation.');
//};
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articlebundlewidget = function () {
    var widgetSelector = ".article-bundle-widget";

    function initialize(widget) {
        var $widget = $(widget);

        var $btnAddToCart = $(".js-bundle-add-to-cart", $widget);
        $btnAddToCart.click(function () {
            var articles = $(this).data("articles");

            Panduro.cart.addMultipleToCart(articles, (this));
        });
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articlebundlewidgetCarousel = function () {
    var widgetSelector = ".article-bundle-widget-carousel";

    function initialize(widget) {
        var $widget = $(widget);
        Panduro.advancedslick.setUpSpecialDots($widget);

        $widget.slick({
            dots: true,
            infinite: true,
            speed: 300,
            slidesToShow: 1,
            adaptiveHeight: true,
            responsive: [
                {
                    breakpoint: 767,
                    settings: {
                        rows: 1,
                        arrows: false,
                        slidesToShow: 1,
                        slidesToScroll: 1,
                        adaptiveHeight: true,
                        infinite: false,
                    }
                }
            ]
        });

    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.inspirationCarousel = function () {
    var widgetSelector = ".js-inspiration-carousel-container";

    function initialize(widget) {
        var $carousel = $(".js-inspiration-carousel", widget);
        var changed = false;
        var setWidth = 0;

        var slick = $carousel.slick({
            dots: true,
            infinite: true,
            speed: 300,
            adaptiveHeight: true,
            dots: false,
            onSetPosition: onSetPosition,
            responsive: [
                {
                    breakpoint: Panduro.main.mobileMaxWidth,
                    settings: {
                        centerMode: true,
                        adaptiveHeight: true,
                        arrows: false

                    }
                }
            ]
        });



        // a method/func
        function onSetPosition() {
            if (this.$slides.length > this.options.slidesToShow) {
                // Note: don't use this.slideWidth for this.
                var slideWidth = this.$slides.first().width();
                var addValueToEach = (slideWidth / 2) / this.options.slidesToShow;
                this.$slides.width(slideWidth + addValueToEach);
            }
        }

        $(".js-carousel-go-to-inspiration", widget).click(function () {
            var inspirationUrl = $(".slick-current", widget).data("url");
            location.href = inspirationUrl;
        })

    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.linkList = function () {
    var widgetSelector = ".js-link-list, .js-link-list-mobile-no-scroll, .link-list-columns";

    function initialize(widget) {
        Panduro.windowResizeListener.registerCallback("onMobileToTablet", //todo: ta bort?
            function reInitSlick() {
                initSlick(widget)
            }
        );
        //Panduro.windowResizeListener.registerCallback("onMobileToTablet",
        //    function waitForDesktopViewToRender() {
        //        initSlick();
        //    }
        //);
        initSlick(widget);
        $(".js-toggle-link-list", widget).click(function() {
            $(this).closest(".link-list-columns").toggleClass("link-list-columns--closed")
        });
    }

    function initSlick(widget) {

        var addFadeToStart = function () {
            $(".link-list__buttons", widget).on('afterChange', function (event, slick, currentSlide, nextSlide) {
                if (currentSlide == 0)
                    $(this).parent().removeClass("link-list--start");
                else
                    $(this).parent().addClass("link-list--start");
            });
        };

        if ($(widget).hasClass("js-link-list-mobile-no-scroll")) {
            var slick = $(".link-list__buttons", widget).slick({
                speed: 300,
                infinite: false,
                variableWidth: true,
                arrows: true,
                slidesToScroll: 4,
                slidesToShow: 1,
                responsive: [
                    {
                        breakpoint: 1280,
                        settings: {
                            speed: 300,
                            infinite: false,
                            variableWidth: true,
                            arrows: true,
                            slidesToScroll: 6,
                            slidesToShow: 6
                        }
                    },
                    {
                        breakpoint: Panduro.main.tabletMaxWidth,
                        settings: {
                            speed: 300,
                            infinite: false,
                            variableWidth: true,
                            arrows: true,
                            slidesToScroll: 4,
                            slidesToShow: 4
                        }
                    },                    
                    {
                        breakpoint: Panduro.main.mobileMaxWidth,
                        settings: "unslick"
                    }
                ]
            });
            addFadeToStart();

        } else {

            var slick = $(".link-list__buttons", widget).slick({
                speed: 300,
                infinite: false,
                variableWidth: true,
                arrows: true,
                draggable: true,
                slidesToScroll: 6,
                slidesToShow: 6,
                swipeToSlide: false,
                responsive: [
                    {
                        breakpoint: 1280,
                        settings: {
                            speed: 300,
                            infinite: false,
                            variableWidth: true,
                            arrows: true,
                            draggable: true,
                            slidesToScroll: 6,
                            slidesToShow: 6,
                            swipeToSlide: false
                        }
                    },
                    {
                        breakpoint: Panduro.main.tabletMaxWidth,
                        settings: {
                            swipeToSlide: false,
                            mobileFirst: true,
                            slidesToScroll: 4,
                            slidesToShow: 4,
                            arrows: false
                        }
                    },
                    {
                        breakpoint: Panduro.main.mobileMaxWidth,
                        settings: {
                            speed: 10,
                            swipeToSlide: false,
                            mobileFirst: true,
                            slidesToScroll: 2,
                            slidesToShow: 2,
                            arrows: false,
                            draggable: true,
                            touchTreshold: 10
                        }
                    },
                ]
            });

            addFadeToStart();
        }
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleImageViewer = function () {
    var widgetSelector = ".js-article-images-carousel";
    var thumbnailsSelector = ".js-article-image-viewer-thumbs";
    var imagesSelector = ".js-article-image-viewer-images";
    var zoomThumbnailsSelector = ".js-article-image-viewer-zoom-thumbs";
    var zoomImagesSelector = ".js-article-image-viewer-zoom-images";
    var zoomSelector = ".js-article-image-viewer-zoom";
    var zoomCloseSelector = ".js-article-image-viewer-zoom-close";

    function initialize(widget) {
        var $widget = $(widget);

        initSwiper($widget);
        //var $hiddenList = $widget.find(".js-article-images-carousel-list");

        //Panduro.windowResizeListener.registerCallback("onTabletToMobile",
        //    function mobile() {                
        //        initMobileSlick($widget, $hiddenList);
        //    }
        //);

        //Panduro.windowResizeListener.registerCallback("onMobileToTablet",
        //    function desktop() {
        //        initDesktopSlick($widget, $hiddenList);
        //    }
        //);

        //if ($(window).width() < Panduro.main.mobileMaxWidth) {
        //    initMobileSlick($widget, $hiddenList);
        //}
        //else {
        //    initDesktopSlick($widget, $hiddenList);
        //}
    }

    function initSwiper($widget) {
        var $thumbnails = $(thumbnailsSelector, $widget)[0];
        var thumbnails = new Splide($thumbnails, {
            fixedWidth: 80,
            gap: 10,
            rewind: true,
            pagination: false,
            isNavigation: true,
            arrows: false,
            arrowPath: 'M15 9v22l14-11z',
            //focus: 'center',
            lazyLoad: 'nearby',

            dragMinThreshold: {
                mouse: 4,
                touch: 10,
            },


        });

        var $images = $(imagesSelector, $widget)[0];
        var main = new Splide($images, {
            type: $(".splide__slide", $images).length > 1 ? 'loop' : 'slide',
            pagination: false,
            arrows: true,
            cover: true,
            pagination: true,
            perMove: 1,
            arrowPath: 'M15 9v22l14-11z',
            //padding: '100px',
            //gap: '20px',
            drag: true,
            flickMaxPages: 1,
            perPage: 1,
            perMove: 1,
            dragMinThreshold: 10,
            flickPower: 0,
            //lazyLoad: 'nearby',
            //height: '565px',
            breakpoints: {
                //1280: {
                //    height: '49vw',
                //},
                959: {
                    arrows: false,

                    //height: '100vw',
                    gap: 0,
                    padding: 0
                }
            },


        });

        main.sync(thumbnails);
        main.mount();
        thumbnails.mount();
        main.on("click",
            function (e) {
                if ($(e.slide).hasClass("no-zoom") || $(e.target).is("button")) return;

                $(zoomCloseSelector, $widget).off().click(function() {
                    $(zoomSelector, $widget).addClass("closed");
                    $("body").removeClass("no-scroll");
                });

                $(zoomSelector, $widget).removeClass("closed");

                var $thumbnails = $(zoomThumbnailsSelector, $widget)[0];
                var zoomThumbnails = new Splide($thumbnails, {
                    type: 'slide',
                    start: $(e.slide).data("index"),
                    rewind: true,
                    fixedWidth: 85,
                    fixedHeight: 90,
                    isNavigation: true,
                    gap: 10,
                    pagination: false,
                    arrows: false,
                    focus: 'center',
                    lazyLoad: 'nearby',

                    dragMinThreshold: {
                        mouse: 4,
                        touch: 10,
                    }

                });

                var $images = $(zoomImagesSelector, $widget)[0];
                var zoomMain = new Splide($images, {
                    type: 'loop',
                    start: $(e.slide).data("index"),
                    pagination: false,
                    arrows: false,
                    cover: true,
                    arrows: true,
                    perMove: 1,
                    arrowPath: 'M15 9v22l14-11z',
                    drag: false,
                    lazyLoad: 'nearby',
                    breakpoints: {
                        768: { arrows: false, drag: true },
                    },

                });
          
                var zoomed = false;
                var shouldZoomOut = false;
                zoomMain.on("click", function (e, clickEvent) {
                    var $element = $(e.slide).find("img");
                    var element = $element[0];

                    if ($element.length < 1 || $(window).width() < Panduro.main.tabletMaxWidth)
                        return

                    if (!zoomed) {
                        zoomed = true;
                        $element.addClass("zoomed");
                        element.style.transform = getMatrix(1.5, 0, 0);

                        var initialX = 0;
                        var initialY = 0;
                        var tempInitialX = 0;
                        var tempInitialY = 0;
                        var hasMoved = false;

                        $element.on("mousedown", function (pos) {
                            var startX = pos.pageX;
                            var startY = pos.pageY;
                            hasMoved = false;

                            $element.on("mousemove", function (e) {
                                hasMoved = true;
                                shouldZoomOut = false;
                                var currentX = (e.pageX - startX + initialX);
                                var currentY = (e.pageY - startY + initialY);
                                tempInitialX = currentX;
                                tempInitialY = currentY;
                                $element.css("transform", getMatrix(1.5, currentX, currentY));
                            });

                            $element.on('mouseup mouseout', function () {
                                initialX = tempInitialX;
                                initialY = tempInitialY;
                                $(this).unbind('mousemove');
                            })
                        })
                        $element.on("mouseup", function (pos) {
                            if (zoomed && !hasMoved) {
                                shouldZoomOut = true;
                            }
                           
                        });
                    } else if (shouldZoomOut) {
                        zoomed = false;
                        $element.removeClass("zoomed");
                        $element.css("transform", "none");
                        $element.unbind();
                    }
                })
                zoomMain.on("move", function (e) {
                    var $element = $(e.slide).find("img");
                    $(zoomImagesSelector, $widget).find("img").css("transform", "none");
                    zoomed = false;
                    $element.removeClass("zoomed");
                })

                zoomMain.on('moved', function () {
                    updatePagination();
                });

                zoomMain.on('mounted', function () {
                    updatePagination();
                });

                function updatePagination() {
                    $(".js-image-index").text(`${zoomMain.index + 1}/${zoomMain.length}`);
                }    

                zoomMain.sync(zoomThumbnails);
                zoomMain.mount();
                zoomThumbnails.mount();

            }

        );
    }
    function getMatrix(scale, translateX, translateY) {
        return "matrix(" + scale + ", 0, 0, " + scale + ", " + translateX + ", " + translateY + ")";
    }

    //const hasPositionChanged = ({ pos, prevPos }) => pos !== prevPos;

    //const valueInRange = ({ minScale, maxScale, scale }) => scale <= maxScale && scale >= minScale;

    //const getTranslate = ({ minScale, maxScale, scale }) => ({ pos, prevPos, translate }) =>
    //    valueInRange({ minScale, maxScale, scale }) && hasPositionChanged({ pos, prevPos })
    //    ? translate + (pos - prevPos * scale) * (1 - 1 / scale)
    //    : translate;


    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleImageZoomCarousel = function () {
    var widgetSelector = ".js-article-images-zoom-carousel.active";

    function initialize(widget) {

        var $widget = $(widget);
        var $list = $widget.find(".js-article-images-zoom-carousel-list");

        initDesktopZoom($widget, $list);
    }

    function initDesktopZoom($widget, $list) {

        var itemCount = $list.find(".zoom__image-wrapper").length;
        var desktopSettings = {
            slidesToShow: 8,
            slidesToScroll: 1,
            infinite: false
        };

        $list.slick(desktopSettings);

        $widget.find(".js-carousel-left").off().on("click", function () {
            var prevIndex = parseInt($list.attr("data-index")) - 1;

            if (prevIndex >= 0) {
                findAndSetNewImage(prevIndex);
            }
        });

        $widget.find(".js-carousel-right").off().on("click", function () {
            var nextIndex = parseInt($list.attr("data-index")) + 1;

            if (nextIndex < itemCount) {
                findAndSetNewImage(nextIndex);
            }
        });

        $list.off().on("click", ".zoom__image-wrapper img, .zoom__image-wrapper picture", function () {
            var $wrapper = $(this).parent(".zoom__image-wrapper");            
            var zoomurl = $(this).attr("zoom-url");
            var index = $wrapper.data("slick-index");

            setNewImage(index, zoomurl, $wrapper);
        });

        findAndSetNewImage($widget.attr("data-openIndex"));

        function findAndSetNewImage(index) {
            var $wrapper = $list.find(".zoom__image-wrapper[data-slick-index='" + index + "']");
            var zoomurl = $wrapper.find("img").attr("zoom-url");

            setNewImage(index, zoomurl, $wrapper);
        }

        function setNewImage(index, imgurl, $imageWrapper) {

            var itemsToShow = 7;

            $widget.find(".js-carousel-current-zoom-item img").attr("zoom-url", imgurl);
            $widget.find(".js-carousel-current-zoom-item img").attr("src", imgurl);

            $imageWrapper.addClass("zoom__image-wrapper--selected");
            $imageWrapper.siblings().removeClass("zoom__image-wrapper--selected");
            $list.attr("data-index", index);            

            if (!$imageWrapper.hasClass("slick-active")) {
                var slickSlide = (index - itemsToShow < 1) ? 0 : (index - itemsToShow);
                $list.slick("slickGoTo", slickSlide)
            }

            updateArrows(index);
        }

        function updateArrows(index) {

            var $leftArrow = $widget.find(".js-carousel-left").removeClass("arrows--disabled");
            var $rightArrow = $widget.find(".js-carousel-right").removeClass("arrows--disabled");

            if (index == 0)
                $leftArrow.addClass("arrows--disabled");

            if (index == (itemCount-1))
                $rightArrow.addClass("arrows--disabled");
        }
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.simpleArticleSlide = function () {
    var widgetSelector = ".article-swiper";
    var swiper;

    function initialize(widget) {
        var $list = $(widget);
        if ($list.length > 0) {
            if ($(window).width() < Panduro.main.mobileMaxWidth) {
                initSwiper($list, 2);
            }
            else {
                initSwiper($list, 5);
            }
        }
    }

    function initSwiper($list, numberOfArticles) {
        swiper = new Swiper($list[0], {
            slidesPerView: 2,
            spaceBetween: 0,
            grabCursor: true,
            watchSlidesProgress: true,
            scrollbar: {
                el: $(".swiper-scrollbar", $list)[0],
                hide: false,
                draggable: true
            },
            navigation: {
                nextEl: $(".swiper-button-next", $list)[0],
                prevEl: $(".swiper-button-prev", $list)[0]
            },
            breakpoints: {
                767: {
                    slidesPerView: 3
                },
                959: {
                    slidesPerView: 5
                }
            }
        });
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        },
        initSlider: function ($list) {
            initSwiper($list);
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

Panduro.module.youtubeCarousel = function () {
    var widgetSelector = ".js-youtubelist-carousel";

    function initialize(widget) {

        var $widget = $(widget);
        var $list = $widget;

        if ("IntersectionObserver" in window) {
            var lazyCarouselObserver = new IntersectionObserver(function (entries, options) {
                entries.forEach(function (entry) {
                    if (entry.isIntersecting || entry.intersectionRatio > 0.0) {
                        init($(entry.target));
                        lazyCarouselObserver.unobserve(entry.target);
                    }
                });
            });

            lazyCarouselObserver.observe($list[0]);
        }
        else {
            init($list);
        }
    }

    function init($list) {

        var settings = {
            dots: false,
            slidesToShow: 1,
            slidesToScroll: 1,
            swipe: false,
            infinite: true,
            lazyLoad: "progressive"
        };
               
        Panduro.advancedslick.setUpYouTubeCarousel($list);
        $list.slick(settings);
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.accordionTabs = function () {
    var widgetSelector = ".tabs";

    function initialize(widget) {

        initializeTrackTabChange();
        if ($(widget).length) {
            $(widget).off().on("click", ".tabs__tab", function (event) {
                if ($(window).width() > Panduro.main.mobileMaxWidth) {
                    $(this).siblings("input").prop("checked", false);
                }
            });

            Panduro.windowResizeListener.registerCallback("onMobileToTablet", function () {
                $(widget).find("#tab-1").prop("checked", true);
            });
        }
    }

    function initializeTrackTabChange(widget) {
        Panduro.EcomRepo.trackUxInteraction("Product tabs", "Initial render", "1", true);
        $(".tabs__input", widget).change(function() {
            Panduro.EcomRepo.trackUxInteraction("Product tabs", "Open - " + $(this).attr('id'), "1", false);

        })
    }

    function openTab(tabSelector, callback) {
        var container = $(tabSelector).closest(".tabs");
        $(".tabs__input", container).prop("checked", false);

        $(tabSelector, ".tabs").prop("checked", true);

        if (typeof callback === "function")
            callback();
    }


    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        },
        openTab: openTab
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleStoreStockAvailability = function () {
    var stores;
    var enriched = false;
    var visible = false;
    var rendered = false;
    var container = $(".store-availability");
    var articleNumber = -1;
    var spinner;
    var slidein = $(".js-storeavailability-slidein");
    var storeStockCount = 0;
    var checkForMemberStore = "true";

    function initialize() {
        if ($(".store-listing").length > 0) {
            stores = $(".store-listing").data("jsonstores").filter(function (store) { return store.DontShowStockInfo === false; });
            articleNumber = container.data("articlenumber");

            var outerContainer = $(".store-availability-container");
            var checkForMemberStore = "true";
            
            getStoreAvailability(articleNumber, renderStore, renderRows);
            $(".js-storeavailability-slidein-open").click(function () {
                Panduro.module.slideIn.openStaticSlideIn(slidein, true);
            })
        }

        //Check for member chosen store
        if (Panduro.state.current.currentStore === -1 || Panduro.state.current.currentStore === "" || Panduro.state.current.currentStore === null) {
            if (stores && typeof Panduro.variables.chosenStore != "undefined" && Panduro.variables.chosenStore != 9999) { 
                for (var i = 0; i < stores.length; i++) {
                    if (stores[i].BisonID == Panduro.variables.chosenStore) {
                        Panduro.state.setState({ currentStore: stores[i].ID });
                    }
                }
            }
        }
        
    }

    function getStoreAvailability(articleNumber, callback, callback2) {
        $.ajax({
            type: "GET",
            url: "/api/article/GetStoreAvailabilityAllStores",
            data: { articleNumber: articleNumber }
        }).done(function (storesAvailability) {
            $(storesAvailability).each(function(i, storeAvailability) {
                $(stores).each(function(x, store) {
                    if (store.BisonID == storeAvailability.StoreId) {
                        store.quantityInStock = storeAvailability.Quantity;
                        store.availability = storeAvailability.Availability;
                        store.inStock = storeAvailability.Availability === 3;
                        store.fewLeftInStock = storeAvailability.Availability === 2;
                        store.outOfStock = storeAvailability.Availability === 1;
                        store.stockMissing = storeAvailability.Availability === 4;
                        store.altText = storeAvailability.AltText;
                        store.missingText = storeAvailability.stockmissing;

                    }
                });

                
            });

            enriched = true;
            if (typeof (callback) === "function")
                callback();

            if (typeof (callback2) === "function")
                callback2();

        }).fail(function (error) {
            //console.log(error);
        });
    }

    function checkIfChosenStore() {
        if (Panduro.state.current.currentStore != -1 && Panduro.state.current.currentStore != "" && Panduro.state.current.currentStore.toString().length < 8) {
            $(".js-store-chosen").removeClass("store-availability-info__store-chosen--hidden");
            $(".js-store-not-chosen").addClass("store-availability-info__store-not-chosen--hidden");
        }
        else {
            $(".js-store-chosen").addClass("store-availability-info__store-chosen--hidden");
            $(".js-store-not-chosen").removeClass("store-availability-info__store-not-chosen--hidden");

            for (var i = 0; i < stores.length; i++) {
                if (stores[i].availability == 2 || stores[i].availability == 3) {
                    storeStockCount++;
                }
            }

            if (storeStockCount > 0) 
                $(".js-availability-icon").addClass("store-availability-info__icon--in-stock");
            else
                $(".js-availability-icon").addClass("store-availability-info__icon--out-of-stock");

            var $storeCount = $(".js-store-count", ".js-store-not-chosen");

            var renderStoreCount = Mustache.render($("#store-count-template").html(), { storecount: storeStockCount } );
            $($storeCount).html(renderStoreCount);
        }
    }

    function renderStore() {

        checkIfChosenStore();
        if (Panduro.state.current.currentStore != -1 && Panduro.state.current.currentStore.toString().length < 8) {
            var storeId = Panduro.state.current.currentStore;
            var store = stores.find(function (s) {
                return s.ID == storeId;
            });

            if (typeof store != 'undefined') {
                var closeStores = getClosestStores(store.Lat, store.Lng, Math.min(stores.length, 4));
                closeStores.shift();

                if (store !== undefined && store !== undefined && storeId !== "") {
                    var $chosenStore = $(".js-chosen-store-info", ".js-store-chosen");

                    var renderChosenStore = Mustache.render($("#store-list-template").html(), store);
                    $($chosenStore).html(renderChosenStore);
                }

                var $closeStores = $(".js-close-stores-content", ".js-close-stores");

                var renderStores = Mustache.render($("#store-list-template").html(), closeStores);
                $($closeStores).html(renderStores);
            }
        }
    }


    function renderRows() {
        var $content = $(".js-slidein-content", slidein); 

        var rendered = Mustache.render($("#store-list-template").html(), stores);
        $($content).html(rendered);

        var button = document.querySelector(".js-choose-store");

        button.disabled = true;


        $($content).find(".store-availability-list-item").click(function () {
            button.disabled = false;
            $(".js-choose-store").removeClass("btn--disabled");
            $('.store-availability-list-item__store-info').addClass('store-availability-list-item__store-info--hidden');

            $('.store-availability-list-item').not(this).removeClass('store-availability-list-item--show-info');
            $(this).addClass('store-availability-list-item--show-info');

            $(this).find(".store-availability-list-item__store-info").removeClass('store-availability-list-item__store-info--hidden');
        });

        $(".js-choose-store").on('click touchstart', function () {
            var selectedStore = $($content).find(".store-availability-list-item--show-info").data("store-id");
            Panduro.state.setState({ currentStore: selectedStore });
            renderStore();
            slidein.removeClass("slidein--open");
            Panduro.ui.hideModalFade();
        });

       

    }

    function getClosestStores(x, y, numberOfStores, ignoreStoreId) {
        var myPosition = { x, y };
        var foundStores = [];
        var foundIds = [ignoreStoreId];
        function DistSquared(pt1, pt2) {
            var diffX = pt1.x - pt2.x;
            var diffY = pt1.y - pt2.y;
            return (diffX * diffX + diffY * diffY);
        }

        for (x = 0; x < numberOfStores; x++) {
            var closest;
            var shortestDistance = DistSquared(myPosition, { "x": stores[0].Lat, "y": stores[0].Lng })
            if (shortestDistance === 0 && typeof stores[1] !== 'undefined')
                shortestDistance = DistSquared(myPosition, { "x": stores[1].Lat, "y": stores[1].Lng })
            else
                closest = stores[0];
            for (i = 0; i < stores.length - 1; i++) {
                var storePosition = { "x": stores[i].Lat, "y": stores[i].Lng };
                var d = DistSquared(myPosition, storePosition);
                if (d < shortestDistance && foundIds.indexOf(stores[i].ID.toString()) < 0 && stores[i].ID != "") {
                    closest = stores[i];
                    shortestDistance = d;
                }
            }
            if (closest !== undefined && foundIds.indexOf(closest.ID.toString()) < 0) {
                foundStores.push(closest);
                foundIds.push(closest.ID.toString());
            }
            
        }

        return foundStores;
    }

    return {
        initialize: initialize,
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.chat = function () {
    var widgetSelector = ".chat";

    function initialize(widget) {
        var serviceGroupId = $(widget).data("serviceGroupName");
        var tenantId = $(widget).data("tenantId");
        var sessionId = $(widget).data("sessionId");

        $(".js-chat-toggle", widget).click(function () {
            $(this).closest(".chat").toggleClass("chat--open")
        });

        $(".js-open-chat", widget).click(function () {

            var name = Panduro.contact.getTextValue($(widget).find('.name'));
            var email = Panduro.contact.getEmailValue($(widget).find('.email'));
            if ($(widget).find(".error").length < 1) {
                openChatWindow(name, email, serviceGroupId, tenantId, sessionId);
            }
        });

    }

    function openChatWindow(name, email, serviceGroupName, tenantId, sessionId) {
        var url = "https://chat.panduro.com/panduro/Chat.aspx" +
            "?sessionid=" + encodeURIComponent(sessionId) +
            "&customername=" + encodeURIComponent(name) +
            //"&customerid=" + encodeURIComponent(document.getElementById('txtCustomerID').value) +
            "&email=" + encodeURIComponent(email) +
            "&tenantid=" + encodeURIComponent(tenantId) +
            "&servicegroupid=" + encodeURIComponent(0) +
            "&servicegroupname=" + encodeURIComponent(serviceGroupName);
        //"&privatedata=" + encodeURIComponent(document.getElementById('txtPrivateData').value);
        var strWindowFeatures = "menubar=no,location=no,resizable=yes,scrollbars=yes,status=yes,height=400,width=700,centerscreen=yes";

        window.open(url, "Panduro support", strWindowFeatures);
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.campaignInfo = function () {
    var widgetSelector = ".campaign-information";

    function initialize(widget) {
        
        $(widget).click(function () {
            var width = $(window).width() < 769 ? "auto" : 600;
            var height = $(window).width() < 769 ? null : "auto";
            Panduro.popup.launch($(".js-popup-content", widget).html(), height, width, null, null, null, "padding");
        })
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

Panduro.module.popularArticles = function () {

    function initialize($list) {
        
        $(".js-get-more-popular-articles", $list).on("click",
            function () {
                var $container = $(".js-popular-list", $list);
                var page = parseInt($container.attr("data-page"), 10) + 1;

                $.ajax({
                    type: "GET",
                    url: "/api/article/GetMorePopularArticles?page=" + page + "&assortmentNode=" + $container.data("assortment-node-id") + "&subCatetegoryId=" + $container.data("assortment-sub-category-id"),
                    success: function(view) {
                        $container.append(view);
                        $container.addClass("polular-article-category-list--show-" + page);
                        Panduro.lazyLoadImages.updateImages();
                        $container.attr("data-page", page);

                        if (page == 2 || (page) * 10 > $container.children().length) {
                            $(".js-get-more-popular-articles", $list).addClass("hidden");
                            $(".js-back-to-start", $list).removeClass("hidden");
                        }
                    }
                })
            });
        $(".js-back-to-start", $list).on("click",
            function () {
                var $container = $(".js-popular-list", $list);
                $container.attr("data-page", 0);
                $container.removeClass("polular-article-category-list--show-1");
                $container.removeClass("polular-article-category-list--show-2");

                $(".js-get-more-popular-articles", $list).removeClass("hidden");
                $(".js-back-to-start", $list).addClass("hidden");

                $('html, body').animate({
                    scrollTop: $($list).offset().top - 20
                }, 'slow', function() {
                    $container.children().slice(10, $container.children().length).remove();
                });

            });
    }

    return {
        initialize: function () {
            $.each($('.polular-article-category-list'),
                function() {
                    initialize($(this));
                });
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleListCarousel = function () {
    var widgetSelector = ".article-list-carousel";
    function initialize(widget) {
        var $list = $(widget);

        //Panduro.windowResizeListener.registerCallback("onTabletToMobile",
        //    function reInitSlick() {
        //        console.log("reset")

        //        initSlick($list, true)
        //    }
        //);

        //Panduro.windowResizeListener.registerCallback("onMobileToTablet",
        //    function reInitSlick() {
        //        console.log("reset")
        //        initSlick($list, false)
        //    }
        //);
        //Panduro.windowResizeListener.registerCallback("onTabletToDesktopish",
        //    function reInitSlick() {
        //        console.log("reset")
        //        initSlick($list, false)
        //    }
        //);
        //Panduro.windowResizeListener.registerCallback("onDesktopishToTablet",
        //    function reInitSlick() {
        //        console.log("reset")
        //        initSlick($list, false)
        //    }
        //);

        if ($(window).width() < Panduro.main.mobileMaxWidth) {
            initSlick($list, true);
        }
        else {
            initSlick($list, false);
        }
    }

    function initSlick($list, isMobile) {

        if ($list.hasClass("slick-initialized")) {
            unSlick($list)
        }
        if (isMobile && $list.children().length < 3)
            return false;
        else if (!isMobile && $list.children().length < 6)
            return false;


        console.log("init")
        Panduro.advancedslick.setUpSpecialDots($list);

        $list.slick({
            dots: true,
            speed: 300,
            rows: 1,

            slidesToShow: 5,
            slidesToScroll: 5,
            adaptiveHeight: true,
            infinite: false, 
            responsive: [
                {
                    breakpoint: 959,
                    settings: {
                        rows: 1,
                        arrows: false,
                        slidesToShow: 3.15,
                        slidesToScroll: 3,
                        adaptiveHeight: true,
                        infinite: false
                    }
                },
                {
                    breakpoint: 767,
                    settings: {
                        rows: 1,
                        arrows: false,
                        slidesToShow: 2.15,
                        slidesToScroll: 2,
                        adaptiveHeight: true,
                        infinite: false,
                    }
                }
            ]
        });
    }

    function unSlick($list) {

        if ($list.hasClass("slick-initialized")) {
            $list.slick("unslick");
            $list.off();
        };
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize(this) });
        }
    }
}();



;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.brandList = function () {
    var widgetSelector = ".brand-list";

    function initialize(widget) {
        var brandLetters = $(".js-brand-letter", widget);

        $(brandLetters).click(function () {
            
            var aTag = $("[name='" + $(this).data("letter") + "']");

            var totalOffset = $(".js-brand-letter-container").outerHeight() + $("header").outerHeight() + 9;
            $('html,body').animate({ scrollTop: aTag.offset().top - totalOffset }, 1500);
        });

    }

    return {
        initialize: function () {
            $(widgetSelector).each(function() { initialize($(this)) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.addToCartPopup = function () {
    var selector = ".js-add-to-cart-popup";
    var timeout;
    function initialize(widget) {

        if ($(widget).length) {
            
        }
    }

    function open() {
        var toasts = $(selector);
        if (timeout !== null)
            window.clearTimeout(timeout);

        var messageIndexToShow = Math.floor(Math.random() * $("h3", $(selector).first()).length);

        $("h3", toasts).addClass("hidden");
        

        toasts.each(function() {
            $($("h3", this).get(messageIndexToShow)).removeClass("hidden")

        })

        $(selector).removeClass("add-to-cart-popup--close");
       

        timeout = setTimeout(function () {
            $(selector).addClass("add-to-cart-popup--close");
        }, 5000);

    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        },
        open: open
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.slideIn = function () {
    var widgetSelector = ".slidein:not(.slidein--static)";
    var slidein;
    function initialize(widget) {

        if ($(widget).length) {
            slidein = widget;
            $(".js-slidin-close", widget).off().click(function() {
                $(slidein).removeClass("slidein--open");
            })

            //Panduro.windowResizeListener.registerCallback("onMobileToTablet", function () {
            //    $(widget).find("#tab-1").prop("checked", true);
            //});
        }
    }

    function openSlidein(content, callback) {

        // hide slider
        $(".js-slidein-content", slidein).html(content);
        $(slidein).addClass("slidein--open");

        if (typeof callback === "function")
            callback();
    }

    function openStaticSlideIn(theSlideinToOpen, noScroll, openCallback, closeCallback) {

        function close() {
            if (noScroll) {
                Panduro.ui.hideModalFade()
            }
            $(theSlideinToOpen).removeClass("slidein--open");
            if (typeof closeCallback === "function")
                closeCallback();
        }
        if (noScroll) {
            Panduro.ui.showModalFade();
            $(".modal-fade").off().click(function() {
                close();
            });
        }
        $(theSlideinToOpen).addClass("slidein--open");
        if (typeof openCallback === "function")
            openCallback();

        $(".js-slidin-close", $(theSlideinToOpen)).off().click(function() {
            close();
        });

    }
    return {
        initialize: function () {
            initialize($(widgetSelector));
        },
        openSlidein: openSlidein,
        openStaticSlideIn: openStaticSlideIn
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.infoBox = function () {
    var widgetSelector = ".info-box";

    function initialize(widget) {

        $(".js-info-box-close").click(function () {
            $(widgetSelector).removeClass("info-box--open");
        });
    }

    function openInfoBox(header, content, ctaText, successCallback) {

        $(widgetSelector).addClass("info-box--open");
        $(".js-info-box-header").html(header);
        $(".js-info-box-content").html(content);
        $(".js-info-box-accept").html(ctaText);

        $(".js-info-box-accept").click(function () {
            $(widgetSelector).removeClass("info-box--open");

            if (typeof successCallback === "function")
                successCallback();
        })
        
    }
    return {
        initialize: function () {
            initialize($(widgetSelector));
        },
        openInfoBox: openInfoBox
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.locateOrder = function () {
    var widgetSelector = ".locate-order";

    function initialize(widget) {

        var $form = $('#__LocateOrderForm');
        var button = $form.find('.js-locate-order');

        button.on('click', function () {
            var formData = {};
            $form.find('.js-locate-order-not-found').hide();
            formData.OrderNumber = Panduro.contact.getTextValue($form.find('#OrderNumber'));
            formData.Email = Panduro.contact.getEmailValue($form.find('#Email'));

            if ($form.find('.error').length === 0) {
                Panduro.ui.toggleLoading(button);
                $form.find('.error-message').hide();
                Panduro.main.POST("LocateOrder", "LocateTheOrder", formData,
                    function (result) {
                        if (result.success) {
                            location.href = result.message; 
                            Panduro.ui.toggleLoading(button);
                        } else {
                            $form.find('.js-locate-order-not-found').text(result.message).show();
                            Panduro.ui.toggleLoading(button);
                        }
                    },
                    function (error) {
                        $form.find('.error-message').show();
                        Panduro.ui.toggleLoading(button);
                    }
                );
            }
        });

    }

    return {
        initialize: function () {
            initialize($(widgetSelector));
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.inspirationImageSlider = function () {
    var widgetSelector = ".js-inspiration-image-slider";

    function initialize(widget) {
        var $list = $(widget);
        $list.data("numberOfItems", $list.children().length);

        if ($(window).width() < Panduro.main.mobileMaxWidth) {
            if ($list.children().length > 5)
                initSlick($list);
        } else if ($(window).width() < Panduro.main.tabletMaxWidth) {
            if ($list.children().length > 4)
                initSlick($list);
        } else {
            if ($list.children().length > 6)
                initSlick($list);
        }

        Panduro.windowResizeListener.registerCallback("onMobileToTablet", () => checkNumberOfImages(4, $list));
        Panduro.windowResizeListener.registerCallback("onTabletToDesktopish", () => checkNumberOfImages(6, $list));

        Panduro.windowResizeListener.registerCallback("onDesktopishToTablet", () => checkNumberOfImages(4, $list));
        Panduro.windowResizeListener.registerCallback("onTabletToMobile", () => checkNumberOfImages(5, $list));
    }

    function checkNumberOfImages(numberOfImagesToInitSlick, list) {

        if (list.hasClass("slick-initialized")) 
            unSlick(list)

        if (list.data("numberOfItems") > numberOfImagesToInitSlick )
            initSlick(list);
        else
            unSlick(list);
    }

    function initSlick($list) {        

        if ($list.hasClass("slick-initialized")) {
            unSlick($list)
        }

        Panduro.advancedslick.setUpSpecialDots($list);
        
        $list.slick({
            dots: true,
            arrows: true,
            slidesToScroll: 1,
            infinite: false,
            variableWidth: true
        });
    }

    function unSlick($list) {        
        
        if ($list.hasClass("slick-initialized")) {
            $list.slick("unslick");
            $list.off();            
        };        
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

Panduro.module.inspirationList = function () {
    var widgetSelector = ".js-inspiration-filtered-list";

    function initialize(widget) {

        initInspirationFilter()
    }

    function initInspirationFilter() {
        $(".show-list-filter", ".js-inspiration-filtered-list").click(function () {
            $(this).siblings(".js-refine-tools").addClass("active-mobile");
            $('body').addClass('no-scroll');
        })
        $(".filter-group-wrapper h4", ".js-inspiration-filtered-list").click(function () {
            $(this).closest(".filter-group-wrapper").toggleClass("active");
        })

        $(".filter-tools__list-wrapper input").off().on("click", function (e) {
            var $filterGroup = $(e.target).closest(".filter-tools__filter-group");
            var $selectionLabel =
                $filterGroup.find(".filter-tools__list-header-selection");
            var $selectedFilters =
                $filterGroup.find("input:checked");
            var selectedFiltersString = "";
            //$.each($selectedFilters,
            //    function () {
            //        selectedFiltersString += $(this).attr("data-facetname") + ", ";
            //    });
            //if (selectedFiltersString != "") {
            //    selectedFiltersString = selectedFiltersString.substr(0, selectedFiltersString.length - 2);
            //}

            //$selectionLabel.html(selectedFiltersString);

        });

        $(".js-refine-tools", ".js-inspiration-filtered-list").change(function () {
            var filterContainer = $(this).closest(".js-inspiration-filtered-list");
            useFilter(filterContainer);
        });

        $(".filter-tools__clear-filters.js-inspirations, .js-refine-tools-clear-filters.js-inspirations").off("click").on("click", function (e) {
            var filterContainer = $(this).closest(".js-inspiration-filtered-list");
            var $refineTools = $(this).closest(".js-refine-tools");
            if ($refineTools.hasClass("filter-tools--active-mobile")) {
                closeFilter($refineTools);
            }
            resetFilter($refineTools);
            useFilter(filterContainer);

            
            filterContainer = $(".js-inspiration-filtered-list");
            var $filterGroups = filterContainer.find('.filter-group');
            $.each($filterGroups, function () {
                refreshFilterSelectionLabel($(this));
            });

            if ($filterGroups.find("input:checked").length > 0) {
                $(".js-total-chosen-facet-count", filterContainer).closest(".js-chosen-facet-count-container").addClass("md-show").show();
            } else {
                $(".js-total-chosen-facet-count", filterContainer).closest(".js-chosen-facet-count-container").removeClass("md-show").hide();
            }
            
            $(".js-total-chosen-facet-count", filterContainer).text($filterGroups.find("input:checked").length)
           

            e.preventDefault();
        });

        $(".filter-tools__close-filters.js-inspirations").on("click", function (e) {
            var filterContainer = $(this).closest(".js-inspiration-filtered-list");
            var $refineTools = $(this).closest(".js-refine-tools");

            useFilter(filterContainer);
            closeFilter($refineTools);

            e.preventDefault();
        });

        $(".js-inspiration-filtered-list").on("click", ".get-more-inspirations", function () {
            var filterContainer = $(this).closest(".js-inspiration-filtered-list");
            filterContainer.data("current-page", filterContainer.data("current-page") + 1);
            useFilter(filterContainer);
        });

        $(".js-inspiration-filtered-list .js-refine-tools").on("click", ".js-filter-header", function (e) {
            $(this).closest(".filter-tools__filter-group").children(".filter-tools__filter-icon").toggleClass("filter-tools__filter-icon--collapsed");
            $(this).closest(".filter-tools__filter-group").children(".js-filter-header").toggleClass("filter-tools__facet-icon--collapsed");
            $(this).closest(".filter-tools__filter-group").children(".filter-tools__list-wrapper").toggleClass("filter-tools__list-wrapper--collapsed");
            e.stopPropagation();
        })

        Panduro.articles.setOpenFilterHandler($(".js-refine-tools"));
        $(".btn-special__sort").first().off();
        $(".btn-special__sort").first().css("display", "none");
        Panduro.articles.openAllFilterGroups($(".js-refine-tools"));

        var filterContainer = $(".js-inspiration-filtered-list");
        var $filterGroups = filterContainer.find('.filter-group');
        $.each($filterGroups, function () {
            refreshFilterSelectionLabel($(this));
        });

        if ($filterGroups.find("input:checked").length > 0) {
            $(".js-total-chosen-facet-count", filterContainer).closest(".js-chosen-facet-count-container").addClass("md-show").show();
        } else {
            $(".js-total-chosen-facet-count", filterContainer).closest(".js-chosen-facet-count-container").removeClass("md-show").hide();
        }

        $(".js-total-chosen-facet-count", filterContainer).text($filterGroups.find("input:checked").length)

        if ($(window).width() > Panduro.main.mobileMaxWidth) {
            Panduro.search.SetDesktopFilterSticky();
        }
        else {
            Panduro.search.SetMobileFilterSticky();
            Panduro.articles.closeAllFilterGroups(filterContainer);
        }
    }

    function useFilter(filterContainer) {
        var currentFilter = getCurrentFilters(true, filterContainer);
        Panduro.main.persistFilter(currentFilter);
        Panduro.main.POST("Inspiration", "GetFilteredInspirationList", { filters: currentFilter }, function (view) {
            filterContainer.find(".filtered-articlelist").first().html(view);
            Panduro.lazyLoadImages.updateImages();
            updateArticleListCountInfilter(filterContainer);
            updateFacetCount(filterContainer);
        });
    }

    function resetFilter(filterContainer) {
        filterContainer.find('input:checked').prop('checked', false); //check if we need this, .filters could be gone
        clearFilterSelections(filterContainer);
        //var label = $('.filter-tools').data('allfilters');//check if we need this, .filters could be gone
        $('.filter-tools__list-header-selection').html("");
    }

    function closeFilter($container) {
        $container.removeClass("filter-tools--active-mobile");
        $container.children(".filter-tools__inner-container").removeClass("filter-tools__inner-container--active-mobile");
        $container.find('.btn-special').removeClass('active');
        $container.find(".js-stock-clear-btns").first().removeClass("filter-tools__buttons-top--collapsed");
        $container.find(".filter-tools__top-wrapper").removeClass("filter-tools__top-wrapper--open");
        $("body").removeClass("no-scroll");
    }

    function getCurrentFilters(doNotResetPagination, $container) {
        var $filterContainer = $container !== undefined && $container.hasClass("js-inspiration-filtered-list") ? $container : $('.js-inspiration-filtered-list', $container),
            $filterGroups = $filterContainer.find('.filter-group');

        var inspirationFilters = {
            FacetValues: []
        }
        $.each($filterGroups, function () {
            var $filterGroup = $(this),
                filters = $filterGroup.find('.filter:checked');

            refreshFilterSelectionLabel($(this));
            if (filters.length <= 0)
                return;

            filters.each(function () {
                var facetValue = {};
                facetValue.Key = $(this).val();
                facetValue.Name = $(this).data('facetname');
                facetValue.Type = $filterGroup.data('facettype');

                inspirationFilters.FacetValues.push(facetValue);
            });

           
        });



        if (doNotResetPagination === true) {
            inspirationFilters.Page = $filterContainer.data('current-page');
        } else {
            //if we are adding new filters reset pagination to first page
            var firstPage = 1;
            $filterContainer.data('current-page', firstPage);
            inspirationFilters.Page = firstPage;
        }
        inspirationFilters.AmountPerPage = $filterContainer.data('amount-per-page');

        return inspirationFilters;
    }

    function clearFilterSelections($filterContainer) {
        $(".js-filter-tools-choosen-filters > div", $filterContainer).empty()
        $(".js-filter-tools-empty-filter", $filterContainer).show()
    }

    function refreshFilterSelectionLabel($filterGroup) {
        var $selectedFilters = $filterGroup.find("input:checked");
        var result = "";
        var filters = [];
        var facet = $($filterGroup.find("input")[0]).data("facetname");

        $filterGroup.closest(".filter-tools__filter-group").find(".js-chosen-facet-count").text($selectedFilters.length);
        if ($selectedFilters.length > 0) {
            $filterGroup.closest(".filter-tools__filter-group").find(".js-chosen-facet-count").closest(".js-chosen-facet-count-container").addClass("md-show").show();
        } else {
            $filterGroup.closest(".filter-tools__filter-group").find(".js-chosen-facet-count").closest(".js-chosen-facet-count-container").removeClass("md-show").hide();
        }

        $.each($selectedFilters,
            function () {
                facet = $(this).attr("data-facetname");
                filters[$(this).attr("value")] = { key: $(this).attr("value"), value: $(this).attr("data-value") }
                result += $(this).attr("data-value") ? $(this).attr("data-value") + ", " : $(this).attr("id");
            });

        if (result != "" && result.endsWith(", ")) {
            result = result.substr(0, result.length - 2);
        }
        else if (result != "") {
            result = result.substr(0, result.length - 1);
        }


        if (facet !== undefined && facet !== "") {
            var choosenFilters = $(".js-filter-tools-choosen-filters").find('*[data-facetname="' + facet + '"]');
            if (choosenFilters.length === 0) {
                choosenFilters = $("<div/>").attr("data-facetname", facet);
                $(".js-filter-tools-choosen-filters").append(choosenFilters);
            }

            choosenFilters.empty()
            Object.entries(filters).forEach(function (value, key) {
                if (filters[value[0]].value !== "" && filters[value[0]].value !== undefined) {
                    var filterButton = $("<div/>", { class: "filter-tools__choosen-filter js-filter-tools-filter" }).text(filters[value[0]].value);
                    filterButton.click(function (e) {
                        e.stopPropagation()
                        $("#" + facet + value[0]).click();
                    })
                    choosenFilters.append(filterButton);

                }

            });



            //$filterGroup.find(".filter-tools__list-header-selection").html(result);
        }
        $(".js-filter-tools-empty-filter").toggle($(".js-filter-tools-filter").length < 1)
    };

    function updateArticleListCountInfilter($filterContainer) {
        var totalVisibileArticles = $(".js-inspiration-count").data("total-amount-of-inspirations");
        $(".js-filter-tools-visible-inspiration", $filterContainer).attr("data-total-amount-of-items", totalVisibileArticles);
    }
    function updateFacetCount($filterContainer) {
        var nrOfFacets = $("input:checked.filter", $filterContainer);

        if ($filterGroup.find("input:checked").length > 0) {
            $(".js-total-chosen-facet-count", $filterContainer).closest(".js-chosen-facet-count-container").addClass("md-show").show();
        } else {
            $(".js-total-chosen-facet-count", $filterContainer).closest(".js-chosen-facet-count-container").removeClass("md-show").hide();
        }

        $(".js-total-chosen-facet-count", $filterContainer).text(nrOfFacets.length);

    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.loyaltyClubPopUp = function () {
    var widgetSelector = ".loyalty-club-pop-up";


    // js-loyalty-club-pop-up-close

    function handleClose(widget) {
        $(widget).remove();
        Panduro.state.setState({ hasSeenLoyaltyClubPopUp: true });
    }

    function initialize(widget) {
        $(".js-loyalty-club-pop-up-close", widget).click(function() {
            handleClose(widget);
        });

        if ((!Panduro.state.current.hasSeenLoyaltyClubPopUp || Panduro.state.current.seenLoyaltyClubPopUpVersion !== $(widget).data("version")) && Panduro.state.current.shouldSeeLoyaltyClubPopUp ) {
            setTimeout(function () {
                if (!$("#coiOverlay").is(":visible")) {
                    Panduro.state.setState({ seenLoyaltyClubPopUpVersion: $(widget).data("version") });
                    $(widget).removeClass("hidden-force");
                }
            }, 4000);
        } else {
            Panduro.state.setState({ shouldSeeLoyaltyClubPopUp: true });
        }

    }

    return {
        initialize: function () {
            initialize($(widgetSelector));
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

Panduro.module.informationBar = function () {

    var widgetSelector = ".js-information-bar";

    function initialize(widget) {
        var id = $(widget).data("id");
        var version = $(widget).data("version");

        var currentList = Panduro.state.current.seenInfoMessages;
        var found = false;

        for (var i = 0; i < currentList.length; i++) {
            if (currentList[i].id === id && currentList[i].version === version) {
                found = true;
            }
        }

        if (!found) {
            $(widget).show();
        }


        $(".js-information-bar-close", widget).click(function (e) {
            e.preventDefault;
            e.stopPropagation;
            $(widget).fadeOut();
            var currentList = Panduro.state.current.seenInfoMessages;
            var id = $(this).closest(widgetSelector).data("id");
            var version = $(this).closest(widgetSelector).data("version");
            var infoBarState = { id: id, version: version };
            var listLength = currentList.length;

            if (id !== null) {
                if (currentList.length < 1) {
                    currentList.push(infoBarState);
                    Panduro.state.setState({ seenInfoMessages: currentList });
                }
                else {
                    for (var i = 0; i < listLength; i++) {
                        if (currentList[i].id === id) {
                            currentList.splice(i, 1);
                            currentList.push(infoBarState);
                            Panduro.state.setState({ seenInfoMessages: currentList });
                        }
                        else {
                            currentList.push(infoBarState);
                            Panduro.state.setState({ seenInfoMessages: currentList });
                        }
                    }
                }

            }
                
        });
    }

    

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.staffDiscount = function () {
    var widgetSelector = ".staff-discount";

    function initialize(widget) {

        var $form = $('#__StaffDiscountForm');
        var button = $form.find('.js-activate-staff-discount');

        function submit() {
            var formData = {};
            $form.find('.js-activate-staff-discount-error').hide();
            formData.Password = Panduro.contact.getTextValue($form.find('#Password'));
            formData.StaffNumber = Panduro.contact.getTextValue($form.find('#StaffNumber'));

            if ($form.find('.error').length === 0) {
                Panduro.ui.toggleLoading(button);
                $form.find('.error-message').hide();
                Panduro.main.POST("StaffDiscount", "ActivateStaffDiscount", formData,
                    function (result) {
                        if (result.success) {
                            $(".js-locate-order-form", widget).hide();
                            $(".js-locate-order-success", widget).show();
                            Panduro.ui.toggleLoading(button);
                        } else {
                            $form.find('.js-activate-staff-discount-error').text(result.message).show();
                            Panduro.ui.toggleLoading(button);
                        }
                    },
                    function (error) {
                        $form.find('.error-message').show();
                        Panduro.ui.toggleLoading(button);
                    }
                );
            }
        }
        $form.on('submit', function (e) {
            e.preventDefault();
            submit();
        });

        button.on('click', function (e) {
            e.preventDefault();
            submit();
        });

    }

    return {
        initialize: function () {
            initialize($(widgetSelector));
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.checkGiftCardBalance = function () {
    var widgetSelector = ".giftcard-info";

    function initialize(widget) {
        var $form = $('#__CheckGiftCardBalanceForm');
        var button = $form.find('.js-giftcard-balance');


        function validateFieldOnBlur(e) {
            $field = $(e.target);

            if ($field.attr("type") == "text")
                Panduro.contact.getTextValueAndValidateLength($field, 16);
            else if ($field.attr("type") == "password")
                Panduro.contact.getTextValueAndValidateLength($field, 5);
           else
                Panduro.contact.getTextValue($field);
        }

        $($form).on("blur", "input", function (e) {
            validateFieldOnBlur(e);
        });

        button.on('click', function () {
            var formData = {};
            $form.find('.js-giftcard-balance-not-found').hide();

            formData.GiftCardNumber = Panduro.contact.getTextValueAndValidateLength($form.find('#GiftCardNumber'), 16);
            formData.GiftCardPin = Panduro.contact.getTextValueAndValidateLength($form.find('#GiftCardPin'), 5);

            if ($form.find('.error').length === 0) {
                Panduro.ui.toggleLoading(button);
                $form.find('.error-message').hide();
                Panduro.main.POST("GiftCard", "CheckBalance", formData,
                    function (result) {
                        if (result.Status) {
                            $form.find('#GiftCardNumber').closest('.field').addClass('ok');
                            $form.find('#GiftCardPin').closest('.field').addClass('ok');
                            $form.find('.js-show-balance').text(result.Balance).show();
                            $form.find('.js-show-date').text(result.Date).show();
                            Panduro.ui.toggleLoading(button);
                            Panduro.ui.refreshAutonumeric($(".js-show-balance"));
                        } else {
                            if (error == 1) {
                                $form.find('.js-giftcard-balance-not-found').text(result.message).show();
                            } else {
                                $form.find('.js-checkout-gift-card-service-unavailable').text(result.message).show();
                            }
                            Panduro.ui.toggleLoading(button);

                        }
                    },
                    function (error) {
                        $form.find('.js-giftcard-balance-not-found').text(result.message).show();
                        Panduro.ui.toggleLoading(button);
                    }
                );
            }
            
        });

    }

    return {
        initialize: function () {
            initialize($(widgetSelector));
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleVariants = function () {
    var widgetSelector = ".select-variant";

    function initialize(widget) {
        initiateSelectArticleVariants();     
    };

    function initiateSelectArticleVariants () { //todo rensa

        var container = $('.select-variant');
        $('.product-list-variant').selectric();
        var $selectedValue = $('.product-list-variant').find('strong');
        $selectedValue.text($('product-list-variant').val());

        $(".product-list-variant").selectric({
            optionsItemBuilder: function (itemData, element, index) {

                var itemTitle = itemData.element.data("titel");
                var itemImage = itemData.element.data("image");
                var itemOptimizedImage = itemData.element.data("optimizedImage");
                var itemOriginalPrice = itemData.element.data("originalprice");
                var itemCurrentPrice = itemData.element.data("currentprice");
                var itemStockLevel = itemData.element.data("stocklevel");

                if (itemCurrentPrice !== itemOriginalPrice) {
                    return '<div class="product-list-variant__item"><picture class="lazy"><source srcset="' + itemOptimizedImage + '" type="image/webp"><img srcset="' + itemImage + '" data-error="https://static.panduro.com/Static/images/placeholders/image-missing.png" alt="' + itemTitle + '"></picture> <span class="item-title"> ' + itemTitle + '</span><div class="item-price"><span class="price price--brandcolor autonumeric">' + itemCurrentPrice + '</span><span class="price price--redacted autonumeric">' + itemOriginalPrice + '</span></div><div class="item-stock item-stock--' + getAvailabilityClass(itemStockLevel) + '"></div></div>';
                }
                else {
                    return '<div class="product-list-variant__item"><picture class="lazy"><source srcset="' + itemOptimizedImage + '" type="image/webp"><img srcset="' + itemImage + '" data-error="https://static.panduro.com/Static/images/placeholders/image-missing.png" alt="' + itemTitle + '"></picture> <span class="item-title"> ' + itemTitle + '</span><div class="item-price"><span class="price autonumeric">' + itemOriginalPrice + '</span></div> <div class="item-stock item-stock--' + getAvailabilityClass(itemStockLevel) + '"></div></div>';

                }

            },
        });

        $(".product-list-variant", container).off().on("change", function () {
            $(".product-list-variant", container).selectric("refresh");
            if ($(this).val() != null) {
                $selectedValue = $(this).val();
                window.location = $selectedValue;
            };

        });

        $('.product-list-variant').prop('selectedIndex', 0).selectric('refresh');

        function getAvailabilityClass(status) {
            if (status === "InStoreOnly") {
                return "no-info"
            }
            else if (status === "OutOfStock") {
                return "out-of-stock";
            }
            else if (status === "LowStock") {
                return "few-left-in-stock";
            }
            else if (status === "InStock") {
                return "in-stock";
            }
            else {
                return "no-info";
            }
        }
        Panduro.ui.refreshAutonumeric($(".price"));
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        }
    }
}();;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.inspirationSection = function () {
    var widgetSelector = ".article-inspiration-section";
    var compCardSelector = ".js-inspiration-section-open-zoom";


    var zoomSelector = ".js-article-inspiration-section-zoom";
    var zoomCloseSelector = ".js-article-inspiration-section-zoom-close";
    var zoomThumbnailsSelector = ".js-article-inspiration-section-zoom-thumbs";
    var zoomImagesSelector = ".js-article-inspiration-section-zoom-images";

    function initialize(widget) {

        $(".js-toggle-inspiration-show").click(function () {
            $(".article-inspirations").toggleClass("article-inspirations--closed");
            $(".js-toggle-show-inspirations").slideToggle();
        });

        $(".js-toggle-video-show").click(function () {
            $(".article-videos").toggleClass("article-videos--closed");
            $(".js-toggle-show-videos").slideToggle();
            
        });

        $(compCardSelector).on('click', function (q, w) {
            var $widget = $(widget);
            $(zoomSelector, $widget).removeClass("closed");
            $("body").addClass("no-scroll");
            $(zoomCloseSelector, $widget).off().click(function () {
                $(zoomSelector, $widget).addClass("closed");
                $("body").removeClass("no-scroll");

            })

            var $thumbnails = $(zoomThumbnailsSelector, $widget)[0];
            var zoomThumbnails = new Splide($thumbnails, {
                type: 'slide',
                start: $(this).data("index"),
                rewind: true,
                fixedWidth: 90,
                fixedHeight: 90,
                isNavigation: true,
                gap: 10,
                pagination: false,
                arrows: false,
                focus: 'center',

                dragMinThreshold: {
                    mouse: 4,
                    touch: 10,
                }

            });

            var $images = $(zoomImagesSelector, $widget)[0];
            var zoomMain = new Splide($images, {
                type: 'loop',
                start: $(this).data("index"),

                pagination: false,
                arrows: false,
                cover: true,
                arrows: true,
                perMove: 1,
                arrowPath: 'M15 9v22l14-11z',

                breakpoints: {
                    768: { arrows: false },
                },

            });

            zoomMain.on('moved', function () {
                updatePagination();
            });

            zoomMain.on('mounted', function () {
                updatePagination();
            });

            function updatePagination() {
                $(".js-image-index").text(`${zoomMain.index + 1}/${zoomMain.length}`);
            }

            zoomMain.sync(zoomThumbnails);
            zoomMain.mount();
            zoomThumbnails.mount();

        });
    }

    return {
        initialize: function () {
            initialize($(widgetSelector));
        },
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.childrenLinkBlock = function () {

    function initialize(widget) {
        var $widget = $(widget);
    }

    return {
        initialize: function () {
            //$(widgetSelector).each(function() { initialize(this) });
        }
    }
}();

;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.articleListCarousel = function () {
    var widgetSelector = ".inspirational-article-carousel ";

    function initialize(widget) {
        var $widget = $(widget);

        initSwiper($widget);

    }

    function initSwiper($widget) {

        var splide = new Splide('.splide', {
            type: 'loop',
            autoplay: true,
            pagination: true,
            breakpoints: {
                768: {
                    padding: '1.5rem',
                },
            },
        });

        splide.mount();
    }

    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) })
        }
    }
}();



;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.inactivityStatus = function () {
    var widgetSelector = ".show-inactivity";

    function initialize(widget) {
        if (Panduro.state.current.isLoggedIn) {
            activityWatcher();
        }
    }

    function activityWatcher() {
        var startTime = Date.now();
        var maxInactivity = (1205);
        var checked = false;
        setInterval(function () {
            var elapsed = (Date.now() - startTime) / 1000;
            if (elapsed > maxInactivity && checked === false) {
                Panduro.main.POST("MyPages",
                    "check",
                    null,
                    function (payload) {
                        if (payload === false) {
                            checked = true;
                            $(".js-show-inactivity").addClass("show-inactivity--open");
                        } else {
                            $(".js-show-inactivity").removeClass("show-inactivity--open");
                            startTime = Date.now();
                        }
                    });
            }
        }, 1000);

        $(".js-slidin-close").click(function() {
            window.location.reload();
        })
    }

    return {
        initialize: function () {
            initialize(this)
            $(widgetSelector).each(function () { initialize(this) });
        }
    }
}();
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};
Panduro.module.receiptBecomeMember = function () {
    var widgetSelector = ".receipt-become-member";

    function initialize(widget) {

        if ($(widgetSelector).length) {
            $(".become-member-container").removeClass("hidden");

            $(".become-member-btn").off().click(function () {
                becomeMember();
            })
            $(".js-member-badge-close-btn").off().click(function () {
                $(".receipt-become-member").addClass("hidden");
            })
        }
    }

    function becomeMember() {
        Panduro.main.POST("receipt", "AddMemberFromReceiptPage", {},
            function (result) {
                if (result === true) {
                    $(".become-member-container").addClass("hidden");
                    $(".member-success-container").removeClass("hidden");
                } else {
                    $(".become-member-error").removeClass("hidden");
                }
            },
            function (error) {
                $(".become-member-error").removeClass("hidden");
                console.log(error);
            }
        );
    }
    return {
        initialize: function () {
            $(widgetSelector).each(function () { initialize(this) });
        }
    }
}();
;
var Panduro = Panduro || {}
Panduro.module = Panduro.module || {}

/**
 * This module have two purposes:
 *  1. Execute search requests to Elevate
 *  2. Handle search responses and building result and filter views
 * 
 * VIEWS
 * This module have four main buttons that toggles between four
 * result views. The first on is an article result view and the three
 * others are content result views. The user can toggle between the views
 * by pressing one of the four buttons on top of the result section
 * 
 * The four views are:
 *  Articles
 *  Inspirations
 *  Pages (Magazine for creatima)
 *  Stores
 * 
 * There is also filter views where the customer can apply filter settings, such
 * as filtering results by color. The results are never filtered - instead the
 * module resets and makes new requets to Elevate with the filter passed as
 * query params.
 * 
 * FUNCTION FLOW
 * The flow is as follows
 *  A. Search request -> Search Response -> Handle Response -> Build UI
 *  B. Filter changed -> Reset -> Search Request -> Search Response -> Handle Response -> Build UI
 * 
 * IMPOARTANT NOTE - SECONDARY ARTICLE RESULT LIST
 * We need to display secondary results in the case that the secondary
 * result contains hits - but only when we have shown all primary search results.
 * This is because the primary results poor in quality at times
 * 
 * Elevate API does not feature pagination or filter for the secondary list in the search
 * request. Because of this, I've implemented a _secondaryListMode. This is so that the
 * filter and pagination works - but we need to request the secondary list as a primary list.
 * The _secondaryListMode flag is used for this.
 * 
 * We start paging the secondary list if the pagination check in buildArticleView()
 * returns true. This enables the _secondaryListMode and triggers an immediate search request 
 * for the secondary list 'as a primary list'.
 * 
 * The result is then handled normally, but pagination takes _secondaryListMode <-------
 * */
Panduro.module.elevateSearchResultList = function () {
    const _widgetSelector = ".js-elevate-search-result-list"
    var _widgets = $(_widgetSelector)
    var _mustasheTemplatesResult = {}
    var _mustacheTemplateSummery
    var _mustacheTemplateFacets
    var _mustacheTemplateEmptyResult
    var _mustacheTemplateAutocorrectQuery

    var _currentSearchType
    var _searchState = {}
    var _searchQuery = ""
    var _currentFilter = {}
    var _currentSorting = ""
    var _contentFilters = {}
    var _defaultPageReference

    var _isNewSearch = true
    var _totalHitsArticle = 0;
    var _totalHitsArticlePrimary = 0;
    var _totalHitsArticleSecondary = 0;
    var _initialSearch = true;
    var _secondaryListMode = false;

    var _debug = false

    /** JS dont have pointers, but this will do. */
    const SEARCHTYPE = {
        get Article() { return Panduro.enums.SEARCH_TYPES.ARTICLE },
        get Inspiration() { return Panduro.enums.SEARCH_TYPES.INSPIRATION },
        get Categoty() { return Panduro.enums.SEARCH_TYPES.CATEGORY },
        get Editorial() { return Panduro.enums.SEARCH_TYPES.EDITORIAL },
        get Store() { return Panduro.enums.SEARCH_TYPES.STORE }
    }


    /** Initialize the search widget */
    function initialize() {

        // Do nothing if no widget was found
        if (_widgets.length <= 0)
            return;

        // There should realistically only ever be one
        _defaultPageReference = _widgets.data('default-page-reference')

        buildSearchStateList()
        buildContentFilterList()
        initializeTemplates()
        initializeSearchType()
        initializeUiBindings(_widgetSelector)
        initializeEvents()

        // Just in case...
        resetModule()
    }

    /**
     * Initialize events
     */
    function initializeEvents() {
        // Since we cannot mess with user history and PO wants to be able
        // to "go back" to a previous search result we have to do this
        // without reloading the page, or trigger a navigation event
        // since this would be veeeeeery slow
        $(window).on('popstate', function (event) {
            const urlSearchType = Panduro.main.getQueryParameter("searchType")
            if (urlSearchType != undefined && urlSearchType != "") {
                setSearchType(urlSearchType)
            } else {
                setSearchType(SEARCHTYPE.Article)
            }
        });
    }

    /**
     * Build search key value list
     */
    function buildSearchStateList() {
        _searchState[SEARCHTYPE.Article] = {
            page: 0,
            secondaryPage: 0,
            itemsPerPage: 48,
            waiting: false,
            primaryShown: 0,
            secondaryShown: 0
        }
        _searchState[SEARCHTYPE.Inspiration] = {
            page: 0,
            itemsPerPage: 20,
            waiting: false,
        }
        _searchState[SEARCHTYPE.Editorial] = {
            page: 0,
            itemsPerPage: 20,
            waiting: false,
        }
        _searchState[SEARCHTYPE.Store] = {
            page: 0,
            itemsPerPage: 20,
            waiting: false,
        }
    }

    /**
     * Build content list key value list
     */
    function buildContentFilterList() {
        _contentFilters[SEARCHTYPE.Inspiration] = {
            contentFilter: {
                type: SEARCHTYPE.Inspiration
            },
            id: SEARCHTYPE.Inspiration,
            limit: 5
        }
        _contentFilters[SEARCHTYPE.Editorial] = {
            contentFilter: {
                type: SEARCHTYPE.Editorial
            },
            id: SEARCHTYPE.Editorial,
            limit: 5
        }
        _contentFilters[SEARCHTYPE.Store] = {
            contentFilter: {
                type: SEARCHTYPE.Store
            },
            id: SEARCHTYPE.Store,
            limit: 5
        }
    }

    /**
     * If no search type is provided, default to article
     * @returns
     */
    function initializeSearchType() {
        const urlSearchType = Panduro.main.getQueryParameter("searchType")
        if (urlSearchType != undefined && urlSearchType != "")
            return;

        _currentSearchType = SEARCHTYPE.Article;
        pushHistory(false) // only update url, no history
    }


    /**
     * Sets search states to their initial values and resets the filters
     * */
    function resetModule() {
        _searchState[SEARCHTYPE.Article].page = 0
        _searchState[SEARCHTYPE.Editorial].page = 0
        _searchState[SEARCHTYPE.Inspiration].page = 0
        _searchState[SEARCHTYPE.Store].page = 0
        _isNewSearch = true;

        const urlSearchType = Panduro.main.getQueryParameter("searchType")
        if (urlSearchType != undefined && urlSearchType != "") {
            setSearchType(urlSearchType)
        } else {
            setSearchType(SEARCHTYPE.Article)
        }
        resetArticleFilter()
        resetArticleFilterSorting()
    }


    /** 
     *  Initialize templates 
     */
    function initializeTemplates() {

        _mustasheTemplatesResult[SEARCHTYPE.Article] = $('#elevate-search-result-direct-template').html()
        Mustache.parse(_mustasheTemplatesResult[SEARCHTYPE.Article])

        _mustasheTemplatesResult[SEARCHTYPE.Inspiration] = $('#elevate-search-result-inspiration-template').html()
        Mustache.parse(_mustasheTemplatesResult[SEARCHTYPE.Inspiration])

        _mustasheTemplatesResult[SEARCHTYPE.Editorial] = $('#elevate-search-result-editorial-template').html()
        Mustache.parse(_mustasheTemplatesResult[SEARCHTYPE.Editorial])

        _mustasheTemplatesResult[SEARCHTYPE.Store] = $('#elevate-search-result-store-template').html()
        Mustache.parse(_mustasheTemplatesResult[SEARCHTYPE.Store])

        _mustacheTemplateFacets = $('#elevate-search-result-facet-template').html()
        Mustache.parse(_mustacheTemplateFacets)

        _mustacheTemplateSummery = $('#elevate-result-summery-template').html()
        Mustache.parse(_mustacheTemplateSummery)

        _mustacheTemplateEmptyResult = $('#search-result-empty-template').html()
        Mustache.parse(_mustacheTemplateEmptyResult)

        _mustacheTemplateAutocorrectQuery = $('#search-result-spelling-template').html()
        Mustache.parse(_mustacheTemplateAutocorrectQuery)
    }


    /**
     * Bind events to interactive elements
     * @param {any} widget
     */
    function initializeUiBindings(widget) {
        $(".js-elevate-toggle-search-type").click(function () { executeSearchTypeToggle(this) })
    }


    /** The execute Search Toggle */
    function executeSearchTypeToggle(toggleButton) {
        var buttonSearchType = $(toggleButton).data("type")
        var requestedType = Panduro.enums.SEARCH_TYPES[buttonSearchType];

        // Do nothing if we already are on the correct page
        if (requestedType === _currentSearchType)
            return;

        _currentSearchType = requestedType
        updateSearchType();


        pushHistory(true)
        //setSearchType(_currentSearchType)
    }

    /**
    * Executes a search articles and items
    * This is executed when a customer lands on the page
    * or a new search (no pagination)
    * 
    * @param {any} query Incoming query form calling function
    * @param {any} origin Origin override, defaults to ORGANIC
    */
    function executeNewSearch(query, origin) {

        if (query === "" || query == undefined)
            return

        if (_searchQuery === query)
            return

        // Set current search query, reset settings and hide the quick search
        _searchQuery = query
        resetModule()
        $('.js-elevate-search-quick').hide();

        // Get origin from URL
        if (origin == null || origin == "") {
            var urlOrigin = Panduro.main.getParameterByName('origin');
            if (urlOrigin == null || urlOrigin == "")
                origin = Panduro.enums.SEARCH_ORIGINS.ORGANIC
            else
                origin = urlOrigin
        }

        executeArticleSearch(query, origin);
        executeContentSearch(query, SEARCHTYPE.Inspiration, origin);
        executeContentSearch(query, SEARCHTYPE.Editorial, origin);
        executeContentSearch(query, SEARCHTYPE.Store, origin);
    }

    /**
     * Executes an Article Search Request
     * @param {any} query
     * @param {any} origin
     */
    function executeArticleSearch(query, origin) {

        // Request
        var req = {
            searchType: SEARCHTYPE.Article,
            queryString: query,
            sort: _currentSorting,
            f: [],
            payload: {
                "contentLists": [ // Skip this! We need individual results per search context
                ],
                "primaryList": {
                    "include": true,
                    "productRules": _currentFilter.inStockOnly ? "rule incl stock_number [1,infinity]" : ""
                }
            },
            page: _searchState[SEARCHTYPE.Article].page,
            itemsPerPage: _searchState[SEARCHTYPE.Article].itemsPerPage,
            origin: origin,
        }

        // Request - Secondary, special case
        if (_secondaryListMode) {
            req.page = _searchState[SEARCHTYPE.Article].secondaryPage
            req.secondaryOnly = true
        }

        // Facet
        $.each(_currentFilter.facets, function (index, facetGroup) {
            if (facetGroup.length == 0)
                return;

            var keyName = Panduro.enums.SEARCH_FACETS[index].facetName
            req.f[keyName] = facetGroup.map((facet) => facet.value).join("|")
        })

        // Execute search
        _searchState[SEARCHTYPE.Article].waiting = true;
        Panduro.voyadoElevate.search(req, function (response) {
            handleArticleSearchResult(response, SEARCHTYPE.Article)
        })
    }

    /**
     * Handles the response from an Article Search
     * @param {any} response
     * @param {any} searchType
     */
    function handleArticleSearchResult(response, searchType) {
        if (_initialSearch) {
            _totalHitsArticlePrimary = response.primaryList.totalHits
            _totalHitsArticleSecondary = response.secondaryList.totalHits
            _totalHitsArticle = _totalHitsArticlePrimary + _totalHitsArticleSecondary
            _initialSearch = false

            _clog("Article Search Result", {
                hits: _totalHitsArticle,
                prmary: _totalHitsArticlePrimary,
                secondary: _totalHitsArticleSecondary,
            })
        }

        // If no hits, go to backup recommendations instead
        if (_totalHitsArticle === 0) {
            executePageRecommendationSearch()
            return;
        }

        if (_secondaryListMode) {
            _totalHitsArticleSecondary = response.primaryList.totalHits
            _totalHitsArticle = _totalHitsArticlePrimary + _totalHitsArticleSecondary
        }

        updateResultView(searchType, response)
        handleSearchResult(response)
    }

    /**
     * Executes a Page Recommendation Search
     */
    function executePageRecommendationSearch() {
        var searchType = SEARCHTYPE.Article;
        var req = {
            queryString: _defaultPageReference,
            limit: 6
        }

        // Execute search
        Panduro.voyadoElevate.pageRecommendation(req, function (response) {
            handlePageRecommendationResult(response, searchType)
        })
    }

    /**
     * Handles the response from a Recommendation Search Request
     * @param {any} response
     * @param {any} searchType
     */
    function handlePageRecommendationResult(response, searchType) {
        var articleResponse = {
            primaryList: {
                isRecommendation: true, // Special case ¯\_(ツ)_/¯
                productGroups: response.recommendationLists[0].productGroups,
                totalHits: 0
            }
        }

        _searchState[searchType].waiting = false;
        updateUiContextButtons(articleResponse, searchType)
        updateUiContext()
        buildRecommendationView(articleResponse, searchType)
        handleSearchResult(articleResponse)
    }


    /**
     * Execute a content search
     * @param {any} query
     * @param {any} forceSearch
     * @param {any} origin
     */
    function executeContentSearch(query, contentType, origin) {
        var req = {
            searchType: contentType,
            queryString: query + ' ',
            sort: Panduro.enums.SORT_ORDERS.RELEVANCE,
            f: [],
            page: _searchState[contentType].page,
            payload: {
                "primaryList": _contentFilters[contentType]
            },
            itemsPerPage: _searchState[contentType].itemsPerPage,
            origin: origin
        }

        _searchState[contentType].waiting = true;
        Panduro.voyadoElevate.search(req, function (response) {
            updateResultView(contentType, response)
            handleSearchResult(response)
        })
    }


    /**
     * Update the ui
     * @param {any} searchType
     * @param {any} response
     */
    function updateResultView(searchType, response) {
        _searchState[searchType].waiting = false;
        updateUiContextButtons(response, searchType)
        updateUiContext()

        switch (searchType) {
            // Articles
            case SEARCHTYPE.Article:
                buildArticleView(response, searchType)
                break
            // Content
            default:
                buildContentView(response, searchType)
                break
        }
    }


    /**
     * Handle search result
     * @param {any} response
     * @param {any} req
     */
    function handleSearchResult(response) {
        Panduro.lazyLoadImages.updateImages()

        var noContentResults = true
        $.each(response.contentLists, function (i, list) {
            if (list.totalHits > 0)
                noContentResults = false
        })
        if (response.primaryList.length < 1 && response.secondaryList.length < 1 && !noContentResults) {
            $(".js-search-result", _widgetSelector).hide()
        } else {
            $(".js-search-result", _widgetSelector).show()
        }

        $('body .autonumeric').each(function () {
            Panduro.ui.formatNumber($(this), Panduro.ui.numericOptions)
        })

    }


    /**
     * Build the article view
     * @param {any} productList
     * @param {any} searchType
     */
    function buildArticleView(response, searchType) {
        // No longer used since we need pagination section only since implementing secondary list mode
        // The artile section is still used for recommendation results
        //var $articleViewList = $(".js-search-type.search-type-" + searchType + " .search-results-list", widgetSelector)
        var $articleViewHeader = $('.js-search-type.search-type-' + searchType + " .js-search-result-info", _widgetSelector)
        var $articleViewPagination = $(".js-search-type.search-type-" + searchType + " .search-results-pagination", _widgetSelector)

        // If autocorrect, than inform the user that a different search term was used
        if (response.autoCorrect) {
            var autocorrectQuery = response.autoCorrect.q;
            var autocorrectResult = Mustache.render(_mustacheTemplateAutocorrectQuery,
                {
                    oldQuery: _searchQuery,
                    newQuery: autocorrectQuery
                })
            $articleViewHeader.html(autocorrectResult)
            $articleViewHeader.css('display', 'block')
            $('.js-search-query-header', '.search-details-header').text("\"" + autocorrectQuery + "\"")
        } else {
            $articleViewHeader.hide()
            $('.js-search-query-header', '.search-details-header').text("\"" + _searchQuery + "\"")
        }

        // Iterate through articles in result
        var count = 0
        $(response.primaryList.productGroups).each(function (index, productGroup) {
            count += productGroup.products.length

            // Check if product is new and set isNew attribute
            var badges = productGroup.products[0].badges
            if (badges == undefined || badges.primary == undefined)
                return

            for (let i = 0; i < badges.primary.length; i++) {
                if (badges.primary[i].theme === 'NEW') {
                    productGroup.products[0].attributes.isNews = true
                    break
                }
            }
        })

        var template = _mustasheTemplatesResult[SEARCHTYPE.Article]
        var rendered = Mustache.render(template, response.primaryList);
        var state = _searchState[SEARCHTYPE.Article]

        // Clean space if this is first search
        if (state.page == 0 && !_secondaryListMode) {
            $articleViewPagination.html('')
        }

        // Append results
        $articleViewPagination.append($(rendered).hide().fadeIn(500))

        // No longer used -> we use pagination section all the time for article results
        // This is so we can attach secondary list results easily
        // Keeping this just in case
        //if (state.page > 0 || _searchSecondary) {
        //    $articleViewPagination.append($(rendered).hide().fadeIn(500))
        //} else {
        //    $articleViewPagination.html('')
        //    $articleViewList.html($(rendered).hide().fadeIn(500))
        //}

        buildArticleListPagination(count)
        buildArticleListFilter(response.primaryList.facets, _totalHitsArticle)

        // Do we need to start requesting results from secondary list?
        if (_secondaryListMode)
            return

        var productsShown = state.page * state.itemsPerPage + count;
        if (productsShown != _totalHitsArticlePrimary)
            return

        if (_totalHitsArticleSecondary == 0)
            return

        _secondaryListMode = true
        _clog("Sencondary Mode Initialized", _secondaryListMode)
        executeArticleSearch(_searchQuery, null)
    }

    /**
     * Build Article List pagination
     * @param {any} count
     */
    function buildArticleListPagination(count) {
        var $paginationShowMore = $('.js-search-show-more', '.search-type-' + SEARCHTYPE.Article)
        var $paginationCount    = $('.search-result-pagination-count', '.search-type-' + SEARCHTYPE.Article)
        var $paginationButton   = $('.search-results-pagination-button', '.search-type-' + SEARCHTYPE.Article)

        var productsShown = 0;
        if (_secondaryListMode) {
            _searchState[SEARCHTYPE.Article].secondaryShown += count
        } else {
            _searchState[SEARCHTYPE.Article].primaryShown += count
        }

        productsShown = _searchState[SEARCHTYPE.Article].primaryShown + _searchState[SEARCHTYPE.Article].secondaryShown
        var searchSummery = Mustache.render(_mustacheTemplateSummery,
            {
                count: productsShown,
                total: _totalHitsArticle
            })

        $paginationCount.html(searchSummery)
        $paginationButton.css('display', 'block')

        _clog("Pagination", {
            hits: _totalHitsArticle,
            primaryHits: _totalHitsArticlePrimary,
            secondaryHits: _totalHitsArticleSecondary,
            shown: productsShown,
            count: count
        })

        // Hide 'show more' button when we reach the end of the pagination
        if (productsShown >= _totalHitsArticle) {
            $paginationShowMore.css('display', 'none')
            return
        }

        // Show 'show more' button
        $paginationShowMore.css('display', 'block')
        $paginationShowMore.off().click(function (e) {
            if (_secondaryListMode) {
                _searchState[SEARCHTYPE.Article].secondaryPage = _searchState[SEARCHTYPE.Article].secondaryPage + 1
            } else {
                _searchState[SEARCHTYPE.Article].page = _searchState[SEARCHTYPE.Article].page + 1
            }

            executeArticleSearch(_searchQuery, null)
            e.preventDefault()
        })
    }

    /**
     * Build article filter
     * @param {any} facets
     */
    function buildArticleListFilter(facets, totalHits) {

        // Iterate all facets and set value and id
        $(facets).each(function (ia, facet) {
            $(facet.values).each(function (ib, item) {
                item.value = item.id
                item.id = item.id.replace(/[^a-zA-Z0-9]/g, '');
            })
        })

        $(facets).each(function (index, facet) {
            buildFacetView(facet)
        })

        // Quick fix
        var $whiteColorSpecialCase = $('#COLOR_ID_WHITE')
        if ($whiteColorSpecialCase) {
            $whiteColorSpecialCase.css("border-style", "solid")
            $whiteColorSpecialCase.css("border-width", "1.5px")
        }

        // Bind ui events
        $('.filter-tools__facet input:checkbox, .filter-tools__facet input:radio').off().change(function () {
            var filters = $('.filter-tools__filter-group').find('input:checked');
            if (filters.length === 0) {
                $(".js-total-chosen-facet-count").html("")
            } else {
                $(".js-total-chosen-facet-count").html("(" + filters.length + ")")
            }

            executeFilteredSearch()
        })

        $('.js-refine-btns select').off().change(function () {
            executeFilteredSearch()
        })


        $(".js-elevate-search-show-in-stock-only").off().click(function (e) {
            var $switchElement = $(this);
            if (!$switchElement.is(":visible")) {
                return;
            }

            $(".js-elevate-search-show-in-stock-only").prop('checked', e.target.checked)
            _currentFilter.inStockOnly = e.target.checked
            executeFilteredSearch()
            e.preventDefault()
        })

        $(".js-refine-tools-clear-filters").off().click(function (e) {
            resetArticleFilter();
            executeFilteredSearch();
        })

        $(".js-filter-tools-visible-articles").attr("data-total-amount-of-items", totalHits);

        // Set filter
        $(".js-elevate-search-show-in-stock-only").prop('checked', _currentFilter.inStockOnly)

        $('.filter-tools__close-filters.js-search-filter-elevate').off('click.search').on('click.search', function (n) {
            Panduro.search.hideFilter($container);
            n.preventDefault()
        })

        // Make filter options visible / hidden
        $(".js-refine-tools").off().on("click", ".js-filter-header", function (e) {
            var $element = $(this)
            $element.closest(".filter-tools__filter-group").children(".filter-tools__facet-icon").toggleClass("filter-tools__facet-icon--collapsed");
            $element.closest(".filter-tools__filter-group").children(".filter-tools__list-wrapper").toggleClass("filter-tools__list-wrapper--collapsed");

            e.stopPropagation();
        })
    }

    /**
     * Facets
     * @param {any} key
     * @param {any} facet
     */
    function buildFacetView(facet) {

        // Get key of the facet
        var key = ""
        switch (facet.id) {
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_BRAND.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_BRAND.key
                break
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_COLOR.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_COLOR.key
                break
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_CATEGORY.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_CATEGORY.key
                break
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_SERIES.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_SERIES.key
                break
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_ACTIVITY.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_ACTIVITY.key
                break
            case Panduro.enums.SEARCH_FACETS.ASSORTMENT_EVENT.facetName:
                key = Panduro.enums.SEARCH_FACETS.ASSORTMENT_EVENT.key
                break
            default:
                return
        }

        var $filterGroup = $('.filter-group.' + key)
        var $facets = $('.js-found-facets', "." + key)
        var $facetsShowMore = $(".js-show-more-search-facets", "." + key)

        // Update UI
        if (facet == undefined) {
            $filterGroup.html("")
            $facets.text("0")
            return
        }

        var filters = Mustache.render(_mustacheTemplateFacets, facet)
        $filterGroup.html(filters)
        if ($(window).width() > Panduro.main.tabletMaxWidth) {
            $facets.text(facet.values.length)
        } else {
            var $closest = $facets.closest(".js-chosen-facet-count-container")
            facet != undefined && facet.values.length > 0 ? $closest.show() : $closest.hide()
            $facets.text(facet.values.length)
        }
        facet.values.length > 5 ? $facetsShowMore.show() : $facetsShowMore.hide()
    }

    /**
     * Build content view
     * @param {any} response
     * @param {any} searchType
     */
    function buildContentView(response, searchType) {
        var contentViewHeader = $('.js-search-type.search-type-' + searchType + " .js-search-result-info", _widgetSelector)
        var rendered = Mustache.render(_mustasheTemplatesResult[searchType], response.primaryList)
        var state = _searchState[searchType]

        // Render header content if no hits
        if (response.primaryList.totalHits === 0) {
            var emptyResult = Mustache.render(_mustacheTemplateEmptyResult, { query: _searchQuery })
            contentViewHeader.html(emptyResult)
            contentViewHeader.css('display', 'block')
            return;
        } else if (response.autoCorrect) {
            var autocorrectQuery = response.autoCorrect.q;
            var autocorrectResult = Mustache.render(_mustacheTemplateAutocorrectQuery, { oldQuery: _searchQuery, newQuery: autocorrectQuery })
            contentViewHeader.html(autocorrectResult)
            contentViewHeader.css('display', 'block')
        } else {
            contentViewHeader.hide()
        }

        // Render content
        if (state.page > 0) {
            $(".js-search-type.search-type-" + searchType + " .search-results-pagination", _widgetSelector).append($(rendered).hide().fadeIn(500))
        } else {
            $(".js-search-type.search-type-" + searchType + " .search-results-pagination", _widgetSelector).html('')
            $(".js-search-type.search-type-" + searchType + " .search-results-list", _widgetSelector).html($(rendered).hide().fadeIn(500))
        }

        buildContentPagination(state, searchType, response.primaryList.items.length, response.primaryList.totalHits)
    }


    /**
     * Build pagination for content items
     * @param {any} state
     * @param {any} searchType
     * @param {any} count
     * @param {any} totalHits
     */
    function buildContentPagination(state, searchType, count, totalHits) {

        var searchSummery = Mustache.render(_mustacheTemplateSummery, { count: state.page * state.itemsPerPage + count, total: totalHits })
        $('.search-result-pagination-count', '.search-type-' + searchType).html(searchSummery)
        $('.search-results-pagination-button', '.search-type-' + searchType).css('display', 'block')

        if (totalHits > state.page * state.itemsPerPage + count) {
            $('.js-search-show-more', '.search-type-' + searchType).css('display', 'block')
            $('.js-search-show-more', '.search-type-' + searchType).off().click(function (e) {
                _searchState[searchType].page = _searchState[searchType].page + 1
                executeContentSearch(_searchQuery, searchType, null)
                e.preventDefault()
            })
        } else {
            $('.js-search-show-more', '.search-type-' + searchType).css('display', 'none')
        }
    }

    /**
     * Build recommendation view
     * @param {any} response
     * @param {any} searchType
     * @returns
     */
    function buildRecommendationView(response, searchType) {
        var $articleViewHeader = $('.js-search-type.search-type-' + searchType + " .js-search-result-info", _widgetSelector)
        var $articleViewList = $(".js-search-type.search-type-" + searchType + " .search-results-list", _widgetSelector)
        var $articleViewPagination = $(".js-search-type.search-type-" + searchType + " .search-results-pagination", _widgetSelector)

        var emptyResult = Mustache.render(_mustacheTemplateEmptyResult, { query: _searchQuery })
        $articleViewHeader.html(emptyResult)
        $articleViewHeader.css('display', 'block')

        var template = _mustasheTemplatesResult[SEARCHTYPE.Article]
        var rendered = Mustache.render(template, response.primaryList)

        buildArticleListFilter(response.primaryList.facets, response.primaryList.totalHits)

        $articleViewPagination.hide();
        $articleViewList.html($(rendered).hide().fadeIn(500))
        $('.js-search-query-header', '.search-details-header').text("\"" + _searchQuery + "\"")

        return;
    }

    /**
     * Update search type buttons
     * @param {any} response
     */
    function updateUiContextButtons(response, type) {

        $(".js-elevate-toggle-search-type.toggle-" + type).attr("disabled", true)
        var button = $(".js-elevate-toggle-search-type.toggle-" + type);
        if (type === SEARCHTYPE.Article) {
            button.attr("data-count", _totalHitsArticle)
        }
        else {
            button.attr("data-count", response.primaryList.totalHits)
        }

        // Article page is 'never' disabled
        if (response.primaryList.totalHits > 0 || type === SEARCHTYPE.Article)
            $(".js-elevate-toggle-search-type.toggle-" + type).removeAttr("disabled")
    }

    /** Updates the UI contexts */
    function updateUiContext() {
        if (_searchState[SEARCHTYPE.Article].waiting ||
            _searchState[SEARCHTYPE.Inspiration].waiting ||
            _searchState[SEARCHTYPE.Editorial].waiting ||
            _searchState[SEARCHTYPE.Store].waiting) {
            return;
        }

        if (_isNewSearch) {
            updateSearchType()
            _isNewSearch = false
        }
    }


    /** Update search UI based on current search type */
    function updateSearchType() {


        // Try to automatically switch to a type that has a result but prioritize user history
        var couldNotSelectSearchType = false
        if (_isNewSearch) {
            couldNotSelectSearchType = true
            switch (_currentSearchType) {

                // Article
                case SEARCHTYPE.Article:
                    if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Article).attr("data-count") > 0) {
                        _currentSearchType = SEARCHTYPE.Article
                        couldNotSelectSearchType = false;
                    }
                    break;

                // Inspiration
                case SEARCHTYPE.Inspiration:
                    if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Inspiration).attr("data-count") > 0) {
                        _currentSearchType = SEARCHTYPE.Inspiration
                        couldNotSelectSearchType = false;
                    }
                    break;

                // Editorial
                case SEARCHTYPE.Editorial:
                    if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Editorial).attr("data-count") > 0) {
                        _currentSearchType = SEARCHTYPE.Editorial
                        couldNotSelectSearchType = false;
                    }
                    break;

                // Store
                case SEARCHTYPE.Store:
                    if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Store).attr("data-count") > 0) {
                        _currentSearchType = SEARCHTYPE.Store
                        couldNotSelectSearchType = false;
                    }
                    break;
            }
        }

        // Automatically switch to a type that has a result
        if (_isNewSearch && couldNotSelectSearchType) {
            if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Article).attr("data-count") > 0)
                _currentSearchType = SEARCHTYPE.Article
            else if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Inspiration).attr("data-count") > 0)
                _currentSearchType = SEARCHTYPE.Inspiration
            else if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Editorial).attr("data-count") > 0)
                _currentSearchType = SEARCHTYPE.Editorial
            else if ($(".js-elevate-toggle-search-type.toggle-" + SEARCHTYPE.Store).attr("data-count") > 0)
                _currentSearchType = SEARCHTYPE.Store
        }

        // No automatic switching
        setSearchType(_currentSearchType)
    }


    /**
     * Sets the search type and updates the UI 
     * @param {any} type
     */
    function setSearchType(type) {
        if (type === undefined)
            return;

        _currentSearchType = type;

        // Hide and 'de-active' all search type elements
        $(".js-search-type", _widgetSelector).hide()
        $(".js-elevate-toggle-search-type").removeClass("active")

        // Show and 'active' the current search type element
        $(".js-search-type.search-type-" + _currentSearchType).show()
        $(".js-elevate-toggle-search-type.toggle-" + _currentSearchType).addClass("active")

        var $articleFilter = $(".filter-tools-wrapper", _widgetSelector)
        if (_currentSearchType === SEARCHTYPE.Article) {
            $articleFilter.show()

            var totalCount = 0
            $.each(_currentFilter.facets,
                function (index, facetGroup) {
                    totalCount += facetGroup.length
                })

            if (totalCount > 0) {
                $(".js-total-chosen-facet-count", $articleFilter).closest(".js-chosen-facet-count-container").show()
            } else {
                $(".js-total-chosen-facet-count", $articleFilter).closest(".js-chosen-facet-count-container").hide()
            }

            if (totalCount === 0)
                $(".js-total-chosen-facet-count").html("")
            else
                $(".js-total-chosen-facet-count", $articleFilter).text(totalCount)
        }
        else {
            $articleFilter.hide()
        }

    }


    /** Reset filter */
    function resetArticleFilter() {
        $('.filter-tools__facet input:checked', ".js-article-facets").prop('checked', false)
        $(".js-filter-tools-filter").remove()
        var emptyFilter = {
            inStockOnly: false,
            facets: {}
        }

        $(".js-total-chosen-facet-count").html("")
        Object.assign(_currentFilter, emptyFilter)
    }


    /** Reset sorting */
    function resetArticleFilterSorting() {
        _currentSorting = Panduro.enums.SORT_ORDERS.RELEVANCE
        document.getElementById(Panduro.enums.SORT_ORDERS.RELEVANCE).checked = true
        document.getElementById(Panduro.enums.SORT_ORDERS.NEWEST_FIRST).checked = false
        document.getElementById(Panduro.enums.SORT_ORDERS.PRICE_ASCENDING).checked = false
        document.getElementById(Panduro.enums.SORT_ORDERS.PRICE_DESCENDING).checked = false
        _currentFilter.inStockOnly = false;
        $(".js-elevate-search-show-in-stock-only").prop('checked', false)
    }


    /** Read values from the Article filter view  */
    function readArticleFilter() {

        // Sorting
        var isDesktop = $(".js-search-sort-desktop").is(":visible")
        if (isDesktop)
            _currentSorting = $(".js-search-sort-desktop input:checked", _widgetSelector).val()
        else
            _currentSorting = $(".js-search-sort-mobile-elevate").val()

        // Filter facet
        $(".js-filter-tools-filter").remove()

        // Todo: This is a bit messy.
        $(".filter-group", _widgetSelector).each(function (index, group) {
            var facetGroup = $(group).data("facettype")
            _currentFilter.facets[facetGroup] = []

            $.each($('input:checked', group), function () {
                var $element = $(this)
                var label = $element.attr('data-label')
                var value = $element.attr('data-value')
                var id = $element.attr('id')
                _currentFilter.facets[facetGroup].push({ value: value, label: label })

                var filterButton = $("<div/>", { class: "filter-tools__choosen-filter js-filter-tools-filter " + facetGroup }).text($(this).attr('data-label'))
                filterButton.attr('data-id', id)
                $(".js-filter-tools-choosen-filters.js-search-articles").append(filterButton)
                filterButton.click(function () {
                    $("#" + id, "." + facetGroup).click()
                })
            })
        })

        // In stock
        $(".js-elevate-search-show-in-stock-only").each(function (e) {
            var $element = $(this)
            if (!$element.is(":visible"))
                return;

            _currentFilter.inStockOnly = $element.is(":checked")
        })

        var hasChosenFacetValues = false
        $.each(_currentFilter.facets, function (index, facetGroup) {
            if (facetGroup.length)
                hasChosenFacetValues = true
        })

        if (hasChosenFacetValues) {
            $(".js-filter-tools-empty-filter").hide()
        }
        else {
            $(".js-filter-tools-empty-filter").show()
        }
    }

    /** Use filter */
    function executeFilteredSearch() {
        readArticleFilter()
        _searchState[SEARCHTYPE.Article].page = 0
        _searchState[SEARCHTYPE.Article].secondaryPage = 0
        _searchState[SEARCHTYPE.Article].primaryShown = 0
        _searchState[SEARCHTYPE.Article].secondaryShown = 0
        _secondaryListMode = false;
        _initialSearch = true;
        executeArticleSearch(_searchQuery, null)
    }


    /** Push history */
    function pushHistory(push) {
        var updatedQueries = []

        if (_searchQuery != undefined && _searchQuery != "") {
            updatedQueries.push({ key: "q", value: _searchQuery })
        }

        if (_currentSearchType != undefined && _currentSearchType != "") {
            updatedQueries.push({ key: "searchType", value: _currentSearchType })
        }

        Panduro.main.addUpdateQueryParameters(updatedQueries, push)
        Panduro.module.elevateSearchQuick.updateSearchInput(_searchQuery)
    }

    /**
     * Log to console. 
     * _debug must be true
     * @param {any} title
     * @param {any} object
     */
    function _clog(title, object) {
        if (!_debug)
            return
        console.log(title, object)
    }

    return {
        initialize: initialize,
        executeSearch: executeNewSearch
    }
}()
;
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

/**
 * Main implementation of elevate quick search. 
 * 
 * This code interacts with a quick search widget, with an
 * input field where the user can enter a search query.
 * 
 * This code is tightly integrated with the Elevate Result List page
 * */
Panduro.module.elevateSearchQuick = function () {
    const localHistoryKey = "quick_search_history";

    var widgetSelector = ".js-elevate-search-inline, .js-elevate-search-inline-mobile";
    var searchInput = ".js-elevate-search-inline-input, .mobile-menu-search-input";
    var searchQuery = "";
    var searchPage = "/elevate-search";
    var mustacheTemplatePreviousSearches;
    var mustacheTemplatePopular;
    var mustacheTemplateAutocorrect;
    var mustacheTemplateArticles;
    var mustacheTemplateCategories;
    var mustacheTemplateInspirations;
    var mustacheTemplateQuickSearch;



    // Will initialize all Elevate Quick Search widgets.
    function initialize() {
        loadTemplates();

        var widgets = $(widgetSelector);
        if (widgets.length != 0) {
            widgets.each(function () {
                initializeWidget($(this));
            });
        }
    }

    // Finds all Mustache templates in the dom and registers them with Mustache.
    // The templates are used later to construct dom elements.
    function loadTemplates() {
        mustacheTemplatePreviousSearches = $('#search-elevate-quick-previous-searches-template').html();
        Mustache.parse(mustacheTemplatePreviousSearches);

        mustacheTemplatePopular = $('#search-elevate-quick-popular-template').html();
        Mustache.parse(mustacheTemplatePopular);

        mustacheTemplateAutocorrect = $('#search-elevate-quick-autocorrect-template').html();
        Mustache.parse(mustacheTemplateAutocorrect);

        mustacheTemplateArticles = $('#search-elevate-quick-articles-template').html();
        Mustache.parse(mustacheTemplateArticles);

        mustacheTemplateCategories = $('#search-elevate-quick-categories-template').html();
        Mustache.parse(mustacheTemplateCategories);

        mustacheTemplateInspirations = $('#search-elevate-quick-inpirations-template').html();
        Mustache.parse(mustacheTemplateInspirations);
    }

    // Initializes a quick search widget
    // Assigns events etc to dom object
    function initializeWidget(widget) {

        // Populate the input field with existing search query if present in window url
        // and execute a search (E.g user bookmarked site with search params in the url)
        var urlQuery = Panduro.main.getParameterByName('q');
        if (urlQuery != null && urlQuery != "") {
            searchQuery = urlQuery;
            $(".js-elevate-search-inline-input", widget).val(searchQuery);
            var origin = Panduro.main.getParameterByName('origin');
            if (origin == null || origin == "") {
                origin = Panduro.enums.SEARCH_ORIGINS.ORGANIC
            }
            executeElevateSearch(searchQuery, widget, false, origin);
        }
        else {
            var $placeholder = $(".js-elevate-search-inline-input", widget)
            var textToRender = $placeholder.data("placeholder");
            $placeholder.attr("placeholder", textToRender);
        }

        bindUi(widget);
    }

    // Bind events to the quick search widget
    function bindUi(widget) {
        const delay = 100;
        var $inlineSearchInput = $('.js-elevate-search-inline-input', widget);
        var $buttonClear = $('.js-clear-search-elevate', widget);
        var $buttonSubmit = $('.js-submit-search-elevate', widget);
        var timer = 0;


        // Executes code after a set timeout (ms)
        var executeWithDelay = (function () {
            return function (callback, ms) {
                clearTimeout(timer);
                timer = setTimeout(callback, ms);
            };
        })();

        $buttonClear.on('click', function (e) {
            $inlineSearchInput.val('');
            e.preventDefault();
        });

        $buttonSubmit.on('click', function (e) {
            var inputValue = $inlineSearchInput.val();

            if (inputValue.length < 2)
                return;

            executeElevateSearch(inputValue, widget, true, Panduro.enums.SEARCH_ORIGINS.ORGANIC);
            if (typeof Panduro.navigation.closeMobileSearch == "function")
                Panduro.navigation.closeMobileSearch();
        });

        // This event fires when the user enters text into the search field
        $inlineSearchInput.on("keyup", function (event) {
            var inputValue = $(this).val();
            var handleKeyUpEvent = function () {

                // Anything but return was pressed
                if (event.which !== 13) {
                    executeQueryAndUpdateWidget(inputValue, widget);
                    //$.debounce(500, Panduro.search.buildAutoComplete);
                    event.preventDefault();
                    return;
                }

                // Return was pressed
                if (inputValue.length >= 2) {
                    executeElevateSearch(inputValue, widget, true, Panduro.enums.SEARCH_ORIGINS.ORGANIC);
                    return;
                }

                // Use suggestion
                var activeSuggestion = $(widget).find("li.active");
                if (activeSuggestion.length > 0) {
                    if ($(activeSuggestion).data("islink")) {
                        pushQueryToQuickSearchHistory(query)
                        event.preventDefault();
                        var url = $(activeSuggestion).find("a").attr("href")
                        window.location = url + '&origin=' + panduro.enums.SEARCH_ORIGINS.PHRASE_SUGGEST
                    } else {
                        executeElevateSearch($(activeSuggestion).data("query"), widget, false, Panduro.enums.SEARCH_ORIGINS.ORGANIC);
                        if (typeof Panduro.navigation.closeMobileSearch == "function")
                            Panduro.navigation.closeMobileSearch();
                    }
                    return;
                }
            };

            executeWithDelay(handleKeyUpEvent, delay);
        });

        $inlineSearchInput.focus(function () {
            query = $(this).val().toString()
            toggleQuickSearch(true, widget, query);
            var inputValue = query;

            if (inputValue != null && inputValue.length > 2) {
                executeQueryAndUpdateWidget(inputValue, widget)
            } else {
                executeQueryAndUpdateWidget("", widget)
            }
        });

        $inlineSearchInput.blur(function () {
            toggleQuickSearch(false, widget);
        });
    }

    /**
     * Update the input field with a query
     * @param {any} query
     */
    function updateSearchInput(query) {
        $(searchInput).val(query);
    }

    /**
     * Executes a quick search.
     * The result is presented in the widget under the search input.
     * @param {any} query Search query
     * @param {any} widget The widget object
     */
    function executeQueryAndUpdateWidget(query, widget) {

        // Request
        var request = {
            queryString: query,
            payload: {
                "contentLists": [
                    {
                        "contentFilter": {
                            "type": Panduro.enums.SEARCH_TYPES.INSPIRATION
                        },
                        "id": Panduro.enums.SEARCH_TYPES.INSPIRATION,
                        "limit": 6
                    },
                    {
                        "contentFilter": {
                            "type": Panduro.enums.SEARCH_TYPES.CATEGORY
                        },
                        "id": Panduro.enums.SEARCH_TYPES.CATEGORY,
                        "limit": 6
                    }
                ],
            }
        }

        // Execute Voyado Elevate Autocomplete request
        Panduro.voyadoElevate.autocomplete(request, function (responseData) {
            updateQuickSearchWidget(responseData, widget, query);
        });
    }

    /**
     * Retreive the current search history for elevate quick search
     * @returns
     */
    function getQuickSearchHistory() {
        return JSON.parse(window.localStorage.getItem(localHistoryKey));
    }

    /**
     * Push a search term (query) to the elevate quick search history
     * @param {any} query
     * @returns
     */
    function pushQueryToQuickSearchHistory(query) {

        // Validate input
        if (query == null || query == "")
            return;

        query = query.trim()

        // Get history
        var history = JSON.parse(window.localStorage.getItem(localHistoryKey));

        // If no history exists
        if (history == null) {
            window.localStorage.setItem(localHistoryKey, JSON.stringify([ query ] ))
            return;
        }

        // If history exists, add new query
        var newHistory = []
        newHistory.push(query)
        var max = 5;
        var index = 0;

        var newHistoryValue = query.toLowerCase();
        while (index < history.length && index < (max - 1)) {
            var oldHistoryValue = history[index].toLowerCase();
            if (newHistoryValue !== oldHistoryValue) {
                newHistory.push(oldHistoryValue)
            }
            index++;
        }

        window.localStorage.setItem(localHistoryKey, JSON.stringify(newHistory))
    }

    /**
     * Capitalizes the first character in a text string
     * @param {any} input
     * @returns
     */
    function capitalizeFirstLetter(input) {
        return input.charAt(0).toUpperCase() + input.toLowerCase().slice(1);
    }
    /**
     * Update and display the quick search widget with data from autocomplete response
     * @param {any} data
     * @param {any} widget
     */
    function updateQuickSearchWidget(data, widget, query) {
        var enablePreviousSearches = true;
        var enablePopularSearches = true;
        var enableAutoCorrectQueries = false;
        var enableProductSuggestions = true;
        var enableContentSuggestions = true;
        var enableCatgorySuggestions = true;
        var numberOfBoxes = 0;

        // Populate mustache templates
        // This HTML will replace any HTML in the widget result box
        var html = "";

        // This is the same as phrase suggestions from the autocomplete
        var history = getQuickSearchHistory();
        if (enablePreviousSearches &&
            history != null &&
            history.length > 0)
        {
            var previousSearches = history.map(function (history) {
                return {
                    key: history,
                    value: capitalizeFirstLetter(history)
                }
            });

            html += Mustache.render(mustacheTemplatePreviousSearches, previousSearches)
            numberOfBoxes++
        }

        // Popular searches
        if (enablePopularSearches && data.phraseSuggestions.length > 0) {
            var popularSearches = data.phraseSuggestions.slice(0, 5).map(function (autoCorrect) {
                return {
                    key: autoCorrect.q,
                    value: autoCorrect.highlighted.replaceAll('{', '<span>').replaceAll('}', '</span>')
                }
            });

            html += Mustache.render(mustacheTemplatePopular, popularSearches)
            numberOfBoxes++
        }

        // Category suggestions
        if (enableCatgorySuggestions &&
            data.contentLists.length > 0 &&
            data.contentLists[1].items.length > 0) {
            renderColumns = true;
            var contentItems = data.contentLists[1].items
            var templateData = {
                total: data.productSuggestions.length,
                categoryResults: contentItems
            }
            html += Mustache.render(mustacheTemplateCategories, templateData)
            numberOfBoxes++
        }

        // Product suggestions
        if (enableProductSuggestions &&data.productSuggestions.length > 0) {
            renderColumns = true;
            html += Mustache.render(mustacheTemplateArticles, { total: data.productSuggestions.length, suggestions: data.productSuggestions })
            numberOfBoxes++
        }

        // Insert auto correct queries
        if (enableAutoCorrectQueries) {
            var autoCorrectQueries = data.phraseSuggestions.slice(0, 5).map(function (autoCorrect) {
                return {
                    key: autoCorrect.q,
                    value: autoCorrect.highlighted.replaceAll('{', '<span>').replaceAll('}', '</span>')
                }
            });

            if (autoCorrectQueries.length > 0) {
                html += Mustache.render(mustacheTemplateAutocorrect, autoCorrectQueries)
                numberOfBoxes++
            } else {
                html += Mustache.render(mustacheTemplatePopular);
                numberOfBoxes++
            }
        }

        // Content suggestions (Inspirations)
        if (enableContentSuggestions &&
            data.contentLists.length > 0 &&
            data.contentLists[0].items.length > 0)
        {
            renderColumns = true;
            var contentItems = data.contentLists[0].items
            var templateData = {
                total: data.productSuggestions.length,
                inspirationResults: contentItems
            }
            html += Mustache.render(mustacheTemplateInspirations, templateData)
            numberOfBoxes++
        }

        // Render widget
        // We only render columns when the result contains sufficient content
        var $theContent = $(".js-elevate-search-quick-content", widget); 
        if (numberOfBoxes > 2) {
            $theContent.addClass('search-quick-content-columns')
        } else {
            $theContent.removeClass('search-quick-content-columns')
        }
        $theContent.html(html);

        // Don't show prevous search content when sufficient content
        var $previousSearchesContent = $(".search-quick-previous-searches");
        if (numberOfBoxes > 2) {
            $previousSearchesContent.addClass("hidden");
        }
        else {
            $previousSearchesContent.removeClass("hidden");
        }

        // Bind an action to each item in the widget result list
        // If it is a link to a product or inspiration => redirect user
        // If it is a query suggestion => execute search
        $(".js-elevate-search-quick li", widget).on("mousedown", function (e) {
            if ($(this).data("islink")) {
                e.preventDefault();
                window.location = $(this).find("a").attr("href");
            } else {
                var q = $(this).data("query");
                executeElevateSearch(q, null, false, Panduro.enums.SEARCH_ORIGINS.RELATED_SEARCHES);
            }
        })

        toggleQuickSearch(true, widget);
    }

    /**
     * Toggles the Quick Search widget visibilty on or off
     * @param {any} show
     * @param {any} widget
     * @param {any} query
     */
    function toggleQuickSearch(show, widget, query) {
        var $searchQuick = $(".search-quick", widget);
        var html = $.trim($searchQuick.html())
        if (html && show) {
            $searchQuick.show();
            $(widget).addClass("js-inline-search-expanded");
        } else if (!html && show && query.length > 1) {
            executeQueryAndUpdateWidget(query, widget);
        } else {
            $searchQuick.hide();
            $(widget).removeClass("js-inline-search-expanded");
        }
    }

    /**
     * The execute search (aka the user press return or clicked on a suggestion)
     * Note: This excludes clicking on links
     * @param {any} query
     * @param {any} widget
     * @param {any} force
     * @param {any} origin
     */
    function executeElevateSearch(query, widget, force, origin) {
        query = query.toString().replace('"', "").replace("'", "");
        pushQueryToQuickSearchHistory(query)
        var expectedUrl = getExpectedUrl(query, origin);
        var currentUrl = getCurrentUrl();

        // We are already on the result page.
        // Execute the search and update the result list.
        if (currentUrl.includes(expectedUrl)) {
            Panduro.module.elevateSearchResultList.executeSearch(query, force, false, false, origin);
            return;
        }

        // We are not on the result page
        // Direct customer to result page
        // The result page will query elevate and show results based on url query params
        var updatedQueries = []
        updatedQueries.push({
            key: "origin",
            value: origin
        }, {
            key: "q",
            value: query
        })
        Panduro.main.addUpdateQueryParameters(updatedQueries, false)
        window.location.href = expectedUrl;
    }

    /**
     * Return the href url for a given query
     * @param {any} query
     * @returns
     */
    function getExpectedUrl(query, origin) {
        var encodedQuery = encodeURIComponent(query)
        return "/" + Panduro.main.currentLanguage + searchPage + '?q=' + encodedQuery + '&origin=' + origin;
    }

    /** 
     * Returns the current href url
     */
    function getCurrentUrl() {
        return location.pathname + location.search;
    }

    /**
     * Default return
     */
    return {
        initialize: initialize,
        updateSearchInput: updateSearchInput
    }
}();;
var Panduro = Panduro || {}
Panduro.module = Panduro.module || {}

Panduro.module.elevateRecommendations = function () {
    var widgetSelector = ".js-elevate-recommendation"
    var initializedTemplates = {}

    function initialize(widget) {
        if ($(widgetSelector).length > 0) {
            buildRecommendationsRequest()
        }
    }

    // Build recommendation request
    function buildRecommendationsRequest() {
        $(widgetSelector).each(function (index) {
            var $recommendationBlock = $(this)

            var recommendationType = $recommendationBlock.data("type");
            var newId = recommendationType + '-' + index.toString()
            $recommendationBlock.attr('id', newId)

            switch (Panduro.enums.ELEVATE_RECOMMENDATION_TYPE[recommendationType]) {
                case Panduro.enums.ELEVATE_RECOMMENDATION_TYPE.PRODUCT:
                    buildProductPageRecommendation($recommendationBlock, index)
                    break;

                case Panduro.enums.ELEVATE_RECOMMENDATION_TYPE.PAGE:
                    buildLandingPageRecommendation($recommendationBlock, index)
                    break;

                case Panduro.enums.ELEVATE_RECOMMENDATION_TYPE.CART:
                    // Do nothing, this type have its own logic when item is added to cart
                    break;

                default:
                    console.log('Unhandled recommendation type', recommendationType)
                    return;
            }
        })

    }

    // Build recommendations based on the product page
    function buildProductPageRecommendation($recommendationBlock, index) {
        var productRecommendations = []
        var articleNumber = $(".js-article").data("articlenumber")

        productRecommendations.push({
            title: $recommendationBlock.attr('title'),
            id: $recommendationBlock.attr('id'),
            algorithm: $recommendationBlock.data("algorithm"),
            limit: $recommendationBlock.data("limit"),
            visualization: $recommendationBlock.data("visualization"),

        })
        $.each(productRecommendations, function (index, productReq) {
            initializeTemplate(Panduro.enums.RECOMMENDATION_VISUALIZATION[productReq.visualization])
        })

        if (productRecommendations.length === 0 || typeof articleNumber === "undefined")
            return

        var req = {
            queryString: articleNumber,
            productRecommendations: productRecommendations,
        }

        Panduro.voyadoElevate.productRecommendation(req, function (result) {
            renderResultToElement(result, $recommendationBlock.attr('id'))
        })
    }


    // Build recommendations based on a landing page
    function buildLandingPageRecommendation($recommendationBlock, index) {
        var productRecommendations = []
        var pageReference = $recommendationBlock.data('page-reference')
        var reqLimit = $recommendationBlock.data('limit')


        productRecommendations.push({
            title: $recommendationBlock.attr('title'),
            id: $recommendationBlock.attr('id'),
            algorithm: $recommendationBlock.data("algorithm"),
            limit: $recommendationBlock.data("limit"),
            visualization: $recommendationBlock.data("visualization")
        })

        $.each(productRecommendations, function (index, productReq) {
            initializeTemplate(Panduro.enums.RECOMMENDATION_VISUALIZATION[productReq.visualization])
        })

        if (productRecommendations.length === 0)
            return

        var req = {
            queryString: pageReference,
            limit: reqLimit,
        }

        Panduro.voyadoElevate.pageRecommendation(req, function (result) {
            renderResultToElement(result, $recommendationBlock.attr('id'))
        })
    }

    // Special case
    function buildPageBuyRecommendation(listOfArticleKeys) {
        var $recommendationBlock;
        $(widgetSelector).each(function (index) {
            var $element = $(this);
            if ($element.data('type') !== Panduro.enums.ELEVATE_RECOMMENDATION_TYPE.CART)
                return;

            $recommendationBlock = $element
            elementIndex = index
        })

        if ($recommendationBlock === undefined)
            return;


        var articles = listOfArticleKeys.map(x => x.ArticleNumber)
        var productRecommendations = []
        var articleNumber

        articleNumber = $(".js-article").data("articlenumber")
        productRecommendations.push({
            title: $recommendationBlock.attr('title'),
            id: $recommendationBlock.attr('id'),
            algorithm: $recommendationBlock.data("algorithm"),
            limit: $recommendationBlock.data("limit"),
            visualization: $recommendationBlock.data("visualization"),
            params: {
                cart: articles
            }
        })

        $.each(productRecommendations, function (index, productReq) {
            initializeTemplate(Panduro.enums.RECOMMENDATION_VISUALIZATION[productReq.visualization])
        })

        if (productRecommendations.length === 0 || typeof articleNumber === "undefined")
            return

        var req = {
            queryString: articleNumber,
            productRecommendations: productRecommendations,
        }

        Panduro.voyadoElevate.productRecommendation(req, function (result) {
            renderResultToElement(result, $recommendationBlock.attr('id'))
        })
    }

    /**
     * Render recommendation result to an elevate recommendation module
     * @param {any} result
     * @param {any} elementId
     */
    function renderResultToElement(result, elementId) {
        $.each(result.recommendationLists, function (index, list) {
            if (typeof initializedTemplates[list.visualization] === "undefined")
                return;

            list.id = '#' + elementId
            var rendered = Mustache.render(initializedTemplates[list.visualization], list)

            var $element = $(list.id);
            $element.html(rendered)

            var title = $element.data('title');
            $element.find('h3').text(title);

            // Remove Loop54 event
            $element.find('.articlelist-item-image-wrapper').each(function (index) {
                $(this).prop("onclick", null).off("click");
            })

            Panduro.lazyLoadImages.updateImages()
            Panduro.module.simpleArticleSlide.initSlider($(".article-swiper", list.id))
        })

        $('body .autonumeric').each(function () {
            Panduro.ui.formatNumber($(this), Panduro.ui.numericOptions)
        })
    }

    /**
     * Initialize Mustache template
     * @param {any} visualization
     */
    function initializeTemplate(visualization) {
        if (typeof visualization !== "undefined" && typeof initializedTemplates[visualization.key] === "undefined") {
            var template = $(visualization.template).html()
            Mustache.parse(template)
            initializedTemplates[visualization.key] = template
        }
    }

    return {
        initialize: initialize,
        buildPageBuyRecommendation: buildPageBuyRecommendation,
    }
}();
var Panduro = Panduro || {};
Panduro.module = Panduro.module || {};

Panduro.module.newLoyaltyMemberPopup = function () {
	var widgetSelector = ".my-pages-login-popup";


	function initialize(widget) {
		var timer = setInterval(function () {
			if (typeof window.CookieInformation === "undefined" || window.CookieInformation.getConsentGivenFor('cookie_cat_necessary')) {
				clearInterval(timer);
				if ((Panduro.state.current.seenNewLoyaltyClubMemberPopUp === -1 ||
					Panduro.state.current.seenNewLoyaltyClubMemberPopUp - Date.now() > 604800000) && !Panduro.state.current.isLoggedIn) {
					setTimeout(function() {
						$(widget).each(function () {
							launchPopUp(widget);
						});
					}, 3000);
				}
			}
		}, 1000);


	}

	function launchPopUp(widget) {
		$(widget).show();
		$(".js-my-pages-login-popup-close", widget).click(function() {
			closePopUp();
		});

		Panduro.state.setState({ seenNewLoyaltyClubMemberPopUp: Date.now() });
	}

	function closePopUp() {
		$(widgetSelector).hide();
	}

	return {
		initialize: function () {
			initialize($(widgetSelector));
		},
		closePopUp: function() {
			closePopUp();
		}
	}
}();;
