/* Minification failed. Returning unminified contents.
(1020,6): run-time error JS1004: Expected ';'
(1030,17): run-time error JS1004: Expected ';'
 */
/// <reference path="~/Scripts/jquery-1.12.4.js" />
/// <reference path="~/Scripts/jquery-ui-1.12.1.js" />
/// <reference path="~/Scripts/jquery.validate-vsdoc.js" />
/// <reference path="~/Scripts/jquery.validate.unobtrusive.js" />

String.prototype.format = function () {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] !== "undefined"
            ? args[number]
            : match
            ;
    });
};

function goToByScroll(id) {
    $("body,html").animate({ scrollTop: $("#" + id).offset().top - 40 }, "slow");
}

// TODO Only used by cart, so could be removed?
function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) {
        vars[key] = value;
    });
    return vars;
}

function getCookie(cookieName) {
    var i, x, y, cookies = document.cookie.split(";");
    for (i = 0; i < cookies.length; i++) {
        x = cookies[i].substr(0, cookies[i].indexOf("="));
        y = cookies[i].substr(cookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x === cookieName) {
            return unescape(y);
        }
    }
    return null;
}

function isEmpty(value) {
    switch (typeof (value)) {
        case "string": return (value.length === 0);
        case "number":
        case "boolean": return false;
        case "undefined": return true;
        case "object": return !value ? true : false; // handling for null.
        default:
            return !value ? true : false;
    }
}

function PrintCoupon(divName) {

    var myWindow = window.open('', 'Print Preview', 'height=600,width=800');
    myWindow.document.write('<html><head><title></title>');
    myWindow.document.write('</head><body>');
    myWindow.document.write($(divName).html());
    myWindow.document.write('</body></html>');
    myWindow.print();
    myWindow.close();
    return true;
}

$(".navBarMessage").click(function () {
    $(".navBarMessage").slideUp();
});

$(function () {
    $(".platformBar")
        .on("click", ".platMenuMobile", function (e) {
            e.preventDefault();
            $("#menu").slideToggle();
            $(this).toggleClass("openMenu");
        });

    $(".mainFooterSep")
        .on("click", "h4", function (e) {
            if ($(window).innerWidth() <= 959) {
                e.preventDefault();
                $(this).siblings("ul").slideToggle();
                $(this).toggleClass("opened");
            }
        });

    $(window).resize(function () {
        if ($(window).innerWidth() > 959) {
            $("#menu").css("display", "");
            $(".platMenuMobile").removeClass("openMenu");
            $(".mainFooterSep ul").css("display", "");
            $(".loyaltyLinksIn").css("display", "");
            $(".mainFooter h4").removeClass("opened");
            $(".leftBar").css("left", "");
            $("#leftOpener").removeClass("closeLe");
            $(".leftBarIn").css("height", "");
        } else {
            $(".leftBarIn").height($(window).height() - 86);
        }
    });

    $("body")
        .on("click", "#closeCookieBar2", function (e) {
            e.preventDefault();
            $("#cookieBar2").fadeOut();
        });

    var consentLevel = getCookie("cmapi_cookie_privacy");

    if (!IsNullOrUndefined(consentLevel)) {
        if (consentLevel.toLowerCase().indexOf("permit 1,2,3") !== -1) {
            AddGooglePlusOne();
        }
    }

    function AddGooglePlusOne() {
        var po = document.createElement("script");
        po.type = "text/javascript";
        po.async = true;
        po.src = "//apis.google.com/js/plusone.js";
        po.setAttribute("trackertype", "advertising");
        po.classList.add("trustecm");
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(po, s);
    }

});

/* Cart
   ------------------------------------------------------------------------- */

/* Help Dropdown */
$(".navBar")
    .on("mouseenter", ".navDrop", function () {
        clearTimeout(this.navTimeOut);
        var ee = this;
        this.navTimeIn = setTimeout(function () {
            ee.opened = true;
            $(ee).find("ul").show("slide", { direction: "up" }, 250);
        }, 200);
    })
    .on("mouseleave", ".navDrop", function () {
        clearTimeout(this.navTimeIn);
        var ee = this;
        if (ee.opened === true) {
            this.navTimeOut = setTimeout(function () {
                ee.opened = false;
                $(ee).find("ul").hide("slide", { direction: "up" }, 250);
            }, 200);
        }
    })
    .on("click", ".mainDrop", function (e) {
        e.preventDefault();
        $(this).siblings("ul").toggle("slide", { direction: "up" }, 250);
    })
    .on("click", ".accountDrop", function (e) {
        e.preventDefault();
        $(this).siblings("ul").toggle("slide", { direction: "up" }, 250);
    });

/* Plus Dropdown */
$(".navBar")
    .on("mouseenter", ".loyaltyLinks", function () {
        if ($(window).innerWidth() > 959) { return false }
        clearTimeout(this.navTimeOut);
        var ee = this;
        this.navTimeIn = setTimeout(function () {
            ee.opened = true;
            $(ee).find(".loyaltyLinksIn").show("slide", { direction: "up" }, 250);
        }, 200);
    })
    .on("mouseleave", ".loyaltyLinks", function () {
        if ($(window).innerWidth() > 959) { return false }
        clearTimeout(this.navTimeIn);
        var ee = this;
        if (ee.opened === true) {
            this.navTimeOut = setTimeout(function () {
                ee.opened = false;
                $(ee).find(".loyaltyLinksIn").hide("slide", { direction: "up" }, 250);
            }, 200);
        }
    })
    .on("click", ".loyaltyLinks", function (e) {
        if ($(window).innerWidth() <= 959) {
            $(this).find("ul").toggle("slide", { direction: "up" }, 250);
        }
    });

function CheckFieldLength(source, charsEntered, charsLeft, maxChars) {
    var len = source.value.length;
    if (len > maxChars) {
        source.value = source.value.substring(0, maxChars);
        len = maxChars;
    }
    charsEntered.innerHTML = len;
    charsLeft.innerHTML = maxChars - len;
}

function AddToCart(id, IsHeroResult) {
    $.post("/api/cart/AddProduct?pvid=" + id, function (res) { })
        .done(function (data) {
            googleTagManagerAddToCart(data);
            var applyProtection = $.find(".productProtectionCheckbox:checked");
            var protectionId = applyProtection.length === 0 ? 0 : applyProtection[0].value;
            $.when(AddProtection(id, protectionId)).done(function () {
                $(".cart").load("/Cart/UpdateCart?&r=" + Math.random() * 99999 + "&currentUrl=" + document.URL,
                    function () {
                        $(".cart").effect("bounce", 800);
                    });
                openAler(id, protectionId);
            });
        })
        .fail(function (err) {
            //console.log(err);
            $(".navBarMessage p span").text(err.responseJSON.message);
            $(".navBarMessage").slideDown().delay(2000).slideUp();
        });
    return false;
}

// mark a link with a disabled flag for 1.5 seconds, return false if the link is "disabled", this is because links do have a disabled attribute like inputs/buttons
function tempDisableLink(ele) {
    if ($(ele).data("disabled")) return false;
    $(ele).data("disabled", true);
    setTimeout(function () { $(ele).data("disabled", false); }, 1500);
    return true;
}
$("body")
    .on("click", ".cartAddRadio", function (e) {
        if (!tempDisableLink(this)) { return }; // dont allow add if one in progress
        e.preventDefault();
        var targetProd = $(this).closest(".buySection").find(".radioAdd[type='radio']:checked").val();
        AddToCart(targetProd);
    })
    .on("click", ".cartAddNoRadio", function (e) {
        if (!tempDisableLink(this)) { return; } // dont allow add if one in progress
        e.preventDefault();
        var targetProd = $(this).attr("cartElemId");
        var isHeroResult = $(this).parent().parent().attr("id") === "HeroResult";
        AddToCart(targetProd, isHeroResult);
    })
    .on("click", ".add-to-wishlist-link", function (e) {
        e.preventDefault();
        var sku = $(this).data("sku");
        var productId = $(this).data("product-id");
        $.ajax({
            type: "POST",
            url: "/MyAccount/AddToWishList",
            data: { productId: productId, sku: sku },
            success: function (data) {
                if (data.Success) {
                    $(".havelist-wishlist-block[data-product-id=" + productId + "]").html(data.IHaveIWantBlock);
                }
            },
            error: function (request, status, err) {
                //alert(request + "\n" + status + "\n" + err)
            }
        });
    })
    .on("click", ".add-to-havelist-link", function (e) {
        e.preventDefault();
        var sku = $(this).data("sku");
        var productId = $(this).data("product-id");
        $.ajax({
            type: "POST",
            url: "/MyAccount/AddToHaveList",
            data: { productId: productId, sku: sku },
            success: function (data) {
                if (data.Success) {
                    $(".havelist-wishlist-block[data-product-id=" + productId + "]").html(data.IHaveIWantBlock);
                }
            },
            error: function (request, status, err) {
                //alert(request + "\n" + status + "\n" + err)
            }
        });
    });

/* ENHANCED AUTOCOMPLETER 2.0 */

