/* Minification failed. Returning unminified contents.
(391,26-27): run-time error JS1195: Expected expression: .
(391,33-34): run-time error JS1003: Expected ':': )
(392,7-8): run-time error JS1009: Expected '}': $
(392,7-8): run-time error JS1006: Expected ')': $
(410,19): run-time error JS1004: Expected ';'
(410,19-20): run-time error JS1195: Expected expression: :
(410,29-30): run-time error JS1010: Expected identifier: (
(459,4-5): run-time error JS1195: Expected expression: ,
(460,26-27): run-time error JS1010: Expected identifier: (
(480,4-5): run-time error JS1195: Expected expression: ,
(481,31-32): run-time error JS1010: Expected identifier: (
(490,4-5): run-time error JS1195: Expected expression: ,
(491,36-37): run-time error JS1010: Expected identifier: (
(499,4-5): run-time error JS1195: Expected expression: ,
(500,34-35): run-time error JS1010: Expected identifier: (
(519,4-5): run-time error JS1195: Expected expression: ,
(520,36-37): run-time error JS1010: Expected identifier: (
(529,4-5): run-time error JS1195: Expected expression: ,
(530,34-35): run-time error JS1010: Expected identifier: (
(547,4-5): run-time error JS1195: Expected expression: ,
(548,31-32): run-time error JS1010: Expected identifier: (
(550,4-5): run-time error JS1195: Expected expression: ,
(551,34-35): run-time error JS1010: Expected identifier: (
(558,1-2): run-time error JS1002: Syntax error: }
 */
var addressDropDown;