$.widget("custom.platformautocomplete", $.ui.autocomplete, {
    _create: function () {
        var b = this;
        b.element
            .addClass("ui-autocomplete-input")
            .attr({
                "autocomplete": "off",
                role: "textbox",
                "aria-autocomplete": "list",
                "aria-haspopup": "true"
            })
            .on("keydown.autocomplete", function (e) {
                var d = $.ui.keyCode;
                var sel = $(".ui-state-hover").siblings("ol").find("a").hasClass("selected");
                var indx = $(".ui-state-hover").parent().index();
                switch (e.keyCode) {
                    case d.LEFT:
                        if (indx === -1) break;
                        e.preventDefault();
                        if (!sel) {
                            selSubElem(0);
                        }
                        break;
                    case d.RIGHT:
                        if (indx === -1) break;
                        e.preventDefault();
                        $(".ui-state-hover").siblings("ol").find("a").removeClass("selected");
                        break;
                    case d.DOWN:
                        e.preventDefault();
                        e.stopImmediatePropagation();
                        if (sel) {
                            selSubElem("+");
                        } else {
                            selElem("+");
                        }
                        break;
                    case d.UP:
                        e.preventDefault();
                        e.stopImmediatePropagation();
                        if (sel) {
                            selSubElem("-");
                        } else {
                            selElem("-");
                        }
                        break;
                    case d.ENTER:
                        goToLink(sel, b, e);
                        return;
                    default:
                        clearTimeout(b.searching);
                        b.searching = setTimeout(function () {
                            if (b.term !== b.element.val()) {
                                b.selectedItem = null;
                                b.search(null, e);
                            }
                        }, b.options.delay);
                        break;
                }
            });
        b._initSource();
        if ($.fn.bgiframe) {
            this.menu.element.bgiframe();
        }
        $(this).blur(function () { var hideTimer = setTimeout(function () { b.close(); }, 100); });
        b._super();
    }, //end create

    _renderMenu: function (ul, items) {
        var b = this
        $.each(items, function (index, item) {
            b._renderItemData(ul, item);
        });
        $(ul)
            .addClass("ui-autocomplete ui-platformautocomplete")
            .appendTo("body")
            .menu()
            .hide()
            .data("menu");
    },

    _renderItem: function (ul, item) {
        var b = this;
        var isGift = "";
        if (item.giftCard) {
            isGift = "leftLess";
        } else {
            var subMenuPlat = "<ol class='ui-menu ui-corner-right'>";
            var subNum = item.platforms.length;
            for (var i = 0; item.platforms !== null && i < subNum; i++) {
                if (item.platforms[i] === "Loyalty") {
                    subMenuPlat = subMenuPlat +
                        "<li><a class=\"ui-corner-right\" subPlatName=\"" +
                        item.platforms[i] +
                        "\" href=" +
                        "\\Tier3Card\\AddToCart" +
                        " onmouseenter=\"selT(this)\" onmouseout=\"selT(this)\">" +
                        item.platforms[i] +
                        "</a></li>";
                } else {
                    subMenuPlat = subMenuPlat +
                        "<li><a class=\"ui-corner-right\" subPlatName=\"" +
                        item.platforms[i] +
                        "\" href=\"/" +
                        item.platforms[i] +
                        "/Games/" +
                        item.productsId[i] +
                        "\" onmouseenter=\"selT(this)\" onmouseout=\"selT(this)\" >" +
                        item.platforms[i] +
                        "</a></li>";
                }

            }
            subMenuPlat = subMenuPlat + "</ol>";
        }

        return $("<li class='autoSing'></li>")
            .data("ui-autocomplete-item", item)
            .append("<a class='" + isGift + "' isGift=" + item.giftCard + " targLink='" + item.label + "' href='/SearchResult/QuickSearch?q="
                + item.label + "'><img src='" + item.imagePath + "'/><span>" + item.label + "</span><span class='descr'>" + item.abstract + "</span><br /> </a>")
            .on("mouseenter", function (d) {
                var fews = $(d.target).closest(".ui-menu-item").index();
                $(".autoSing > a").removeClass("ui-state-hover");
                $(".autoSing > a").eq(fews).addClass("ui-state-hover");
                if (!$(d.target).closest(".ui-menu-item").find("ol").is(":visible")) {
                    hideAllSubs();
                }
                $(".ui-state-hover").siblings("ol").delay(150).fadeIn(400);
            })
            .on("click", function (e) {
                e.preventDefault();
                var sel = $(".ui-state-hover").siblings("ol").find("a").hasClass("selected");
                goToLink(sel, b, e);
            })
            .append(subMenuPlat)
            .appendTo(ul);
    }// end render
});// end widget

function selT(a) { $(a).toggleClass("selected"); }

function keepSel(d) {
    var fed = $("ol:visible").parent().index();
    if (fed !== -1) $(".autoSing > a").eq(fed).addClass("ui-state-hover");
}

function hideAllSubs() {
    $(".ui-autocomplete ol").stop(true, true).hide();
}

function goToLink(sel, b, e) {
    if (sel) {
        e.preventDefault();
        var selectedSub = $(".ui-state-hover").siblings("ol").find(".selected");
        var selectedSubId = selectedSub.attr("href");
        location.href = selectedSubId;
    }
    else if ($(".ui-state-hover").parent().index() !== -1) {
        e.preventDefault();
        var thisLink = $(".ui-state-hover").attr("targLink");
        $("input[data-autocomplete-source]").val(thisLink);
        if ($(".ui-state-hover").attr("isGift") === "false") {
            $(".quickInputContainer").submit();
        } else location.href = "/giftcard/addtocart";
    }
    else { return false }
    b.close();
}

// select elem autocompleter
function selElem(e) {
    var der = $(".ui-state-hover").parent().index();
    var $currSel = $(".autoSing > a");
    $currSel.removeClass("ui-state-hover");
    if (e === "+") der = der + 1;
    else if (e === "-") der = der - 1;
    else der = e;
    if (der > ($(".autoSing > a").length - 1)) der = 0;
    hideAllSubs();
    $currSel.eq(der).addClass("ui-state-hover").siblings("ol").delay(150).fadeIn(400);
}

// select sub elem autocompleter
function selSubElem(e) {
    var cer = $(".ui-state-hover").parent().find(".selected").parent().index();
    var $currSel = $(".ui-state-hover").siblings("ol").find("a");
    $currSel.removeClass("selected");
    if (e === "+") cer = cer + 1;
    else if (e === "-") cer = cer - 1;
    else cer = e;
    if (cer > ($currSel.length - 1)) cer = 0;
    $currSel.eq(cer).addClass("selected");
}

$(function () {
    $(".quickSearchInput")
        .platformautocomplete({
            delay: $(".quickSearchInput").attr("delay"),
            minLength: $(".quickSearchInput").attr("min-length"),
            source: $(".quickSearchInput").attr("data-autocomplete-source"),
            search: function (e, ui) {
                console.log($(this).attr("delay"));
                $(".qSpinner").show();
                $(".autoNoRes").remove();
            },
            response: function (e, ui) {
                $(".qSpinner").hide();
                if (ui.content.length === 0) {
                    e.preventDefault();
                    var emptyelem = "<div class=\"autoNoRes\">No Results</div>";
                    $(".quickInputContainer").append(emptyelem);
                    $(".autoNoRes").fadeIn();
                }
            },
            focus: function (e, ui) {
                e.preventDefault();
            }
        })
        .focus(function () {
            $(".quickSearch").addClass("selec");
            $(".quickInputContainer > p").hide();
        })
        .blur(function () {
            $(".quickSearch").removeClass("selec");
            $(".autoNoRes").remove();
            if ($(this).val() === "") $(".quickInputContainer > p").show();
        });

    if ($(".quickSearchInput").val() === "") {
        $(".quickInputContainer > p").show();
    }
});

/* On load*/
$(function () {

    /* Platforms Dropdown */

    $(".platformBar")
        .on("mouseenter", "ul > li", function () {
            if ($(window).innerWidth() <= 959) return false;
            var thisElem = this;
            if (!$(thisElem).find(".platformPopup")[0]) {
                return;
            }
            var overLeft = $(thisElem).position().left;
            var popWidth = $(thisElem).find(".platformPopup").width();
            var containerWidth = $(".platformBar").width();
            if ((overLeft + popWidth) > containerWidth) {
                $(thisElem).find(".platformPopup")[0].style.marginLeft = -(((overLeft + popWidth) - containerWidth)) + "px";
            }
            clearTimeout(this.popTimeOut);
            this.popTimeIn = setTimeout(function () {
                //thisElem.className = "platOp";
                $(thisElem).find(".platformPopup").fadeIn(100);
            }, 200);
        })
        .on("mouseleave", " ul > li", function () {
            if ($(window).innerWidth() <= 959) return false;
            var thisElem = this;
            clearTimeout(this.popTimeIn);
            this.popTimeOut = setTimeout(function () {
                $(thisElem).find(".platformPopup")
                    .fadeOut(100
                        //	,function() {	thisElem.className = ""}
                    );
            }, 200);
        })
        .on("click", ".subMenuMob .platButton", function (e) {
            e.preventDefault();
            if ($(window).innerWidth() > 959) return false;
            var $this = $(this);
            $this.parent().addClass("subMenuMobOpen");
            $this.siblings(".platformPopup").slideToggle();
        });

    /* bindleftbar */
    var mobileSearchScrolled = false;

    if ($(".leftBar")[0]) {
        var direction = "down";
        var scrollPosition = 0;
        var originalTop = $(".leftBar").position().top;
        if (originalTop < -500) originalTop = 179;
        var lockedTo = "none";

        mobileLeftBar();
        fixLeftBar();

        $(window).on("scroll", function () {
            if ($("body").width() <= 959) {
                var scrollPos = $(".searchRefinement").position().top;
                if (!mobileSearchScrolled) {
                    mobileSearchScrolled = true;
                    fixLeftBar();
                    setTimeout(function () { mobileSearchScrolled = false; }, 500);
                } else if (scrollPos <= 200) {
                    fixLeftBar(); // Remove filter if we have scrolled to the top
                }
            } else {
                fixLeftBar();
            }
        });

        $(window).resize(function () {
            direction = "down";
            scrollPosition = 0;
            lockedTo = "none";
            $(".leftBar").stop().css({ 'position': "", 'display': "", 'top': "", 'left': "" }).removeClass("notan");
            mobileLeftBar();
            fixLeftBar();
        });
    }

    /* Mobile left bar */
    function mobileLeftBar() {
        if ($("body").width() <= 959) {
            var opButton = "<a href=\"#\" id=\"leftOpener\">Filtri</a>";
            var leftCol = $(".leftBar");
            var leftInn = $(".leftBarIn");
            var winhHe = $(window).height() - 90;
            if ($("body").width() <= 959 && leftInn.height() > winhHe) {
                leftInn.height(winhHe + 4);
            } else {
                leftInn.css({ 'height': "" });
            }
            if (!$("#leftOpener")[0]) {

                leftCol.prepend(opButton);

                $("#leftOpener").click(function (e) {
                    e.preventDefault();
                    if ($(this).hasClass("closeLe")) {
                        leftCol.animate({ "left": "-230px" });
                        $(this).removeClass("closeLe");
                    } else {
                        leftCol.animate({ "left": "0px" });
                        $(this).addClass("closeLe");
                    }
                });
            }
        }
    }

    /* Fix left bar */
    function fixLeftBar() {
        var delayFromTop;
        if ($(".searchSum")[0]) {
            delayFromTop = $(".searchSum").offset().top;
        } else if ($(".loy-left-menu")[0]) {
            delayFromTop = 0;
        } else {
            delayFromTop = originalTop;
        }
        var barHe = $(".topPanel").height();
        var windowHeight = $(window).height();
        var offsetFooter = $(".mainFooter").offset().top;

        //IMC-625 undo of original fix because it wasnt a fix after all
        var sidebarHeight = $(".leftBar").height();
        var $sideBar = $(".leftBar");

        if ($(this).scrollTop() > scrollPosition) {
            direction = "down";
        } else {
            direction = "up";
        }

        scrollPosition = $(this).scrollTop(); //absolute var!
        var footFromTopWin = offsetFooter - scrollPosition;
        var footFromBottomWin = windowHeight - footFromTopWin;
        var leftOverFlow = sidebarHeight - windowHeight;

        if (windowHeight > sidebarHeight && $("body").width() <= 959) // if leftbar is lower than window
        {
            if (scrollPosition >= (delayFromTop - barHe)) {
                if (!$sideBar.hasClass("notan")) {
                    $sideBar.addClass("notan");
                }
                if ($sideBar.position().top !== 101) {
                    // Display the filter side bar if it isn't visible
                    $sideBar.css({ 'display': "", 'top': barHe, 'left': "-300px" });
                    $sideBar.animate({ 'left': "-230px" });
                }
            } else {
                $sideBar.removeClass("notan");
                $("#leftOpener").removeClass("closeLe");
                $sideBar.css({ 'display': "", 'top': "", 'left': "" });
            }
        } else
            if (windowHeight > sidebarHeight) { // if leftbar is lower than window
                if (scrollPosition >= originalTop - barHe) {
                    if ((footFromTopWin) < sidebarHeight + barHe) {
                        $sideBar.css({ 'position': "fixed", 'top': "auto", 'bottom': footFromBottomWin + "px" });
                    } else {
                        $sideBar.css({ 'position': "fixed", 'top': barHe + "px", 'bottom': "auto" });
                    }
                } else {
                    $sideBar.css({ 'position': "static", 'top': "auto", 'bottom': "auto" });
                }
            } else { // if leftbar is higher than window
                if (footFromBottomWin < 0) footFromBottomWin = 0;
                sidebarPosition = $sideBar.position().top;
                windowSideBarHightDiff = sidebarHeight - windowHeight;
                windowSideBarHightDiff = windowSideBarHightDiff < 0 ? 0 : windowSideBarHightDiff;

                if (direction === "down" && lockedTo === "none" && sidebarPosition < (scrollPosition - windowSideBarHightDiff)) {
                    $sideBar.css({
                        'position': "fixed",
                        'top': "",
                        'bottom': footFromBottomWin + "px"
                    });
                    lockedTo = "bottom";
                } else if (direction === "down" && lockedTo === "none") {
                    $sideBar.css({
                        'position': "",
                        'top': "",
                        'bottom': ""
                    });
                    lockedTo = "none";
                } else if (direction === "down" && lockedTo === "bottom" && footFromBottomWin > 0) {
                    $sideBar.css({
                        'position': "fixed",
                        'top': "",
                        'bottom': footFromBottomWin + "px"
                    });
                    lockedTo = "bottom";
                } else if (direction === "down" && lockedTo === "top") {
                    $sideBar.css({
                        'position': "absolute",
                        'bottom': "",
                        'top': scrollPosition + barHe + "px"
                    });
                    lockedTo = "none";
                } else if (direction === "up" && scrollPosition <= originalTop - barHe) {
                    $sideBar.css({
                        'position': "",
                        'bottom': "",
                        'top': ""
                    });
                    lockedTo = "none";
                } else if (direction === "up" && lockedTo === "bottom") {
                    $sideBar.css({
                        'position': "absolute",
                        'bottom': "",
                        'top': scrollPosition - leftOverFlow - footFromBottomWin + "px"
                    });
                    lockedTo = "none";
                } else if (direction === "up" && lockedTo === "none" && sidebarPosition - barHe >= scrollPosition && originalTop < scrollPosition && $(".leftColumn").css("position") !== "static") {
                    $sideBar.css({
                        'position': "fixed",
                        'bottom': "",
                        'top': barHe + "px"
                    });
                    lockedTo = "top";
                }
            }
    }

    /* bindBundle */
    if ($(".bundleBuilder")[0]) {
        var sortop = $(".bundleConstruct").offset().top - 48;
        $(window).scroll(function (event) {
            var y = $(this).scrollTop();
            if (y >= sortop && $(".allChosen").css("display") === "none") {
                var ee = $(".bundleConstruct").height() + 20;
                $(".bundleChoose").css("margin-top", ee);
                $(".bundleConstruct").addClass("fixed");
            } else {
                $(".bundleChoose").css("margin-top", "20px");
                $(".bundleConstruct").removeClass("fixed");
            }
        });
    }

    /* bindSort */
    if ($(".sorting")[0] && $("body").width() > 959) {
        var sortPoz = $(".sorting");
        var sortop = sortPoz.offset().top - 126;
        $(window).scroll(function (event) {
            var y = $(this).scrollTop();
            if (y >= sortop) {
                $(".sorting p").addClass("fixed");
            } else {
                $(".sorting p").removeClass("fixed");
            }
        });
    }

    $("body")
        .on("mouseenter", ".crit", function () {
            var lefted = (-56 + (($(this).width()) / 2) + 10);
            $(this).find("span").css("left", lefted);

            var ee = $(this);
            clearTimeout(this.sortTimeOut);
            this.sortTimeIn = setTimeout(function () {
                $(ee).find("span").fadeIn(100);
            }, 200);
        })
        .on("mouseleave", ".crit", function () {
            var ee = $(this);
            clearTimeout(this.sortTimeIn);
            this.sortTimeOut = setTimeout(function () {
                $(ee).find("span").fadeOut(100);
            }, 200);
        });

    /* scrolling anchors */
    $("body")
        .on("click", ".anc", function (e) {
            e.preventDefault();
            var elementClicked = $(this).attr("href");
            var destination = $(elementClicked).offset().top;
            var fromTop = 60;
            $("body,html:not(:animated)").animate({ scrollTop: destination - fromTop }, 500);
        });
});

function openAler(pvId, pId) {

    var callurl = "/Platform/AddToCartPopup";

    var continueShopKey = $("#continueShopKey").val();
    var goToCheckKey = $("#goToCheckKey").val();
    var dialogButtons = {};
    dialogButtons = [
        {
            text: continueShopKey,
            "class": "ui-button-clear",
            "id": "productContinueShopping",
            click: function () {
                $(this).dialog("close");
            }
        },
        {
            text: goToCheckKey,
            "id": "productGoToCart",
            click: function () {
                window.location.href = "/App/Index";
            }
        }
    ];

    $.ajax({
        url: callurl,
        type: "POST",
        async: true,
        data: { pvId: pvId, pId: pId },

        success: function (result) {
            $(".addedToCart").html(result);

            var wid = $(window).innerWidth() - 50;
            if (wid > 550) wid = 550;

            $(".addedToCart").dialog({
                width: wid,
                height: "auto",
                dialogClass: "noTitle",
                show: { effect: "slide", direction: "up", duration: 200 },
                hide: { effect: "slide", direction: "up", duration: 200 },
                modal: true,
                buttons: dialogButtons
            });
        },

        error: function (jqXhr, textStatus, errorThrown) {
            // alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
        }
    });
}

/* show hide results loader */
function showLoader(num, dir) {
    $(".crit").removeClass("asc des active");
    var crit = $(".crit").eq(num - 1).addClass("active").data("sortDir", dir).addClass(dir);

    $("body,html:not(:animated)").animate({ scrollTop: 0 }, 500);
    $("#scroller").hide().removeAttr("startPr endProd");
    var textTop = $("#pagerInf div p a")[0];
    var textTopPa = $(textTop).html();
    $("#pagerInf > div").html("<p><a href='#productsList' class='anc'>" + textTopPa + "</a></p>");
    $("#productsList").fadeOut(400, function () { $(".loaderBig").fadeIn(400); });
    resetCounter();
}

function hideLoader() {
    $(".loaderBig").fadeOut(400, function () {
        $("#scroller").fadeIn(400);
        $("#productsList").fadeIn(400, function () {
            $(".loaderBig").hide();
            if (ImageLazyLoad) ImageLazyLoad.LoadVisImgs();
        });
    });
}