var AddressBook = {
  init: function() {
    $(document).on(
      "change",
      ".jsChangeCountry",
      AddressBook.replacePhoneCountryCode
    );
    $(document).on("change", ".jsChangeCountry", AddressBook.hideRegion);
    $(document).on(
      "click",
      ".save-address-ajax-button",
      AddressBook.saveNewAddress
    );
  },
  showNewAddressDialog: function(sender) {
    addressDropDown = $(sender).siblings(".address-dropdown");

    var url = $(sender).data("url");

    $.ajax({
      type: "GET",
      cache: false,
      url: url,
      success: function(result) {
        AddressBook.setAddressFormAsModalContent(result);
      }
    });
  },
  setAddressFormAsModalContent: function(view) {
    $("#AddressDialogContent").html($(view));
    $('button[type="submit"]', $("#AddressDialog")).addClass(
      "save-address-ajax-button"
    );
  },
  saveNewAddress: function(e) {
    e.preventDefault();

    var form = $(this).closest("form");

    $.ajax({
      type: "POST",
      cache: false,
      url: form[0].action,
      data: form.serialize(),
      success: function(result) {
        if (result.AddressId) {
          $(".address-dropdown").each(function() {
            $('option[value=""]', this).remove();
          });

          var option = $("<option>");
          option.attr("value", result.AddressId).text(result.Name);
          $(".address-dropdown").append(option);
          $("#AddressDialog").modal("hide");

          if (addressDropDown) {
            addressDropDown.val(result.AddressId);
          }

          $(".address-dropdown").each(function() {
            Checkout.changeTaxAddress($(this));
          });
          return;
        }

        AddressBook.setAddressFormAsModalContent(result);
      }
    });
  },
  getPhoneCountryCode: function(countryCode) {
    switch (countryCode) {
      case "AUT":
        return "+43";
      case "DEU":
        return "+49";
      case "DNK":
        return "+45";
      case "FIN":
        return "+358";
      case "GBR":
        return "+44";
      case "NOR":
        return "+47";
      case "NZL":
        return "+64";
      case "SWE":
        return "+46";
      case "USA":
        return "+1";
      default:
        return "";
    }
  },
  hideRegion: function() {
    var addressName = $(this).data("addressname");
    var countryCode = $(
      ".jsChangeCountry[data-addressname='" + addressName + "']"
    ).val();
    if (countryCode && countryCode !== "-" && countryCode !== "undefined") {
      $(".jsCountryRegion").show();
    } else {
      $(".jsCountryRegion").hide();
    }
  },
  replacePhoneCountryCode: function() {
    var addressName = $(this).data("addressname");
    var countryCode = $(
      ".jsChangeCountry[data-addressname='" + addressName + "']"
    ).val();
    var phoneField = $(
      ".jsPhoneNumber[data-addressname='" + addressName + "']"
    );
    var phoneCountryCode = AddressBook.getPhoneCountryCode(countryCode);

    phoneField.val(phoneCountryCode);
  }
};
;
var Cart = {
  init: function() {
    $(document)
      .on("keypress", ".jsChangeCartItem", Cart.preventSubmit)
      .on("click", ".jsRemoveCartItem", Cart.removeCartItem)
      .on("change", ".jsChangeCartItem", Cart.changeCartItem)
      .on("change", ".jsChangeShipment", Cart.changeShipment)
      .on("click", ".jsAddToCart", Cart.addCartItem)
      .on("change", "#MiniCart", function() {
        $("#MiniCartResponsive > div:first").html($("div:first", this).html());
      })
      .on("change", "#WishListMiniCart", function() {
        $("#WishListMiniCartResponsive > div:first").html(
          $("div:first", this).html()
        );
      })
      .on("click", ".jsCartContinueShopping", function() {
        if ($(this).closest("#cart-dropdown")) {
          $(this)
            .closest("#cart-dropdown")
            .collapse("hide");
        }
      })
      .on("click", ".jsWishListContinueShopping", function() {
        if ($(this).closest("#wishlist-dropdown")) {
          $(this)
            .closest("#wishlist-dropdown")
            .collapse("hide");
        }
      })
      .on("click", ".jsCartDropdown", function(e) {
        return (
          $(e.target).hasClass("btn") ||
          $(e.target)
            .parent()
            .is("a")
        );
      });

    $(".cart-dropdown").on("show.bs.dropdown", function(e) {
      if ($("#CartItemCount", $(this)).val() === 0) {
        e.preventDefault();
      }
    });
  },
  changeShipment: function() {
    var container = $(this).closest(".shipping-method");
    var url = container.data("url");
    $.ajax({
      type: "POST",
      url: url,
      cache: false,
      success: function(result) {
        Checkout.updateOrderSummary();
      }
    });
  },
  changeCartItem: function(e) {
    e.preventDefault();
    var form = $(this).closest("form");
    var quantity = $("#quantity", form).val();

    if (parseInt(quantity, 10) < 0) {
      return;
    }

    var formContainer = $("#" + form.data("container"));
    $.ajax({
      type: "POST",
      url: form[0].action,
      data: form.serialize(),
      success: function(result) {
        formContainer.html($(result));
        $(".cartItemCountLabel", formContainer.parent()).text(
          $("#CartItemCount", formContainer).val()
        );
        $(".cartTotalAmountLabel", formContainer.parent()).text(
          $("#CartTotalAmount", formContainer).val()
        );

        if (formContainer.is($("#WishListMiniCart"))) {
          if (result.indexOf("list-group-item") === -1) {
            $(".delete-wishlist").hide();
          }
          // If items where removed from the wishlist cart from the wishlist view, they should be removed from the view.
          var wishListAction = form.closest(".wishlist-actions");
          if (wishListAction.length > 0) {
            wishListAction.parent().remove();
          }
        }
      }
    });
  },
  removeCartItem: function(e) {
    e.preventDefault();
    var form = $(this).closest("form");
    $("#quantity", form)
      .val(0)
      .change();
  },
  addCartItem: function(e) {
    e.preventDefault();
    var form = $(this).closest("form");
    var formContainer = $("#" + form.data("container"));
    var skuCode = $("#code", form).val();

    $("#CartWarningMessage").hide();
    $(".warning-message", $("#CartWarningMessage")).html("");

    $.ajax({
      type: "POST",
      url: form[0].action,
      data: { code: skuCode },
      success: function(result) {
        formContainer.html($(result));
        $(".cartItemCountLabel", formContainer.parent()).text(
          $("#CartItemCount", formContainer).val()
        );
        $(".cartTotalAmountLabel", formContainer.parent()).text(
          $("#CartTotalAmount", formContainer).val()
        );

        formContainer.change();
      },
      error: function(xhr, status, error) {
        $(".warning-message", $("#CartWarningMessage")).html(xhr.statusText);
        $("#CartWarningMessage").show();
      }
    });
  },
  preventSubmit: function(e) {
    if (e.keyCode === 13) {
      e.preventDefault();
    }
  }
};
;
var Checkout = {
  init: function() {
    $(document)
      .on("change", ".jsChangePayment", Checkout.changePayment)
      .on("change", ".jsChangeTaxAddress", Checkout.changeTaxAddress)
      .on("change", "#MiniCart", Checkout.refreshView)
      .on("change", "#MiniCartResponsive", Checkout.refreshView)
      .on("change", "#CheckoutView .jsChangeCartItem", Checkout.refreshView)
      .on("click", ".jsNewAddress", Checkout.newAddress)
      .on("click", "#AlternativeAddressButton", Checkout.enableShippingAddress)
      .on("click", ".remove-shipping-address", Checkout.removeShippingAddress)
      .on("click", ".js-add-couponcode", Checkout.addCouponCode)
      .on("click", ".js-remove-couponcode", Checkout.removeCouponCode)
      .on("change", "#chkUseDifferentShippingAddress", Checkout.toggleShippingAddress)
      .on("click", ".jsToggleCheckoutAddressLine2", Checkout.toggleAddressLine2);

    Checkout.initializeAddressAreas();
    Checkout.initializePaymentMethods();
  },
  initializeAddressAreas: function() {
    if ($("#chkUseDifferentShippingAddress").is(":checked")) {
      Checkout.doEnableShippingAddress();
    } else {
      Checkout.doRemoveShippingAddress();
    }
  },
  initializePaymentMethods: function() {
    const continueButton = $(".js-checkout-summary-btn");
    if ($("#securedfields").length > 0) {
      continueButton.attr("disabled", "disabled").attr("aria-disabled", "true");
    } else {
      continueButton.removeAttr("disabled").attr("aria-disabled", "false");
    }
  },
  addCouponCode: function(e) {
    e.preventDefault();
    var couponCode = $(inputCouponCode).val();
    if (couponCode.trim()) {
      $.ajax({
        type: "POST",
        url: $(this).data("url"),
        data: { couponCode: couponCode },
        success: function(result) {
          if (!result) {
            $(".couponcode-errormessage").show();
            return;
          }
          $(".couponcode-errormessage").hide();
          $("#CheckoutView").replaceWith($(result));
          Checkout.initializeAddressAreas();
        }
      });
    }
  },
  removeCouponCode: function(e) {
    e.preventDefault();
    $.ajax({
      type: "POST",
      url: $(this).attr("href"),
      data: {
        couponCode: $(this)
          .siblings()
          .text()
      },
      success: function(result) {
        $("#CheckoutView").replaceWith($(result));
        Checkout.initializeAddressAreas();
      }
    });
  },
  refreshView: function() {
    var view = $("#CheckoutView");

    if (view.length == 0) {
      return;
    }
    var url = view.data("url");
    $.ajax({
      cache: false,
      type: "GET",
      url: view.data("url"),
      success: function(result) {
        view.replaceWith($(result));
        Checkout.initializeAddressAreas();
      }
    });
  },
  newAddress: function(e) {
    e.preventDefault();
    AddressBook.showNewAddressDialog($(this));
  },
  toggleCountryShippingMethods: function(shippmentCountryCode) {
    $(".checkout-shipping-methods__values").removeClass(
      "checkout-shipping-methods__values--active"
    );
    $(
      ".checkout-shipping-methods__values[data-countrycode='" +
        shippmentCountryCode +
        "'"
    ).addClass("checkout-shipping-methods__values--active");

    $(".checkout-shipping-methods__input")
      .prop("checked", false)
      .removeAttr("checked");

    if (
      $(
        ".checkout-shipping-methods__input--selected",
        ".checkout-shipping-methods__values--active"
      ).length
    ) {
      $(
        ".checkout-shipping-methods__input--selected",
        ".checkout-shipping-methods__values--active"
      )
        .prop("checked", true)
        .attr("checked", "checked");
    } else {
      $(
        ".checkout-shipping-methods__input",
        ".checkout-shipping-methods__values--active"
      )
        .first()
        .prop("checked", true)
        .attr("checked", "checked");
    }
  },
  updateShipping: function() {
    var shippingMethodId = $(
      ".checkout-shipping-methods__input:checked",
      ".checkout-shipping-methods__values--active"
    ).val();

    if (shippingMethodId?.length) {
      $.ajax({
        type: "POST",
        url: "/api/cart/shipping",
        data: JSON.stringify({ data: { shippingMethodId: shippingMethodId } }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: {
          XSRF_Header_Token: window.app.preloadState["xsrfToken"]
        },
        success: function() {
          Checkout.updateOrderSummary();
        },
        error: function() {
          console.log("Error updating shipping method");
        }
      });
    }
  },
  changeTaxAddress: function(sender) {
    if (sender.originalEvent instanceof Event) {
      sender = $(this);
    }

    var isBilling = $(this).attr("id") === "billing-address-country-code";

    var refreshAddress = $(this).data("refresh") === true ? true : false;

    if (isBilling) {
      $("#ShippingAddressIndex").val(-1);
    } else {
      $("#ShippingAddressIndex").val(0);
    }

    var shippmentCountryCode = $("#chkUseDifferentShippingAddress:checked")
      .length
      ? $("#shipping-address-country-code").val()
      : $("#billing-address-country-code").val();

    if ($(this).hasClass("jsChangeCountry")) {
      $("#shippingCountryCode").val($(this).val());
      Checkout.toggleCountryShippingMethods(shippmentCountryCode);
    }

    var form = $(".jsCheckoutForm");
    if (form.length === 0) {
      return;
    }
    $.ajax({
      type: "POST",
      cache: false,
      url: $(sender)
        .closest(".jsCheckoutAddress")
        .data("url"),
      data: form.serialize(),
      success: function(result) {
        if (refreshAddress) {
          if (isBilling) {
            $("#billingAddressContainer").html($(result));
          } else {
            $("#AddressContainer").html($(result));
          }
        }
      },
      complete: function() {
        Checkout.updateShipping();
      }
    });
  },
  changePayment: function() {
    $.ajax({
      type: "POST",
      url: $(this).data("url"),
      success: function(result) {
        $(".jsPaymentMethod").replaceWith($(result).find(".jsPaymentMethod"));

        const continueButton = $(".js-checkout-summary-btn");
        if ($(result).find("#securedfields").length > 0) {
          continueButton
            .attr("disabled", "disabled")
            .attr("aria-disabled", "true");
        } else {
          continueButton.removeAttr("disabled").attr("aria-disabled", "false");
        }

        Checkout.updateOrderSummary();
        Misc.updateValidation("jsCheckoutForm");
      }
    });
  },
  updateOrderSummary: function() {
    $.ajax({
      cache: false,
      type: "GET",
      url: $(".jsOrderSummary").data("url"),
      success: function(result) {
        $(".jsOrderSummary").replaceWith($(result).filter(".jsOrderSummary"));
      }
    });
  },
  doEnableShippingAddress: function() {
    $("#chkUseDifferentShippingAddress").attr("checked", "checked");
    $(".shipping-address:hidden").slideToggle(300);
    $(".shipping-address").css("display", "block");
    $("#UseBillingAddressForShipment").val("false");
    Checkout.toggleCountryShippingMethods(
      $("#shipping-address-country-code").val()
    );
  },
  enableShippingAddress: function(event) {
    event.preventDefault();

    Checkout.doEnableShippingAddress();

    var form = $(".jsCheckoutForm");

    $("#ShippingAddressIndex").val(0);

    $.ajax({
      type: "POST",
      cache: false,
      url: $(".jsCheckoutAddress").data("url"),
      data: form.serialize(),
      success: function(result) {
        $("#AddressContainer").html($(result));
        Checkout.updateOrderSummary();
      }
    });
  },
  doRemoveShippingAddress: function() {
    $("#chkUseDifferentShippingAddress").removeAttr("checked");
    $(".shipping-address:visible").slideToggle(300);
    $(".shipping-address").css("display", "none");
    $("#UseBillingAddressForShipment").val("true");

    Checkout.toggleCountryShippingMethods(
      $("#billing-address-country-code").val()
    );
  },
  removeShippingAddress: function(event) {
    event.preventDefault();

    Checkout.doRemoveShippingAddress();

    var form = $(".jsCheckoutForm");
    $("#ShippingAddressIndex").val(-1);

    $.ajax({
      type: "POST",
      cache: false,
      url: $(".jsCheckoutAddress").data("url"),
      data: form.serialize(),
      success: function(result) {
        Checkout.updateOrderSummary();
      }
    });
  },
  toggleAddressLine2: function() {
    $(".jsCheckoutAddressLine2").toggleClass("hidden");
  },
  toggleShippingAddress: function(e) {
    if ($("#chkUseDifferentShippingAddress").is(":checked")) {
        Checkout.enableShippingAddress(e);
    } else {
        Checkout.removeShippingAddress(e);
    }
  }
};
;
var login = {
  init: function() {
    $(document).on("submit", ".jsLoginBlock", login.login);
  },
  login: function(e) {
    e.preventDefault();
    var form = $(this).closest(".jsLoginBlock");
    form[0].classList.add("is-pending");
    $.ajax({
      type: "POST",
      url: form[0].action,
      data: form.serialize(),
      success: function(response, status, xhr) {
        var ct = xhr.getResponseHeader("content-type") || "";
        if (ct.indexOf("html") > -1) {
          $(form)
            .closest(".jsLoginBlockWrapper")
            .replaceWith($(response));
          form[0].classList.remove("is-pending");
        }
        if (ct.indexOf("json") > -1) {
          document.location = response.ReturnUrl;
        }
      }
    });
  }
};
;
var Market = {
    init: function () {
        $(document)
            .on("change ", ".jsMarketSelector", Market.setMarket)
            .on("change ", ".jsLanguageSelector", Market.setLanguage)
            .on("change ", ".jsCurrencySelector", Market.setCurrency);
    },
    setMarket: function () {
        var form = $(this).closest("form");
        $.ajax({
            type: "POST",
            url: form[0].action,
            data: form.serialize(),
            success: function (response) {
                document.location = response.returnUrl;
            }
        });
    },
    setLanguage: function (e) {
        var form = $(this).closest("form");
        $.ajax({
            type: "POST",
            url: form[0].action,
            data: form.serialize(),
            success: function (response) {
                document.location = response.returnUrl;
            }
        });
    },
    setCurrency: function (e) {
        var form = $(this).closest("form");
        $.ajax({
            type: "POST",
            url: form[0].action,
            data: form.serialize(),
            success: function (response) {
                document.location = response.returnUrl;
            }
        });
    },
    getSelectedCurrency: function () {
        return $("#CurrencyCode").val() || "USD";
    },
    getSelectedMarketId: function () {
        return $("#MarketId").val() || "US";
    }
};
var Misc = {
  setCookie: function(cname, cvalue, exSeconds) {
    //  Session cookie
    if (!exSeconds) {
      document.cookie = cname + "=" + cvalue + "; path=/";
      return;
    }

    var date = new Date();
    date.setTime(date.getTime() + exSeconds * 1000);
    document.cookie =
      cname + "=" + cvalue + "; expires=" + date.toUTCString() + "; path=/";
  },
  getCookie: function(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(";");
    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == " ") c = c.substring(1);
      if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
    }
    return "";
  },
  updateValidation: function(formClass) {
    var currForm = $("." + formClass);
    currForm.removeData("validator");
    currForm.removeData("unobtrusiveValidation");
    $.validator.unobtrusive.parse(currForm);
    currForm.validate();
  },
  patchMultipleFormIds: function(formToPatch) {
    if ($(formToPatch).length) {
      $(formToPatch).each(function(i, regForm) {
        $("input", regForm).each(function(j, regFormInput) {
          $(regFormInput).attr("id", $(regFormInput).attr("id") + "_" + i);
        });
        $("label", regForm).each(function(j, regFormInput) {
          $(regFormInput).attr("for", $(regFormInput).attr("for") + "_" + i);
        });
      });
    }
  }
};
;
var ProductReviewInvitation = {
  init: function() {
    $(document).on(
      "click",
      ".jsStartProductReview",
      this.openProductReviewInvitationModal
    );
    $(document).on(
      "click",
      ".jsSendProductReviewInvitation",
      this.sendInvitation
    );
    $(document).on(
      "click",
      ".jsCloseProductReviewInvitation",
      this.closeInvitationModal
    );
  },
  openProductReviewInvitationModal: function(e) {
    e.preventDefault();
    ProductReviewInvitation.url = e.target.getAttribute("data-url");

    $(".product-review-invitation-mail").html(
      window.app.preloadState.user.Name
    );
    $("#send-product-review-mail-modal").addClass("is-active");
    $(".jsReviewInvitationFormError, .jsReviewInvitationFormSent").hide();
    $(".jsSendReviewInvitationForm").show();
    $(".jsReviewInvitationSent").hide();
  },
  sendInvitation: function(e) {
    e.preventDefault();
    $(".jsReviewInvitationFormError, .jsReviewInvitationFormSent").hide();

    $.post(ProductReviewInvitation.url)
      .done(function(data, status) {
        if (status === "success") {
          $(".jsReviewInvitationSent, .jsSendReviewInvitationForm ").toggle();
        } else {
          $(".jsReviewInvitationFormError").show();
        }
      })
      .error(function(response) {
        if (response.status === 409) {
          $(".jsReviewInvitationFormSent").show();
        } else {
          $(".jsReviewInvitationFormError").show();
        }
      });
  },
  closeInvitationModal: function(e) {
    e.preventDefault();

    $("#send-product-review-mail-modal").removeClass("is-active");
  }
};
;
$(document).ready(function() {
  AddressBook.init();
  Cart.init();
  Checkout.init();
  Market.init();
  login.init();
  Warehouse.init();
  Registration.init();
  Search.init();
  Recommendations.init();
  Return.init();
  ProductReviewInvitation.init();

  $("[data-hide]").on("click", function() {
    $(this)
      .closest("." + $(this).attr("data-hide"))
      .hide();
  });
});
;
var Recommendations = {
  init: function() {
    this._bindEvents();
  },

  clickTracking: function(evt) {
    var recommendationId = $(evt.delegateTarget).data("recommendation-id");
    Misc &&
      Misc.setCookie(
        "EPiServer_Commerce_RecommendationId",
        recommendationId,
        60
      ); //set lifetime of this cookie to only 1 minute.
  },

  keyboardHandle: function(evt) {
    if (
      (evt.type === "keydown" && evt.which === 13) ||
      (evt.type === "contextmenu" && evt.which !== 3)
    ) {
      Recommendations.clickTracking(evt); //handle keyup event of enter key, contextmenu event of menu key.
    }
  },

  // summary:
  //      Renders the recommended items received inside the given target container.
  // returnedData: [Object]
  //      The recommendations data.
  // contextSettings: [Object]
  //      The context settings used to render recommendations, that included:
  //      sectionMappings: [Object]
  //          area: [string]
  //              The area that recommendations belong to.
  //          selector: [string]
  //              The selector to target container (a HTML element).
  // tags:
  //      public, recommendations
  render: function(returnedData, contextSettings) {
    var data = null;
    try {
      data = JSON.parse(returnedData);
    } catch (e) {
      return;
    }

    var sectionMappings = contextSettings.sectionMappings;
    if (!(sectionMappings instanceof Array) || sectionMappings.length === 0) {
      return;
    }

    // Loads and parses templates.
    var listTemplate = $("#epiRecommendationListTemplate").html(),
      itemTemplate = $("#epiRecommendationItemTemplate").html();
    Mustache.parse(listTemplate);
    Mustache.parse(itemTemplate);

    var filterRecommendation = function(recs) {
      var filteredRecs = [];
      for (var i = 0, length = recs.length; i < length; i++) {
        var attributes = recs[i].attributes;
        if (attributes) {
          recs[i].hasDiscount = attributes.unitPrice > attributes.salePrice;
          filteredRecs.push(recs[i]);
        }
      }
      return filteredRecs;
    };

    var renderRecommendations = function(
      data,
      targetArea,
      targetSelector,
      numberOfItemsToRender
    ) {
      var $target = $(targetSelector);
      if ($target.length === 0) {
        return;
      }

      // Get indicated recommendations data.
      var recs = [];
      if (!!data && !!data.smartRecs) {
        for (var i = 0, length = data.smartRecs.length; i < length; i++) {
          if (data.smartRecs[i].position === targetArea) {
            recs = recs.concat(filterRecommendation(data.smartRecs[i].recs));
          }
        }
      }

      if (numberOfItemsToRender > 0) {
        recs = recs.slice(0, numberOfItemsToRender);
      }

      // Renders recommended data with loaded templates.
      var htmlContent = Mustache.render(
        listTemplate,
        { recs: recs },
        { epiRecommendationItemTemplate: itemTemplate }
      );
      $target.html(htmlContent);
    };

    for (var i = 0, length = sectionMappings.length; i < length; i++) {
      var targetArea = sectionMappings[i].area,
        targetSelector = sectionMappings[i].selector,
        numberOfItemsToRender = sectionMappings[i].numberOfItemsToRender;
      renderRecommendations(
        data,
        targetArea,
        targetSelector,
        numberOfItemsToRender
      );
    }

    // Bind events for new rendered elements.
    Recommendations._bindEvents();
  },

  _bindEvents: function() {
    $(".recommendations")
      .find("[data-recommendation-id]")
      .on("mouseup", ".product > a", Recommendations.clickTracking);
    $(".recommendations")
      .find("[data-recommendation-id]")
      .on("contextmenu", ".product > a", Recommendations.keyboardHandle);
    $(".recommendations")
      .find("[data-recommendation-id]")
      .on(
        "keydown",
        ".product > a, .product img",
        Recommendations.keyboardHandle
      );
  }
};
;
var Registration = {
  init: function() {
    $(document)
      .on(
        "submit",
        ".jsOrderConfirmationRegistration",
        Registration.orderConfirmationRegistration
      )
      .on(
        "submit",
        ".jsOrderConfirmationRegistrationAssign",
        Registration.orderConfirmationRegistrationAssign
      )
      .on(
        "submit",
        ".jsNewsletterRegistration",
        Registration.newsletterRegistration
      )
      .on("submit", ".jsRegistration", Registration.register);

    Misc.patchMultipleFormIds($(".jsNewsletterRegistration"));
  },
  register: function(e) {
    e.preventDefault();
    var form = $(this).closest(".jsRegistration");
    form[0].classList.add("is-pending");
    $.ajax({
      type: "POST",
      url: form[0].action,
      data: form
        .serialize()
        .replace("&Address.Region=", "&Address.CountryRegion.Region="),
      success: function(result, status, xhr) {
        var ct = xhr.getResponseHeader("content-type") || "";
        if (ct.indexOf("json") > -1) {
          document.location = result.ReturnUrl;
        } else {
          $(form)
            .parent()
            .replaceWith($(result));
        }
      }
    });
  },
  orderConfirmationRegistration: function(e) {
    e.preventDefault();
    var form = $(this).closest(".jsOrderConfirmationRegistration");
    form[0].classList.add("is-pending");
    $.ajax({
      type: "POST",
      url: form[0].action,
      data: form.serialize(),
      success: function(result) {
        $(form)
          .parent()
          .replaceWith($(result));
      }
    });
  },
  orderConfirmationRegistrationAssign: function(e) {
    e.preventDefault();
    var form = $(this).closest(".jsOrderConfirmationRegistrationAssign");
    form[0].classList.add("is-pending");
    $.ajax({
      type: "POST",
      url: form[0].action,
      data: form.serialize(),
      success: function(result) {
        $(form)
          .parent()
          .replaceWith($(result));
      }
    });
  },
  newsletterRegistration: function(e) {
    e.preventDefault();
    var form = $(this).closest(".jsNewsletterRegistration");
    var isAccepted = $(".jsNewsletterAccept", form);

    if ($(isAccepted).length && $(isAccepted).is(":checked")) {
      form[0].classList.add("is-pending");
      $.ajax({
        type: "POST",
        url: form[0].action,
        data: form.serialize(),
        success: function(result) {
          $(form)
            .closest(".newsletter-subscribe")
            .replaceWith($(result));
        }
      });
    } else {
      $(isAccepted).addClass("input-validation-error");
    }
  }
};
;
var Return = {
  init: function() {
    $(document).on("click", ".jsStartOrderReturn", Return.startOrderReturn);
    $(document).on("click", ".jsIsReturnItem", Return.updateReturnButton);
    $(document).on("change", ".jsIsReturnSelect", Return.updateReturnButton);
    this.loadingIcon =
      '<span class="lds-ring icon--loading" aria-hidden="true"><span></span><span></span><span></span><span></span></span>';
  },
  startOrderReturn: function(e) {
    e.preventDefault();
    var btn = e.target;
    var btnConatiner = $(btn).parent();

    $(btn).attr("disabled", "disabled");
    $(btnConatiner)
      .append(Return.loadingIcon)
      .addClass("button--loading");

    var url = e.target.getAttribute("href");

    $("#return-order-modal").load(url, function(response, status, xhr) {
      Return.bindAjaxForm();
      $(btnConatiner)
        .removeAttr("disabled")
        .removeClass("button--loading");
      $(".icon--loading", btnConatiner).remove();
      $(".jsLoadingInfo").removeClass("is-active");
    });
  },
  bindAjaxForm: function() {
    $(".jsReturnOrderForm").ajaxForm({
      target: "#return-order-modal",
      beforeSubmit: Return.isLoading,
      success: Return.checkResponse
    });
    Return.updateReturnButton();
  },
  checkResponse: function(responseText, statusText, xhr, $form) {
    if (responseText.Success === true) {
      window.location.href = responseText.RedirectUrl;
    } else {
      Return.bindAjaxForm();
    }
  },
  updateReturnButton: function() {
    var selectedItemsCnt = $(".jsIsReturnItem:checked").length;
    $(".jsReturnItemsCount").text(selectedItemsCnt);

    var isValid = 0;
    isValid = $(".order__product").filter(function() {
      return (
        $(".jsIsReturnItem:checked", this).length &&
        $(".jsIsReturnSelect", this).val() === "-"
      );
    });

    $(".button--primary", ".jsReturnOrderForm").prop(
      "disabled",
      isValid.length || !selectedItemsCnt
    );
    if (isValid.length || !selectedItemsCnt) {
      $(".jsPleaseSelectMessage").removeClass("hidden");
    } else {
      $(".jsPleaseSelectMessage").addClass("hidden");
    }
  },
  isLoading: function() {
    $(".button--primary", ".jsReturnOrderForm")
      .append(Return.loadingIcon)
      .addClass("button--loading")
      .attr("disabled", "disabled");
    $(".jsLoadingInfo").addClass("is-active");
  }
};
;
var Search = {
    init: function() {
        $(document)
            .on('keyup', '.jsQuickSearch', Search.quickSearch)
            .on('focus', '.jsQuickSearch, .jsQuickSearchResult', Search.showResults)
            .on('focusin.jsQuickSearchResult click.jsQuickSearchResult', function (e) {
                if ($(e.target).closest('.jsQuickSearchResult, .jsQuickSearch').length) return;
                $('.jsQuickSearchResult').fadeOut('medium');
            });
        $(window).bind('popstate ', function (event) {
            //this will handle browser back/forward navigation
            Search.updatePage(location.search);
        });
        $('.js-search-input').on('focusout', function () { $('.search-input').removeClass("is-active"); });
        $('.js-search-input').on('focusin', function () { $('.search-input').addClass("is-active"); });
        if ($('.jsSearch').length == 1) {
            Search.infinityScroll();
            $(document)
                .on('change', '.jsSearchSort', Search.sort)
                .on('change', '.jsSearchFacet', Search.sort)
                .on('click', '.jsSearchFacetRemoveAll', Search.removeAll);
        }

        // Set input width
        $('.js-search-input').focus(function () {
            $(this).addClass('has-focus');
        });
        $('.js-search-input').blur(function () {
            $(this).removeClass('has-focus');
        });
    },
    fetchingNewPage: false,
    lastPage: false,
    lastKeyWord: "",
    quickSearch: function() {
        if ($(this).val().length > 1 && Search.lastKeyWord != $(this).val()) {
            var url = $(this).data('url');
            var form = $(this).closest('form');
            var jqXhr = $(this).data('jqXhr');
            if (jqXhr)
                jqXhr.abort();
            Search.lastKeyWord = $(this).val();
            $(this).data('jqXhr', $.ajax({
                    type: "POST",
                    url: url,
                    data: form.serialize(),
                    context: this,
                    success: function(result) {
                        $(this).removeData('jqXhr');
                        $('.jsQuickSearchResult').empty();
                        $('.jsQuickSearchResult').append(result);
                    }
                })
            );
        }
    },
    showResults: function() {
        $('.jsQuickSearchResult').show();
    },
    infinityScroll: function () {
        $(window).scroll(function () {
            if (Search.fetchingNewPage == true || Search.lastPage) {
                return null;
            }
            if ($(window).scrollTop() >= ($(document).height() - $(window).height()) - 1000) {
                Search.fetchingNewPage = true;
                var form = $(document).find('.jsSearchForm');
                $.ajax({
                    url: Search.getUrlWithFacets(),
                    type: "POST",
                    data: form.serialize(),
                    success: function (result) {
                        Search.fetchingNewPage = false;
                        if ($(result).find('.product').length > 0) {
                            $('.jsSearchPage').replaceWith($(result).find('.jsSearchPage'));
                            $('.jsSearch').append($(result).find('.jsSearch').children());
                            $('.jsSearchFacets').replaceWith($(result).find('.jsSearchFacets'));
                        } else {
                            Search.lastPage = true;
                        }
                    }
                });
            }
        });
    },
    sort: function () {
        Search.lastPage = false;
        var form = $(document).find('.jsSearchForm');
        $('.jsSearchPage').val(1);
        $('.jsSelectedFacet').val($(this).data('facetgroup') + ':' + $(this).data('facetkey'));
        var url = Search.getUrlWithFacets();
        Search.updatePage(url, form.serialize(), function () {
            history.pushState({ url: url }, "", url); //put the new url to browser history
        })
    },
    getUrlWithFacets: function () {
        var facets = [];
        $('.jsSearchFacet:input:checked').each(function () {
            var selectedFacet = encodeURIComponent($(this).data('facetkey'));
            facets.push(selectedFacet);
        });
        return Search.getUrl(facets);
    },
    getUrl: function (facets) {
        var urlParams = Search.getUrlParams();
        urlParams.facets = facets ? facets.join(',') : null;
        var sort = $('.jsSearchSort')[0].value;
        urlParams.sort = sort;
        var url = "?";
        for (var key in urlParams) {
            var value = urlParams[key];
            if (value) {
                url += key + '=' + value + '&';
            }
        }
        return url.slice(0, -1); //remove last char
    },
    getUrlParams: function () {
        var match,
            search = /([^&=]+)=?([^&]*)/g, //regex to find key value pairs in querystring
            query = window.location.search.substring(1);

        var urlParams = {};
        while (match = search.exec(query)) {
            urlParams[match[1]] = match[2];
        }
        return urlParams;
    },
    removeAll: function () {
        Search.lastPage = false;
        $('.jsSearchFacet:input:checked').each(function () { $(this).attr('checked', false); });
        var form = $(document).find('.jsSearchForm');
        $('.jsSearchPage').val(1);
        var url = Search.getUrl();
        Search.updatePage(url, form.serialize(), function () {
            history.pushState({ url: url }, "", url); //put the new url to browser history
        })
    },
    updatePage: function (url, data, onSuccess) {
        $.ajax({
            type: "POST",
            url: url || "",
            data: data,
            success: function (result) {
                $('.jsSearchPage').replaceWith($(result).find('.jsSearchPage'));
                $('.jsSearch').replaceWith($(result).find('.jsSearch'));
                $('.jsSearchFacets').replaceWith($(result).find('.jsSearchFacets'));
                if (onSuccess) {
                    onSuccess(result);
                }
            }
        });
    }
};
﻿var Warehouse = {
    init: function () {
        $(document).on('click', '.warehouse-quickview-button', Warehouse.showQuickview);
        Warehouse.showWarehouseAvailability();
    },
    showWarehouseAvailability: function () {
        var container = $(".warehouse-availability-container");
        if (container.length) {
            var skuCode = container.data("sku-code");
            var url = container.data("url");
            $.ajax({
                type: "GET",
                cache: false,
                url: url,
                data: { skuCode: skuCode },
                success: function (result) {
                    container.html($(result));
                }
            });
        }
    },
    showQuickview: function (e) {
        e.preventDefault();
        var warehouseCode = $(this).data("warehouse-code");
        var url = $(this).data("url");
        $.ajax({
            type: "GET",
            cache: false,
            url: url,
            data: { warehouseCode: warehouseCode },
            success: function (result) {
                $(".modal-dialog", $("#ModalDialog")).html($(result));
            }
        });
    }
};;