/*  load header popups*/
function loadHeaderBar() {
    $.ajax({
        url: "/Platform/_HeaderBarPlatforms" + currentPlatformId,
        type: "GET"
    })
        .success(function (result) {
            // Display the section contents.
            $("#menu").html(result);
        })
        .error(function (xhr, status) {
            //alert(xhr.responseText);
        });
}

/* ProductSheet
------------------------------------------------------------------------- */

function openStoreLocator() {
    $("#storeLocatoreForm").submit();
}

$(function () {
    if ($(".checkValBtn").length > 0) {
        $(".checkValBtn").on("click", function (e) {
            e.preventDefault();
            var wid = $(window).innerWidth() - 50;
            if (wid > 550) wid = 550;
            var titleTranslation = $("#validityTitle").val();

            $("#promoVerifyDiv").dialog({
                width: wid,
                height: "auto",
                title: titleTranslation,
                modal: true,
                buttons: [
                    {
                        text: $("#closeContentKey").val(),
                        click: function () { $(this).dialog("close"); }
                    }
                ]
            });

        });
    }
});

$(function () {
    var titleTranslation = $("#titleContentKey").val();
    var closeTranslation = $("#closeContentKey").val();
    var dialogButtons = {};
    dialogButtons[closeTranslation] = function () { $(this).dialog("close"); };
    $("#giveawayInfoDiv").dialog({
        autoOpen: false,
        title: titleTranslation,
        width: "auto",
        maxWidth: 500,
        height: "auto",
        modal: true,
        buttons: dialogButtons,
        fluid: true
    });
    SetDialogOperations("#giveawayInfoDiv");
});

function openGiveawayInfoDialog(promotion) {
    $("#giveawayInfoDiv").load("/PromotionInfo/Index", { cache: false, Id: promotion }, function () {
        $("#giveawayInfoDiv").dialog("open");
    });
}

$(function () {
    $("body").on("click", ".openGiveawayPopup", function (e) {
        openGiveawayInfoDialog($(this).attr("targetPromo"));
    });
});

/* non-INFINITE SCROLLING */

$(function () {
    $("body").on("click", ".loadmoreMessage", function (e) {
        var $scroll = $("#scroller");
        var pageDim = parseInt($("#numProductsShown").val());

        if (!$scroll.attr("startPr")) $scroll.attr("startPr", 1);
        if (!$scroll.attr("endProd")) $scroll.attr("endProd", pageDim);

        var scrollStart = parseInt($scroll.attr("startPr"));
        var scrollEnd = parseInt($scroll.attr("endProd"));

        if (!$("#scroller").hasClass("loadingScr") && scrollEnd < lastProd) {

            $scroll.addClass("loadingScr");

            $scroll.attr("startPr", scrollStart + pageDim);
            $scroll.attr("endProd", scrollEnd + pageDim);

            if (parseInt($scroll.attr("endProd")) >= lastProd) { $scroll.attr("endProd", lastProd) }
            var start = parseInt($scroll.attr("startPr")) - 1;

            getNewProds(start, pageDim);
        }
    });
});

function getQueryString_getNewProds(string, includeAnchor) {
    var url = window.location.href;
    if (url.indexOf("?") > -1) {
        var urlBits = url.split("?");
        if (urlBits.length !== 2) {
            console.log("function qsNoAnch: QS malformed");
        }
        var qs = urlBits[1];
        return includeAnchor ? qs : qs.substring(qs.indexOf("#") + 1);
    } else {
        return includeAnchor ? url : url.substring(url.indexOf("#") + 1);
    }
}

function getNewProds(from, how) {
    var qs = getQueryString_getNewProds(window.location.href);
    var activeCrit = $(".crit.active");
    var typesorting = activeCrit.data("sort");
    var sdirection = activeCrit.data("sortDir") === "des" ? "descending" : "ascending";

    if (!typesorting || typesorting < 0) typesorting = 0;

    var newpath = "/SearchResult/QuickSearchAjax?" + qs + "&typesorting=" + (typesorting) + "&sdirection=" + sdirection + "&skippos=" + from + "&takenum=" + how;
    setSearchVariablesInLocalStorage(from, how);

    $.ajax({
        type: "POST",
        url: newpath,
        data: {},
        success: function (data) {
            loadNewProd(data);
        },
        error: function (request, status, err) {   /*alert(request + "\n" + status + "\n" + err)*/ }
    });
}

// Separate Method to handle the coming back from PDP in a proper async way, needed to correctly chain multiple ajax calls and also to properly modify scroll and navigations attributes eventually
async function getNewProdsWithScrolls(from, how, scrollStart, scrollEnd) {
    var qs = getQueryString_getNewProds(window.location.href);
    var activeCrit = $(".crit.active");
    var typesorting = activeCrit.data("sort");
    var sdirection = activeCrit.data("sortDir") === "des" ? "descending" : "ascending";

    if (!typesorting || typesorting < 0) typesorting = 0;

    var newpath = "/SearchResult/QuickSearchAjax?" + qs + "&typesorting=" + (typesorting) + "&sdirection=" + sdirection + "&skippos=" + from + "&takenum=" + how;
    setSearchVariablesInLocalStorage(from, how);
    return await $.ajax({
        type: "POST",
        url: newpath,
        data: {},
        error: function (request, status, err) {   /*alert(request + "\n" + status + "\n" + err)*/ }
    }).then(function (data) {
        setScrollAttributes(scrollStart, scrollEnd);
        loadNewProd(data);
    });

}

function setSearchVariablesInLocalStorage(productSearchFrom, productSearchHow) {
    localStorage.setItem("productSearchFrom", productSearchFrom);
    localStorage.setItem("productSearchHow", productSearchHow);
}

function setScrollAttributes(scrollStart, scrollEnd) {
    var $scroll = $("#scroller");
    $scroll.attr("startPr", parseInt(scrollStart));
    $scroll.attr("endProd", parseInt(scrollEnd));
}

function loadNewProd(data) {
    var newProdBlock = "<p id ='group" + $("#scroller").attr("startPr") + "' class='searchDivider'>" + $("#languageForProductFrom").val() + " " + $("#scroller").attr("startPr") + " " + $("#languageForTo").val() + " " + $("#scroller").attr("endProd") + "</p>" + data;
    var newProdBlockPaging = "<p><a href='#group" + $("#scroller").attr("startPr") + "' class ='anc' >" + $("#languageForProductFrom").val() + " " + $("#scroller").attr("startPr") + " " + $("#languageForTo").val() + " " + $("#scroller").attr("endProd") + " </a></p>";

    /* updates values for loading bar */
    var $scroll = $("#scroller");
    var last = parseInt($scroll.attr("endProd"));
    var totalProductsFound = $(".searchSum").children("strong").first().text();
    $(".loadingbarText").text(last + " / " + totalProductsFound);
    var progressbar = parseFloat(last / totalProductsFound * 100).toFixed(2);
    $(".loadingbarProgress").width(progressbar + "%");


    $("#productsList").append(newProdBlock);
    $("#pagerInf > div").append(newProdBlockPaging);
    $("#scroller").removeClass("loadingScr");
    if (parseInt($("#scroller").attr("endProd")) >= lastProd) { $("#scroller").hide(); }
    if (ImageLazyLoad) {
        ImageLazyLoad.LoadVisImgs();
    }
}

/* Password Strength */

/* Password Strength check */

var kNoCanonicalCounterpart = 0;
var kCapitalLetter = 0;
var kSmallLetter = 1;
var kDigit = 2;
var kPunctuation = 3;
var kAlpha = 4;
var kCanonicalizeLettersOnly = true;
var kCananicalizeEverything = false;
var gDebugOutput = null;
var kDebugTraceLevelNone = 0;
var kDebugTraceLevelSuperDetail = 120;
var kDebugTraceLevelRealDetail = 100;
var kDebugTraceLevelAll = 80;
var kDebugTraceLevelMost = 60;
var kDebugTraceLevelFew = 40;
var kDebugTraceLevelRare = 20;
var gDebugTraceLevel = kDebugTraceLevelNone;

function DebugPrint() {
    var string = "";
    if (gDebugTraceLevel && gDebugOutput && DebugPrint.arguments && (DebugPrint.arguments.length > 1) && (DebugPrint.arguments[0] <= gDebugTraceLevel)) {
        for (var index = 1; index < DebugPrint.arguments.length; index++) {
            string += DebugPrint.arguments[index] + " ";
        }

        string += "<br>\n";
        gDebugOutput(string);
    }
}

function CSimilarityMap() {
    this.m_elements = "";
    this.m_canonicalCounterparts = "";
}

function SimilarityMap_Add(element, canonicalCounterpart) {
    this.m_elements += element;
    this.m_canonicalCounterparts += canonicalCounterpart;
}

function SimilarityMap_Lookup(element) {
    var canonicalCounterpart = kNoCanonicalCounterpart;
    var index = this.m_elements.indexOf(element);
    if (index >= 0) {
        canonicalCounterpart = this.m_canonicalCounterparts.charAt(index);
    }
    return canonicalCounterpart;
}

function SimilarityMap_GetCount() {
    return this.m_elements.length;
}

CSimilarityMap.prototype.Add = SimilarityMap_Add;
CSimilarityMap.prototype.Lookup = SimilarityMap_Lookup;
CSimilarityMap.prototype.GetCount = SimilarityMap_GetCount;

function CDictionaryEntry(length, wordList) {
    this.m_length = length;
    this.m_wordList = wordList;
}

function DictionaryEntry_Lookup(strWord) {
    var fFound = false;
    if (strWord.length === this.m_length) {
        var nFirst = 0;
        var nLast = this.m_wordList.length - 1;
        while (nFirst <= nLast) {
            var nCurrent = Math.floor((nFirst + nLast) / 2);
            if (strWord === this.m_wordList[nCurrent]) {
                fFound = true;
                break;
            }
            else if (strWord > this.m_wordList[nCurrent]) {
                nLast = nCurrent - 1;
            }
            else {
                nFirst = nCurrent + 1;
            }
        }
    }

    return fFound;
}

CDictionaryEntry.prototype.Lookup = DictionaryEntry_Lookup;

function CDictionary() {
    this.m_entries = new Array();
}

function Dictionary_Lookup(strWord) {
    for (var index = 0; index < this.m_entries.length; index++) {
        if (this.m_entries[index].Lookup(strWord)) {
            return true;
        }
    }
}

function Dictionary_Add(length, wordList) {
    var iL = this.m_entries.length;
    var cD = new CDictionaryEntry(length, wordList);
    this.m_entries[iL] = cD;
}

CDictionary.prototype.Lookup = Dictionary_Lookup;
CDictionary.prototype.Add = Dictionary_Add;
var gSimilarityMap = new CSimilarityMap();
var gDictionary = new CDictionary();

function CharacterSetChecks(type, fResult) {
    this.type = type;
    this.fResult = fResult;
}

function isctype(character, type, nDebugLevel) {
    var fResult = false;
    switch (type) {
        case kCapitalLetter:
            if (character >= "A" && character <= "Z") {
                fResult = true;
            }
            break;
        case kSmallLetter:
            if (character >= "a" && character <= "z") {
                fResult = true;
            }
            break;
        case kDigit:
            if (character >= "0" && character <= "9") {
                fResult = true;
            }
            break;
        case kPunctuation:
            if ("!@#$%^&*()_+-='\";:[{]}\|.>,</?`~".indexOf(character) >= 0) {
                fResult = true;
            }
            break;
        case kAlpha:
            if (isctype(character, kCapitalLetter) || isctype(character, kSmallLetter)) {
                fResult = true;
            }
            break;
        default:
            break;
    }
    return fResult;
}

function CanonicalizeWord(strWord, similarityMap, fLettersOnly) {
    var canonicalCounterpart = kNoCanonicalCounterpart;
    var strCanonicalizedWord = "";
    var nStringLength = 0;
    if ((strWord !== null) && (strWord.length > 0)) {
        strCanonicalizedWord = strWord;
        strCanonicalizedWord = strCanonicalizedWord.toLowerCase();
        if (similarityMap.GetCount() > 0) {
            nStringLength = strCanonicalizedWord.length;
            for (var index = 0; index < nStringLength; index++) {
                if (fLettersOnly && !isctype(strCanonicalizedWord.charAt(index), kSmallLetter, kDebugTraceLevelSuperDetail)) {
                    continue;
                }
                canonicalCounterpart = similarityMap.Lookup(strCanonicalizedWord.charAt(index));
                if (canonicalCounterpart !== kNoCanonicalCounterpart) {
                    strCanonicalizedWord = strCanonicalizedWord.substring(0, index) + canonicalCounterpart +
                        strCanonicalizedWord.substring(index + 1, nStringLength);
                }
            }
        }
    }
    return strCanonicalizedWord;
}

function IsLongEnough(strWord, nAtLeastThisLong) {
    if ((strWord === null) || isNaN(nAtLeastThisLong)) {
        return false;
    }
    else if (strWord.length < nAtLeastThisLong) {
        return false;
    }
    return true;
}

function SpansEnoughCharacterSets(strWord, nAtLeastThisMany) {
    var nCharSets = 0;
    var charSet;
    var characterSetChecks = new Array(
        new CharacterSetChecks(kCapitalLetter, false),
        new CharacterSetChecks(kSmallLetter, false),
        new CharacterSetChecks(kDigit, false),
        new CharacterSetChecks(kPunctuation, false)
    );
    if ((strWord === null) || isNaN(nAtLeastThisMany)) {
        return false;
    }
    for (var index = 0; index < strWord.length; index++) {
        for (charSet = 0; charSet < characterSetChecks.length; charSet++) {
            if (!characterSetChecks[charSet].fResult && isctype(strWord.charAt(index), characterSetChecks[charSet].type, kDebugTraceLevelAll)) {
                characterSetChecks[charSet].fResult = true;
                break;
            }
        }
    }
    for (charSet = 0; charSet < characterSetChecks.length; charSet++) {
        if (characterSetChecks[charSet].fResult) {
            nCharSets++;
        }
    }
    if (nCharSets < nAtLeastThisMany) {
        return false;
    }
    return true;
}

function FoundInDictionary(strWord, similarityMap, dictionary) {
    if (strWord === null || similarityMap === null || dictionary === null) {
        return true;
    }
    var strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap, kCanonicalizeLettersOnly);
    if (dictionary.Lookup(strCanonicalizedWord)) {
        return true;
    }
    return false;
}

function IsCloseVariationOfAWordInDictionary(strWord, threshold, similarityMap, dictionary) {
    if (strWord === null || isNaN(threshold) || similarityMap === null || dictionary === null) {
        return true;
    }
    var strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap, kCananicalizeEverything);
    var nMinimumMeaningfulMatchLength = Math.floor((threshold) * strCanonicalizedWord.length);
    for (var nSubStringLength = strCanonicalizedWord.length; nSubStringLength >= nMinimumMeaningfulMatchLength; nSubStringLength--) {
        for (var nSubStringStart = 0; (nSubStringStart + nMinimumMeaningfulMatchLength) < strCanonicalizedWord.length; nSubStringStart++) {
            var strSubWord = strCanonicalizedWord.substr(nSubStringStart, nSubStringLength);
            if (dictionary.Lookup(strSubWord)) {
                return true;
            }
        }
    }
    return false;
}

function Init() {
    gSimilarityMap.Add("3", "e");
    gSimilarityMap.Add("x", "k");
    gSimilarityMap.Add("5", "s");
    gSimilarityMap.Add("$", "s");
    gSimilarityMap.Add("6", "g");
    gSimilarityMap.Add("7", "t");
    gSimilarityMap.Add("8", "b");
    gSimilarityMap.Add("|", "l");
    gSimilarityMap.Add("9", "g");
    gSimilarityMap.Add("+", "t");
    gSimilarityMap.Add("@", "a");
    gSimilarityMap.Add("0", "o");
    gSimilarityMap.Add("1", "l");
    gSimilarityMap.Add("2", "z");
    gSimilarityMap.Add("!", "i");
    gDictionary.Add(3,
        "oat|not|ken|keg|ham|hal|gas|cpu|cit|bop|bah".split("|"));
    gDictionary.Add(4,
        "zeus|ymca|yang|alex|abcd".split("|"));
    gDictionary.Add(5,
        "yacht|xerox|aires|admin|adept|adele|addle|addis|added|acura|abyss|abcde|1701d|123go|!@#$%".split("|"));
    gDictionary.Add(6,
        "yankee|yamaha|123abc|10sne1|0p9o8i|!@#$%^".split("|"));
    gDictionary.Add(7,
        "yolanda|wyoming|abcdefg|!@#$%^&".split("|"));
    gDictionary.Add(8,
        "yosemite|y7u8i9o0|0p9o8i7u|0987poiu|!@#$%^&*".split("|"));
    gDictionary.Add(9,
        "zimmerman|worldwide|adenosine|abcabcabc".split("|"));
    gDictionary.Add(10,
        "washington|volkswagen|1q2w3e4r5t".split("|"));
    gDictionary.Add(11,
        "yellowstone|venturesome|appreciable|anastomotic|albuquerque".split("|"));
    gDictionary.Add(12,
        "williamsburg|testamentary|burglarproof|bloodletting|bilharziasis|asynchronous|asymptomatic|ambidextrous|1q2w3e4r5t6y".split("|"));
    gDictionary.Add(13,
        "ventriloquist|ventriloquism|comprehension".split("|"));
    gDictionary.Add(14,
        "slaughterhouse|irreproducible|incompressible|comprehensible|bremsstrahlung".split("|"));
    gDictionary.Add(15,
        "irreconciliable|instrumentation|incomprehension".split("|"));
    gDictionary.Add(16,
        "incomprehensible".split("|"));
}

function ClientSideStrongPassword() {
    return IsLongEnough(ClientSideStrongPassword.arguments[0], "8") && SpansEnoughCharacterSets(ClientSideStrongPassword.arguments[0], "3") && (!(IsCloseVariationOfAWordInDictionary(ClientSideStrongPassword.arguments[0], "0.6", ClientSideStrongPassword.arguments[1], ClientSideStrongPassword.arguments[2])));
}

function ClientSideBestPassword() {
    return IsLongEnough(ClientSideBestPassword.arguments[0], "14") && SpansEnoughCharacterSets(ClientSideBestPassword.arguments[0], "3") && (!(IsCloseVariationOfAWordInDictionary(ClientSideBestPassword.arguments[0], "0.6", ClientSideBestPassword.arguments[1], ClientSideBestPassword.arguments[2])));
}

function ClientSideMediumPassword() {
    return IsLongEnough(ClientSideMediumPassword.arguments[0], "8") && SpansEnoughCharacterSets(ClientSideMediumPassword.arguments[0], "2") && (!(FoundInDictionary(ClientSideMediumPassword.arguments[0], ClientSideMediumPassword.arguments[1], ClientSideMediumPassword.arguments[2])));
}

function ClientSideWeakPassword() {
    return IsLongEnough(ClientSideWeakPassword.arguments[0], "1") || (!(IsLongEnough(ClientSideWeakPassword.arguments[0], "0")));
}

function GEId(sID) {
    return document.getElementById(sID);
}

function GEbyTypeClass(eleTypeName, eleClassName) {
    var elem_list = document.getElementsByTagName(eleTypeName);

    for (var loop = 0; loop < elem_list.length; loop++) {

        if (elem_list[loop].className === eleClassName) {
            return elem_list[loop];
        }
    }
}

function EvalPwdStrength(idPwdField) {

    if (ClientSideBestPassword(idPwdField, gSimilarityMap, gDictionary)) {
        DispPwdStrengthDiv(4);
    }
    else if (ClientSideStrongPassword(idPwdField, gSimilarityMap, gDictionary)) {
        DispPwdStrengthDiv(3);
    }
    else if (ClientSideMediumPassword(idPwdField, gSimilarityMap, gDictionary)) {
        DispPwdStrengthDiv(2);
    }
    else if (ClientSideWeakPassword(idPwdField, gSimilarityMap, gDictionary)) {
        DispPwdStrengthDiv(1);
    }
    else {
        DispPwdStrengthDiv(0);
    }
}

function PadPasswd(oF, lPwd) {
    if (typeof oF.PwdPad === "object") {
        var sPad = "djg";
        var lPad = sPad.length - lPwd;
        oF.PwdPad.value = sPad.substr(0, (lPad < 0) ? 0 : lPad);
    }
}

function DispPwdStrengthDiv(strength) {
    $(".pwdStr").removeClass().addClass("pwdStr");

    if (strength > 4) { strength = 4; }
    if (strength === 1) {
        $(".pwdStr").addClass("pwdLow");
    }
    else if (strength === 2) {
        $(".pwdStr").addClass("pwdMed");
    }
    else if (strength === 3) {
        $(".pwdStr").addClass("pwdHi");
    }
    else if (strength === 4) {
        $(".pwdStr").addClass("pwdPer");
    }
}

$(".ordDet").on("click", function (e) {
    e.preventDefault();
    window.location = $(this).attr("href");
});

$("body").on("keyup", "#pwdToCheck", function (e) {
    if (e.which === 13) {
        $("#pwdDialogSubmit").click();
        return false;
    }
});

$(function () {
    $("body")
        .on("keyup", "#NewPassword", function () {
            EvalPwdStrength($(this).val());
        })
        .on("keyup", "#Password", function () {
            EvalPwdStrength($(this).val());
        });
});

// ROPIS popup

$(function () {
    if ($("#RopisPopup")) {

        var wid = $(window).innerWidth() - 50;
        var close = $('#closeRopisDialog').val();
        if (wid > 500) wid = 350;

        $("#RopisPopup").dialog({
            autoOpen: false,
            title: $(".ropisTitlePop").html(),
            width: wid,
            height: "auto",
            modal: true,
            buttons: [{
                text: close,
                click: function () {
                    $(this).dialog("close");
                }
            }]
        });

        $(".mainContainer").on("click", ".ropisPop", function (e) {
            e.preventDefault();
            $("#RopisPopup").dialog("open");
        });
    }
});

// Digital and PC popup

$(function () {
    if ($("#DigitalAndPCPopup")) {

        var wid = $(window).innerWidth() - 50;
        if (wid > 500) wid = 350;

        $("#DigitalAndPCPopup").dialog({
            autoOpen: false,
            title: $(".digitalAndPCTitlePop").html(),
            width: wid,
            height: "auto",
            modal: true,
            buttons: {
                closeKey: function () { $(this).dialog("close"); }
            }
        });

        $(".mainContainer").on("click", ".digitalPop", function (e) {
            e.preventDefault();
            $("#DigitalAndPCPopup").dialog("open");
        });
    }
});

var closeKey = "close";
// Digital and DLC popup

$(function () {
    if ($("#DigitalAndDLCPopup")) {

        var wid = $(window).innerWidth() - 50;
        var dialogButtons = {};
        dialogButtons = [
            {
                text: closeKey,
                click: function () { $(this).dialog("close"); }
            }];
        if (wid > 500) wid = 350;

        $("#DigitalAndDLCPopup").dialog({
            autoOpen: false,
            title: $(".digitalAndDLCTitlePop").html(),
            width: wid,
            height: "auto",
            modal: true,
            buttons: dialogButtons
        });

        $(".mainContainer").on("click", ".digitalPopDLC", function (e) {
            e.preventDefault();
            $("#DigitalAndDLCPopup").dialog("open");
        });
    }
});

$(function () {
    if ($("#DigitalInstructionsPopup")) {

        var wid = $(window).innerWidth() - 50;
        if (wid > 500) wid = 350;
        var dialogButtons = {};
        dialogButtons = [
            {
                text: closeKey,
                click: function () { $(this).dialog("close"); }
            }];

        $("#DigitalInstructionsPopup").dialog({
            autoOpen: false,
            width: wid,
            height: "auto",
            modal: true,
            buttons: dialogButtons
        });

        $(".mainContainer").on("click", ".digitalInstructionsPop", function (e) {
            e.preventDefault();
            var op = $(this).data("id");
            var callurl = "/AccountManagement/GetInstructions";
            $.ajax({
                url: callurl,
                type: "POST",
                async: true,
                data: { orderProduct: op },
                success: function (result) {
                    $("#instructionsText").html(result);
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
                }
            });
            $("#DigitalInstructionsPopup").dialog("open");
        });
    }
});

$(function () {
    if ($("#DigitalTokenPopup")) {

        var wid = $(window).innerWidth() - 50;
        if (wid > 500) wid = 470;
        var dialogButtons = {};
        dialogButtons = [
            {
                text: closeKey,
                click: function () { $(this).dialog("close"); }
            }];

        $("#DigitalTokenPopup").dialog({
            autoOpen: false,
            width: wid,
            height: "auto",
            modal: true,
            buttons: dialogButtons
        });

        $(".mainContainer").on("click", ".digitalTokenPop", function (e) {
            e.preventDefault();
            var op = $(this).data("id");
            var callurl = "/AccountManagement/GetToken";
            $.ajax({
                url: callurl,
                type: "POST",
                async: true,
                data: { orderProduct: op },
                success: function (result) {
                    $("#tokenText").html(result);
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    console.log("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
                }
            });
            $("#DigitalTokenPopup").dialog("open");
        });
    }
});

// Rating function
$(function () {
    if ($(".rating")[0]) {
        $(".rating").mouseenter(function () {
            $("#rated").hide();
            $("#rater").show();
        });
        $(".rating").mouseleave(function () {
            $("#rater").hide();
            $("#rated").show();
        });

        $(".auto-submit-star").rating({
            callback: function (value, link) {
                var productId = $("input[name=productId]").val();
                var score = $("input[name=score]:checked").val();

                $.ajax({
                    type: "POST",
                    url: "/Platform/RateProduct",
                    data: { productId: productId, score: score },
                    dataType: "text",
                    success: function (response) {
                        var data = JSON.parse(response);
                        if (data.alreadyRated) {
                            $(".rateMessage").html(alreadyRat);
                        } else {
                            $(".rateMessage").html(elaborate);
                            $("#ratingAverage").html(data.averageRating.toFixed(2));
                            $("#ratersCount").html(data.raters);
                        }
                        $("#rater").hide();
                        $("#rated").show();
                    },
                    error: function (response) {
                        $(".rateMessage").html("There was an error.");
                    }
                });
            }
        });
    }
});

$(function () {
    // new head
    $("body")
        .on("click", ".showSearch", function (e) {
            e.preventDefault();
            $(".slidingHead").animate({ "left": "-100%" });
            $(".navBarOv").fadeOut(150, function () {
                $(".unloggedMobileHead").fadeIn(150);
            });
        })
        .on("click", ".showLoyal", function (e) {
            e.preventDefault();
            $(".slidingHead").animate({ "left": "0" });
            $(".unloggedMobileHead").fadeOut(150, function () {
                $(".navBarOv").fadeIn(150);
            });
        });
    $(".navBar").on("click", ".openPlatMenu", function (e) {
        e.preventDefault();
        $("#menu").slideToggle();
        //$(this).toggleClass("openMenu");
    });

    // go top button
    $("body").append("<div class='toTopBtn toTopBtnF'>TOP</div>");

    if ($("#topbutton").val() !== 'undefined') {
        $('.topbutton').html($("#topbutton").val());
    }

    $(window).scroll(function (event) {
        var scrollPosition = $(this).scrollTop();
        if (scrollPosition > 150) {
            $(".toTopBtn").fadeIn(400);
        } else {
            $(".toTopBtn").fadeOut(400);
        }
    });

    $(".toTopBtnF")
        .on("click", "", function () {
            $("body,html").animate({ scrollTop: 0 }, "slow");
        });

    //banners sliders

    $(".dynamicBanner").each(function () {
        var $this = $(this);
        if ($this.find(".dynamicSingle")[1]) {
            var thumbsList = $this.siblings(".dynamicThumb");
            var timer = $this.attr("timing");
            if (thumbsList[0]) {
                $this.bxSlider({
                    mode: "horizontal",
                    auto: true,
                    controls: false,
                    pagerCustom: thumbsList,
                    pause: timer,
                    autoHover: true,
                    captions: true,
                    onSliderLoad: function () {
                    }
                });
            } else {
                $this.bxSlider({
                    mode: "horizontal",
                    auto: true,
                    pause: timer,
                    autoHover: true,
                    captions: true,
                    onSliderLoad: function () {
                    }
                });
            }
        }
    });
});

jQuery.validator.addMethod("passwordmatch", function (value, element, param) {

    if (value === null || value.length === 0) {
        return true;
    }
    return value === $(param).val();
});

jQuery.validator.unobtrusive.adapters.add("passwordmatch", ["otherfield"], function (options) {
    options.rules["passwordmatch"] = "#" + options.params.otherfield;
    options.messages["passwordmatch"] = options.message;
});

jQuery.validator.addMethod("passwordpresent", function (value, element, param) {
    if (value === null || value.length === 0) {
        return true;
    }
    else {
        return $(param).val().length > 0;
    }
});

jQuery.validator.unobtrusive.adapters.add("passwordpresent", ["otherfield"], function (options) {
    options.rules["passwordpresent"] = "#" + options.params.otherfield;
    options.messages["passwordpresent"] = options.message;
});

/* Custom radio */
(function ($) {
    $.fn.extend({
        customRadio: function (options) {
            return this.each(function () {
                if ($(this).prev().hasClass("customRadio")) {
                } else {
                    if ($(this).is(":disabled")) {
                        $(this)
                            .wrap('<span class="customContSelRadio" />')
                            .before('<span class="customRadio disab"><span></span></span>')
                            .css({ position: 'absolute', opacity: 0 });
                    } else {
                        $(this)
                            .wrap('<span class="customContSelRadio" />')
                            .before('<span class="customRadio"><span></span></span>')
                            .css({ position: 'absolute', opacity: 0 });
                    }
                    var selectBoxSpan = $(this).prev();
                    selectBoxSpan.css({ display: 'inline-block' });
                    if ($(this).is(':checked')) {
                        selectBoxSpan.find("span").addClass('cchecked');
                    } else {
                        selectBoxSpan.find("span").removeClass('cchecked');
                    }
                    $(this)
                        .change(function () {
                            var radName = $(this).attr("name");
                            $("[name='" + radName + "']")
                                .each(function () {
                                    if ($(this).is(':checked')) {
                                        $(this).prev().find("span").addClass('cchecked');
                                    } else {
                                        $(this).prev().find("span").removeClass('cchecked');
                                    }
                                })
                        })
                        .focus(function () { selectBoxSpan.addClass('focused'); })
                        .blur(function () { selectBoxSpan.removeClass('focused'); })
                        .keypress(function (e) {
                            if (e.which === 13) {
                                if ($(this).is(':checked')) {
                                    $(this).attr('checked', false);
                                } else {
                                    $(this).attr('checked', true);
                                }
                                var radName = $(this).attr("name");

                                $("[name='" + radName + "']")
                                    .each(function () {
                                        if ($(this).is(':checked')) {
                                            $(this).prev().find("span").addClass('cchecked');
                                        } else {
                                            $(this).prev().find("span").removeClass('cchecked');
                                        }
                                    });
                            }
                        });
                }
            });
        }
    });
})(jQuery);
//Click on the prices on the product page for the radio button...
$('.pricetext').add('#checkboxTwo').click(function () {
    //nordic ecom sites...
    if ($('#checkboxTwo').hasClass('radioButton1')) {
        CheckandUpdateRadio("#checkboxTwo", "#checkboxOne", "#checkboxThree", true, false);
        IsStoreCollectAvailable();
    }
    //normal ecom sites....
    else if ($(".pricetext1").size()) {
        CheckandUpdateRadio("#checkboxTwo", "#checkboxOne", "#checkboxThree", true, false);
        IsAddToCartAvailable();
    }
});

$('.pricetext1').add('#checkboxOne').click(function () {
    //nordic ecom sites....
    if ($('#checkboxTwo').hasClass('radioButton1')) {
        CheckandUpdateRadio("#checkboxOne", "#checkboxTwo", "#checkboxThree", true, false);
        IsStoreCollectAvailable();
    }
    //normal ecom sites....
    else if ($(".Clickbutton").size()) {
        CheckandUpdateRadio("#checkboxOne", "#checkboxTwo", "#checkboxThree", true, false);
        IsAddToCartAvailable();
    }
});

$('.pricetext2').add('#checkboxthree').click(function () {
    //nordic ecom sites....
    if ($('#checkboxTwo').hasClass('radioButton1')) {
        CheckandUpdateRadio("#checkboxThree", "#checkboxOne", "#checkboxTwo", true, false);
        IsStoreCollectAvailable();
    }
    //normal ecom sites....
    else if ($(".Clickbutton").size()) {
        CheckandUpdateRadio("#checkboxThree", "#checkboxOne", "#checkboxTwo", true, false);
        IsAddToCartAvailable();
    }
});

function CheckandUpdateRadio(radioselector1, radioselector2, radioselector3, boolTrue, boolfalse) {
    $(radioselector1).prop('checked', boolTrue);
    $(radioselector2).prop('checked', boolfalse);
    $(radioselector3).prop('checked', boolfalse);
    UpdateRadioButton($(radioselector1), boolTrue);
    UpdateRadioButton($(radioselector2), boolfalse);
    UpdateRadioButton($(radioselector3), boolfalse);
    ClearProtectionCheckbox();
}

function ClearProtectionCheckbox() {
    $(".productProtectionCheckbox").prop("checked", false);
}

// Ensures only one checkbox is selected
$(".productProtectionCheckbox").on('click', function () {
    var $box = $(this); // 'this' refers to the box clicked on
    if ($box.is(":checked")) {
        // Set all the checkboxes to unchecked
        $(".productProtectionCheckbox").prop("checked", false);
        $box.prop("checked", true); // Then check the one that was clicked on
    } else {
        $box.prop("checked", false);
    }
});

function UpdateRadioButton(el, dochecked) {

    var selectBoxSpan = $(el).prev();
    selectBoxSpan.css({ display: "inline-block" });

    if (dochecked) {
        selectBoxSpan.find("span").addClass("cchecked");
    } else {
        selectBoxSpan.find("span").removeClass("cchecked");
    }
}

// Only used by Click and Collect only sites.
function IsStoreCollectAvailable() {
    var available1 = $("#checkboxOne").data("available");
    var available2 = $("#checkboxTwo").data("available");

    var checkboxTwoSku = $("#checkboxTwo").data("sku");
    var checkboxOneSku = $("#checkboxTwo").data("sku");

    if ($("#checkboxOne").is(":checked")) {
        if (available1 === "True") {
            showHideButtons(true, ".CollectToStore", ".buyDisabled");
            // TODO Replace this with a call to new cart api
            $('.CollectToStore').attr("href", "/CollectInStore/ReserveInStore?Sku=" + checkboxOneSku);
        } else {
            showHideButtons(false, ".CollectToStore", ".buyDisabled");
        }
    }
    if ($("#checkboxTwo").is(":checked")) {
        if (available2 === "True") {
            showHideButtons(true, ".CollectToStore", ".buyDisabled");
            // TODO Replace this with a call to new cart api
            $('.CollectToStore').attr("href", "/CollectInStore/ReserveInStore?Sku=" + checkboxTwoSku);
        } else {
            showHideButtons(false, ".CollectToStore", ".buyDisabled");
        }
    }
}
function EnabledDisableButton(bool, button1, button2) {
    showHideButtons(bool, button1, button2);
}
function showHideButtons(bool, button1, button2) {
    if (bool) {
        $(button1).show();
        $(button2).hide();
    } else {
        $(button1).hide();
        $(button2).show();
    }
}

// Buy Now radio button
function SetAvailability(variantId) {
    $(".productSelected").hide();
    var element = $("div[name*=" + variantId + "]");
    element.show();
}

function IsAddToCartAvailable() {

    $(".buyDisabled").hide();

    var available1 = $("#checkboxOne").data("available") === "True";
    var available2 = $("#checkboxTwo").data("available") === "True";

    if ($("#checkboxOne").is(":checked")) {
        if (available1) {
            $(".cartAddRadio").show();
            $(".buyDisabled").hide();
        }
        else {
            $(".cartAddRadio").hide();
            $(".buyDisabled").show();
        }
    } else if ($("#checkboxTwo").is(":checked")) {
        if (available2) {
            $(".cartAddRadio").show();
            $(".buyDisabled").hide();
        }
        else {
            $(".cartAddRadio").hide();
            $(".buyDisabled").show();
        }
    } else {
        $(".cartAddRadio").hide();
        $(".buyDisabled").hide();
    }
}

$(function () {
    $(".singleVariantRadio [type=radio]").customRadio();
});

/* NEW PROD PAGE */

$(function () {
    $(".mediaImages")
        .on("click", ".gallery", function (e) {
            e.preventDefault();
            $(".bigZoomImg img").attr("src", $(this).attr("href"));
            $(".gallery").removeClass("sel");
            $(this).addClass("sel");
        });

    $("body")
        .on("click", ".tradeValueOpener", function (e) {
            e.preventDefault();
            $("#tradeValueTC").fadeToggle();
            $(this).toggleClass("sel");
        });

    $("body")
        .on("click", "#xaaProductOfferOpener", function (e) {
            e.preventDefault();
            $(".xaaProductInterstitialModal").fadeToggle();
            $(this).toggleClass("sel");
        });

    $("body")
        .on("click", ".xaaProductOfferPopup > .close a", function (e) {
            e.preventDefault();
            $(".xaaProductInterstitialModal").fadeToggle();
            $("#xaaProductOfferOpener").toggleClass("sel");
        });

    $("body")
        .on("click", "#xaaBuyButton", function (e) {
            e.preventDefault();
            $(".xaaProductInterstitialModal").fadeToggle();
            $(this).toggleClass("sel");
        });

    $("body")
        .on("click", "#xaaProductInterstitialClose", function (e) {
            e.preventDefault();
            $(".xaaProductInterstitialModal").fadeToggle();
            $(this).toggleClass("sel");
        });
});

/* promo popup */

$(function () {
    if ($(".splashPage").length > 0) {
        $(".splashPage").dialog({
            width: "auto",
            maxWidth: 550,
            height: "auto",
            dialogClass: "ui-dialog-with-close",
            modal: true,
            fluid: true, //new option
            resizable: false
        });
        SetDialogOperations(".splashPage");
    }
});

// This removes suggestion drop down functionality from mobile devices
$(function () {
    var isMbl = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
    if (isMbl) $(".quickSearchInput").off(); //stip keypress/down/up etc from search box
});

function validateCanadianAddress() {
    $(".DOTSwarn").hide();
    $(".DOTSerr").hide();

    var inAddress1 = $("input[name='Address.Address1']");
    var inAddress2 = $("input[name='Address.Address2']");
    var inCity = $("input[name='Address.City']");
    var inProvince = $("select[name='Address.ProvinceId']");
    var inPostalCode = $("input[name='Address.Zip']");

    var address1 = $(inAddress1).val().toUpperCase();
    var address2 = $(inAddress2).val().toUpperCase();
    var city = $(inCity).val().toUpperCase();
    var province = $(inProvince).val();
    var postalCode = $(inPostalCode).val().toUpperCase();
    var response = false;

    $.ajax({
        async: false,
        type: "POST",
        url: "/Account/ValidateCanadianAddress",
        data: { address1: address1, address2: address2, city: city, province: province, postalCode: postalCode },
        success: function (data) {

            switch (data) {
                case "ok":
                    response = true;
                    break;
                case "warning":
                    $(".DOTSwarn").show();
                    $(".DOTSanyw").show();
                    response = false;
                    break;
                case "error":
                    $(".DOTSerr").show();
                    $(".DOTSanyw").show();
                    response = false;
                    break;
                default:
                    var thisFix;
                    if (data.address1 !== address1) {
                        thisFix = $(inAddress1).siblings(".fixedText");
                        thisFix.show();
                        thisFix.find("em").html(data.address1);
                        thisFix.find("a").attr("subVal", data.address1);
                    }
                    if (data.address2 !== address2) {
                        thisFix = $(inAddress2).siblings(".fixedText");
                        thisFix.show();
                        thisFix.find("em").html(data.address2);
                        thisFix.find("a").attr("subVal", data.address2);
                    }
                    if (data.city !== city) {
                        thisFix = $(inCity).siblings(".fixedText");
                        thisFix.show();
                        thisFix.find("em").html(data.city);
                        thisFix.find("a").attr("subVal", data.city);
                    }
                    if (data.provinceId !== province) {
                        thisFix = $(inProvince).siblings(".fixedText");
                        thisFix.show();
                        thisFix.find("em").html(data.provinceName);
                        thisFix.find("a").attr("subVal", data.provinceId);
                    }
                    if (data.postalCode !== postalCode) {
                        thisFix = $(inPostalCode).siblings(".fixedText");
                        thisFix.show();
                        thisFix.find("em").html(data.postalCode);
                        thisFix.find("a").attr("subVal", data.postalCode);
                    }

                    $(".DOTQuicklinks").show();

                    response = false;
                    break;
            }
        }
    });
    return response;
}

/* JQUERY Dialog Responsive Options*/
function fluidDialog() {
    var $visible = $(".ui-dialog:visible");
    // each open dialog
    $visible.each(function () {
        var $this = $(this);
        var dialog = $this.find(".ui-dialog-content").data("ui-dialog");
        // if fluid option == true
        if (dialog.options.fluid) {
            var wWidth = $(window).width();
            // check window width against dialog width
            if (wWidth < parseInt(dialog.options.maxWidth) + 50) {
                // keep dialog from filling entire screen
                if (wWidth <= 320) {
                    $this.css("max-width", "320px");
                }
                else {
                    $this.css("max-width", "90%");
                }
            } else {
                // fix maxWidth bug
                $this.css("max-width", dialog.options.maxWidth + "px");
            }
            //reposition dialog
            dialog.option("position", dialog.options.position);
        }
    });
}

/*This will set up the events for using fluidDialog on specific Dialog*/

function SetDialogOperations(dialogName) {

    $(function () {
        fluidDialog();
        $(dialogName).dialog();
    });
    // on window resize run function
    $(window).resize(function () {
        fluidDialog();
    });
}

//IMC-3539 - Used for filter on search results page
$(function () {
    $(".filterHeader").on("click", function () {
        var selectedFilter = $(this);
        var unselectedFilters = $(".filterHeader").not(selectedFilter);
        var selectedTypes = $(this).next();
        var expandList = selectedTypes.css("display") === "none";

        if (selectedFilter.hasClass("opened")) {
            selectedFilter.removeClass("opened");
            selectedFilter.find("span").text("+");
            unselectedFilters.removeClass("opened");
            unselectedFilters.find("span").text("+");
        } else {
            unselectedFilters.removeClass("opened");
            unselectedFilters.find("span").text("+");
            selectedFilter.addClass("opened");
            selectedFilter.find("span").text("-");
        }

        unselectedFilters.each(function () {
            var header = $(this).next();
            header.slideUp("slow", function () { });
        });

        selectedTypes.slideToggle("slow", function () {
            if (expandList) {
                return "Expand";
            } else {
                return "Collapse";
            }
        });
    });
});

//IMC-6861 - Add Google tag manager tracking to Add to Cart
function googleTagManagerAddToCart(data) {
    if (data === null || data === undefined || data.sku === undefined) { return; }
    var currency = data.currency;
    var cartItems = [];
    cartItems.push(data);

    var products = this.CreateProducts(cartItems);
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        "event": "addToCart",
        "ecommerce": {
            "currencyCode": currency,
            "add": {
                "products": products
            }
        }
    });
}

function CreateProducts(cartItems) {
    var products = [];
    for (let i = 0; i < cartItems.length; i++) {
        products.push({
            "name": cartItems[i].title,
            "id": cartItems[i].sku.toString(),
            "price": cartItems[i].price.toString(),
            "brand": cartItems[i].brand,
            "category": cartItems[i].category,
            "variant": cartItems[i].variant,
            "quantity": cartItems[i].quantity
        });
    }
    return products;
}

// IMC-6871 Add Google tag manager tracking to Promo click
function GoogleTagManagerPromoClick(id, position, title, link) {

    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        "event": "promotionClick",
        "ecommerce": {
            "promoClick": {
                "promotions": [
                    {
                        "id": id.toString(),
                        "name": title,
                        "creative": link,
                        "position": position.toString()
                    }]
            }
        }
    });
}

// IMC-6871 Add Google tag manager tracking to card and chart locale
function GoogleTagManagerProductClick(data) {
    if (data === null || data === undefined) { return; }
    var products = [];
    products.push(data);

    var googleTagProducts = this.MapGoogleTagProducts(products);

    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        "event": "productClick",
        "ecommerce": {
            "click": {
                "actionField": { "list": "Category" },
                "products": googleTagProducts
            }
        }
    });
}

function MapGoogleTagProducts(products) {
    var googleTagProducts = [];
    var quantity = 1;
    for (let i = 0; i < products.length; i++) {
        googleTagProducts.push({
            "name": products[i].name,
            "id": products[i].id.toString(),
            "price": products[i].price.toString(),
            "brand": products[i].brand,
            "category": products[i].category,
            "variant": products[i].variant,
            "quantity": quantity
        });
    }
    return googleTagProducts;
}

function GoogleTagManagerZeroResults() {
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        "event": "searchItemsNotFound"
    });
}

function IsNullOrUndefined(val) {
    if (val === undefined) {
        return true;
    }
    if (val === null) {
        return true;
    }
    return false;
}

function AddProtection(productVariantId, protectionId) {
    if (protectionId !== 0) {
        $.post("/api/cart/AddProtection?pvId=" + productVariantId + "&bId=0&pId=" + protectionId, function (res) { })
            .fail(function (err) {
                $(".navBarMessage p span").text(err.responseJSON.message);
                $(".navBarMessage").slideDown().delay(2000).slideUp();
            })
            .always(function (data) {
                ClearProtectionCheckbox();
            });
    }
}


function GoogleTagManagerHeroResultEvent(products) {
    if (products === null || products === undefined) { return; }

    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        "event": "heroResultClick",
        "ecommerce": {
            "click": {
                "products": products
            }
        }
    });
};
// REQUIRES: jQuery
// USAGE:
// --------- IN HTML -------------
// - Lazy Images should have src attributes set to placeholder img (or blank string), 
// - Image path to be loaded should be set on data-llsrc,
// - Lazy Images need to have the "LL_ready" class added to them (class can be overridden on Init, llclass param)
// -------- IN Page JS -----------
/*
	ImageLazyLoad.Init(); // Attaches self to scroll and resize events of window & loads any images ready to load in viewport.
    ImageLazyLoad.LoadVisImgs(); // Requires Init to have been run. Loads any img which contains the lazyLoadClass and is visible in the browsers viewport
*/
var ImageLazyLoad = (function () {
    this.lazyLoadClass = "";
    this.highRes = (window.devicePixelRatio > 1.9);
    this.cb = null;
    var isInViewport = function (ele) {
        var w = $(window);
        var eleTop = ele.offset().top;
        var eleBottom = eleTop + ele.outerHeight();
        var viewpTop = w.scrollTop();
        var viewpBottom = viewpTop + w.height();
        return eleBottom > viewpTop && eleTop < viewpBottom;
    };
    var loadVisImgs = function () {
        var ll_imgs = $("img." + lazyLoadClass);
        $.each(ll_imgs, function () {
            var me = $(this);
            if (isInViewport(me)) {
                me.attr("src", (highRes && me.data("llhressrc")) ? me.data("llhressrc") : me.data("llsrc"));
                me.removeClass(lazyLoadClass);
                if (cb) me.on('load', cb.apply(me));
            }
            return ll_imgs;
        });
    };
    // INTERFACE
    return {
        Init: function (llclass, callback) {
            lazyLoadClass = (llclass) ? llclass : "LL_ready";
            cb = callback;
            $(window).on("resize scroll", loadVisImgs);
            loadVisImgs();
        },
        LoadVisImgs: function () {
            loadVisImgs();
        }
    };
}());;
