{
  "version": 3,
  "sources": ["/cdn/shop/t/254/assets/theme.js?enable_js_minification=1"],
  "sourcesContent": ["/*\nMotion by Archetype Themes (https://archetypethemes.co)\n  Access unminified JS in assets/theme.js\n\n  Use this event listener to run your own JS outside of this file.\n  Documentation - https://archetypethemes.co/blogs/motion/javascript-events-for-developers\n\n  document.addEventListener('page:loaded', function() {\n    // Page has loaded and theme assets are ready\n  });\n*/\n\nwindow.theme = window.theme || {};\n\n/*\n  Debug mode adds bunch of console logs that helps understanding the code flow.\n\n  You can read more about the functionality here:\n  https://woolman.eu.teamwork.com/spaces/kauppakamari/page/5239-debugging-the-theme\n\n  /!\\ WARNING: Never leave debug mode enabled for production.\n*/\nwindow.debugMode = false;\nwindow.Shopfiy = window.Shopify || {};\n\nvar params = {},\n  q = window.location.href.replace(\n    /[?&]+([^=&]+)=([^&]*)/gi,\n    function (m, k, v) {\n      params[k] = v;\n    }\n  );\nif ((params.debugMode && params.debugMode == 1) || params.debugMode == true) {\n  window.debugMode = true;\n}\n\n// Medium breakpoint is also set in theme.css and inline throughout some templates. Do not change values unless you know what you're doing.\ntheme.bp = {};\ntheme.bp.smallUp = 590;\ntheme.bp.small = theme.bp.smallUp - 1;\n\ntheme.config = {\n  bpSmall: false,\n  hasSessionStorage: true,\n  mediaQuerySmall: \"screen and (max-width: \" + theme.bp.small + \"px)\",\n  mediaQuerySmallUp: \"screen and (min-width: \" + theme.bp.smallUp + \"px)\",\n  youTubeReady: false,\n  vimeoReady: false,\n  vimeoLoading: false,\n  isTouch:\n    \"ontouchstart\" in window ||\n    (window.DocumentTouch && window.document instanceof DocumentTouch) ||\n    window.navigator.maxTouchPoints ||\n    window.navigator.msMaxTouchPoints\n      ? true\n      : false,\n  isIpad:\n    /ipad/.test(window.navigator.userAgent.toLowerCase()) ||\n    (window.navigator.platform === \"MacIntel\" &&\n      window.navigator.maxTouchPoints > 1),\n  rtl: document.documentElement.getAttribute(\"dir\") == \"rtl\" ? true : false,\n  prefersReducedMotion: window.matchMedia(\"(prefers-reduced-motion: reduce)\"),\n};\n\nif (theme.config.isIpad) {\n  document.documentElement.className += \" js-ipad\";\n}\n\nif (console && console.log) {\n  console.log(\n    \"%cHelsingin seudun kauppakamari\",\n    'font-size: 36px; color: #1a346c; font-family: \"Arial\"; font-weight: 900; padding: 12px;'\n  );\n  console.log(\n    \"%cOnline store developed by Woolman Oy %s\",\n    \"font-size: 12px; color: #38383b; font-weight: 900; padding: 12px;\",\n    \"\uD83D\uDC49 https://woolman.io/\"\n  );\n}\n\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nlazySizesConfig.expFactor = 2.2;\n\n(function ($) {\n  var $ = (jQuery = $);\n\n  theme.utils = {\n    /**\n     * _.defaultTo from lodash\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     * Source: https://github.com/lodash/lodash/blob/master/defaultTo.js\n     *\n     * @param {*} value - Value to check\n     * @param {*} defaultValue - Default value\n     * @returns {*} - Returns the resolved value\n     */\n    defaultTo: function (value, defaultValue) {\n      return value == null || value !== value ? defaultValue : value;\n    },\n    cart_is_reloading: false,\n    cart_is_rebuilding: false,\n    /**\n     *\n     * @param {*} HTMLElement - Element to scroll into view (jQuery selected).\n     * @param {Number=} scrollMarginTop - Scroll margin top (Int)\n     * @param {Function=} callbackFn - Function to call once scrolling is completed.\n     */\n    smoothScrollTo: function (HTMLElement, callbackFn) {\n      /* Smooth scrolling is enabled for those that have not set reduced motion preference in browser/system. */\n      const behavior = theme.config.prefersReducedMotion.matches\n        ? \"auto\"\n        : \"smooth\";\n      if (callbackFn && typeof callbackFn === \"function\") {\n        HTMLElement[0].scrollIntoView({\n          behavior: behavior,\n          block: \"center\",\n          callback: callbackFn(),\n        });\n      } else {\n        const boundingArea = $(HTMLElement).position();\n\n        window.scrollTo({\n          y: boundingArea.top,\n          behavior,\n        });\n      }\n    },\n  };\n\n  /*\n    This relies on the fact that all products in cart share the same PRICE GROUPS.\n    So e.g. if product A has groups `Normaali,J\u00E4sen,Ryhm\u00E41` then product B must have same ones.\n\n    If one product has different price groups it will cause never-ending loop of cart rebuilds\n  */\n\n  async function rebuildRow(value, faulty_row, index) {\n    var obj = {\n      id: value.variant_id,\n      quantity: value.itemQty,\n      properties: value.all_properties,\n    };\n    if (!faulty_row) {\n      if (window.debugMode) {\n        console.log(\"[rebuildRow] rebuilding row ...\", \"return not faulty\");\n      }\n      return obj;\n    } else {\n      if (window.debugMode) {\n        console.log(\n          \"[rebuildRow] rebuilding row ...\",\n          faulty_row.index,\n          \"getting json\"\n        );\n      }\n      var res = await $.getJSON(\"/products/\" + value.handle + \".json\");\n      var variants = res.product.variants;\n      var index = variants.findIndex(\n        (a) => a.title.toLowerCase() == faulty_row.variant_to\n      );\n      if (window.debugMode) {\n        console.log(\n          \"[rebuildRow] rebuilding row ...\",\n          faulty_row.index,\n          variants\n        );\n      }\n      if (index > -1) {\n        if (window.debugMode) {\n          console.log(\n            \"[rebuildRow] rebuilding row ...\",\n            faulty_row.index,\n            \"select variant\",\n            index\n          );\n        }\n        if (faulty_row.to == theme.strings.priceRegular.toLowerCase()) {\n          if (window.debugMode) {\n            console.log(\n              \"[rebuildRow] Reset price and swap to regular priced variant\"\n            );\n          }\n          var old_index = variants.findIndex(\n            (a) => a.title.toLowerCase() == faulty_row.variant_from\n          );\n          if (old_index > -1) {\n            obj.properties[\"_productMemberPrice\"] = variants[old_index].price;\n          }\n        } else if (\n          faulty_row.to != theme.strings.priceRegular.toLowerCase() &&\n          faulty_row.to != theme.strings.priceRegular.toLowerCase()\n        ) {\n          if (window.debugMode) {\n            console.log(\n              \"[rebuildRow] Reset price and swap to member priced variant\"\n            );\n          }\n          obj.properties[\"_productMemberPrice\"] = variants[index].price;\n          if (\n            typeof obj.properties[\"_productMemberPrice\"] == \"string\" &&\n            obj.properties[\"_productMemberPrice\"].includes(\".\") &&\n            !obj.properties[\"_productMemberPrice\"].includes(\",\")\n          ) {\n            obj.properties[\"_productMemberPrice\"] =\n              Number(obj.properties[\"_productMemberPrice\"]) * 100;\n          }\n        }\n\n        if (window.debugMode) {\n          console.log(\"[rebuildRow] obj properties\", obj.properties);\n        }\n\n        if (\n          typeof obj.properties[\"_productMemberPrice\"] == \"string\" &&\n          obj.properties[\"_productMemberPrice\"].includes(\".\") &&\n          !obj.properties[\"_productMemberPrice\"].includes(\",\")\n        ) {\n          obj.properties[\"_productMemberPrice\"] =\n            Number(obj.properties[\"_productMemberPrice\"]) * 100;\n        }\n\n        obj.id = variants[index].id;\n        return obj;\n      }\n    }\n  }\n\n  theme.a11y = {\n    /**\n     * Traps the focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    trapFocus: function (options) {\n      var eventsName = {\n        focusin: options.namespace ? \"focusin.\" + options.namespace : \"focusin\",\n        focusout: options.namespace\n          ? \"focusout.\" + options.namespace\n          : \"focusout\",\n        keydown: options.namespace\n          ? \"keydown.\" + options.namespace\n          : \"keydown.handleFocus\",\n      };\n\n      /**\n       * Get every possible visible focusable element\n       */\n      var $focusableElements = options.$container.find(\n        'button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])'\n      ).filter(\":visible\");\n\n      var firstFocusable = $focusableElements[0];\n      var lastFocusable = $focusableElements[$focusableElements.length - 1];\n\n      if (!options.$elementToFocus) {\n        options.$elementToFocus = options.$container;\n      }\n\n      function _manageFocus(evt) {\n        // Tab key\n        if (evt.keyCode !== 9) return;\n\n        var isTabPressed = evt.key === 'Tab' || evt.keyCode === 9;\n        if (!isTabPressed) return;\n\n        // If focus is not within the modal, redirect it back\n        if (!options.$container[0].contains(evt.target)) {\n          evt.preventDefault();\n          firstFocusable.focus();\n          return;\n        }\n\n        /**\n         * On the last focusable element and tab forward,\n         * focus the first element.\n         */\n        if (evt.target === lastFocusable && !evt.shiftKey) {\n          evt.preventDefault();\n          firstFocusable.focus();\n        }\n        /**\n         * On the first focusable element and tab backward,\n         * focus the last element.\n         */\n        else if (evt.target === firstFocusable && evt.shiftKey) {\n          evt.preventDefault();\n          lastFocusable.focus();\n        }\n      }\n\n      // Set up focus containment\n      options.$container.attr(\"tabindex\", \"-1\");\n\n      // Focus the specified element or first focusable element\n      if (options.$elementToFocus && options.$elementToFocus.length) {\n        setTimeout(function() {\n          options.$elementToFocus.focus();\n        }, 50);\n      } else if (firstFocusable) {\n        setTimeout(function() {\n          firstFocusable.focus();\n        }, 50);\n      }\n\n      // Remove any existing focus event handlers\n      $(document).off(\"focusin.\" + options.namespace);\n      $(document).off(\"keydown.\" + options.namespace);\n\n      // Add focus containment listeners\n      $(document).on(eventsName.keydown, function (evt) {\n        _manageFocus(evt);\n      });\n\n      // Redirect focus back to modal if it escapes\n      $(document).on(eventsName.focusin, function (evt) {\n        if (!options.$container[0].contains(evt.target)) {\n          evt.preventDefault();\n          if (firstFocusable) {\n            firstFocusable.focus();\n          }\n        }\n      });\n    },\n\n    /**\n     * Removes the trap of focus in a particular container\n     *\n     * @param {object} options - Options to be used\n     * @param {jQuery} options.$container - Container to trap focus within\n     * @param {string} options.namespace - Namespace used for new focus event handler\n     */\n    removeTrapFocus: function (options) {\n      var focusinEventName = options.namespace\n        ? \"focusin.\" + options.namespace\n        : \"focusin\";\n      var keydownEventName = options.namespace\n        ? \"keydown.\" + options.namespace\n        : \"keydown\";\n\n      if (options.$container && options.$container.length) {\n        options.$container.removeAttr(\"tabindex\");\n      }\n\n      $(document).off(focusinEventName);\n      $(document).off(keydownEventName);\n    },\n\n    lockMobileScrolling: function (namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add(\"body\");\n      }\n      $el.on(\"touchmove\" + namespace, function () {\n        return false;\n      });\n    },\n\n    unlockMobileScrolling: function (namespace, $element) {\n      if ($element) {\n        var $el = $element;\n      } else {\n        var $el = $(document.documentElement).add(\"body\");\n      }\n      $el.off(namespace);\n    },\n  };\n\n  theme.Sections = function Sections() {\n    this.constructors = {};\n    this.instances = [];\n\n    $(document)\n      .on(\"shopify:section:load\", this._onSectionLoad.bind(this))\n      .on(\"shopify:section:unload\", this._onSectionUnload.bind(this))\n      .on(\"shopify:section:select\", this._onSelect.bind(this))\n      .on(\"shopify:section:deselect\", this._onDeselect.bind(this))\n      .on(\"shopify:block:select\", this._onBlockSelect.bind(this))\n      .on(\"shopify:block:deselect\", this._onBlockDeselect.bind(this));\n  };\n\n  theme.Sections.prototype = $.extend({}, theme.Sections.prototype, {\n    createInstance: function (container, constructor, customScope) {\n      var $container = $(container);\n      var id = $container.attr(\"data-section-id\");\n      var type = $container.attr(\"data-section-type\");\n\n      constructor = constructor || this.constructors[type];\n\n      if (typeof constructor === \"undefined\") {\n        return;\n      }\n\n      // If custom scope passed, check to see if instance\n      // is already initialized so we don't double up\n      if (customScope) {\n        var instanceExists = this._findInstance(id);\n        if (instanceExists) {\n          return;\n        }\n      }\n\n      var instance = $.extend(new constructor(container), {\n        id: id,\n        type: type,\n        container: container,\n      });\n\n      this.instances.push(instance);\n    },\n\n    _onSectionLoad: function (evt, subSection, subSectionId) {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      var container = subSection\n        ? subSection\n        : $(\"[data-section-id]\", evt.target)[0];\n\n      if (!container) {\n        return;\n      }\n\n      this.createInstance(container);\n\n      var instance = subSection\n        ? subSectionId\n        : this._findInstance(evt.detail.sectionId);\n\n      if (!subSection) {\n        this._loadSubSections();\n      }\n\n      // Run JS only in case of the section being selected in the editor\n      // before merchant clicks \"Add\"\n      if (instance && typeof instance.onLoad === \"function\") {\n        instance.onLoad(evt);\n      }\n    },\n\n    _loadSubSections: function () {\n      if (AOS) {\n        AOS.refreshHard();\n      }\n      $(\"[data-subsection]\").each(\n        function (evt, el) {\n          this._onSectionLoad(null, el, $(el).data(\"section-id\"));\n        }.bind(this)\n      );\n    },\n\n    _onSectionUnload: function (evt) {\n      var instance = this._removeInstance(evt.detail.sectionId);\n      if (instance && typeof instance.onUnload === \"function\") {\n        instance.onUnload(evt);\n      }\n    },\n\n    _onSelect: function (evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n\n      if (instance && typeof instance.onSelect === \"function\") {\n        instance.onSelect(evt);\n      }\n    },\n\n    _onDeselect: function (evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n\n      if (instance && typeof instance.onDeselect === \"function\") {\n        instance.onDeselect(evt);\n      }\n    },\n\n    _onBlockSelect: function (evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n\n      if (instance && typeof instance.onBlockSelect === \"function\") {\n        instance.onBlockSelect(evt);\n      }\n    },\n\n    _onBlockDeselect: function (evt) {\n      var instance = this._findInstance(evt.detail.sectionId);\n\n      if (instance && typeof instance.onBlockDeselect === \"function\") {\n        instance.onBlockDeselect(evt);\n      }\n    },\n\n    _findInstance: function (id) {\n      for (var i = 0; i < this.instances.length; i++) {\n        if (this.instances[i].id === id) {\n          return this.instances[i];\n        }\n      }\n    },\n\n    _removeInstance: function (id) {\n      var i = this.instances.length;\n      var instance;\n\n      while (i--) {\n        if (this.instances[i].id === id) {\n          instance = this.instances[i];\n          this.instances.splice(i, 1);\n          break;\n        }\n      }\n\n      return instance;\n    },\n\n    register: function (type, constructor, $scope) {\n      var afterLoad = false;\n      this.constructors[type] = constructor;\n      var $sections = $(\"[data-section-type=\" + type + \"]\");\n\n      if ($scope) {\n        $sections = $(\"[data-section-type=\" + type + \"]\", $scope);\n      }\n\n      $sections.each(\n        function (index, container) {\n          this.createInstance(container, constructor, $scope);\n        }.bind(this)\n      );\n    },\n  });\n\n  /**\n   * Currency Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help with currency formatting\n   *\n   * Current contents\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n   *\n   * Alternatives\n   * - Accounting.js - http://openexchangerates.github.io/accounting.js/\n   *\n   */\n\n  theme.Currency = (function () {\n    var moneyFormat = \"${{amount}}\";\n\n    function formatMoney(cents, format) {\n      if (!format) {\n        format = theme.settings.moneyFormat;\n      }\n\n      if (typeof cents === \"string\") {\n        cents = cents.replace(\".\", \"\");\n      }\n      var value = \"\";\n      var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n      var formatString = format || moneyFormat;\n\n      function formatWithDelimiters(number, precision, thousands, decimal) {\n        precision = theme.utils.defaultTo(precision, 2);\n        thousands = theme.utils.defaultTo(thousands, \",\");\n        decimal = theme.utils.defaultTo(decimal, \".\");\n\n        if (isNaN(number) || number == null) {\n          return 0;\n        }\n\n        number = (number / 100.0).toFixed(precision);\n\n        var parts = number.split(\".\");\n        var dollarsAmount = parts[0].replace(\n          /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n          \"$1\" + thousands\n        );\n        var centsAmount = parts[1] ? decimal + parts[1] : \"\";\n\n        return dollarsAmount + centsAmount;\n      }\n\n      switch (formatString.match(placeholderRegex)[1]) {\n        case \"amount\":\n          value = formatWithDelimiters(cents, 2);\n          break;\n        case \"amount_no_decimals\":\n          value = formatWithDelimiters(cents, 0);\n          break;\n        case \"amount_with_comma_separator\":\n          value = formatWithDelimiters(cents, 2, \".\", \",\");\n          break;\n        case \"amount_no_decimals_with_comma_separator\":\n          value = formatWithDelimiters(cents, 0, \".\", \",\");\n          break;\n        case \"amount_no_decimals_with_space_separator\":\n          value = formatWithDelimiters(cents, 0, \" \");\n          break;\n      }\n\n      return formatString.replace(placeholderRegex, value);\n    }\n\n    function getBaseUnit(variant) {\n      if (!variant) {\n        return;\n      }\n\n      if (\n        !variant.unit_price_measurement ||\n        !variant.unit_price_measurement.reference_value\n      ) {\n        return;\n      }\n\n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    }\n\n    return {\n      formatMoney: formatMoney,\n      getBaseUnit: getBaseUnit,\n    };\n  })();\n\n  /**\n   * Image Helper Functions\n   * -----------------------------------------------------------------------------\n   * A collection of functions that help with basic image operations.\n   *\n   */\n\n  theme.Images = (function () {\n    /**\n     * Find the Shopify image attribute size\n     *\n     * @param {string} src\n     * @returns {null}\n     */\n    function imageSize(src) {\n      if (!src) {\n        return \"620x\"; // default based on theme\n      }\n\n      var match = src.match(\n        /.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\.@]/\n      );\n\n      if (match !== null) {\n        return match[1];\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Adds a Shopify size attribute to a URL\n     *\n     * @param src\n     * @param size\n     * @returns {*}\n     */\n    function getSizedImageUrl(src, size) {\n      if (!src) {\n        return src;\n      }\n\n      if (size == null) {\n        return src;\n      }\n\n      if (size === \"master\") {\n        return this.removeProtocol(src);\n      }\n\n      var match = src.match(\n        /\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i\n      );\n\n      if (match != null) {\n        var prefix = src.split(match[0]);\n        var suffix = match[0];\n\n        return this.removeProtocol(prefix[0] + \"_\" + size + suffix);\n      }\n\n      return null;\n    }\n\n    function removeProtocol(path) {\n      return path.replace(/http(s)?:/, \"\");\n    }\n\n    return {\n      imageSize: imageSize,\n      getSizedImageUrl: getSizedImageUrl,\n      removeProtocol: removeProtocol,\n    };\n  })();\n\n  theme.Variants = (function () {\n    function Variants(options) {\n      this.$container = options.$container;\n      this.variants = options.variants;\n      this.singleOptionSelector = options.singleOptionSelector;\n      this.originalSelectorId = options.originalSelectorId;\n      this.enableHistoryState = options.enableHistoryState;\n      this.currentVariant = this._getVariantFromOptions();\n\n      $(this.singleOptionSelector, this.$container).on(\n        \"change\",\n        this._onSelectChange.bind(this)\n      );\n    }\n\n    Variants.prototype = $.extend({}, Variants.prototype, {\n      _getCurrentOptions: function () {\n        var currentOptions = $.map(\n          $(this.singleOptionSelector, this.$container),\n          function (element) {\n            var $element = $(element);\n            var type = $element.attr(\"type\");\n            var currentOption = {};\n\n            if (type === \"radio\" || type === \"checkbox\") {\n              if ($element[0].checked) {\n                currentOption.value = $element.val();\n                currentOption.index = $element.data(\"index\");\n\n                return currentOption;\n              } else {\n                return false;\n              }\n            } else {\n              currentOption.value = $element.val();\n              currentOption.index = $element.data(\"index\");\n\n              return currentOption;\n            }\n          }\n        );\n\n        // remove any unchecked input values if using radio buttons or checkboxes\n        currentOptions = this._compact(currentOptions);\n\n        return currentOptions;\n      },\n\n      _getVariantFromOptions: function () {\n        var selectedValues = this._getCurrentOptions();\n        var variants = this.variants;\n        var found = false;\n\n        variants.forEach(function (variant) {\n          var match = true;\n          var options = variant.options;\n\n          selectedValues.forEach(function (option) {\n            if (match) {\n              match = variant[option.index] === option.value;\n            }\n          });\n\n          if (match) {\n            found = variant;\n          }\n        });\n\n        return found || null;\n      },\n\n      _onSelectChange: function () {\n        var variant = this._getVariantFromOptions();\n\n        this.$container.trigger({\n          type: \"variantChange\",\n          variant: variant,\n        });\n\n        document.dispatchEvent(\n          new CustomEvent(\"variant:change\", {\n            detail: {\n              variant: variant,\n            },\n          })\n        );\n\n        if (!variant) {\n          return;\n        }\n\n        this._updateMasterSelect(variant);\n        this._updateImages(variant);\n        this._updatePrice(variant);\n        this._updateUnitPrice(variant);\n        this._updateSKU(variant);\n        this.currentVariant = variant;\n\n        if (this.enableHistoryState) {\n          this._updateHistoryState(variant);\n        }\n      },\n\n      _updateImages: function (variant) {\n        var variantImage = variant.featured_image || {};\n        var currentVariantImage = this.currentVariant.featured_image || {};\n\n        if (\n          !variant.featured_image ||\n          variantImage.src === currentVariantImage.src\n        ) {\n          return;\n        }\n\n        this.$container.trigger({\n          type: \"variantImageChange\",\n          variant: variant,\n        });\n      },\n\n      _updatePrice: function (variant) {\n        if (\n          variant.price === this.currentVariant.price &&\n          variant.compare_at_price === this.currentVariant.compare_at_price\n        ) {\n          return;\n        }\n\n        this.$container.trigger({\n          type: \"variantPriceChange\",\n          variant: variant,\n        });\n      },\n\n      _updateUnitPrice: function (variant) {\n        if (variant.unit_price === this.currentVariant.unit_price) {\n          return;\n        }\n\n        this.$container.trigger({\n          type: \"variantUnitPriceChange\",\n          variant: variant,\n        });\n      },\n\n      _updateSKU: function (variant) {\n        if (variant.sku === this.currentVariant.sku) {\n          return;\n        }\n\n        this.$container.trigger({\n          type: \"variantSKUChange\",\n          variant: variant,\n        });\n      },\n\n      _updateHistoryState: function (variant) {\n        if (!history.replaceState || !variant) {\n          return;\n        }\n\n        var newurl =\n          window.location.protocol +\n          \"//\" +\n          window.location.host +\n          window.location.pathname +\n          \"?variant=\" +\n          variant.id;\n        window.history.replaceState({ path: newurl }, \"\", newurl);\n      },\n\n      _updateMasterSelect: function (variant) {\n        $(this.originalSelectorId, this.$container).val(variant.id);\n      },\n\n      // _.compact from lodash\n      // https://github.com/lodash/lodash/blob/4d4e452ade1e78c7eb890968d851f837be37e429/compact.js\n      _compact: function (array) {\n        var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n        while (++index < length) {\n          var value = array[index];\n          if (value) {\n            result[resIndex++] = value;\n          }\n        }\n        return result;\n      },\n    });\n\n    return Variants;\n  })();\n\n  theme.popups = {\n    init: function () {\n      var modalTriggers = $(\".js-modal-open[data-opens-modal]\");\n      if (modalTriggers.length == 0) {\n        return;\n      }\n\n      modalTriggers.each(function (index, btn) {\n        var btn = $(btn);\n        var target = btn.attr(\"data-opens-modal\").replace(\"#\", \"\"); // always opens an ID, so remove the #\n        new theme.Modals(target, target, {\n          closeOffContentClick: true,\n          solid: true,\n        });\n      });\n    },\n  };\n\n  /*\n    add '.slickify' class to any element to convert it to slick slider upon initialization.\n    you can also utilize slick data attributes to provide overwrites to default config set below.\n    https://kenwheeler.github.io/slick/\n    <div data-slick='{\"slidesToShow\": 4, \"slidesToScroll\": 4}'> ...\n  */\n  theme.slick = {\n    selectors: {\n      slick: \".slickify\",\n    },\n    init: function () {\n      var $slickEls = $(theme.slick.selectors.slick);\n      $.each($slickEls, function (i, slider) {\n        var data_config = $(slider).attr(\"data-slick\")\n          ? JSON.parse($(slider).attr(\"data-slick\"))\n          : \"\";\n        var config = {\n          arrows: false,\n          dots: true,\n          autoplay: true,\n          autoplaySpeed: 4500 + i * 1500,\n          infinite: true,\n          pauseOnFocus: true,\n          pauseOnHover: true,\n          slidesToShow: 3,\n          slidesToScroll: 1,\n          responsive: [\n            {\n              breakpoint: 600,\n              settings: {\n                slidesToShow: 2,\n                slidesToScroll: 1,\n              },\n            },\n            {\n              breakpoint: 480,\n              settings: {\n                slidesToShow: 1,\n                slidesToScroll: 1,\n              },\n            },\n          ],\n          ...data_config,\n        };\n        $(slider).slick(config);\n      });\n    },\n  };\n\n  theme.loginRegister = {\n    selectors: {\n      loginLink: `[data-href=\"${theme.routes.login}\"]`,\n      registerLink: `[data-href=\"${theme.routes.register}\"]`,\n      modal: \"LoginRegisterModal\", // id\n      modalEl: undefined,\n    },\n    init: function () {\n      // we init modal first so we can add input handler on it\n      theme.loginRegister.selectors.modalEl = new theme.Modals(\n        theme.loginRegister.selectors.modal,\n        theme.loginRegister.selectors.modal,\n        {\n          closeOffContentClick: true,\n          solid: true,\n          focusOnOpen: '#LoginRegisterModal input[type=\"email\"]',\n        }\n      );\n\n      var $modalEmailInput = $(\n        theme.loginRegister.selectors.modalEl.$modal\n      ).find('input[type=\"email\"]');\n      $modalEmailInput.on(\n        \"blur keydown paste\",\n        $.debounce(250, function () {\n          if (\n            $modalEmailInput.val().length <= 3 ||\n            !$modalEmailInput.val().includes(\"@\")\n          ) {\n            $modalEmailInput.removeClass(\"success\").addClass(\"error\");\n            return;\n          }\n          $modalEmailInput.removeClass(\"error\").addClass(\"success\");\n        })\n      );\n\n      var $modalEmailForm = $(\n        theme.loginRegister.selectors.modalEl.$modal\n      ).find(\"form\");\n      $modalEmailForm.submit(function (evt) {\n        evt.preventDefault();\n        if (\n          $modalEmailInput.val().length <= 3 ||\n          !$modalEmailInput.val().includes(\"@\")\n        ) {\n          $modalEmailInput.removeClass(\"success\").addClass(\"error\");\n          return;\n        }\n        $modalEmailForm.find('button[type=\"submit\"]').addClass(\"btn--loading\");\n        window.top.location = `${theme.routes.login}?email=${encodeURIComponent(\n          $modalEmailInput.val()\n        )}&return_url=${encodeURIComponent(window.top.location)}`;\n      });\n\n      /*\n        We need to wrap button initialization to cart:updated event, because AJAX cart has some buttons we use as well.\n        Those buttons are available only after this event is completed, as cart is built dynamically with a Handlebars template.\n        For each cart:updated event, we also unbind existing click because every time product is added to cart, it retriggers cart:updated\n      */\n      $(document).on(\"cart:updated\", function () {\n        $(\n          theme.loginRegister.selectors.loginLink +\n            \",\" +\n            theme.loginRegister.selectors.registerLink\n        ).unbind(\"click\");\n        $(\n          theme.loginRegister.selectors.loginLink +\n            \",\" +\n            theme.loginRegister.selectors.registerLink\n        ).click(function (evt) {\n          evt.preventDefault();\n          theme.loginRegister.show($(this).attr(\"data-href\"));\n        });\n      });\n    },\n    show: function (sourceHref) {\n      theme.loginRegister.selectors.modalEl.open();\n    },\n  };\n\n  (theme.tabs = {\n    init: function () {\n      var selectors = {\n        parent: \".js-product-tabs\",\n        button: \".js-product-tabs .tab-buttons button\",\n        section: \".js-product-tabs .tab-content section\",\n      };\n\n      if ($(selectors.parent).length == 0) {\n        return;\n      }\n\n      $(selectors.button).click(function (evt) {\n        evt.preventDefault();\n        var targetSection = $(this).attr(\"data-target\");\n\n        // close all sections first\n        $(selectors.button).attr(\"data-active\", false);\n        $(selectors.section).attr(\"data-open\", false);\n\n        // open targeted section\n        $(this).attr(\"data-active\", true);\n        $(selectors.section + \"#\" + targetSection).attr(\"data-open\", true);\n      });\n    },\n  }),\n    (theme.rte = {\n      init: function () {\n        theme.rte.wrapTable();\n        theme.rte.wrapVideo();\n        theme.rte.imageLinks();\n      },\n\n      wrapTable: function () {\n        $(\".rte table\").wrap('<div class=\"table-wrapper\"></div>');\n      },\n\n      wrapVideo: function () {\n        var $iframeVideo = $(\n          '.rte iframe[src*=\"youtube.com/embed\"], .rte iframe[src*=\"player.vimeo\"]'\n        );\n        var $iframeReset = $iframeVideo.add(\"iframe#admin_bar_iframe\");\n\n        $iframeVideo.each(function () {\n          // Add wrapper to make video responsive\n          if (!$(this).parents(\".video-wrapper\").length) {\n            $(this).wrap('<div class=\"video-wrapper\"></div>');\n          }\n        });\n\n        $iframeReset.each(function () {\n          // Re-set the src attribute on each iframe after page load\n          // for Chrome's \"incorrect iFrame content on 'back'\" bug.\n          // https://code.google.com/p/chromium/issues/detail?id=395791\n          // Need to specifically target video and admin bar\n          this.src = this.src;\n        });\n      },\n\n      // Remove CSS that adds animated underline under image links\n      imageLinks: function () {\n        $(\".rte a img\").parent().addClass(\"rte__image\");\n      },\n    });\n\n  theme.LibraryLoader = (function () {\n    var types = {\n      link: \"link\",\n      script: \"script\",\n    };\n\n    var status = {\n      requested: \"requested\",\n      loaded: \"loaded\",\n    };\n\n    var cloudCdn = \"https://cdn.shopify.com/shopifycloud/\";\n\n    var libraries = {\n      youtubeSdk: {\n        tagId: \"youtube-sdk\",\n        src: \"https://www.youtube.com/iframe_api\",\n        type: types.script,\n      },\n      shopifyXr: {\n        tagId: \"shopify-model-viewer-xr\",\n        src: cloudCdn + \"shopify-xr-js/assets/v1.0/shopify-xr.en.js\",\n        type: types.script,\n      },\n      modelViewerUi: {\n        tagId: \"shopify-model-viewer-ui\",\n        src: cloudCdn + \"model-viewer-ui/assets/v1.0/model-viewer-ui.en.js\",\n        type: types.script,\n      },\n      modelViewerUiStyles: {\n        tagId: \"shopify-model-viewer-ui-styles\",\n        src: cloudCdn + \"model-viewer-ui/assets/v1.0/model-viewer-ui.css\",\n        type: types.link,\n      },\n    };\n\n    function load(libraryName, callback) {\n      var library = libraries[libraryName];\n\n      if (!library) return;\n      if (library.status === status.requested) return;\n\n      callback = callback || function () {};\n      if (library.status === status.loaded) {\n        callback();\n        return;\n      }\n\n      library.status = status.requested;\n\n      var tag;\n\n      switch (library.type) {\n        case types.script:\n          tag = createScriptTag(library, callback);\n          break;\n        case types.link:\n          tag = createLinkTag(library, callback);\n          break;\n      }\n\n      tag.id = library.tagId;\n      library.element = tag;\n\n      var firstScriptTag = document.getElementsByTagName(library.type)[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n\n    function createScriptTag(library, callback) {\n      var tag = document.createElement(\"script\");\n      tag.src = library.src;\n      tag.addEventListener(\"load\", function () {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n\n    function createLinkTag(library, callback) {\n      var tag = document.createElement(\"link\");\n      tag.href = library.src;\n      tag.rel = \"stylesheet\";\n      tag.type = \"text/css\";\n      tag.addEventListener(\"load\", function () {\n        library.status = status.loaded;\n        callback();\n      });\n      return tag;\n    }\n\n    return {\n      load: load,\n    };\n  })();\n\n  theme.Modals = (function () {\n    function Modal(id, name, options) {\n      var defaults = {\n        close: \".js-modal-close\",\n        open: \".js-modal-open-\" + name,\n        openClass: \"modal--is-active\",\n        closingClass: \"modal--is-closing\",\n        bodyOpenClass: \"modal-open\",\n        bodyOpenSolidClass: \"modal-open--solid\",\n        bodyClosingClass: \"modal-closing\",\n        closeOffContentClick: true,\n      };\n\n      this.id = id;\n      this.$modal = $(\"#\" + id);\n\n      if (!this.$modal.length) {\n        return false;\n      }\n\n      this.nodes = {\n        $parent: $(\"html\").add(\"body\"),\n        $modalContent: this.$modal.find(\".modal__inner\"),\n      };\n\n      this.config = $.extend(defaults, options);\n      this.modalIsOpen = false;\n      this.$focusOnOpen = this.config.focusOnOpen\n        ? $(this.config.focusOnOpen)\n        : this.$modal;\n      this.isSolid = this.config.solid;\n\n      this.init();\n    }\n\n    Modal.prototype.init = function () {\n      var $openBtn = $(this.config.open);\n\n      // Add aria controls\n      $openBtn.attr(\"aria-expanded\", \"false\");\n\n      $(this.config.open).on(\"click\", this.open.bind(this));\n      this.$modal.find(this.config.close).on(\"click\", this.close.bind(this));\n\n      // Close modal if a drawer is opened\n      $(\"body\").on(\n        \"drawerOpen\",\n        function () {\n          this.close();\n        }.bind(this)\n      );\n    };\n\n    Modal.prototype.open = function (evt) {\n      // Keep track if modal was opened from a click, or called by another function\n      var externalCall = false;\n\n      // don't open an opened modal\n      if (this.modalIsOpen) {\n        return;\n      }\n\n      // Prevent following href if link is clicked\n      if (evt) {\n        evt.preventDefault();\n      } else {\n        externalCall = true;\n      }\n\n      // Without this, the modal opens, the click event bubbles up to $nodes.page\n      // which closes the modal.\n      if (evt && evt.stopPropagation) {\n        evt.stopPropagation();\n        // save the source of the click, we'll focus to this on close\n        this.$activeSource = $(evt.currentTarget).attr(\"aria-expanded\", \"true\");\n      }\n\n      if (this.modalIsOpen && !externalCall) {\n        this.close();\n      }\n\n      this.$modal.prepareTransition().addClass(this.config.openClass);\n      this.nodes.$parent.addClass(this.config.bodyOpenClass);\n\n      if (this.isSolid) {\n        this.nodes.$parent.addClass(this.config.bodyOpenSolidClass);\n      }\n\n      this.modalIsOpen = true;\n      theme.a11y.trapFocus({\n        $container: this.$modal,\n        $elementToFocus: this.$focusOnOpen,\n        namespace: \"modal_focus\",\n      });\n\n      $(\"body\")\n        .trigger(\"productModalOpen\")\n        .trigger(\"modalOpen.\" + this.id);\n\n      this.bindEvents();\n    };\n\n    Modal.prototype.close = function () {\n      // don't close a closed modal\n      if (!this.modalIsOpen) {\n        return;\n      }\n\n      // deselect any focused form elements\n      $(document.activeElement).trigger(\"blur\");\n\n      this.$modal\n        .prepareTransition()\n        .removeClass(this.config.openClass)\n        .addClass(this.config.closingClass);\n      this.nodes.$parent.removeClass(this.config.bodyOpenClass);\n      this.nodes.$parent.addClass(this.config.bodyClosingClass);\n\n      this.modalIsOpen = false;\n\n      window.setTimeout(\n        function () {\n          this.nodes.$parent.removeClass(this.config.bodyClosingClass);\n          this.$modal.removeClass(this.config.closingClass);\n\n          // Remove focus trap first\n          theme.a11y.removeTrapFocus({\n            $container: this.$modal,\n            namespace: \"modal_focus\",\n          });\n\n          // Then restore focus\n          if (this.$activeSource && this.$activeSource.length && this.$activeSource.attr(\"aria-expanded\")) {\n            this.$activeSource.attr(\"aria-expanded\", \"false\").focus();\n          } else {\n            // Fallback: focus on document body or first focusable element on page\n            var $fallbackFocus = $('main, #MainContent, body').first();\n            if ($fallbackFocus.length) {\n              $fallbackFocus.attr('tabindex', '-1').focus().removeAttr('tabindex');\n            }\n          }\n        }.bind(this),\n        500\n      ); // modal close css transition\n\n      if (this.isSolid) {\n        this.nodes.$parent.removeClass(this.config.bodyOpenSolidClass);\n      }\n\n      /*\n        When closing the modal, it only hides it from user rather than destroying the DOM entry.\n        This causes one problem with video modals; video keeps playing on the background instead of pausing.\n        To prevent this, we use the logic below.\n      */\n      if (this.id.toLowerCase().includes(\"video\")) {\n        var iframe_element = this.$modal[0].querySelector(\"iframe\");\n        var video_source = iframe_element.getAttribute(\"src\");\n        iframe_element.removeAttribute(\"src\");\n        iframe_element.setAttribute(\"src\", video_source);\n      }\n\n      $(\"body\").trigger(\"modalClose.\" + this.id);\n\n      this.unbindEvents();\n    };\n\n    Modal.prototype.bindEvents = function () {\n      // Pressing escape closes modal\n      this.nodes.$parent.on(\n        \"keyup.modal\",\n        function (evt) {\n          if (evt.keyCode === 27) {\n            this.close();\n          }\n        }.bind(this)\n      );\n\n      if (this.config.closeOffContentClick) {\n        // Clicking outside of the modal content also closes it\n        this.$modal.on(\"click.modal\", this.close.bind(this));\n\n        // Exception to above: clicking anywhere on the modal content will NOT close it\n        this.nodes.$modalContent.on(\"click.modal\", function (evt) {\n          evt.stopImmediatePropagation();\n        });\n      }\n    };\n\n    Modal.prototype.unbindEvents = function () {\n      this.nodes.$parent.off(\".modal\");\n\n      if (this.config.closeOffContentClick) {\n        this.$modal.off(\".modal\");\n        this.nodes.$modalContent.off(\".modal\");\n      }\n    };\n\n    return Modal;\n  })();\n\n  theme.Drawers = (function () {\n    function Drawer(id, name) {\n      this.config = {\n        id: id,\n        close: \".js-drawer-close\",\n        open: \".js-drawer-open-\" + name,\n        openClass: \"js-drawer-open\",\n        closingClass: \"js-drawer-closing\",\n        activeDrawer: \"drawer--is-open\",\n        namespace: \".drawer-\" + name,\n      };\n\n      this.$nodes = {\n        parent: $(document.documentElement).add(\"body\"),\n        page: $(\"#MainContent\"),\n      };\n\n      this.$drawer = $(\"#\" + id);\n\n      if (!this.$drawer.length) {\n        return false;\n      }\n\n      this.isOpen = false;\n      this.init();\n    }\n\n    Drawer.prototype = $.extend({}, Drawer.prototype, {\n      init: function () {\n        var $openBtn = $(this.config.open);\n\n        // Add aria controls\n        $openBtn.attr(\"aria-expanded\", \"false\");\n\n        $openBtn.on(\"click\", this.open.bind(this));\n        this.$drawer.find(this.config.close).on(\"click\", this.close.bind(this));\n\n        // Close modal if a drawer is opened\n        $(\"body\").on(\n          \"productModalOpen\",\n          function () {\n            this.close();\n          }.bind(this)\n        );\n      },\n\n      open: function (evt, returnFocusEl) {\n        if (evt) {\n          evt.preventDefault();\n        }\n\n        if (this.isOpen) {\n          return;\n        }\n\n        // Without this the drawer opens, the click event bubbles up to $nodes.page which closes the drawer.\n        if (evt && evt.stopPropagation) {\n          evt.stopPropagation();\n          // save the source of the click, we'll focus to this on close\n          this.$activeSource = $(evt.currentTarget).attr(\n            \"aria-expanded\",\n            \"true\"\n          );\n        } else if (returnFocusEl) {\n          var $el = $(returnFocusEl);\n          this.$activeSource = $el.attr(\"aria-expanded\", \"true\");\n        }\n\n        this.$drawer.prepareTransition().addClass(this.config.activeDrawer);\n\n        this.$nodes.parent.addClass(this.config.openClass);\n        this.isOpen = true;\n\n        theme.a11y.trapFocus({\n          $container: this.$drawer,\n          namespace: \"drawer_focus\",\n        });\n\n        $(\"body\")\n          .trigger(\"drawerOpen\")\n          .trigger(\"drawerOpen.\" + this.config.id);\n\n        this.bindEvents();\n      },\n\n      close: function () {\n        if (!this.isOpen) {\n          return;\n        }\n\n        // deselect any focused form elements\n        $(document.activeElement).trigger(\"blur\");\n\n        this.$drawer.prepareTransition().removeClass(this.config.activeDrawer);\n\n        this.$nodes.parent.removeClass(this.config.openClass);\n        this.$nodes.parent.addClass(this.config.closingClass);\n        window.setTimeout(\n          function () {\n            this.$nodes.parent.removeClass(this.config.closingClass);\n            if (\n              this.$activeSource &&\n              this.$activeSource.attr(\"aria-expanded\")\n            ) {\n              this.$activeSource.attr(\"aria-expanded\", \"false\").focus();\n            }\n          }.bind(this),\n          500\n        );\n\n        this.isOpen = false;\n\n        theme.a11y.removeTrapFocus({\n          $container: this.$drawer,\n          namespace: \"drawer_focus\",\n        });\n\n        this.unbindEvents();\n      },\n\n      bindEvents: function () {\n        theme.a11y.lockMobileScrolling(this.config.namespace, this.$nodes.page);\n\n        // Clicking out of drawer closes it\n        this.$nodes.page.on(\n          \"click\" + this.config.namespace,\n          function () {\n            this.close();\n            return false;\n          }.bind(this)\n        );\n\n        // Pressing escape closes drawer\n        this.$nodes.parent.on(\n          \"keyup\" + this.config.namespace,\n          function (evt) {\n            if (evt.keyCode === 27) {\n              this.close();\n            }\n          }.bind(this)\n        );\n      },\n\n      unbindEvents: function () {\n        theme.a11y.unlockMobileScrolling(\n          this.config.namespace,\n          this.$nodes.page\n        );\n        this.$nodes.parent.off(this.config.namespace);\n        this.$nodes.page.off(this.config.namespace);\n      },\n    });\n\n    return Drawer;\n  })();\n\n  theme.cart = {\n    getCart: function () {\n      return $.getJSON(theme.routes.cart);\n    },\n\n    changeItem: function (key, qty) {\n      return this._updateCart({\n        type: \"POST\",\n        url: theme.routes.cartChange,\n        data: \"quantity=\" + qty + \"&id=\" + key,\n        dataType: \"json\",\n      });\n    },\n\n    addItemFromForm: function (data) {\n      return this._updateCart({\n        type: \"POST\",\n        url: theme.routes.cartAdd,\n        data: data,\n        dataType: \"json\",\n      });\n    },\n\n    _updateCart: function (params) {\n      return $.ajax(params).then(\n        function (cart) {\n          return cart;\n        }.bind(this)\n      );\n    },\n\n    updateNote: function (note) {\n      var params = {\n        type: \"POST\",\n        url: \"/cart/update.js\",\n        data: \"note=\" + theme.cart.attributeToString(note),\n        dataType: \"json\",\n        success: function (cart) {},\n        error: function (XMLHttpRequest, textStatus) {},\n      };\n\n      $.ajax(params);\n    },\n\n    attributeToString: function (attribute) {\n      if (typeof attribute !== \"string\") {\n        attribute += \"\";\n        if (attribute === \"undefined\") {\n          attribute = \"\";\n        }\n      }\n      return attribute.trim();\n    },\n  };\n\n  theme.ajaxEnhancements = {\n    functions: {\n      cartQtyHandler: $.throttle(150, async function (evt, key, inputQty) {\n        const qty = parseInt(inputQty);\n        const step_item_id = parseInt(key.split(\":\").shift());\n        const update = {};\n\n        if (qty === 0) {\n          const removeButton = document.querySelector(\n            `[data-remove-step=\"${key}\"]`\n          );\n          if (removeButton) {\n            removeButton.click();\n            return;\n          }\n        }\n\n        const participantForm = document.querySelector(\n          `[data-key=\"${key}\"] .main-form`\n        );\n        if (participantForm) {\n          const touched = participantForm.querySelector('[data-touched=\"true\"]')\n            ? \"true\"\n            : \"false\";\n          const variant = key.split(\":\")[0];\n\n          const cartRes = await fetch(`/cart.json`);\n          const json = await cartRes.json();\n\n          // console.log(json)\n\n          const itemsWithSameVariant = json.items.filter(\n            (x) => x.variant_id == parseInt(variant) && x.quantity >= 1\n          );\n\n          if (touched === \"true\" && itemsWithSameVariant.length == 0) {\n            const itemHandle = participantForm.getAttribute(\"data-handle\");\n            const res = await fetch(\n              `${theme.routes.home}products/${itemHandle}?view=ajax`\n            );\n            const text = await res.text();\n\n            const parser = new DOMParser();\n            const parsedHtml = parser.parseFromString(text, \"text/html\");\n\n            const lineItemsToInclude = {};\n            const lineItemPropInputs = parsedHtml.querySelectorAll(\n              '[name*=\"properties\"]'\n            );\n            lineItemPropInputs.forEach((input) => {\n              const propName = input\n                .getAttribute(\"name\")\n                .replace(\"properties[\", \"\")\n                .replace(\"]\", \"\");\n              const propValue = input.value;\n              lineItemsToInclude[propName] = propValue;\n            });\n\n            const payload = [\n              {\n                id: parseInt(variant),\n                quantity: 1,\n                properties: { ...lineItemsToInclude },\n              },\n            ];\n\n            theme.startReloadingCartPage();\n\n            const query = await fetch(\"/cart/add.js\", {\n              method: \"POST\",\n              credentials: \"same-origin\",\n              headers: { \"Content-Type\": \"application/json\" },\n              body: JSON.stringify({ items: payload }),\n            });\n\n            const cartData = await query.json();\n            if (window.debugMode) {\n              console.dir(cartData);\n            }\n\n            document.dispatchEvent(\n              new CustomEvent(\"cart:updated\", {\n                detail: {\n                  cart: cartData,\n                  skipLoader: true,\n                },\n              })\n            );\n            return;\n          } else if (touched === \"true\" && itemsWithSameVariant.length == 1) {\n            const item = itemsWithSameVariant[0];\n            update[item.id] = qty;\n          } else {\n            update[key] = qty;\n          }\n        } else {\n          update[key] = qty;\n        }\n\n        // also clear service products linked\n        const this_services = $('[data-parent=\"' + step_item_id + '\"]');\n        if (this_services.length > 0) {\n          this_services.each(function (index, el) {\n            const service_item_id = $(el).val();\n            update[service_item_id] = qty;\n          });\n        }\n\n        theme.startReloadingCartPage();\n\n        const query = await fetch(\"/cart/update.js\", {\n          method: \"POST\",\n          credentials: \"same-origin\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ updates: update }),\n        });\n\n        const cartData = await query.json();\n        if (window.debugMode) {\n          console.dir(cartData);\n        }\n\n        document.dispatchEvent(\n          new CustomEvent(\"cart:updated\", {\n            detail: {\n              cart: cartData,\n              skipLoader: true,\n            },\n          })\n        );\n      }),\n      checkoutBtnLoading: function () {\n        $(this).addClass(\"btn--loading\");\n        if (window.debugMode) {\n          console.log(\"ajax 1\");\n        }\n      },\n      cartNoteHandler: function () {\n        var newNote = $(this).val();\n        theme.cart.updateNote(newNote);\n        if (window.debugMode) {\n          console.log(\"ajax 2\");\n        }\n      },\n      cartTermsHandler: function (evt) {\n        if (\n          $(\"#CartAgree\").length > 0 &&\n          $(\"#CartAgree\").is(\":checked\") == false &&\n          !theme.userObject.myyntikanava\n        ) {\n          theme.alert(theme.strings.cartTermsConfirmation);\n          $(this).removeClass(\"btn--loading\");\n          return false;\n        }\n      },\n    },\n    deconstruct: function () {\n      $(\"body\").off(\n        \"click\",\n        \".cart__checkout:not([data-href])\",\n        this.functions.checkoutBtnLoading\n      );\n      $(\"body\").off(\n        \"change\",\n        'textarea[name=\"note\"]',\n        this.functions.cartNoteHandler\n      );\n      $(\"body\").off(\"qty.cart-page\", this.functions.cartQtyHandler);\n      $(\"body\").off(\"delete.cart-page\", this.functions.cartQtyHandler);\n      $(\"body\").off(\n        \"click\",\n        \".cart__checkout--ajax\",\n        this.functions.cartTermsHandler\n      );\n    },\n    init: function (skipQtySelectors = false) {\n      $(\"body\").on(\n        \"click\",\n        \".cart__checkout:not([data-href])\",\n        this.functions.checkoutBtnLoading\n      );\n      $(\"body\").on(\n        \"change\",\n        'textarea[name=\"note\"]',\n        this.functions.cartNoteHandler\n      );\n\n      $(\".cart-page-form\")\n        .find(\".js-qty__wrapper\")\n        .each(function (index, el) {\n          var selector = new theme.QtySelector($(el), {\n            namespace: \".cart-page\",\n          });\n          if (window.debugMode) {\n            console.log(\"ajax 3, index\", index);\n          }\n        });\n\n      $(\"body\").on(\"qty.cart-page\", this.functions.cartQtyHandler);\n\n      $(\".cart-page-form\")\n        .find(\".js-delete__button\")\n        .each(function (index, el) {\n          new theme.DeleteButton($(el), { namespace: \".cart-page\" });\n        });\n      $(\"body\").on(\"delete.cart-page\", this.functions.cartQtyHandler);\n\n      // Custom JS to prevent checkout without confirming terms and conditions\n      $(\"body\").on(\n        \"click\",\n        \".cart__checkout--ajax\",\n        this.functions.cartTermsHandler\n      );\n    },\n  };\n\n  theme.DeleteButton = (function () {\n    function DeleteButton($el, options) {\n      this.$button = $el;\n\n      var defaults = {\n        namespace: null,\n        key: this.$button.data(\"id\"),\n      };\n\n      this.options = $.extend(defaults, options);\n\n      this.initEventListeners();\n    }\n\n    DeleteButton.prototype = $.extend({}, DeleteButton.prototype, {\n      initEventListeners: function () {\n        this.$button.on(\n          \"click\",\n          function () {\n            this.removeQty();\n          }.bind(this)\n        );\n      },\n\n      removeQty: function () {\n        $(\"body\").trigger(\"delete\" + this.options.namespace, [\n          this.options.key,\n          0,\n        ]);\n      },\n    });\n\n    return DeleteButton;\n  })();\n\n  theme.QtySelector = (function () {\n    var classes = {\n      input: \".js-qty__num\",\n      plus: \".js-qty__adjust--plus\",\n      minus: \".js-qty__adjust--minus\",\n    };\n\n    function QtySelector($el, options) {\n      this.$wrapper = $el;\n      this.$input = $el.find(classes.input);\n      this.$plus = $el.find(classes.plus);\n      this.$minus = $el.find(classes.minus);\n      this.minValue = this.$input.attr(\"min\") || 1;\n\n      var defaults = {\n        namespace: null,\n        key: this.$input.data(\"id\"),\n      };\n\n      this.options = $.extend(defaults, options);\n\n      this.initEventListeners();\n    }\n\n    QtySelector.prototype = $.extend({}, QtySelector.prototype, {\n      initEventListeners: function () {\n        this.$plus.on(\n          \"click\",\n          function () {\n            var qty = this.validateQty(this.$input.val());\n            this.addQty(qty);\n          }.bind(this)\n        );\n\n        this.$minus.on(\n          \"click\",\n          function () {\n            var qty = this.validateQty(this.$input.val());\n            this.subtractQty(qty);\n          }.bind(this)\n        );\n\n        this.$input.on(\n          \"change\",\n          function () {\n            var qty = this.validateQty(this.$input.val());\n            this.changeQty(qty);\n          }.bind(this)\n        );\n      },\n\n      addQty: function (number) {\n        var qty = number + 1;\n        this.changeQty(qty);\n      },\n\n      subtractQty: function (number) {\n        var qty = number - 1;\n        if (qty <= this.minValue) {\n          qty = this.minValue;\n        }\n        this.changeQty(qty);\n      },\n\n      changeQty: function (qty) {\n        this.$input.val(qty);\n        $(\"body\").trigger(\"qty\" + this.options.namespace, [\n          this.options.key,\n          qty,\n        ]);\n      },\n\n      validateQty: function (number) {\n        if (parseFloat(number) == parseInt(number) && !isNaN(number)) {\n          // We have a valid number!\n        } else {\n          // Not a number. Default to 1.\n          number = 1;\n        }\n        return parseInt(number);\n      },\n    });\n\n    return QtySelector;\n  })();\n\n  theme.CartDrawer = (function () {\n    var config = {\n      namespace: \".ajaxcart\",\n    };\n\n    var selectors = {\n      drawer: \"#CartDrawer\",\n      container: \"#CartContainer\",\n      template: \"#CartTemplate\",\n      cartBubble: \".cart-link__bubble\",\n    };\n\n    function CartDrawer() {\n      this.status = {\n        loaded: false,\n        loading: false,\n      };\n\n      this.drawer = new theme.Drawers(\"CartDrawer\", \"cart\");\n\n      // Prep handlebars template\n      if ($(selectors.template).length == 0) return;\n      var source = $(selectors.template).html();\n      this.template = Handlebars.compile(source);\n\n      // Build cart on page load so it's ready in the drawer\n      theme.cart.getCart().then(this.buildCart.bind(this));\n\n      document.addEventListener(\n        \"cart:build\",\n        function () {\n          theme.cart.getCart().then(this.buildCart.bind(this));\n        }.bind(this)\n      );\n\n      this.initEventListeners();\n    }\n\n    CartDrawer.prototype = $.extend({}, CartDrawer.prototype, {\n      initEventListeners: function () {\n        $(\"body\").on(\n          \"updateCart\" + config.namespace,\n          this.initQtySelectors.bind(this)\n        );\n        $(\"body\").on(\n          \"updateCart\" + config.namespace,\n          this.initDeleteButtons.bind(this)\n        );\n        $(\"body\").on(\n          \"updateCart\" + config.namespace,\n          this.updateCartNotification.bind(this)\n        );\n\n        $(\"body\").on(\n          \"added.ajaxProduct\",\n          function (evt, returnFocusEl) {\n            theme.cart.getCart().then(\n              function (cart) {\n                this.buildCart(cart, true, returnFocusEl);\n              }.bind(this)\n            );\n          }.bind(this)\n        );\n      },\n\n      buildCart: function (cart, openDrawer, returnFocusEl) {\n        // If last focused element is quantity adjust, store the focused product's qty elem and restore focus after rebuilding cart\n        const focusedElement = document.activeElement;\n        const focusedProductId = focusedElement?.parentElement.querySelector('input')?.dataset.id;\n        const restoreFocus = focusedProductId && (focusedElement.classList.contains('js-qty__adjust') || focusedElement.classList.contains('js-qty__num')) ? true : false;\n\n        if (window.debugMode) {\n          console.log(\"[CartDrawer] buildCart\", cart);\n        }\n        this.loading(true);\n        this.emptyCart();\n        if (cart.item_count === 0) {\n          $(selectors.container).append(\n            '<div class=\"drawer__scrollable\"><p class=\"appear-animation appear-delay-3\">' +\n              theme.strings.cartEmpty +\n              \"</p></div>\"\n          );\n        } else {\n          let items = [];\n          let item = {};\n          let data = {};\n          let animation_row = 2;\n          let vat_amounts = [];\n          let vat_member_amounts = [];\n          let vat_percentages = [];\n          let user_price_group = theme.userObject.priceGroup;\n          let faulty_rows = [];\n          let cart_total_member = 0;\n          let requires_participant_flow = false;\n          let cart_use_simplified_checkout_flow_items = 0;\n\n          $.each(cart.items, function (index, product) {\n            let visible_properties = [];\n\n            let prodImg;\n            if (product.image !== null) {\n              prodImg = product.image.replace(/(\\.[^.]*)$/, \"_180x$1\");\n            } else {\n              prodImg =\n                \"//cdn.shopify.com/s/assets/admin/no-image-medium-cc9732cb976dd349a0df1d39816fbcc7.gif\";\n            }\n\n            let vat_string_regular = theme.strings.vat;\n            let vat_string_member = theme.strings.vat;\n            let vat_amount_regular = 0;\n            let vat_amount_member = 0;\n            let vat_percent = 0;\n\n            let price_groups = [];\n\n            let regularPrice = product.price;\n            let memberPrice = product.price;\n\n            if (product.properties !== null) {\n              $.each(product.properties, function (key, value) {\n                if (key == \"_price_groups\") {\n                  price_groups = value.split(\",\");\n                } else if (key == \"_productMemberPrice\") {\n                  memberPrice = Number(value) * product.quantity;\n                  /*\n                    prices are sometimes returned as string so we apply a conversion from string to cents.\n                    this happens usually when you add items in your cart, then login or log out.\n                  */\n                  if (typeof memberPrice == \"string\") {\n                    if (\n                      memberPrice.includes(\".\") &&\n                      !memberPrice.includes(\",\")\n                    ) {\n                      memberPrice = Number(memberPrice) * 100;\n                    }\n                  }\n                  cart_total_member += memberPrice;\n                } else if (key == \"_productRegularPrice\") {\n                  regularPrice = Number(value) * product.quantity;\n                  /*\n                    prices are sometimes returned as string so we apply a conversion from string to cents.\n                    this happens usually when you add items in your cart, then login or log out.\n                  */\n                  if (typeof regularPrice == \"string\") {\n                    if (\n                      regularPrice.includes(\".\") &&\n                      !regularPrice.includes(\",\")\n                    ) {\n                      regularPrice = Number(regularPrice) * 100;\n                    }\n                  }\n                }\n\n                /*\n                if (window.debugMode) {\n                  console.log('[buildCart] memberPrice', memberPrice)\n                  console.log('[buildCart] regularPrice', regularPrice)\n                };\n                */\n\n                if (key === \"_vat_percent\") {\n                  vat_percent = Number(value);\n                  vat_string_regular = vat_string_regular.replace(\n                    \"{{ percent }}\",\n                    vat_percent\n                  );\n                  vat_string_member = vat_string_member.replace(\n                    \"{{ percent }}\",\n                    vat_percent\n                  );\n                  vat_percentages.push(vat_percent);\n                } else if (key === \"_vat_multiplier\") {\n                  vat_amount_regular =\n                    regularPrice * Number(value) * product.quantity;\n                  vat_amount_member =\n                    memberPrice * Number(value) * product.quantity;\n                  vat_string_regular = vat_string_regular.replace(\n                    \"{{ amount }}\",\n                    theme.Currency.formatMoney(\n                      vat_amount_regular,\n                      theme.settings.moneyFormat\n                    )\n                  );\n                  vat_string_member = vat_string_member.replace(\n                    \"{{ amount }}\",\n                    theme.Currency.formatMoney(\n                      vat_amount_member,\n                      theme.settings.moneyFormat\n                    )\n                  );\n                  vat_amounts.push(vat_amount_regular);\n                  vat_member_amounts.push(vat_amount_member);\n                }\n\n                // Single product has participants enabled => cart goes through the form filling flow on '/cart' page.\n                // Read more here: https://woolman.eu.teamwork.com/spaces/kauppakamari/page/3992-participants-form-flow-on-the-cart-page\n                if (key === \"_participants_enabled\") {\n                  requires_participant_flow = true;\n                }\n\n                if (key === \"_participants_form_supertype\") {\n                  const _value = value.toLowerCase();\n                  if (_value === \"maksuton tapahtuma\") {\n                    cart_use_simplified_checkout_flow_items++;\n                  }\n                }\n\n                if (key.charAt(0) !== \"_\" || !value) {\n                  var obj = {};\n                  obj[key] = value;\n                  visible_properties.push(obj);\n                }\n              });\n            }\n\n            /*\n              When building the cart we check if some of the variants mismatch user's price group.\n              If that happens, we initialize rebuilding of the cart for those items/rows.\n\n              Discounts are applied for logged in users based on their respective price group,\n              and those who do not have an account pay the full price.\n\n              Read more here: https://woolman.eu.teamwork.com/spaces/kauppakamari/page/3874-handling-prices-based-on-customer-data#handling-loginlogout-price-updates\n            */\n\n            let variation_title = product.title;\n            if (product.variant_title) {\n              price_groups = [...new Set(price_groups)];\n              let price_group = product.variant_title\n                .toLowerCase()\n                .split(\" / \")\n                .shift();\n              let new_variant = product.variant_title\n                .toLowerCase()\n                .split(\" / \");\n              let old_variant = product.variant_title\n                .toLowerCase()\n                .split(\" / \");\n\n              if (!theme.userObject.myyntikanava && user_price_group != price_group) {\n                if (window.debugMode) {\n                  console.log(\"[buildCart] product price_groups\", price_groups);\n                  console.log(\n                    \"[buildCart] user price group >>>\",\n                    user_price_group\n                  );\n                }\n\n                let matching_group = price_groups.includes(user_price_group);\n                if (matching_group) {\n                  new_variant[0] = user_price_group;\n                }\n\n                if (\n                  user_price_group == theme.strings.priceRegular.toLowerCase()\n                ) {\n                  if (window.debugMode) {\n                    console.log(\n                      \"[buildCart] user needs >>> default price, from\",\n                      price_group\n                    );\n                  }\n                  old_variant[0] = price_group; // theme.strings.priceMember.toLowerCase()\n                } else {\n                  if (window.debugMode) {\n                    console.log(\"[buildCart] user needs >>> discounted price\");\n                  }\n                  if (!matching_group) {\n                    if (window.debugMode) {\n                      console.log(\n                        \"[buildCart] no correct price group found >>> reset to default price\"\n                      );\n                    }\n                    new_variant[0] = theme.strings.priceRegular.toLowerCase();\n                  }\n                }\n\n                old_variant = old_variant.join(\" / \");\n                new_variant = new_variant.join(\" / \");\n\n                if (old_variant != new_variant) {\n                  let faulty_row = {\n                    index: index,\n                    from: price_group,\n                    to: user_price_group,\n                    variant_from: old_variant,\n                    variant_to: new_variant,\n                    product_title: product.title,\n                  };\n                  if (window.debugMode) {\n                    console.log(\"[buildCart] faulty row found\", faulty_row);\n                  }\n                  faulty_rows.push(faulty_row);\n                }\n              }\n\n              variation_title =\n                product.variant_title === theme.strings.priceRegular\n                  ? \"\"\n                  : product.variant_title.replace(\n                      `${theme.strings.priceRegular} / `,\n                      \"\"\n                    );\n            }\n\n            // If we have line-item discount, add formattedAmount to discount object\n            let amount = 0;\n            if (product.line_level_discount_allocations.length !== 0) {\n              for (var discount in product.line_level_discount_allocations) {\n                amount =\n                  product.line_level_discount_allocations[discount].amount;\n                product.line_level_discount_allocations[\n                  discount\n                ].formattedAmount = theme.Currency.formatMoney(\n                  amount,\n                  theme.settings.moneyFormat\n                );\n              }\n            }\n\n            animation_row += 2;\n\n            item = {\n              key: product.key,\n              url: product.url,\n              img: prodImg,\n              animationRow: animation_row,\n              name: product.product_title,\n              variation: variation_title,\n              variant_id: product.variant_id,\n              properties: visible_properties,\n              all_properties: product.properties,\n              itemQty: product.quantity,\n              price: theme.Currency.formatMoney(\n                regularPrice,\n                theme.settings.moneyFormat\n              ),\n              memberPrice: theme.Currency.formatMoney(\n                memberPrice,\n                theme.settings.moneyFormat\n              ),\n              unitPrice: theme.Currency.formatMoney(\n                product.unit_price,\n                theme.settings.moneyFormat\n              ),\n              unitBase: theme.Currency.getBaseUnit(product),\n              discountedPrice: theme.Currency.formatMoney(\n                product.price - product.total_discount / product.quantity,\n                theme.settings.moneyFormat\n              ),\n              discounts: product.line_level_discount_allocations,\n              discountsApplied:\n                product.line_level_discount_allocations.length === 0\n                  ? false\n                  : true,\n              vendor: product.vendor,\n              vat_string_regular: vat_string_regular,\n              vat_string_member: vat_string_member,\n              vat_amount_regular: vat_amount_regular,\n              vat_amount_member: vat_amount_member,\n              vat_percent: vat_percent,\n              handle: product.handle,\n              customerDiscount: theme.userObject.customerDiscount,\n              hasVariants: product.variant_title ? true : false,\n            };\n\n            if (product.properties[\"_hide_variant_in_cart\"]) {\n              delete item.variation;\n            }\n\n            if (window.debugMode) {\n              console.log(\"[buildCart] built item\", item);\n            }\n            items.push(item);\n          });\n\n          if (Object.keys(faulty_rows).length > 0) {\n            if (window.debugMode) {\n              console.log(\"[buildCart] faulty_rows\", faulty_rows);\n            }\n            this.rebuildCart(items, faulty_rows);\n            return;\n          }\n\n          animation_row += 2;\n\n          // If we have cart discount, add a formattedAmount to the discount object\n          var cartAmount = 0;\n          if (cart.cart_level_discount_applications.length !== 0) {\n            for (var cartDiscount in cart.cart_level_discount_applications) {\n              cartAmount =\n                cart.cart_level_discount_applications[cartDiscount]\n                  .total_allocated_amount;\n\n              cart.cart_level_discount_applications[\n                cartDiscount\n              ].formattedAmount = theme.Currency.formatMoney(\n                cartAmount,\n                theme.settings.moneyFormat\n              );\n            }\n          }\n\n          // --[ BEING VAT HANDLING\n          /*\n            By using Set constructor and Spread syntax, we can filter array from duplicate values with ease.\n            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax\n          */\n\n          var uniq_vat_percentages = [...new Set(vat_percentages)];\n          var vat_string = theme.strings.vat; // keys: {{ percent }}, {{ amount }}\n          var vat_string_member = theme.strings.vat;\n          var vat_varies = false;\n\n          /*\n            We are using Array.prototype.reduce() to iterate through the array, adding the current element value to the sum of the previous element values.\n            https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce\n          */\n\n          var vat_amount = vat_amounts.reduce((a, b) => a + b, 0);\n          var vat_member_amount = vat_member_amounts.reduce((a, b) => a + b, 0);\n\n          // If more than one unique vat percentage is found, we are going to display different strings on frontend.\n          if (uniq_vat_percentages.length > 1) {\n            vat_string = theme.strings.vatVaries; // keys: {{ amount }}\n            vat_string_member = theme.strings.vatVaries;\n            vat_varies = true;\n          } else {\n            vat_string = vat_string.replace(\n              \"{{ percent }}\",\n              uniq_vat_percentages[0]\n            );\n            vat_string_member = vat_string_member.replace(\n              \"{{ percent }}\",\n              uniq_vat_percentages[0]\n            );\n          }\n\n          vat_string = vat_string.replace(\n            \"{{ amount }}\",\n            theme.Currency.formatMoney(vat_amount, theme.settings.moneyFormat)\n          );\n          vat_string_member = vat_string_member.replace(\n            \"{{ amount }}\",\n            theme.Currency.formatMoney(\n              vat_member_amount,\n              theme.settings.moneyFormat\n            )\n          );\n          // --[ END VAT HANDLING\n\n          data = {\n            items: items,\n            note: theme.userObject.salespersonId !== null ? theme.userObject.salespersonId : cart.note,\n            lastAnimationRow: animation_row,\n            cartDiscounts: cart.cart_level_discount_applications,\n            cartDiscountsApplied:\n              cart.cart_level_discount_applications.length === 0 ? false : true,\n            totalPrice: theme.Currency.formatMoney(\n              cart.total_price,\n              theme.settings.moneyFormat\n            ),\n            totalMemberPrice: theme.Currency.formatMoney(\n              cart_total_member,\n              theme.settings.moneyFormat\n            ),\n            totalVat: vat_string,\n            totalVatMember: vat_string_member,\n            vatVaries: vat_varies,\n            vatAmounts: vat_amounts,\n            vatAmountsMember: vat_member_amounts,\n            vatPercentages: vat_percentages,\n            customerDiscount: theme.userObject.customerDiscount,\n            participantFlow: requires_participant_flow,\n            freeFlow:\n              requires_participant_flow == true &&\n              cart_use_simplified_checkout_flow_items == items.length,\n            myyntikanava: theme.userObject.myyntikanava\n          };\n          if (window.debugMode) {\n            console.log(\"[buildCart] cart_data\", data);\n          }\n          $(selectors.container).append(this.template(data));\n        }\n\n        this.status.loaded = true;\n        this.loading(false);\n\n        $(\"body\").trigger(\"updateCart\" + config.namespace, cart);\n\n        if (window.Shopify && window.Shopify.StorefrontExpressButtons) {\n          window.Shopify.StorefrontExpressButtons.initialize();\n        }\n\n        // If specifically asked, open the cart drawer (only happens after product added from form)\n        if (openDrawer === true) {\n          this.drawer.open(false, returnFocusEl);\n        }\n\n        document.dispatchEvent(\n          new CustomEvent(\"cart:updated\", {\n            detail: {\n              cart: cart,\n              skipLoading: theme.utils.cart_is_rebuilding,\n            },\n          })\n        );\n\n        if (restoreFocus) {\n          const classSelector = '.' + Array.from(focusedElement.classList).join('.');\n          const targetInput = document.querySelector(`[data-id=\"${focusedProductId}\"]`);\n          if (targetInput) {\n            const targetElement = targetInput.parentElement.querySelector(classSelector);\n            if (targetElement) {\n              targetElement.focus();\n            }\n          }\n        }\n      },\n\n      initDeleteButtons: function () {\n        $(selectors.container)\n          .find(\".js-delete__button\")\n          .each(\n            function (index, el) {\n              var selector = new theme.DeleteButton($(el), {\n                namespace: \".cart-drawer\",\n              });\n            }.bind(this)\n          );\n\n        $(\"body\").on(\"delete.cart-drawer\", this.updateItem.bind(this));\n      },\n\n      initQtySelectors: function () {\n        $(selectors.container)\n          .find(\".js-qty__wrapper\")\n          .each(\n            function (index, el) {\n              var selector = new theme.QtySelector($(el), {\n                namespace: \".cart-drawer\",\n              });\n            }.bind(this)\n          );\n\n        $(\"body\").on(\"qty.cart-drawer\", this.updateItem.bind(this));\n      },\n\n      updateItem: function (evt, key, qty) {\n        if (this.status.loading) {\n          return;\n        }\n\n        this.loading(true);\n\n        theme.cart\n          .changeItem(key, qty)\n          .then(\n            function (cart) {\n              this.updateSuccess(cart);\n            }.bind(this)\n          )\n          .catch(\n            function (XMLHttpRequest) {\n              this.updateError(XMLHttpRequest);\n            }.bind(this)\n          )\n          .always(\n            function () {\n              this.loading(false);\n            }.bind(this)\n          );\n      },\n\n      loading: function (state) {\n        this.status.loading = state;\n\n        if (state) {\n          $(selectors.container).addClass(\"is-loading\");\n        } else {\n          $(selectors.container).removeClass(\"is-loading\");\n        }\n      },\n\n      emptyCart: function () {\n        $(selectors.container).empty();\n      },\n\n      rebuildCart: async function (cart, faulty_rows) {\n        if (window.debugMode) {\n          console.log(\"[rebuildCart] clear cart prior rebuild\");\n        }\n        theme.utils.cart_is_rebuilding = true;\n        theme.startReloadingCartPage();\n        $.post(\"/cart/clear.js\", function (res) {\n          var data = [];\n          /*\n            We rebuilding inside promise to wait for all rows to rebuild before we proceed to adding the rebuilt items to cart.\n            This way items are added when they're all ready, otherwise /cart/add.js fires too early and contains invalid/missing items.\n            There might be better ways to do this, but this is the first valid working method I came up with.\n          */\n\n          var rebuildRows = new Promise(async function (resolve) {\n            for (const [key, value] of cart.entries()) {\n              var i = faulty_rows.findIndex((x) => x.index == key);\n              var faulty_row = faulty_rows[i];\n              var item = await rebuildRow(value, faulty_row);\n              data.push(item);\n            }\n            if (window.debugMode) {\n              console.log(\"[rebuildCart] rebuilding resolved\");\n            }\n            resolve();\n          });\n\n          rebuildRows.then(function () {\n            if (window.debugMode) {\n              console.log(\"[rebuildCart] cart after rebuild:\", data);\n            }\n            $.post(\"/cart/add.js\", { items: data }, function (res) {\n              $(\"body\").trigger(\"added.ajaxProduct\");\n            }).fail(function (err) {\n              if (err && err.responseText) {\n                var json = JSON.parse(err.responseText);\n                console.error(json.description);\n                theme.alert(json.description, \"error\", 3500);\n              }\n            });\n          });\n        });\n      },\n\n      updateSuccess: function (cart) {\n        this.buildCart(cart);\n      },\n\n      updateError: function (XMLHttpRequest) {\n        if (\n          XMLHttpRequest.responseJSON &&\n          XMLHttpRequest.responseJSON.description\n        ) {\n          // console.warn(XMLHttpRequest.responseJSON.description);\n        }\n      },\n\n      updateCartNotification: function (evt, cart) {\n        if (cart.items.length > 0) {\n          $(selectors.cartBubble).addClass(\"cart-link__bubble--visible\");\n        } else {\n          $(selectors.cartBubble).removeClass(\"cart-link__bubble--visible\");\n        }\n      },\n    });\n\n    return CartDrawer;\n  })();\n\n  theme.AjaxProduct = (function () {\n    var status = {\n      loading: false,\n    };\n\n    function ProductForm($form) {\n      this.$form = $form;\n      this.$addToCart = this.$form.find(\".add-to-cart\");\n      this.$quickAdd = $(\"#\" + this.$addToCart.attr(\"id\") + \"B\");\n\n      if (this.$form.length) {\n        this.$form.on(\"submit\", this.addItemFromForm.bind(this));\n      }\n    }\n\n    ProductForm.prototype = $.extend({}, ProductForm.prototype, {\n      addItemFromForm: function (evt, callback) {\n        evt.preventDefault();\n\n        if (status.loading) {\n          return;\n        }\n\n        // Loading indicator on add to cart button\n        this.$addToCart.addClass(\"btn--loading\");\n        this.$quickAdd.addClass(\"btn--loading\");\n\n        status.loading = true;\n\n        var data = this.$form.serialize();\n\n        theme.cart\n          .addItemFromForm(data)\n          .then(\n            function (product) {\n              if (window.debugMode) {\n                console.log(\"[ajaxProduct] added to cart\", product);\n              }\n              this.success(product);\n            }.bind(this)\n          )\n          .catch(\n            function (XMLHttpRequest) {\n              this.error(XMLHttpRequest);\n            }.bind(this)\n          )\n          .always(\n            function () {\n              status.loading = false;\n              this.$addToCart.removeClass(\"btn--loading\");\n              this.$quickAdd.removeClass(\"btn--loading\");\n            }.bind(this)\n          );\n      },\n\n      success: function (product) {\n        this.$form.find(\".errors\").remove();\n        $(\"body\").trigger(\"added.ajaxProduct\", this.$addToCart);\n        document.dispatchEvent(\n          new CustomEvent(\"ajaxProduct:added\", {\n            detail: {\n              product: product,\n            },\n          })\n        );\n      },\n\n      error: function (XMLHttpRequest) {\n        this.$form.find(\".errors\").remove();\n\n        if (\n          XMLHttpRequest.responseJSON &&\n          XMLHttpRequest.responseJSON.description\n        ) {\n          this.$form.prepend(\n            '<div class=\"errors text-center\">' +\n              XMLHttpRequest.responseJSON.description +\n              \"</div>\"\n          );\n\n          document.dispatchEvent(\n            new CustomEvent(\"ajaxProduct:error\", {\n              detail: {\n                errorMessage: XMLHttpRequest.responseJSON.description,\n              },\n            })\n          );\n        }\n      },\n    });\n\n    return ProductForm;\n  })();\n\n  theme.collapsibles = (function () {\n    var selectors = {\n      trigger: \".collapsible-trigger\",\n      module: \".collapsible-content\",\n      moduleInner: \".collapsible-content__inner\",\n    };\n\n    var classes = {\n      hide: \"hide\",\n      open: \"is-open\",\n      autoHeight: \"collapsible--auto-height\",\n    };\n\n    var namespace = \".collapsible\";\n\n    var isTransitioning = false;\n\n    function init() {\n      $(selectors.trigger).each(function () {\n        var $el = $(this);\n        var state = $el.hasClass(classes.open);\n        $el.attr(\"aria-expanded\", state);\n      });\n\n      // Event listeners (hack for modals)\n      $(\"body, .modal__inner\")\n        .off(namespace)\n        .on(\"click\" + namespace, selectors.trigger, function () {\n          if (isTransitioning) {\n            return;\n          }\n\n          isTransitioning = true;\n\n          var $el = $(this);\n          var isOpen = $el.hasClass(classes.open);\n          var moduleId = $el.attr(\"aria-controls\");\n          var $module = $(\"#\" + moduleId);\n          var height = $module.find(selectors.moduleInner).outerHeight();\n          var isAutoHeight = $el.hasClass(classes.autoHeight);\n\n          // If isAutoHeight, set the height to 0 just after setting the actual height\n          // so the closing animation works nicely\n          if (isOpen && isAutoHeight) {\n            setTimeout(function () {\n              height = 0;\n              setTransitionHeight($module, height, isOpen, isAutoHeight);\n            }, 0);\n          }\n\n          if (isOpen && !isAutoHeight) {\n            height = 0;\n          }\n\n          $el.attr(\"aria-expanded\", !isOpen).toggleClass(classes.open, !isOpen);\n\n          setTransitionHeight($module, height, isOpen, isAutoHeight);\n        });\n    }\n\n    function setTransitionHeight($module, height, isOpen, isAutoHeight) {\n      $module\n        .removeClass(classes.hide)\n        .prepareTransition()\n        .css(\"height\", height)\n        .toggleClass(classes.open, !isOpen);\n\n      if (!isOpen && isAutoHeight) {\n        var o = $module;\n        window.setTimeout(function () {\n          o.css(\"height\", \"auto\");\n          isTransitioning = false;\n        }, 500);\n      } else {\n        isTransitioning = false;\n      }\n    }\n\n    return {\n      init: init,\n    };\n  })();\n\n  theme.headerNav = (function () {\n    var $parent = $(document.documentElement).add(\"body\");\n    var $page = $(\"#MainContent\");\n    var selectors = {\n      wrapper: \".header-wrapper\",\n      siteHeader: \".site-header\",\n      searchBtn: \".js-search-header\",\n      closeSearch: \".js-search-header-close\",\n      searchContainer: \".site-header__search-container\",\n      logoContainer: \".site-header__logo\",\n      logo: \".site-header__logo img\",\n      navigation: \".site-navigation\",\n      navContainerWithLogo: \".header-item--logo\",\n      navItems: \".site-nav__item\",\n      navLinks: \".site-nav__link\",\n      navLinksWithDropdown: \".site-nav__link--has-dropdown\",\n      navDropdownLinks: \".site-nav__dropdown-link--second-level\",\n    };\n\n    var classes = {\n      hasDropdownClass: \"site-nav--has-dropdown\",\n      hasSubDropdownClass: \"site-nav__deep-dropdown-trigger\",\n      dropdownActive: \"is-focused\",\n    };\n\n    var config = {\n      namespace: \".siteNav\",\n      wrapperOverlayed: false,\n      overlayedClass: \"is-light\",\n      overlayEnabledClass: \"header-wrapper--overlay\",\n      stickyEnabled: false,\n      stickyActive: false,\n      stickyClass: \"site-header--stuck\",\n      openTransitionClass: \"site-header--opening\",\n      lastScroll: 0,\n    };\n\n    // Elements used in resize functions, defined in init\n    var $window;\n    var $navContainerWithLogo;\n    var $logoContainer;\n    var $nav;\n    var $wrapper;\n    var $siteHeader;\n\n    function init() {\n      $window = $(window);\n      $navContainerWithLogo = $(selectors.navContainerWithLogo);\n      $logoContainer = $(selectors.logoContainer);\n      $nav = $(selectors.navigation);\n      $wrapper = $(selectors.wrapper);\n      $siteHeader = $(selectors.siteHeader);\n\n      config.stickyEnabled = $siteHeader.data(\"sticky\");\n      if (config.stickyEnabled) {\n        config.wrapperOverlayed = $wrapper.hasClass(config.overlayedClass);\n        stickyHeader();\n      }\n\n      theme.settings.overlayHeader = $siteHeader.data(\"overlay\");\n      // Disable overlay header if on collection template with no collection image\n      if (\n        theme.settings.overlayHeader &&\n        window.Shopify &&\n        window.Shopify.designMode\n      ) {\n        if (\n          $(\"body\").hasClass(\"template-collection\") &&\n          !$(\".collection-hero\").length\n        ) {\n          this.disableOverlayHeader();\n        }\n      }\n\n      accessibleDropdowns();\n      searchDrawer();\n\n      $window.on(\"load\" + config.namespace, resizeLogo);\n      $window.on(\"resize\" + config.namespace, $.debounce(150, resizeLogo));\n    }\n\n    function unload() {\n      $(window).off(config.namespace);\n      $(selectors.searchBtn).off(config.namespace);\n      $(selectors.closeSearch).off(config.namespace);\n      $parent.off(config.namespace);\n      $(selectors.navLinks).off(config.namespace);\n      $(selectors.navDropdownLinks).off(config.namespace);\n    }\n\n\n    function searchDrawer() {\n      $(selectors.searchBtn).on(\"click\" + config.namespace, function (evt) {\n        evt.preventDefault();\n        openSearchDrawer();\n      });\n\n      $(selectors.closeSearch).on(\n        \"click\" + config.namespace,\n        closeSearchDrawer\n      );\n    }\n\n    function openSearchDrawer() {\n      $(selectors.searchContainer).prepareTransition().addClass(\"is-active\");\n      $parent.addClass(\"js-drawer-open js-drawer-open--search\");\n\n      setTimeout(function () {\n        theme.a11y.trapFocus({\n          $container: $(selectors.searchContainer),\n          namespace: \"header_search\",\n          $elementToFocus: $(selectors.searchContainer).find(\n            \".site-header__search-input\"\n          ),\n        });\n      }, 100);\n\n      // If sticky is enabled, scroll to top on mobile when close to it\n      // so you don't get an invisible search box\n      if (\n        theme.config.bpSmall &&\n        config.stickyEnabled &&\n        config.lastScroll < 300\n      ) {\n        window.scrollTo(0, 0);\n      }\n\n      // Bind events\n      theme.a11y.lockMobileScrolling(config.namespace);\n\n      // Clicking out of container closes it\n      $page.on(\"click\" + config.namespace, function () {\n        closeSearchDrawer();\n        return false;\n      });\n\n      $parent.on(\"keyup\" + config.namespace, function (evt) {\n        if (evt.keyCode === 27) {\n          closeSearchDrawer();\n        }\n      });\n    }\n\n    function closeSearchDrawer() {\n      // deselect any focused form elements\n      $(document.activeElement).trigger(\"blur\");\n\n      $parent.addClass(\"js-drawer-closing\");\n      $parent\n        .removeClass(\"js-drawer-open js-drawer-open--search\")\n        .off(config.namespace);\n\n      window.setTimeout(\n        function () {\n          $parent.removeClass(\"js-drawer-closing\");\n        }.bind(this),\n        500\n      );\n\n      $(selectors.searchContainer).prepareTransition().removeClass(\"is-active\");\n\n      theme.a11y.removeTrapFocus({\n        $container: $(selectors.searchContainer),\n        namespace: \"header_search\",\n      });\n\n      theme.a11y.unlockMobileScrolling(config.namespace);\n      $page.off(\"click\" + config.namespace);\n      $parent.off(\"keyup\" + config.namespace);\n    }\n\n    function resizeLogo() {\n      // Using .each() as there can be a reversed logo too\n      $(selectors.logo).each(function () {\n        var $el = $(this),\n          logoWidthOnScreen = $el.width(),\n          containerWidth = $el.closest(\".grid__item\").width();\n        // If image exceeds container, let's make it smaller\n        if (logoWidthOnScreen > containerWidth) {\n          $el.css(\"maxWidth\", containerWidth);\n        } else {\n          $el.removeAttr(\"style\");\n        }\n      });\n    }\n\n    function accessibleDropdowns() {\n      var hasActiveDropdown = false;\n      var hasActiveSubDropdown = false;\n      var closeOnClickActive = false;\n\n      // Touch devices open dropdown on first click, navigate to link on second\n      if (theme.config.isTouch) {\n        $(selectors.navLinksWithDropdown).on(\n          \"touchend\" + config.namespace,\n          function (evt) {\n            var $el = $(this);\n            var $parentItem = $el.parent();\n            if (!$parentItem.hasClass(classes.dropdownActive)) {\n              evt.preventDefault();\n              closeDropdowns();\n              openFirstLevelDropdown($el);\n            } else {\n              window.location.replace($el.attr(\"href\"));\n            }\n          }\n        );\n\n        $(selectors.navDropdownLinks).on(\n          \"touchend\" + config.namespace,\n          function (evt) {\n            var $el = $(this);\n            var $parentItem = $el.parent();\n\n            // Open third level menu or go to link based on active state\n            if ($parentItem.hasClass(classes.hasSubDropdownClass)) {\n              if (!$parentItem.hasClass(classes.dropdownActive)) {\n                evt.preventDefault();\n                closeThirdLevelDropdown();\n                openSecondLevelDropdown($el);\n              } else {\n                window.location.replace($el.attr(\"href\"));\n              }\n            } else {\n              // No third level nav, go to link\n              window.location.replace($el.attr(\"href\"));\n            }\n          }\n        );\n      }\n\n      // Open/hide top level dropdowns\n      $(selectors.navLinks).on(\n        \"focusin mouseover\" + config.namespace,\n        function () {\n          if (hasActiveDropdown) {\n            closeSecondLevelDropdown();\n          }\n\n          if (hasActiveSubDropdown) {\n            closeThirdLevelDropdown();\n          }\n\n          openFirstLevelDropdown($(this));\n        }\n      );\n\n      // Force remove focus on sitenav links because focus sometimes gets stuck\n      $(selectors.navLinks).on(\"mouseleave\" + config.namespace, function () {\n        closeDropdowns();\n      });\n\n      // Open/hide sub level dropdowns\n      $(selectors.navDropdownLinks).on(\n        \"focusin\" + config.namespace,\n        function () {\n          closeThirdLevelDropdown();\n          openSecondLevelDropdown($(this), true);\n        }\n      );\n\n      // Private dropdown methods\n      function openFirstLevelDropdown($el) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasDropdownClass)) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveDropdown = true;\n        }\n\n        if (!theme.config.isTouch) {\n          if (!closeOnClickActive) {\n            var eventType = theme.config.isTouch ? \"touchend\" : \"click\";\n            closeOnClickActive = true;\n            $(\"body\").on(eventType + config.namespace, function () {\n              closeDropdowns();\n              $(\"body\").off(config.namespace);\n              closeOnClickActive = false;\n            });\n          }\n        }\n      }\n\n      function openSecondLevelDropdown($el, skipCheck) {\n        var $parentItem = $el.parent();\n        if ($parentItem.hasClass(classes.hasSubDropdownClass) || skipCheck) {\n          $parentItem.addClass(classes.dropdownActive);\n          hasActiveSubDropdown = true;\n        }\n      }\n\n      function closeDropdowns() {\n        closeSecondLevelDropdown();\n        closeThirdLevelDropdown();\n      }\n\n      function closeSecondLevelDropdown() {\n        $(selectors.navItems).removeClass(classes.dropdownActive);\n      }\n\n      function closeThirdLevelDropdown() {\n        $(selectors.navDropdownLinks)\n          .parent()\n          .removeClass(classes.dropdownActive);\n      }\n    }\n\n    function stickyHeader() {\n      config.lastScroll = 0;\n      $siteHeader.wrap('<div class=\"site-header-sticky\"></div>');\n\n      stickyHeaderHeight();\n      $window.on(\n        \"resize\" + config.namespace,\n        $.debounce(50, stickyHeaderHeight)\n      );\n      $window.on(\n        \"scroll\" + config.namespace,\n        $.throttle(15, stickyHeaderScroll)\n      );\n\n      // This gets messed up in the editor, so here's a fix\n      if (window.Shopify && window.Shopify.designMode) {\n        setTimeout(function () {\n          stickyHeaderHeight();\n        }, 250);\n      }\n    }\n\n    function stickyHeaderHeight() {\n      // Check if any megamenu is open\n      const isMegaMenuOpen = $(\".header-megamenu.megamenu-open\").length > 0;\n\n      // If a megamenu is open, use the height of the header without the megamenu\n      const headerHeight = isMegaMenuOpen\n        ? $siteHeader.outerHeight(true) - $(\".header-megamenu.megamenu-open\").outerHeight(true)\n        : $siteHeader.outerHeight(true);\n\n      $(\".site-header-sticky\").css(\n        \"height\",\n        headerHeight);\n    }\n\n    function stickyHeaderScroll() {\n      var scroll = $window.scrollTop();\n      var threshold = 50;\n\n      if (scroll > threshold) {\n        if (config.stickyActive) {\n          return;\n        }\n\n        config.stickyActive = true;\n\n        $siteHeader.addClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.removeClass(config.overlayedClass);\n        }\n\n        // Add open transition class after element is set to fixed\n        // so CSS animation is applied correctly\n        setTimeout(function () {\n          $siteHeader.addClass(config.openTransitionClass);\n        }, 100);\n      } else {\n        if (!config.stickyActive) {\n          return;\n        }\n\n        config.stickyActive = false;\n\n        $siteHeader\n          .removeClass(config.openTransitionClass)\n          .removeClass(config.stickyClass);\n        if (config.wrapperOverlayed) {\n          $wrapper.addClass(config.overlayedClass);\n        }\n      }\n\n      config.lastScroll = scroll;\n    }\n\n    // If the header setting to overlay the menu on the collection image\n    // is enabled but the collection setting is disabled, we need to undo\n    // the init of the sticky nav\n    function disableOverlayHeader() {\n      $(selectors.wrapper)\n        .removeClass(config.overlayEnabledClass)\n        .removeClass(config.overlayedClass);\n      config.wrapperOverlayed = false;\n    }\n\n    return {\n      init: init,\n      disableOverlayHeader: disableOverlayHeader,\n      unload: unload,\n    };\n  })();\n\n  theme.articleImages = (function () {\n    var cache = {};\n\n    function init() {\n      cache.$rteImages = $(\".rte--indented-images\");\n\n      if (!cache.$rteImages.length) {\n        return;\n      }\n\n      $(window).on(\"load\", setImages);\n    }\n\n    function setImages() {\n      cache.$rteImages.find(\"img\").each(function () {\n        var $el = $(this);\n        var attr = $el.attr(\"style\");\n\n        // Check if undefined or float: none\n        if (!attr || attr == \"float: none;\") {\n          // Remove grid-breaking styles if image isn't wider than parent\n          if ($el.width() < cache.$rteImages.width()) {\n            $el.addClass(\"rte__no-indent\");\n          }\n        }\n      });\n    }\n\n    return {\n      init: init,\n    };\n  })();\n\n  theme.Slideshow = (function () {\n    this.$slideshow = null;\n\n    var classes = {\n      next: \"is-next\",\n      init: \"is-init\",\n      animateOut: \"animate-out\",\n      wrapper: \"slideshow-wrapper\",\n      slideshow: \"slideshow\",\n      allSlides: \"slick-slide\",\n      currentSlide: \"slick-current\",\n      pauseButton: \"slideshow__pause\",\n      isPaused: \"is-paused\",\n    };\n\n    function slideshow(el, args) {\n      this.$slideshow = $(el);\n      this.$wrapper = this.$slideshow.closest(\".\" + classes.wrapper);\n      this.$pause = this.$wrapper.find(\".\" + classes.pauseButton);\n\n      this.settings = {\n        accessibility: true,\n        arrows: args.arrows ? true : false,\n        dots: args.dots ? true : false,\n        fade: args.fade ? true : false,\n        speed: args.speed ? args.speed : 500,\n        draggable: true,\n        touchThreshold: 5,\n        pauseOnHover: false,\n        rtl: theme.config.rtl,\n        autoplay: this.$slideshow.data(\"autoplay\"),\n        autoplaySpeed: this.$slideshow.data(\"speed\"),\n      };\n\n      this.$slideshow.on(\"init\", this.init.bind(this));\n      if (this.settings.fade) {\n        this.$slideshow.on(\"beforeChange\", this.beforeSlideChange.bind(this));\n        this.$slideshow.on(\"afterChange\", this.afterSlideChange.bind(this));\n      }\n\n      this.$slideshow.slick(this.settings);\n\n      this.$pause.on(\"click\", this._togglePause.bind(this));\n    }\n\n    slideshow.prototype = $.extend({}, slideshow.prototype, {\n      init: function (event, obj) {\n        this.$slideshowList = obj.$list;\n        this.$slickDots = obj.$dots;\n        this.$allSlides = obj.$slides;\n        this.slideCount = obj.slideCount;\n\n        this.$slideshow.addClass(classes.init);\n        this._a11y();\n        this._clonedLazyloading();\n      },\n      beforeSlideChange: function (event, slick, currentSlide, nextSlide) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider\n          .find(\".\" + classes.currentSlide)\n          .addClass(classes.animateOut);\n      },\n      afterSlideChange: function (event, slick, currentSlide) {\n        var $slider = slick.$slider;\n        var $allSlides = $slider\n          .find(\".\" + classes.allSlides)\n          .removeClass(classes.animateOut);\n      },\n      destroy: function () {\n        this.$slideshow.slick(\"unslick\");\n      },\n\n      // Playback\n      _play: function () {\n        this.$slideshow.slick(\"slickPause\");\n        $(classes.pauseButton).addClass(\"is-paused\");\n      },\n      _pause: function () {\n        this.$slideshow.slick(\"slickPlay\");\n        $(classes.pauseButton).removeClass(\"is-paused\");\n      },\n      _togglePause: function () {\n        var slideshowSelector = this._getSlideshowId(this.$pause);\n        if (this.$pause.hasClass(classes.isPaused)) {\n          this.$pause.removeClass(classes.isPaused);\n          $(slideshowSelector).slick(\"slickPlay\");\n        } else {\n          this.$pause.addClass(classes.isPaused);\n          $(slideshowSelector).slick(\"slickPause\");\n        }\n      },\n\n      // Helpers\n      _getSlideshowId: function ($el) {\n        return \"#Slideshow-\" + $el.data(\"id\");\n      },\n      _activeSlide: function () {\n        return this.$slideshow.find(\".slick-active\");\n      },\n      _currentSlide: function () {\n        return this.$slideshow.find(\".slick-current\");\n      },\n      _nextSlide: function (index) {\n        return this.$slideshow.find(\n          '.slideshow__slide[data-slick-index=\"' + index + '\"]'\n        );\n      },\n\n      // a11y fixes\n      _a11y: function () {\n        var $list = this.$slideshowList;\n        var autoplay = this.settings.autoplay;\n\n        if (!$list) {\n          return;\n        }\n\n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr(\"aria-live\");\n\n        // When an element in the slider is focused\n        // pause slideshow and set aria-live\n        $(classes.wrapper).on(\n          \"focusin\",\n          function (evt) {\n            if (!$(classes.wrapper).has(evt.target).length) {\n              return;\n            }\n\n            $list.attr(\"aria-live\", \"polite\");\n            if (autoplay) {\n              this._pause();\n            }\n          }.bind(this)\n        );\n\n        // Resume autoplay\n        $(classes.wrapper).on(\n          \"focusout\",\n          function (evt) {\n            if (!$(classes.wrapper).has(evt.target).length) {\n              return;\n            }\n\n            $list.removeAttr(\"aria-live\");\n            if (autoplay) {\n              this._play();\n            }\n          }.bind(this)\n        );\n      },\n\n      // Make sure lazyloading works on cloned slides\n      _clonedLazyloading: function () {\n        var $slideshow = this.$slideshow;\n\n        $slideshow.find(\".slick-slide\").each(\n          function (index, el) {\n            var $slide = $(el);\n            if ($slide.hasClass(\"slick-cloned\")) {\n              var slideId = $slide.data(\"id\");\n              var $slideImg = $slide\n                .find(\".hero__image\")\n                .removeClass(\"lazyloading\")\n                .addClass(\"lazyloaded\");\n\n              // Get inline style attribute from non-cloned slide with arbitrary timeout\n              // so the image is loaded\n              setTimeout(function () {\n                var loadedImageStyle = $slideshow\n                  .find(\n                    \".slideshow__slide--\" +\n                      slideId +\n                      \":not(.slick-cloned) .hero__image\"\n                  )\n                  .attr(\"style\");\n\n                if (loadedImageStyle) {\n                  $slideImg.attr(\"style\", loadedImageStyle);\n                }\n              }, this.settings.autoplaySpeed / 1.5);\n            }\n          }.bind(this)\n        );\n      },\n    });\n\n    return slideshow;\n  })();\n\n  theme.predictiveSearch = (function () {\n    var currentString = \"\";\n    var isLoading = false;\n    var searchTimeout;\n    var namespace = \".predictive\";\n\n    var selectors = {\n      form: \"#HeaderSearchForm\",\n      input: 'input[type=\"search\"]',\n      wrapper: \".predictive-results\",\n\n      searchButton: \"[data-predictive-search-button]\",\n      searchTerm: \"[data-predictive-search-term]\",\n\n      resultDiv: \"#PredictiveResults\",\n      resultTemplate: \"#PredictiveTemplate\",\n    };\n\n    var classes = {\n      isActive: \"predicitive-active\",\n    };\n\n    var keys = {\n      up_arrow: 38,\n      down_arrow: 40,\n      tab: 9,\n    };\n\n    function init() {\n      if (!theme.settings.predictiveSearch) {\n        return;\n      }\n\n      // Only some languages support predictive search\n      if (document.getElementById(\"shopify-features\")) {\n        var supportedShopifyFeatures = JSON.parse(\n          document.getElementById(\"shopify-features\").innerHTML\n        );\n        if (!supportedShopifyFeatures.predictiveSearch) {\n          return;\n        }\n      }\n\n      $(selectors.form).attr(\"autocomplete\", \"off\");\n      $(selectors.form).on(\"submit\" + namespace, submitSearch);\n\n      $(selectors.input, selectors.form).on(\"keyup\" + namespace, handleKeyup);\n      $(selectors.searchButton, selectors.wrapper).on(\n        \"click\" + namespace,\n        triggerSearch\n      );\n\n      // Prep handlebars template\n      if ($(selectors.resultTemplate).length == 0) return;\n      var source = $(selectors.resultTemplate).html();\n      resultTemplate = Handlebars.compile(source);\n    }\n\n    function reset() {\n      $(selectors.wrapper).addClass(\"hide\");\n      clearTimeout(searchTimeout);\n    }\n\n    function triggerSearch() {\n      $(selectors.form).trigger(\"submit\");\n    }\n\n    // Append * wildcard to search\n    function submitSearch(evt) {\n      var $form = $(this);\n      evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n\n      var data = $form.serializeArray().reduce(function (obj, item) {\n        obj[item.name] = item.value;\n        return obj;\n      }, {});\n\n      if (data.q) {\n        data.q += \"*\";\n      }\n\n      var query = $.param(data);\n\n      window.location.href = \"/search?\" + query;\n      return false;\n    }\n\n    function handleKeyup(evt) {\n      if (evt.keyCode === keys.up_arrow) {\n        navigationEvent(evt, \"up\");\n        return;\n      }\n\n      if (evt.keyCode === keys.down_arrow) {\n        navigationEvent(evt, \"down\");\n        return;\n      }\n\n      if (evt.keyCode === keys.tab) {\n        return;\n      }\n\n      search();\n    }\n\n    function search() {\n      var keyword = $(selectors.input, selectors.form).val();\n\n      if (keyword === \"\") {\n        reset();\n        return;\n      }\n\n      var q = _normalizeQuery(keyword);\n\n      clearTimeout(searchTimeout);\n      searchTimeout = setTimeout(\n        function () {\n          predictQuery(q);\n        }.bind(this),\n        500\n      );\n    }\n\n    function predictQuery(q) {\n      if (isLoading) {\n        return;\n      }\n\n      // Do not re-search the same thing\n      if (currentString === q) {\n        return;\n      }\n\n      currentString = q;\n      isLoading = true;\n\n      jQuery\n        .getJSON(\"/search/suggest.json\", {\n          q: q,\n          resources: {\n            type: theme.settings.predictiveSearchType,\n            limit: 3,\n            options: {\n              unavailable_products: \"last\",\n              fields: \"title,product_type,variants.title,vendor\",\n            },\n          },\n        })\n        .done(function (response) {\n          isLoading = false;\n          var data = {};\n          var resultCount = 0;\n\n          $(selectors.wrapper).removeClass(\"hide\");\n\n          var resultTypes = Object.entries(response.resources.results);\n\n          for (var i = resultTypes.length - 1; i >= 0; i--) {\n            var obj = resultTypes[i];\n            var type = obj[0];\n            var results = obj[1];\n            resultCount += results.length;\n\n            switch (type) {\n              case \"products\":\n                data[type] = buildProducts(results);\n                break;\n              case \"collections\":\n                data[type] = buildCollections(results);\n                break;\n              default:\n                data[type] = parseResultImages(results);\n                break;\n            }\n          }\n\n          if (resultCount === 0) {\n            reset();\n          }\n\n          // Append result markup\n          $(selectors.resultDiv).empty().append(resultTemplate(data));\n\n          // Update 'search' term text\n          $(selectors.searchTerm, selectors.wrapper).text(q);\n        });\n    }\n\n    function buildProducts(results) {\n      var products = [];\n\n      for (var i = results.length - 1; i >= 0; i--) {\n        var product = results[i];\n\n        var new_product = {\n          title: product.title,\n          url: product.url,\n          image: theme.Images.getSizedImageUrl(\n            product.image,\n            \"200x200_crop_center\"\n          ),\n          vendor: product.vendor,\n          price: theme.Currency.formatMoney(product.price),\n          compare_price_max: theme.Currency.formatMoney(\n            product.compare_at_price_max\n          ),\n          on_sale:\n            parseInt(product.compare_at_price_max) > parseInt(product.price),\n        };\n\n        products.push(new_product);\n      }\n\n      return products;\n    }\n\n    function buildCollections(results) {\n      var collections = [];\n\n      for (var i = results.length - 1; i >= 0; i--) {\n        var collection = results[i];\n\n        var new_collection = {\n          title: collection.title,\n          url: collection.url,\n        };\n\n        if (collection.featured_image.url) {\n          new_collection.image = theme.Images.getSizedImageUrl(\n            collection.featured_image.url,\n            \"200x200_crop_center\"\n          );\n        }\n\n        collections.push(new_collection);\n      }\n\n      return collections;\n    }\n\n    // Overwrite full sized image returned form API\n    // with lazyloading-friendly path\n    function parseResultImages(results) {\n      for (var i = results.length - 1; i >= 0; i--) {\n        if (!results[i].image) {\n          continue;\n        }\n\n        var image = theme.Images.getSizedImageUrl(\n          results[i].image,\n          \"200x200_crop_center\"\n        );\n\n        results[i].image = image;\n      }\n\n      return results;\n    }\n\n    function _normalizeQuery(string) {\n      if (typeof string !== \"string\") {\n        return null;\n      }\n\n      return string.trim().replace(/\\ /g, \"-\").toLowerCase();\n    }\n\n    function navigationEvent(evt, direction) {}\n\n    return {\n      init: init,\n    };\n  })();\n\n  // This piece of code sorts items with [data-sort-children] data attribute, based on that same elemnts data-sort-by=\"value\"\n  // e.g. <div data-sort-children data-sort-by=\"position\"> is being sorted by it's children data-position=\"value\".\n  theme.initSortables = function () {\n    var $sortables = $(\"[data-sort-children]\");\n    $sortables.each(function () {\n      var sort_by = $(this).attr(\"data-sort-by\");\n      var $children = $(this).children();\n      console.log($children);\n      $(this).html(\n        $children.sort(function (a, b) {\n          console.log(\"date:\", $(a).data(sort_by));\n          const aDate = $(a).data(sort_by) || Infinity;\n          const bDate = $(b).data(sort_by) || Infinity;\n          return bDate < aDate ? 1 : -1;\n        })\n      );\n    });\n  };\n\n  theme.initExcerpt = function () {\n    var $excerpts = $(\".excerpt\");\n    $excerpts.each(function () {\n      var $showMore = $(this).find(\"button[data-excerpt-closed]\");\n      var $showLess = $(this).find(\"button[data-excerpt-open]\");\n\n      $showMore.on(\"click\", function () {\n        $(this)\n          .closest(\".excerpt\")\n          .removeClass(\"excerpt--closed\")\n          .addClass(\"excerpt--open\");\n      });\n\n      $showLess.on(\"click\", function () {\n        $(this)\n          .closest(\".excerpt\")\n          .removeClass(\"excerpt--open\")\n          .addClass(\"excerpt--closed\");\n        $(\"html, body\").animate(\n          {\n            scrollTop: $(this).closest(\".excerpt\").offset().top,\n          },\n          500\n        );\n      });\n    });\n  };\n\n  // Video modal will auto-initialize for any anchor link that points to YouTube\n  // MP4 videos must manually be enabled with:\n  //   - .product-video-trigger--mp4 (trigger button)\n  //   - .product-video-mp4-sound video player element (cloned into modal)\n  //     - see media.liquid for example of this\n  theme.videoModal = function () {\n    var youtubePlayer = null;\n    var videoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        autoplay: 1,\n        branding: 0,\n        cc_load_policy: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: \"hd720\",\n        rel: 0,\n        showinfo: 0,\n        wmode: \"opaque\",\n      },\n      events: {\n        onReady: onPlayerReady,\n      },\n    };\n\n    var videoHolderId = \"VideoHolder\";\n    var activeVideo = false;\n\n    var selectors = {\n      videoHolder: \"#\" + videoHolderId,\n      youtube: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]',\n      mp4Trigger: \".product-video-trigger--mp4\",\n      mp4Player: \".product-video-mp4-sound\",\n    };\n\n    if (!$(selectors.youtube).length && !$(selectors.mp4Trigger).length) {\n      return;\n    }\n\n    var modal = new theme.Modals(\"VideoModal\", \"video-modal\", {\n      closeOffContentClick: true,\n      solid: true,\n    });\n\n    $(selectors.youtube).on(\"click\", triggerYouTubeModal);\n    $(selectors.mp4Trigger).on(\"click\", triggerMp4Modal);\n\n    // Handle closing video modal\n    $(\"body\").on(\"modalClose.VideoModal\", function () {\n      // Slight timeout so YouTube player is destroyed after the modal closes\n      if (youtubePlayer && activeVideo === \"youtube\") {\n        setTimeout(function () {\n          youtubePlayer.destroy();\n        }, 500); // modal close css transition\n      } else {\n        emptyVideoHolder();\n      }\n    });\n\n    function triggerYouTubeModal(evt) {\n      emptyVideoHolder();\n\n      evt.preventDefault();\n      theme.LibraryLoader.load(\"youtubeSdk\");\n\n      if (theme.config.youTubeReady) {\n        startYoutubeOnClick(evt);\n      } else {\n        $(\"body\").on(\"youTubeReady\", function () {\n          startYoutubeOnClick(evt);\n        });\n      }\n    }\n\n    function triggerMp4Modal(evt) {\n      emptyVideoHolder();\n\n      var $el = $(evt.currentTarget);\n      var $mp4Player = $el.next(selectors.mp4Player);\n\n      $mp4Player.clone().removeClass(\"hide\").appendTo(selectors.videoHolder);\n\n      modal.open(evt);\n\n      // Play new video element\n      $(selectors.videoHolder).find(\"video\")[0].play();\n\n      activeVideo = \"mp4\";\n    }\n\n    function startYoutubeOnClick(evt) {\n      var $el = $(evt.currentTarget);\n      var videoId = getYoutubeVideoId($el.attr(\"href\"));\n\n      var args = $.extend({}, videoOptions, {\n        videoId: videoId,\n      });\n\n      // Disable plays inline on mobile\n      args.playerVars.playsinline = theme.config.bpSmall ? 0 : 1;\n\n      youtubePlayer = new YT.Player(videoHolderId, args);\n      modal.open(evt);\n\n      activeVideo = \"youtube\";\n    }\n\n    function onPlayerReady(evt) {\n      evt.target.playVideo();\n    }\n\n    function getYoutubeVideoId(url) {\n      var regExp =\n        /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n      var match = url.match(regExp);\n      return match && match[7].length == 11 ? match[7] : false;\n    }\n\n    function emptyVideoHolder() {\n      $(selectors.videoHolder).empty();\n    }\n  };\n\n  theme.parallaxSections = {};\n\n  theme.Parallax = (function () {\n    var speed = 7; // higher is slower\n\n    function parallax(el, args) {\n      this.$container = $(el);\n      this.namespace = args.namespace;\n\n      if (!this.$container.length) {\n        return;\n      }\n\n      if (args.desktopOnly) {\n        this.desktopInit();\n      } else {\n        this.init(this.$container, args);\n      }\n    }\n\n    parallax.prototype = $.extend({}, parallax.prototype, {\n      init: function (desktopOnly) {\n        var $window = (this.$window = $(window));\n        var elTop = this.$container.offset().top;\n\n        $window.on(\n          \"scroll\" + this.namespace,\n          function (evt) {\n            var scrolled = $window.scrollTop();\n            var shiftDistance = (elTop - scrolled) / speed;\n            this.$container.css({\n              transform: \"translate3d(0, \" + shiftDistance + \"px, 0)\",\n            });\n          }.bind(this)\n        );\n\n        // Reinit on resize\n        $window.on(\n          \"resize\" + this.namespace,\n          $.debounce(\n            350,\n            function () {\n              $window.off(this.namespace);\n\n              if (desktopOnly) {\n                if (!theme.config.bpSmall) {\n                  this.init(true);\n                  return;\n                }\n              }\n\n              this.init();\n            }.bind(this)\n          )\n        );\n      },\n\n      desktopInit: function () {\n        if (!theme.config.bpSmall) {\n          this.init(true);\n        }\n\n        $(\"body\").on(\n          \"matchSmall\",\n          function () {\n            this.destroy();\n          }.bind(this)\n        );\n\n        $(\"body\").on(\n          \"matchLarge\",\n          function () {\n            this.init(true);\n          }.bind(this)\n        );\n      },\n\n      destroy: function () {\n        this.$container.removeAttr(\"style\");\n        if (this.$window) {\n          this.$window.off(this.namespace);\n        }\n      },\n    });\n\n    return parallax;\n  })();\n\n  // Shopify-built select-like popovers for currency and language selection\n  theme.Disclosure = (function () {\n    var selectors = {\n      disclosureList: \"[data-disclosure-list]\",\n      disclosureToggle: \"[data-disclosure-toggle]\",\n      disclosureInput: \"[data-disclosure-input]\",\n      disclosureOptions: \"[data-disclosure-option]\",\n    };\n\n    var classes = {\n      listVisible: \"disclosure-list--visible\",\n    };\n\n    function Disclosure($disclosure) {\n      this.$container = $disclosure;\n      this.cache = {};\n      this._cacheSelectors();\n      this._connectOptions();\n      this._connectToggle();\n      this._onFocusOut();\n    }\n\n    Disclosure.prototype = $.extend({}, Disclosure.prototype, {\n      _cacheSelectors: function () {\n        this.cache = {\n          $disclosureList: this.$container.find(selectors.disclosureList),\n          $disclosureToggle: this.$container.find(selectors.disclosureToggle),\n          $disclosureInput: this.$container.find(selectors.disclosureInput),\n          $disclosureOptions: this.$container.find(selectors.disclosureOptions),\n        };\n      },\n\n      _connectToggle: function () {\n        this.cache.$disclosureToggle.on(\n          \"click\",\n          function (evt) {\n            var ariaExpanded =\n              $(evt.currentTarget).attr(\"aria-expanded\") === \"true\";\n            $(evt.currentTarget).attr(\"aria-expanded\", !ariaExpanded);\n\n            this.cache.$disclosureList.toggleClass(classes.listVisible);\n          }.bind(this)\n        );\n      },\n\n      _connectOptions: function () {\n        this.cache.$disclosureOptions.on(\n          \"click\",\n          function (evt) {\n            evt.preventDefault();\n            this._submitForm($(evt.currentTarget).data(\"value\"));\n          }.bind(this)\n        );\n      },\n\n      _onFocusOut: function () {\n        this.cache.$disclosureToggle.on(\n          \"focusout\",\n          function (evt) {\n            var disclosureLostFocus =\n              this.$container.has(evt.relatedTarget).length === 0;\n\n            if (disclosureLostFocus) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n\n        this.cache.$disclosureList.on(\n          \"focusout\",\n          function (evt) {\n            var childInFocus =\n              $(evt.currentTarget).has(evt.relatedTarget).length > 0;\n            var isVisible = this.cache.$disclosureList.hasClass(\n              classes.listVisible\n            );\n\n            if (isVisible && !childInFocus) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n\n        this.$container.on(\n          \"keyup\",\n          function (evt) {\n            if (evt.which !== 27) return;\n            this._hideList();\n            this.cache.$disclosureToggle.focus();\n          }.bind(this)\n        );\n\n        $(\"body\").on(\n          \"click\",\n          function (evt) {\n            var isOption = this.$container.has(evt.target).length > 0;\n            var isVisible = this.cache.$disclosureList.hasClass(\n              classes.listVisible\n            );\n\n            if (isVisible && !isOption) {\n              this._hideList();\n            }\n          }.bind(this)\n        );\n      },\n\n      _submitForm: function (value) {\n        $(\"body\").addClass(\"unloading\");\n        this.cache.$disclosureInput.val(value);\n        this.$container.parents(\"form\").submit();\n      },\n\n      _hideList: function () {\n        this.cache.$disclosureList.removeClass(classes.listVisible);\n        this.cache.$disclosureToggle.attr(\"aria-expanded\", false);\n      },\n\n      unload: function () {\n        this.cache.$disclosureOptions.off();\n        this.cache.$disclosureToggle.off();\n        this.cache.$disclosureList.off();\n        this.$container.off();\n      },\n    });\n\n    return Disclosure;\n  })();\n\n  theme.ProductMedia = (function () {\n    var modelJsonSections = {};\n    var models = {};\n    var xrButtons = {};\n\n    var selectors = {\n      mediaGroup: \"[data-product-single-media-group]\",\n      xrButton: \"[data-shopify-xr]\",\n    };\n\n    function init(modelViewerContainers, sectionId) {\n      modelJsonSections[sectionId] = {\n        loaded: false,\n      };\n\n      modelViewerContainers.each(function (index) {\n        var $modelViewerContainer = $(this);\n        var mediaId = $modelViewerContainer.data(\"media-id\");\n        var $modelViewerElement = $(\n          $modelViewerContainer.find(\"model-viewer\")[0]\n        );\n        var modelId = $modelViewerElement.data(\"model-id\");\n\n        if (index === 0) {\n          var $xrButton = $modelViewerContainer\n            .closest(selectors.mediaGroup)\n            .find(selectors.xrButton);\n          xrButtons[sectionId] = {\n            $element: $xrButton,\n            defaultId: modelId,\n          };\n        }\n\n        models[mediaId] = {\n          modelId: modelId,\n          sectionId: sectionId,\n          $container: $modelViewerContainer,\n          $element: $modelViewerElement,\n        };\n      });\n\n      window.Shopify.loadFeatures([\n        {\n          name: \"shopify-xr\",\n          version: \"1.0\",\n          onLoad: setupShopifyXr,\n        },\n        {\n          name: \"model-viewer-ui\",\n          version: \"1.0\",\n          onLoad: setupModelViewerUi,\n        },\n      ]);\n\n      theme.LibraryLoader.load(\"modelViewerUiStyles\");\n    }\n\n    function setupShopifyXr(errors) {\n      if (errors) return;\n\n      if (!window.ShopifyXR) {\n        document.addEventListener(\"shopify_xr_initialized\", function () {\n          setupShopifyXr();\n        });\n        return;\n      }\n\n      for (var sectionId in modelJsonSections) {\n        if (modelJsonSections.hasOwnProperty(sectionId)) {\n          var modelSection = modelJsonSections[sectionId];\n\n          if (modelSection.loaded) continue;\n          var $modelJson = $(\"#ModelJson-\" + sectionId);\n\n          window.ShopifyXR.addModels(JSON.parse($modelJson.html()));\n          modelSection.loaded = true;\n        }\n      }\n      window.ShopifyXR.setupXRElements();\n    }\n\n    function setupModelViewerUi(errors) {\n      if (errors) return;\n\n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (!model.modelViewerUi && Shopify) {\n            model.modelViewerUi = new Shopify.ModelViewerUI(model.$element);\n          }\n          setupModelViewerListeners(model);\n        }\n      }\n    }\n\n    function setupModelViewerListeners(model) {\n      var xrButton = xrButtons[model.sectionId];\n      model.$container.on(\"mediaVisible\", function () {\n        xrButton.$element.attr(\"data-shopify-model3d-id\", model.modelId);\n        if (theme.config.isTouch) return;\n        model.modelViewerUi.play();\n      });\n\n      model.$container\n        .on(\"mediaHidden\", function () {\n          xrButton.$element.attr(\"data-shopify-model3d-id\", xrButton.defaultId);\n          model.modelViewerUi.pause();\n        })\n        .on(\"xrLaunch\", function () {\n          model.modelViewerUi.pause();\n        });\n    }\n\n    function removeSectionModels(sectionId) {\n      for (var key in models) {\n        if (models.hasOwnProperty(key)) {\n          var model = models[key];\n          if (model.sectionId === sectionId) {\n            delete models[key];\n          }\n        }\n      }\n      delete modelJsonSections[sectionId];\n    }\n\n    return {\n      init: init,\n      removeSectionModels: removeSectionModels,\n    };\n  })();\n\n  theme.customerTemplates = (function () {\n    function initEventListeners() {\n      // Show reset password form\n      $(\"#RecoverPassword\").on(\"click\", function (evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n\n      // Hide reset password form\n      $(\"#HideRecoverPasswordLink\").on(\"click\", function (evt) {\n        evt.preventDefault();\n        toggleRecoverPasswordForm();\n      });\n    }\n\n    /**\n     *\n     *  Show/Hide recover password form\n     *\n     */\n    function toggleRecoverPasswordForm() {\n      $(\"#RecoverPasswordForm\").toggleClass(\"hide\");\n      $(\"#CustomerLoginForm\").toggleClass(\"hide\");\n    }\n\n    /**\n     *\n     *  Show reset password success message\n     *\n     */\n    function resetPasswordSuccess() {\n      var $formState = $(\".reset-password-success\");\n\n      // check if reset password form was successfully submitted\n      if (!$formState.length) {\n        return;\n      }\n\n      // show success message\n      $(\"#ResetSuccess\").removeClass(\"hide\");\n    }\n\n    /**\n     *\n     *  Show/hide customer address forms\n     *\n     */\n    function customerAddressForm() {\n      var $newAddressForm = $(\"#AddressNewForm\");\n      var $addressForms = $(\".js-address-form\");\n\n      if (!$newAddressForm.length || !$addressForms.length) {\n        return;\n      }\n\n      if (Shopify) {\n        $(\".js-address-country\").each(function () {\n          var $container = $(this);\n          var countryId = $container.data(\"country-id\");\n          var provinceId = $container.data(\"province-id\");\n          var provinceContainerId = $container.data(\"province-container-id\");\n\n          if (Shopify) {\n            new Shopify.CountryProvinceSelector(countryId, provinceId, {\n              hideElement: provinceContainerId,\n            });\n          }\n        });\n      }\n\n      // Toggle new/edit address forms\n      $(\".address-new-toggle\").on(\"click\", function () {\n        $newAddressForm.toggleClass(\"hide\");\n      });\n\n      $(\".address-edit-toggle\").on(\"click\", function () {\n        var formId = $(this).data(\"form-id\");\n        $(\"#EditAddress_\" + formId).toggleClass(\"hide\");\n      });\n\n      $(\".address-delete\").on(\"click\", function () {\n        var $el = $(this);\n        var formId = $el.data(\"form-id\");\n        var confirmMessage = $el.data(\"confirm-message\");\n\n        if (\n          confirm(\n            confirmMessage || \"Are you sure you wish to delete this address?\"\n          )\n        ) {\n          if (Shopify) {\n            Shopify.postLink(\"/account/addresses/\" + formId, {\n              parameters: { _method: \"delete\" },\n            });\n          }\n        }\n      });\n    }\n\n    /**\n     *\n     *  Check URL for reset password hash\n     *\n     */\n    function checkUrlHash() {\n      var hash = window.location.hash;\n\n      // Allow deep linking to recover password form\n      if (hash === \"#recover\") {\n        toggleRecoverPasswordForm();\n      }\n    }\n\n    return {\n      init: function () {\n        checkUrlHash();\n        initEventListeners();\n        resetPasswordSuccess();\n        customerAddressForm();\n      },\n    };\n  })();\n\n  theme.Product = (function () {\n    var classes = {\n      onSale: \"sale-price\",\n      disabled: \"disabled\",\n      loading: \"loading\",\n      loaded: \"loaded\",\n      hidden: \"hide\",\n      interactable: \"video-interactable\",\n      visuallyHide: \"visually-invisible\",\n    };\n\n    var selectors = {\n      productVideo: \".product__video\",\n      videoParent: \".product__video-wrapper\",\n      currentSlide: \".slick-current\",\n      startingSlide: \".starting-slide\",\n    };\n\n    var youtubeReady;\n    var videos = {};\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      height: \"480\",\n      width: \"850\",\n      playerVars: {\n        autohide: 0,\n        autoplay: 0,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: \"hd720\",\n        rel: 0,\n        showinfo: 0,\n        wmode: \"opaque\",\n      },\n    };\n\n    function onVideoPlayerReady(evt, id) {\n      var $player = $(\"#\" + id);\n      var playerId = $player.attr(\"id\");\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n\n      setParentAsLoading($player);\n\n      if (videos[playerId].style === \"muted\") {\n        youtubePlayers[playerId].mute();\n      } else {\n        setParentAsLoaded($player);\n      }\n\n      // If first slide or only photo, start video\n      if (\n        $player.closest(selectors.startingSlide).length ||\n        $player.data(\"image-count\") === 1\n      ) {\n        if (videos[playerId].style === \"muted\") {\n          youtubePlayers[playerId].playVideo();\n          initCheckVisibility(playerId);\n        }\n      }\n    }\n\n    function initCheckVisibility(playerId) {\n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on(\n        \"scroll.\" + playerId,\n        { id: playerId },\n        $.throttle(150, videoVisibilityCheck)\n      );\n    }\n\n    function videoVisibilityCheck(id) {\n      var playerId;\n\n      if (typeof id === \"string\") {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        if (!id.data) {\n          return;\n        }\n        playerId = id.data.id;\n      }\n\n      if (theme.isElementVisible($(\"#\" + playerId))) {\n        if (videos[playerId] && videos[playerId].style === \"unmuted\") {\n          return;\n        }\n        playVisibleVideo(playerId);\n      } else {\n        pauseHiddenVideo(playerId);\n      }\n    }\n\n    function playVisibleVideo(id) {\n      if (\n        youtubePlayers[id] &&\n        typeof youtubePlayers[id].playVideo === \"function\"\n      ) {\n        youtubePlayers[id].playVideo();\n      }\n    }\n\n    function pauseHiddenVideo(id) {\n      if (\n        youtubePlayers[id] &&\n        typeof youtubePlayers[id].pauseVideo === \"function\"\n      ) {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n\n    function onVideoStateChange(evt, id) {\n      var $player = $(\"#\" + id);\n      var playerId = $player.attr(\"id\");\n      var player = youtubePlayers[playerId];\n\n      switch (evt.data) {\n        case -1: // unstarted\n          // Handle low power state on iOS by checking if\n          // video is reset to unplayed after attempting to buffer\n          if (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          if (videos[playerId] && videos[playerId].loop) {\n            player.playVideo();\n          }\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n\n    function setParentAsLoading($el) {\n      $el.closest(selectors.videoParent).addClass(classes.loading);\n    }\n\n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n\n    function setVideoToBeInteractedWith($el) {\n      $el.closest(selectors.videoParent).addClass(classes.interactable);\n    }\n\n    function Product(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = (this.sectionId = $container.attr(\"data-section-id\"));\n\n      this.settings = {\n        enableHistoryState: $container.data(\"enable-history-state\") || false,\n        namespace: \".product-\" + sectionId,\n        inventory: $container.data(\"inventory\") || false,\n        incomingInventory: $container.data(\"incoming-inventory\") || false,\n        modalInit: false,\n        slickMainInitialized: false,\n        slickThumbInitialized: false,\n        thumbArrows: false,\n        thumbVertical: false,\n        hasImages: true,\n        hasMultipleImages: false,\n        imageSetName: null,\n        imageSetIndex: null,\n        currentImageSet: null,\n        imageSize: \"620x\",\n        currentSlideIndex: 0,\n        videoLooping: $container.data(\"video-looping\"),\n      };\n\n      this.selectors = {\n        variantsJson: \"VariantsJson-\" + sectionId,\n        currentVariantJson: \"CurrentVariantJson-\" + sectionId,\n\n        media: \"[data-product-media-type-model]\",\n        closeMedia: \".product-single__close-media\",\n        photoThumbs: \".product__thumb-\" + sectionId,\n        thumbSlider: \"#ProductThumbs-\" + sectionId,\n        mainSlider: \"#ProductPhotos-\" + sectionId,\n        imageContainer: \"[data-product-images]\",\n        productImageMain: \".product-image-main--\" + sectionId,\n        dotsContainer: \".product__photo-dots--\" + sectionId,\n\n        priceWrapper: \".product__price-wrap-\" + sectionId,\n        price: \"#ProductPrice-\" + sectionId,\n        price_member: \"#ProductPrice-\" + sectionId + \"-MEMBER\",\n        comparePrice: \"#ComparePrice-\" + sectionId,\n        priceA11y: \"#PriceA11y-\" + sectionId,\n        comparePriceA11y: \"#ComparePriceA11y-\" + sectionId,\n        unitWrapper: \".product__unit-price-wrapper--\" + sectionId,\n        unitPrice: \".product__unit-price--\" + sectionId,\n        unitPriceBaseUnit: \".product__unit-base--\" + sectionId,\n        sku: \"#Sku-\" + sectionId,\n        inventory: \"#ProductInventory-\" + sectionId,\n        incomingInventory: \"#ProductIncomingInventory-\" + sectionId,\n\n        addToCart: \"#AddToCart-\" + sectionId,\n        addToCartText: \"#AddToCartText-\" + sectionId,\n\n        originalSelectorId: \"#ProductSelect-\" + sectionId,\n        originalSelectorPrice: \"#ProductSelectPrice-\" + sectionId,\n        singleOptionSelector: \".variant__input-\" + sectionId,\n\n        modalFormHolder: \"#ProductFormHolder-\" + sectionId,\n        formContainer: \"#AddToCartForm-\" + sectionId,\n        availabilityContainer: \"StoreAvailabilityHolder-\" + sectionId,\n      };\n\n      this.$mainSlider = $(this.selectors.mainSlider);\n      this.$thumbSlider = $(this.selectors.thumbSlider);\n      this.$firstProductImage = this.$mainSlider.find(\"img\").first();\n\n      if (!this.$firstProductImage.length) {\n        this.settings.hasImages = false;\n      }\n\n      this.settings.imageSetName = this.$mainSlider\n        .find(\"[data-set-name]\")\n        .data(\"set-name\");\n\n      this.init();\n    }\n\n    Product.prototype = $.extend({}, Product.prototype, {\n      init: function () {\n        this.stringOverrides();\n        this.formSetup();\n        this.productSetup();\n\n        this.checkIfVideos();\n        this.createImageCarousels();\n        this.customMediaListners();\n\n        this.initNavigation();\n        this.initDescrption();\n        this.initReturnButton();\n      },\n\n      formSetup: function () {\n        // Determine how to handle variant availability selectors\n        if (theme.settings.dynamicVariantsEnable) {\n          this.$variantSelectors = $(this.selectors.formContainer).find(\n            this.selectors.singleOptionSelector\n          );\n        }\n\n        this.initQtySelector();\n        this.initAjaxProductForm();\n        this.availabilitySetup();\n        this.initVariants();\n      },\n\n      availabilitySetup: function () {\n        var container = document.getElementById(\n          this.selectors.availabilityContainer\n        );\n        if (container) {\n          this.storeAvailability = new theme.StoreAvailability(container);\n        }\n      },\n\n      initNavigation: function () {\n        var nav = {\n          parent: \".js-product-navigation\",\n          menu: \".product-navigation__links\",\n          link: \".product-navigation__links .site-nav__link:not(.product-navigation__return)\",\n          sections: \".js-product-section\",\n          progress: \".js-product-navigation .progress\",\n          return: \".product-navigation__return\",\n          addtocart: \"button.add-to-cart\",\n          form: \".product-navigation--form\",\n          idSelect: 'select[name=\"id\"]',\n        };\n\n        if ($(nav.sections).length == 0) {\n          $(nav.parent).hide();\n          return;\n        }\n        //$(nav.parent).insertBefore('#PageContainer'); // move it up the DOM tree to fix z-index bug on firefox.\n\n        /* Smooth scrolling is enabled for those that have not set reduced motion preference in browser/system. */\n        const behavior = theme.config.prefersReducedMotion.matches\n          ? \"auto\"\n          : \"smooth\";\n\n        var sections = [];\n\n        $(nav.sections).each(function (index, obj) {\n          var section = $(obj);\n          sections.push(section.attr(\"id\"));\n          var linkHTML =\n            '<a class=\"site-nav__link js-no-transition\" href=\"#' +\n            section.attr(\"id\") +\n            '\" title=\"' +\n            section.data(\"title\") +\n            '\">' +\n            section.data(\"title\") +\n            \"</a>\";\n          $(nav.menu).append(linkHTML);\n        });\n\n        // navigate to clicked element\n        $(nav.menu)\n          .find(\".site-nav__link[href]\")\n          .on(\"click\", function (evt) {\n            evt.preventDefault();\n            var targetHref = $(this).attr(\"href\");\n            var target = $(\".js-product-section\" + targetHref);\n            target[0].scrollIntoView({\n              // need to run on element not jquey obj, thats why we select index\n              behavior: behavior,\n              block: \"start\",\n              inline: \"start\",\n            });\n          });\n\n        // init qty selector\n        $(nav.parent)\n          .find(\".js-qty__wrapper\")\n          .each(function () {\n            new theme.QtySelector($(this), {\n              namespace: \".product-navigation\",\n            });\n          });\n\n        // add to cart\n        $(nav.parent)\n          .find(nav.addtocart)\n          .click(function (evt) {\n            evt.preventDefault();\n            if ($(this).attr(\"disabled\")) {\n              return;\n            }\n\n            // we update the main select so we get correct price displayed in cart.\n            const selected_variant_id = $(nav.form).find(nav.idSelect).val();\n            const selected_variant_title = $(nav.form)\n              .find(nav.idSelect)\n              .find('option[value=\"' + selected_variant_id + '\"]')\n              .attr(\"data-variant-title\");\n            const target_input = $(\".product-single__form\").find(\n              'input[value=\"' + selected_variant_title + '\"]'\n            );\n\n            $(\"button.add-to-cart\").addClass(\"btn--loading\");\n\n            $.post(\n              \"/cart/add.js\",\n              $(nav.parent).find(nav.form).serialize(),\n              function (res) {\n                if (window.debugMode) {\n                  console.log(\"[initNavigation] added product\", res);\n                }\n                $(\"body\").trigger(\"added.ajaxProduct\");\n              }\n            )\n              .fail(function (err) {\n                if (err && err.responseText) {\n                  var json = JSON.parse(err.responseText);\n                  theme.alert(json.description);\n                }\n              })\n              .always(function () {\n                $(\"button.add-to-cart\").removeClass(\"btn--loading\");\n              });\n          });\n\n        // progressbar thingy\n        var bodyHeight = $(\"#shopify-section-product-template\").height();\n\n        function hydrateNavigation() {\n          var somethingVisible = false;\n          sections.forEach(function (key, index) {\n            if ($(\".js-product-section#\" + key).isInViewport()) {\n              $(nav.link).removeClass(\"is-active\");\n              $(nav.link + '[href=\"#' + key + '\"]').addClass(\"is-active\");\n              somethingVisible = true;\n            }\n          });\n\n          if (!somethingVisible) {\n            $(nav.link).removeClass(\"is-active\");\n          }\n\n          var scrollTop = $(window).scrollTop();\n          var progressBar = Math.floor(100 / (bodyHeight / scrollTop));\n          progressBar = progressBar <= 100 ? progressBar : 100; // yeah we dont want the progressbar to go nuts so we limit it to 100%.\n          $(nav.progress).css({ width: progressBar + \"%\" });\n        }\n\n        $(window).scroll($.throttle(250, hydrateNavigation));\n        $(nav.return).on(\"click\", function (evt) {\n          $([document.documentElement, document.body]).animate(\n            {\n              scrollTop: 0,\n            },\n            400\n          );\n        });\n      },\n\n      initDescrption() {\n        const selectors = {\n          descriptionText: \".product-description\",\n          readMoreBtn: \"#DescriptionReadMore\",\n          readLessBtn: \"#DescriptionReadLess\",\n        };\n\n        const readMoreBtn = document.querySelector(selectors.readMoreBtn);\n        const readLessBtn = document.querySelector(selectors.readLessBtn);\n        const textField = document.querySelector(selectors.descriptionText);\n\n        if (!textField || !readMoreBtn || !readLessBtn) {\n          return;\n        }\n\n        const scrollHeight = textField.scrollHeight;\n        const clientHeight = textField.clientHeight;\n\n        console.log(\"scrollheight: \", scrollHeight);\n        console.log(\"clientheight: \", clientHeight);\n        console.log(\"offsetHeight: \", textField.offsetHeight);\n\n        if (clientHeight >= scrollHeight) {\n          readMoreBtn.style.display = \"none\";\n          textField.classList.add(\"show-all\");\n          readLessBtn.setAttribute(\"aria-expanded\", \"true\");\n        }\n\n        readMoreBtn.addEventListener(\"click\", () => {\n          textField.classList.add(\"show-all\");\n          readLessBtn.style.display = \"inline\";\n          readMoreBtn.style.display = \"none\";\n          readMoreBtn.setAttribute(\"aria-expanded\", \"true\");\n          readLessBtn.setAttribute(\"aria-expanded\", \"true\");\n        });\n\n        readLessBtn.addEventListener(\"click\", () => {\n          textField.classList.remove(\"show-all\");\n          readMoreBtn.style.display = \"inline\";\n          readLessBtn.style.display = \"none\";\n          readMoreBtn.setAttribute(\"aria-expanded\", \"false\");\n          readLessBtn.setAttribute(\"aria-expanded\", \"false\");\n        });\n      },\n\n      initReturnButton() {\n        const addToCartElement = document.querySelector(\n          this.selectors.addToCart\n        );\n        const backToButton = document.querySelector(\"#BackToAddToCart\");\n\n        if (addToCartElement && backToButton) {\n          backToButton.addEventListener(\"click\", () => {\n            addToCartElement.scrollIntoView({\n              behavior: \"smooth\",\n              block: \"center\",\n              inline: \"nearest\",\n            });\n          });\n\n          window.addEventListener(\n            \"scroll\",\n            $.debounce(200, () => {\n              const position = addToCartElement.getBoundingClientRect();\n              if (position.top < 100) {\n                backToButton.style.opacity = 1;\n              } else {\n                backToButton.style.opacity = 0;\n              }\n            })\n          );\n        }\n      },\n\n      initResizeEvents() {\n        $(window).resize(() => {});\n      },\n\n      productSetup: function () {\n        this.setImageSizes();\n        this.initImageSwitch();\n        this.initImageZoom();\n        this.initModelViewerLibraries();\n        this.initShopifyXrLaunch();\n      },\n\n      stringOverrides: function () {\n        theme.productStrings = theme.productStrings || {};\n        $.extend(theme.strings, theme.productStrings);\n      },\n\n      setImageSizes: function () {\n        if (!this.settings.hasImages) {\n          return;\n        }\n\n        // Get srcset image src, works on most modern browsers\n        // otherwise defaults to settings.imageSize\n        var currentImage = this.$firstProductImage[0].currentSrc;\n\n        if (currentImage) {\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\n        }\n      },\n\n      initVariants: function () {\n        if (!document.getElementById(this.selectors.variantsJson)) {\n          return;\n        }\n\n        this.variantsObject = JSON.parse(\n          document.getElementById(this.selectors.variantsJson).innerHTML\n        );\n\n        var options = {\n          $container: this.$container,\n          enableHistoryState: this.settings.enableHistoryState,\n          singleOptionSelector: this.selectors.singleOptionSelector,\n          originalSelectorId: this.selectors.originalSelectorId,\n          variants: this.variantsObject,\n        };\n\n        this.variants = new theme.Variants(options);\n\n        // Handle variant changing based on customer status\n        if (window.debugMode) {\n          console.log(\"[initVariants] userObject\", theme.userObject);\n        }\n\n        var variants = this.variants.variants;\n        var variantSelectors = $(this.selectors.singleOptionSelector);\n\n        if (!variantSelectors.hasClass(\"myyntikanava-dropdown\")) {\n          $.each(variantSelectors, function (key, value) {\n            var input = $(value);\n            var input_name = input.attr(\"name\").toLowerCase();\n            var trigger_word = theme.strings.priceSwapTrigger.toLowerCase();\n            if (input_name == trigger_word) {\n              var price_group = input.attr(\"value\").toLowerCase();\n              if (price_group == theme.userObject.priceGroup) {\n                input.attr(\"checked\", \"checked\");\n              } else {\n                input.removeAttr(\"checked\");\n              }\n            }\n          });\n        }\n\n        $(this.selectors.singleOptionSelector).change();\n\n        /*\n        var params = {}, q = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,k,v) {params[k] = v});\n        console.dir(params);\n        */\n        // TODO select right format based on url params\n\n        // Product availability on page load\n        if (this.storeAvailability) {\n          var variant_id = this.variants.currentVariant\n            ? this.variants.currentVariant.id\n            : this.variants.variants[0].id;\n\n          this.storeAvailability.updateContent(variant_id);\n          this.$container.on(\n            \"variantChange\" + this.settings.namespace,\n            this.updateAvailability.bind(this)\n          );\n        }\n\n        this.$container\n          .on(\n            \"variantChange\" + this.settings.namespace,\n            this.updateCartButton.bind(this)\n          )\n          .on(\n            \"variantImageChange\" + this.settings.namespace,\n            this.updateVariantImage.bind(this)\n          )\n          .on(\n            \"variantPriceChange\" + this.settings.namespace,\n            this.updatePrice.bind(this)\n          )\n          .on(\n            \"variantUnitPriceChange\" + this.settings.namespace,\n            this.updateUnitPrice.bind(this)\n          );\n\n        if ($(this.selectors.sku).length) {\n          this.$container.on(\n            \"variantSKUChange\" + this.settings.namespace,\n            this.updateSku.bind(this)\n          );\n        }\n        if (this.settings.inventory || this.settings.incomingInventory) {\n          this.$container.on(\n            \"variantChange\" + this.settings.namespace,\n            this.updateInventory.bind(this)\n          );\n        }\n\n        // Update individual variant availability on each selection\n        if (\n          theme.settings.dynamicVariantsEnable &&\n          document.getElementById(this.selectors.currentVariantJson)\n        ) {\n          this.currentVariantObject = JSON.parse(\n            document.getElementById(this.selectors.currentVariantJson).innerHTML\n          );\n\n          this.$variantSelectors.on(\n            \"change\" + this.settings.namespace,\n            this.updateVariantAvailability.bind(this)\n          );\n\n          // Set default state based on current selected variant\n          this.setCurrentVariantAvailability(this.currentVariantObject, true);\n        }\n\n        if (this.settings.imageSetName) {\n          this.settings.imageSetIndex = $(this.selectors.formContainer)\n            .find(\n              '.variant-input-wrap[data-handle=\"' +\n                this.settings.imageSetName +\n                '\"]'\n            )\n            .data(\"index\");\n          this.$container.on(\n            \"variantChange\" + this.settings.namespace,\n            this.updateImageSet.bind(this)\n          );\n        }\n      },\n\n      initQtySelector: function () {\n        this.$container.find(\".js-qty__wrapper\").each(function () {\n          new theme.QtySelector($(this), {\n            namespace: \".product\",\n          });\n        });\n      },\n\n      initAjaxProductForm: function () {\n        new theme.AjaxProduct($(this.selectors.formContainer));\n      },\n\n      /*============================================================================\n        Dynamic variant availability\n          - To disable, set dynamicVariantsEnable to false in theme.liquid\n      ==============================================================================*/\n      setCurrentVariantAvailability: function (variant) {\n        var valuesToEnable = {\n          option1: [],\n          option2: [],\n          option3: [],\n        };\n\n        // Disable all options to start\n        this.disableVariantGroup(\n          $(this.selectors.formContainer).find(\".variant-input-wrap\")\n        );\n\n        // Combine all available variants\n        var availableVariants = this.variantsObject.filter(function (el) {\n          if (variant.id === el.id) {\n            return false;\n          }\n\n          // Option 1\n          if (\n            variant.option2 === el.option2 &&\n            variant.option3 === el.option3\n          ) {\n            return true;\n          }\n\n          // Option 2\n          if (\n            variant.option1 === el.option1 &&\n            variant.option3 === el.option3\n          ) {\n            return true;\n          }\n\n          // Option 3\n          if (\n            variant.option1 === el.option1 &&\n            variant.option2 === el.option2\n          ) {\n            return true;\n          }\n        });\n\n        // IE11 can't handle shortform of {variant} so extra step is needed\n        var variantObject = {\n          variant: variant,\n        };\n\n        availableVariants = Object.assign({}, variantObject, availableVariants);\n\n        // Loop through each available variant to gather variant values\n        for (var property in availableVariants) {\n          if (availableVariants.hasOwnProperty(property)) {\n            var item = availableVariants[property];\n            var option1 = item.option1;\n            var option2 = item.option2;\n            var option3 = item.option3;\n\n            if (option1) {\n              if (valuesToEnable.option1.indexOf(option1) === -1) {\n                valuesToEnable.option1.push(option1);\n              }\n            }\n            if (option2) {\n              if (valuesToEnable.option2.indexOf(option2) === -1) {\n                valuesToEnable.option2.push(option2);\n              }\n            }\n            if (option3) {\n              if (valuesToEnable.option3.indexOf(option3) === -1) {\n                valuesToEnable.option3.push(option3);\n              }\n            }\n          }\n        }\n\n        // Have values to enable, separated by option index\n        if (valuesToEnable.option1.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option1, \"option1\");\n        }\n        if (valuesToEnable.option2.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option2, \"option2\");\n        }\n        if (valuesToEnable.option3.length) {\n          this.enableVariantOptionByValue(valuesToEnable.option3, \"option3\");\n        }\n      },\n\n      updateVariantAvailability: function (evt, value, index) {\n        if (value && index) {\n          var newVal = value;\n          var optionIndex = index;\n        } else {\n          var $el = $(evt.currentTarget);\n          var newVal = $el.val() ? $el.val() : evt.currentTarget.value;\n          var optionIndex = $el.data(\"index\");\n        }\n\n        var variants = this.variantsObject.filter(function (el) {\n          return el[optionIndex] === newVal;\n        });\n\n        // Disable all buttons/dropdown options that aren't the current index\n        $(this.selectors.formContainer)\n          .find(\".variant-input-wrap\")\n          .each(\n            function (index, el) {\n              var $group = $(el);\n              var currentOptionIndex = $group.data(\"index\");\n\n              if (currentOptionIndex !== optionIndex) {\n                // Disable all options as a starting point\n                this.disableVariantGroup($group);\n\n                // Loop through legit available options and enable\n                for (var i = 0; i < variants.length; i++) {\n                  this.enableVariantOption(\n                    $group,\n                    variants[i][currentOptionIndex]\n                  );\n                }\n              }\n            }.bind(this)\n          );\n      },\n\n      disableVariantGroup: function ($group) {\n        if (theme.settings.dynamicVariantType === \"dropdown\") {\n          $group.find(\"option\").prop(\"disabled\", true);\n        } else {\n          $group.find(\"input\").prop(\"disabled\", true);\n          $group.find(\"label\").toggleClass(\"disabled\", true);\n        }\n      },\n\n      enableVariantOptionByValue: function (array, index) {\n        var $group = $(this.selectors.formContainer).find(\n          '.variant-input-wrap[data-index=\"' + index + '\"]'\n        );\n\n        for (var i = 0; i < array.length; i++) {\n          this.enableVariantOption($group, array[i]);\n        }\n      },\n\n      enableVariantOption: function ($group, value) {\n        // Selecting by value so escape it\n        value = value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g, \"\\\\$1\");\n\n        if (theme.settings.dynamicVariantType === \"dropdown\") {\n          $group.find('option[value=\"' + value + '\"]').prop(\"disabled\", false);\n        } else {\n          var $buttonGroup = $group.find(\n            '.variant-input[data-value=\"' + value + '\"]'\n          );\n          $buttonGroup.find(\"input\").prop(\"disabled\", false);\n          $buttonGroup.find(\"label\").toggleClass(\"disabled\", false);\n        }\n      },\n\n      updateCartButton: function (evt) {\n        var variant = evt.variant;\n\n        if (variant) {\n          if (variant.available) {\n            // Available, enable the submit button and change text\n            $(this.selectors.addToCart)\n              .removeClass(classes.disabled)\n              .prop(\"disabled\", false);\n            var defaultText = $(this.selectors.addToCartText).data(\n              \"default-text\"\n            );\n            $(this.selectors.addToCartText).html(defaultText);\n          } else {\n            // Sold out, disable the submit button and change text\n            $(this.selectors.addToCart)\n              .addClass(classes.disabled)\n              .prop(\"disabled\", true);\n            $(this.selectors.addToCartText).html(theme.strings.soldOut);\n          }\n        } else {\n          // The variant doesn't exist, disable submit button\n          $(this.selectors.addToCart)\n            .addClass(classes.disabled)\n            .prop(\"disabled\", true);\n          $(this.selectors.addToCartText).html(theme.strings.unavailable);\n        }\n      },\n\n      updatePrice: function (evt) {\n        var variant = evt.variant;\n\n        if (variant) {\n          var variant_options = $(this.selectors.originalSelectorPrice).find(\n            \"option\"\n          );\n\n          if (theme.userObject.customerDiscount == true && !theme.userObject.myyntikanava) {\n            // Update member price for member user.\n            var vatMember = $(\"small#vatMember\");\n            if (vatMember) {\n              var vatString = theme.strings.vat;\n              var vatPercent = $(\n                'input[name=\"properties[_vat_percent]\"]'\n              ).val();\n              var vatMultiplier = $(\n                'input[name=\"properties[_vat_multiplier]\"]'\n              ).val();\n              vatString = vatString.replace(\"{{ percent }}\", vatPercent);\n              vatString = vatString.replace(\n                \"{{ amount }}\",\n                theme.Currency.formatMoney(\n                  variant.price * vatMultiplier,\n                  theme.settings.moneyFormat\n                )\n              );\n              vatMember.text(vatString);\n            }\n\n            $(this.selectors.price_member)\n              .html(\n                theme.Currency.formatMoney(\n                  variant.price,\n                  theme.settings.moneyFormat\n                )\n              )\n              .show();\n            $('input[name=\"properties[_productMemberPrice]\"]').val(\n              variant.price\n            );\n\n            // Update normal price for member user.\n            // We need to find Hinta variant with matching options.\n            var variant_to = variant.public_title.toLowerCase().split(\" / \");\n            var $price = $(this.selectors.price);\n            variant_to[0] = theme.strings.priceRegular.toLowerCase();\n            variant_to = variant_to.join(\" / \");\n            variant_options.each(function (index, el) {\n              var variant = $(el).text();\n              var price = $(el).val();\n              if (variant == variant_to) {\n                $price\n                  .html(\n                    theme.Currency.formatMoney(\n                      price,\n                      theme.settings.moneyFormat\n                    )\n                  )\n                  .show();\n                $('input[name=\"properties[_productRegularPrice]\"]').val(price);\n                var vatRegular = $(\"small#vatRegular\");\n                if (vatRegular) {\n                  var vatString = theme.strings.vat;\n                  var vatPercent = $(\n                    'input[name=\"properties[_vat_percent]\"]'\n                  ).val();\n                  var vatMultiplier = $(\n                    'input[name=\"properties[_vat_multiplier]\"]'\n                  ).val();\n                  vatString = vatString.replace(\"{{ percent }}\", vatPercent);\n                  vatString = vatString.replace(\n                    \"{{ amount }}\",\n                    theme.Currency.formatMoney(\n                      price * vatMultiplier,\n                      theme.settings.moneyFormat\n                    )\n                  );\n                  vatRegular.text(vatString);\n                }\n                return;\n              }\n            });\n          } else {\n            // Update member price for normal user.\n            // We need to find J\u00E4senetuhinta variant with matching options.\n            var variant_to = variant.public_title.toLowerCase().split(\" / \");\n            var $price_member = $(this.selectors.price_member);\n            variant_to[0] = theme.strings.priceMember.toLowerCase();\n            variant_to = variant_to.join(\" / \");\n            variant_options.each(function (index, el) {\n              var variant = $(el).text();\n              var price = $(el).val();\n              if (variant == variant_to) {\n                $price_member\n                  .html(\n                    theme.Currency.formatMoney(\n                      price,\n                      theme.settings.moneyFormat\n                    )\n                  )\n                  .show();\n                $('input[name=\"properties[_productMemberPrice]\"]').val(price);\n                var vatMember = $(\"vatMember\");\n                if (vatMember) {\n                  var vatString = theme.strings.vat;\n                  var vatPercent = $(\n                    'input[name=\"properties[_vat_percent]\"]'\n                  ).val();\n                  var vatMultiplier = $(\n                    'input[name=\"properties[_vat_multiplier]\"]'\n                  ).val();\n                  vatString = vatString.replace(\"{{ percent }}\", vatPercent);\n                  vatString = vatString.replace(\n                    \"{{ amount }}\",\n                    theme.Currency.formatMoney(\n                      price * vatMultiplier,\n                      theme.settings.moneyFormat\n                    )\n                  );\n                  vatMember.text(vatString);\n                }\n                return;\n              }\n            });\n\n            // Update normal price for normal user.\n            var vatRegular = $(\"#vatRegular\");\n            if (vatRegular) {\n              var vatString = theme.strings.vat;\n              var vatPercent = $(\n                'input[name=\"properties[_vat_percent]\"]'\n              ).val();\n              var vatMultiplier = $(\n                'input[name=\"properties[_vat_multiplier]\"]'\n              ).val();\n              vatString = vatString.replace(\"{{ percent }}\", vatPercent);\n              vatString = vatString.replace(\n                \"{{ amount }}\",\n                theme.Currency.formatMoney(\n                  variant.price * vatMultiplier,\n                  theme.settings.moneyFormat\n                )\n              );\n              vatRegular.text(vatString);\n            }\n\n            $(this.selectors.price)\n              .html(\n                theme.Currency.formatMoney(\n                  variant.price,\n                  theme.settings.moneyFormat\n                )\n              )\n              .show();\n            $('input[name=\"properties[_productRegularPrice]\"]').val(\n              variant.price\n            );\n          }\n\n          // Sale price, if necessary\n          if (variant.compare_at_price > variant.price) {\n            $(this.selectors.comparePrice).html(\n              theme.Currency.formatMoney(\n                variant.compare_at_price,\n                theme.settings.moneyFormat\n              )\n            );\n            $(this.selectors.priceWrapper).removeClass(classes.hidden);\n            $(this.selectors.price).addClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr(\"aria-hidden\", \"false\");\n            $(this.selectors.priceA11y).attr(\"aria-hidden\", \"false\");\n          } else {\n            $(this.selectors.priceWrapper).addClass(classes.hidden);\n            $(this.selectors.price).removeClass(classes.onSale);\n            $(this.selectors.comparePriceA11y).attr(\"aria-hidden\", \"true\");\n            $(this.selectors.priceA11y).attr(\"aria-hidden\", \"true\");\n          }\n        }\n      },\n\n      updateUnitPrice: function (evt) {\n        var variant = evt.variant;\n\n        if (variant && variant.unit_price) {\n          $(this.selectors.unitPrice).html(\n            theme.Currency.formatMoney(\n              variant.unit_price,\n              theme.settings.moneyFormat\n            )\n          );\n          $(this.selectors.unitPriceBaseUnit).text(\n            theme.Currency.getBaseUnit(variant)\n          );\n          $(this.selectors.unitWrapper)\n            .removeClass(classes.hidden)\n            .removeClass(classes.visuallyHide);\n        } else {\n          $(this.selectors.unitWrapper).addClass(classes.visuallyHide);\n        }\n      },\n\n      updateImageSet: function (evt) {\n        // If called directly, use current variant\n        var variant = evt\n          ? evt.variant\n          : this.variants\n          ? this.variants.currentVariant\n          : null;\n        if (!variant) {\n          return;\n        }\n\n        var groupIndex = this.settings.imageSetIndex;\n        if (!groupIndex) {\n          return;\n        }\n\n        var setValue = this.getImageSetName(variant[groupIndex]);\n\n        // Already on the current image group\n        if (this.settings.currentImageSet === setValue) {\n          return;\n        }\n\n        var set = this.settings.imageSetName + \"_\" + setValue;\n\n        if (this.settings.slickMainInitialized) {\n          this.$mainSlider.slick(\"slickUnfilter\");\n          this.$mainSlider\n            .slick(\"slickFilter\", '[data-group=\"' + set + '\"]')\n            .slick(\"refresh\");\n        }\n        if (this.settings.slickThumbInitialized) {\n          this.$thumbSlider.slick(\"slickUnfilter\");\n          this.$thumbSlider\n            .slick(\"slickFilter\", '[data-group=\"' + set + '\"]')\n            .slick(\"refresh\");\n        }\n\n        this.settings.currentImageSet = setValue;\n      },\n\n      getImageSetName: function (string) {\n        return string\n          .toLowerCase()\n          .replace(/[^a-z0-9]+/g, \"-\")\n          .replace(/-$/, \"\")\n          .replace(/^-/, \"\");\n      },\n\n      updateSku: function (evt) {\n        var variant = evt.variant;\n        var newSku = \"\";\n\n        if (variant) {\n          if (variant.sku) {\n            newSku = variant.sku;\n          }\n\n          $(this.selectors.sku).html(newSku);\n        }\n      },\n\n      updateInventory: function (evt) {\n        var variant = evt.variant;\n\n        // Hide stock if no inventory management or policy is continue\n        if (\n          !variant ||\n          !variant.inventory_management ||\n          variant.inventory_policy === \"continue\"\n        ) {\n          this.toggleInventoryQuantity(false);\n          this.toggleIncomingInventory(false);\n          return;\n        }\n\n        if (\n          variant.inventory_management === \"shopify\" &&\n          window.inventories &&\n          window.inventories[this.sectionId]\n        ) {\n          variantInventoryObject =\n            window.inventories[this.sectionId][variant.id];\n          var quantity = variantInventoryObject.quantity;\n          var showInventory = true;\n          var showIncomingInventory = false;\n\n          if (quantity <= 0 || quantity > theme.settings.inventoryThreshold) {\n            showInventory = false;\n          }\n\n          this.toggleInventoryQuantity(showInventory, quantity);\n\n          if (!showInventory && variantInventoryObject.incoming) {\n            showIncomingInventory = true;\n          }\n\n          this.toggleIncomingInventory(\n            showIncomingInventory,\n            variant.available,\n            variantInventoryObject.next_incoming_date\n          );\n        }\n      },\n\n      updateAvailability: function (evt) {\n        var variant = evt.variant;\n        if (!variant) {\n          return;\n        }\n\n        this.storeAvailability.updateContent(variant.id);\n      },\n\n      toggleInventoryQuantity: function (show, qty) {\n        if (!this.settings.inventory) {\n          show = false;\n        }\n\n        if (show) {\n          $(this.selectors.inventory)\n            .removeClass(classes.hidden)\n            .text(theme.strings.stockLabel.replace(\"[count]\", qty));\n        } else {\n          $(this.selectors.inventory).addClass(classes.hidden);\n        }\n      },\n\n      toggleIncomingInventory: function (show, available, date) {\n        if (!this.settings.incomingInventory) {\n          show = false;\n        }\n\n        if (show) {\n          var string = available\n            ? theme.strings.willNotShipUntil.replace(\"[date]\", date)\n            : theme.strings.willBeInStockAfter.replace(\"[date]\", date);\n\n          if (!date) {\n            string = theme.strings.waitingForStock;\n          }\n\n          $(this.selectors.incomingInventory)\n            .removeClass(classes.hidden)\n            .text(string);\n        } else {\n          $(this.selectors.incomingInventory).addClass(classes.hidden);\n        }\n      },\n\n      /*============================================================================\n        Product videos\n      ==============================================================================*/\n      checkIfVideos: function () {\n        var $productVideos = this.$mainSlider.find(selectors.productVideo);\n\n        // Stop if there are 0 videos\n        if (!$productVideos.length) {\n          return false;\n        }\n\n        var videoTypes = [];\n\n        $productVideos.each(function () {\n          var type = $(this).data(\"video-type\");\n\n          if (videoTypes.indexOf(type) < 0) {\n            videoTypes.push(type);\n          }\n        });\n\n        // Load YouTube API if not already loaded\n        if (videoTypes.indexOf(\"youtube\") > -1) {\n          if (!theme.config.youTubeReady) {\n            theme.LibraryLoader.load(\"youtubeSdk\");\n            $(\"body\").on(\n              \"youTubeReady\" + this.settings.namespace,\n              function () {\n                this.loadYoutubeVideos($productVideos);\n              }.bind(this)\n            );\n          } else {\n            this.loadYoutubeVideos($productVideos);\n          }\n        }\n\n        // Add mp4 video players\n        if (videoTypes.indexOf(\"mp4\") > -1) {\n          this.loadMp4Videos($productVideos);\n        }\n\n        return videoTypes;\n      },\n\n      loadMp4Videos: function ($videos) {\n        $videos.each(function () {\n          var $el = $(this);\n          if ($el.data(\"video-type\") != \"mp4\") {\n            return;\n          }\n\n          var id = $el.attr(\"id\");\n          var videoId = $el.data(\"video-id\");\n\n          videos[id] = {\n            type: \"mp4\",\n            divId: id,\n            style: $el.data(\"video-style\"),\n          };\n        });\n      },\n\n      loadYoutubeVideos: function ($videos) {\n        $videos.each(function () {\n          var $el = $(this);\n          if ($el.data(\"video-type\") != \"youtube\") {\n            return;\n          }\n\n          var id = $el.attr(\"id\");\n          var videoId = $el.data(\"youtube-id\");\n\n          videos[id] = {\n            type: \"youtube\",\n            id: id,\n            videoId: videoId,\n            style: $el.data(\"video-style\"),\n            loop: $el.data(\"video-loop\"),\n            attemptedToPlay: false,\n            events: {\n              onReady: function (evt) {\n                onVideoPlayerReady(evt, id);\n              },\n              onStateChange: function (evt) {\n                onVideoStateChange(evt, id);\n              },\n            },\n          };\n        });\n\n        // Create a player for each YouTube video\n        for (var key in videos) {\n          if (videos[key].type === \"youtube\") {\n            if (videos.hasOwnProperty(key)) {\n              var args = $.extend({}, youtubeVideoOptions, videos[key]);\n\n              if (args.style === \"muted\") {\n                // default youtubeVideoOptions, no need to change anything\n              } else {\n                args.playerVars.controls = 1;\n                args.playerVars.autoplay = 0;\n              }\n\n              youtubePlayers[key] = new YT.Player(key, args);\n            }\n          }\n        }\n\n        youtubeReady = true;\n      },\n\n      initVideo: function ($video) {\n        var videoType = $video.data(\"video-type\");\n        var divId = $video.attr(\"id\");\n\n        if (videoType === \"mp4\" && videos[divId].style === \"muted\") {\n          this.playMp4Video(divId);\n        }\n\n        if (videoType === \"youtube\") {\n          if (youtubeReady && videos[divId].style === \"muted\") {\n            this.requestToPlayYoutubeVideo(divId);\n          }\n        }\n      },\n\n      stopVideo: function (id, type) {\n        if (!id) {\n          this.stopYoutubeVideo();\n          this.stopMp4Video();\n        }\n\n        if (type === \"youtube\") {\n          this.stopYoutubeVideo(id);\n        }\n\n        if (type === \"mp4\") {\n          this.stopMp4Video(id);\n        }\n      },\n\n      getVideoType: function ($video) {\n        return $video.data(\"video-type\");\n      },\n\n      getVideoId: function ($video) {\n        return $video.attr(\"id\");\n      },\n\n      // Sub video functions (MP4 and YouTube)\n      requestToPlayYoutubeVideo: function (id, forcePlay) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n\n        var $player = $(\"#\" + id);\n        setParentAsLoading($player);\n\n        // If video is requested too soon, player might not be ready.\n        // Set arbitrary timeout to request it again in a second\n        if (typeof youtubePlayers[id].playVideo != \"function\") {\n          setTimeout(\n            function () {\n              this.playYoutubeVideo(id, forcePlay);\n            }.bind(this),\n            1000\n          );\n          return;\n        }\n\n        this.playYoutubeVideo(id, forcePlay);\n      },\n\n      playYoutubeVideo: function (id, forcePlay) {\n        var $player = $(\"#\" + id);\n        setParentAsLoaded($player);\n        if (typeof youtubePlayers[id].playVideo === \"function\") {\n          youtubePlayers[id].playVideo();\n        }\n\n        // forcePlay is sent as true from beforeSlideChange so the visibility\n        // check isn't fooled by the next slide positioning\n        if (!forcePlay) {\n          initCheckVisibility(id);\n        }\n      },\n\n      stopYoutubeVideo: function (id) {\n        if (!theme.config.youTubeReady) {\n          return;\n        }\n\n        if (id && youtubePlayers[id]) {\n          if (typeof youtubePlayers[id].pauseVideo === \"function\") {\n            youtubePlayers[id].pauseVideo();\n          }\n          $(window).off(\"scroll.\" + id);\n        } else {\n          for (key in youtubePlayers) {\n            var childVideo = this.$container.find(\"#\" + key);\n            if (\n              childVideo.length &&\n              typeof youtubePlayers[key].pauseVideo === \"function\"\n            ) {\n              youtubePlayers[key].pauseVideo();\n              $(window).off(\"scroll.\" + key);\n            }\n          }\n        }\n      },\n\n      playMp4Video: function (id) {\n        var $player = $(\"#\" + id);\n        setParentAsLoaded($player);\n\n        var playPromise = $player[0].play();\n\n        if (playPromise !== undefined) {\n          playPromise\n            .then(function () {})\n            .catch(function (error) {\n              // Likely low power mode on iOS, show controls\n              $player[0].setAttribute(\"controls\", \"\");\n              $player\n                .closest(selectors.videoParent)\n                .attr(\"data-video-style\", \"unmuted\");\n            });\n        }\n      },\n\n      stopMp4Video: function (id) {\n        if (id) {\n          $(\"#\" + id)[0].pause();\n        } else {\n          // loop through all mp4 videos to stop them\n          for (var key in videos) {\n            var childVideo = this.$container.find(\"#\" + key);\n            if (childVideo.length && videos[key].type === \"mp4\") {\n              var player = $(\"#\" + videos[key].divId)[0];\n              if (player && typeof player.pause === \"function\") {\n                player.pause();\n              }\n            }\n          }\n        }\n      },\n\n      /*============================================================================\n        Product images\n      ==============================================================================*/\n      initImageSwitch: function () {\n        if (!$(this.selectors.photoThumbs).length) {\n          return;\n        }\n\n        var self = this;\n\n        $(this.selectors.photoThumbs)\n          .on(\"click\", function (evt) {\n            evt.preventDefault();\n          })\n          .on(\n            \"focus\",\n            function (evt) {\n              if (!this.settings.slickThumbInitialized) {\n                return;\n              }\n\n              var index = this.getThumbIndex($(evt.currentTarget));\n              if (index !== undefined) {\n                this.$thumbSlider.slick(\"slickGoTo\", index);\n              }\n            }.bind(this)\n          )\n          .on(\n            \"keydown\",\n            function (evt) {\n              if (evt.keyCode === 13) {\n                this.$container.find(selectors.currentSlide).focus();\n              }\n            }.bind(this)\n          );\n      },\n\n      initImageZoom: function () {\n        var $container = $(this.selectors.imageContainer, this.$container);\n        var imageZoom = new theme.Photoswipe($container[0], this.sectionId);\n      },\n\n      getThumbIndex: function ($target) {\n        var $slide = $target.closest(\".product__thumb-item\");\n        return $slide.index();\n      },\n\n      updateVariantImage: function (evt) {\n        var variant = evt.variant;\n        var sizedImgUrl = theme.Images.getSizedImageUrl(\n          variant.featured_media.preview_image.src,\n          this.settings.imageSize\n        );\n\n        var $newImage = $(\n          '.product__thumb[data-id=\"' + variant.featured_media.id + '\"]'\n        );\n        var imageIndex = this.getThumbIndex($newImage);\n\n        // If there is no index, slider is not initalized\n        if (typeof imageIndex === \"undefined\") {\n          return;\n        }\n\n        this.$mainSlider.slick(\"slickGoTo\", imageIndex);\n      },\n\n      createImageCarousels: function () {\n        if (\n          !this.$thumbSlider.length ||\n          $(this.selectors.photoThumbs).length < 2\n        ) {\n          // Single product image. Init video if it exists\n          var $video = $(this.selectors.productImageMain).find(\n            selectors.productVideo\n          );\n          if ($video.length) {\n            this.initVideo($video);\n          }\n\n          return;\n        }\n\n        this.settings.hasMultipleImages = true;\n\n        // Set starting slide (for both sliders)\n        var $activeSlide = this.$mainSlider.find(\".starting-slide\");\n        var startIndex = this._slideIndex($activeSlide);\n\n        if (this.settings.imageSetName) {\n          startIndex = this.$mainSlider\n            .find('[data-set-name=\"' + this.settings.imageSetName + '\"]')\n            .index();\n        }\n\n        // Lame way to prevent duplicate event listeners\n        this.$mainSlider.off(\"init\");\n        this.$mainSlider.off(\"beforeChange\");\n        this.$mainSlider.on(\"init\", this.mainSlideInit.bind(this));\n        this.$mainSlider.on(\"beforeChange\", this.beforeSlideChange.bind(this));\n        this.$thumbSlider.on(\"init\", this.thumbSlideInit.bind(this));\n\n        var thumbnailsVertical = (this.settings.thumbVertical =\n          this.$thumbSlider.data(\"position\") === \"beside\" ? true : false);\n        var thumbArrows = (this.settings.thumbArrows =\n          this.$thumbSlider.data(\"arrows\"));\n\n        this.$mainSlider.slick({\n          accessibility: false,\n          adaptiveHeight: true,\n          asNavFor: this.selectors.thumbSlider,\n          infinite: false,\n          arrows: false,\n          dots: false,\n          initialSlide: startIndex,\n          rtl: theme.config.rtl,\n          appendDots: this.selectors.dotsContainer,\n        });\n\n        this.$thumbSlider.slick({\n          accessibility: false,\n          asNavFor: this.selectors.mainSlider,\n          slidesToShow: 1,\n          slidesToScroll: 1,\n          arrows: thumbArrows,\n          dots: false,\n          vertical: thumbnailsVertical,\n          verticalSwiping: thumbnailsVertical,\n          focusOnSelect: true,\n          infinite: false,\n          customHeightMatching: thumbArrows ? false : thumbnailsVertical,\n          customSlideAdvancement: true,\n          rtl: theme.config.rtl,\n          initialSlide: startIndex,\n        });\n\n        if (this.settings.imageSetName) {\n          this.updateImageSet();\n        }\n\n        // Too many thumbnails can cause the AOS calculations to be off\n        // so refresh that when the slider is ready\n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n\n      destroyImageCarousels: function () {\n        if (this.$mainSlider && this.settings.slickMainInitialized) {\n          this.$mainSlider.slick(\"unslick\");\n          this.settings.slickMainInitialized = false;\n        }\n\n        if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n          this.$thumbSlider.slick(\"unslick\");\n          this.settings.slickThumbInitialized = false;\n        }\n\n        this.settings.slickMainInitialized = false;\n        this.settings.slickThumbInitialized = false;\n      },\n\n      mainSlideInit: function (event, slick) {\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $video = $currentSlide.find(selectors.productVideo);\n\n        this.settings.slickMainInitialized = true;\n        this.settings.currentSlideIndex = $currentSlide.data(\"slick-index\");\n\n        if ($video.length) {\n          this.initVideo($video);\n        }\n      },\n\n      thumbSlideInit: function (event, slick) {\n        this.settings.slickThumbInitialized = true;\n\n        // Check if we need to hide the arrows\n        if (this.settings.thumbArrows) {\n          this.$thumbSlider.on(\n            \"setPosition\",\n            this.thumbSlideArrowVisibility.bind(this)\n          );\n        }\n      },\n\n      thumbSlideArrowVisibility: function (event, slick) {\n        var $slider = slick.$slider;\n        var $arrows = $slider.find(\".slick-arrow\");\n        var showArrows = false;\n\n        if (this.settings.thumbVertical) {\n          var $trackHeight = $slider.find(\".slick-track\").height();\n          if ($trackHeight >= $slider.height()) {\n            showArrows = true;\n          }\n        } else {\n          var $trackWidth = $slider.find(\".slick-track\").width();\n          if ($trackWidth >= $slider.width()) {\n            showArrows = true;\n          }\n        }\n\n        if (showArrows) {\n          $arrows.removeClass(classes.hidden);\n        } else {\n          $arrows.addClass(classes.hidden);\n        }\n      },\n\n      beforeSlideChange: function (event, slick, currentSlide, nextSlide) {\n        if (this.settings.currentSlideIndex === nextSlide) {\n          return;\n        } else {\n          this.settings.currentSlideIndex = nextSlide;\n        }\n\n        var $slider = slick.$slider;\n        var $currentSlide = $slider.find(selectors.currentSlide);\n        var $nextSlide = $slider.find(\n          '.slick-slide[data-slick-index=\"' + nextSlide + '\"]'\n        );\n\n        $currentSlide.attr(\"tabindex\", \"-1\");\n        $nextSlide.attr(\"tabindex\", 0);\n\n        // Pause any existing slide video\n        var $prevVideo = $currentSlide.find(\".product__video\");\n        if (currentSlide !== nextSlide && $prevVideo.length) {\n          var prevVideoType = this.getVideoType($prevVideo);\n          var prevVideoId = this.getVideoId($prevVideo);\n\n          if (prevVideoId) {\n            this.stopVideo(prevVideoId, prevVideoType);\n          }\n        }\n\n        // Prep next slide video\n        var $nextVideo = $nextSlide.find(\".product__video\");\n        if ($nextVideo.length) {\n          var nextVideoType = this.getVideoType($nextVideo);\n          var nextVideoId = this.getVideoId($nextVideo);\n\n          // Prep YouTube with a backup in case API isn't ready\n          if (nextVideoId && nextVideoType === \"youtube\") {\n            if (youtubeReady) {\n              if (\n                videos[nextVideoId] &&\n                videos[nextVideoId].style === \"muted\"\n              ) {\n                this.requestToPlayYoutubeVideo(nextVideoId, true);\n              }\n            } else {\n              $(\"body\").on(\n                \"youTubeReady\" + this.settings.namespace,\n                function () {\n                  if (\n                    videos[nextVideoId] &&\n                    videos[nextVideoId].style === \"muted\"\n                  ) {\n                    this.requestToPlayYoutubeVideo(nextVideoId, true);\n                  }\n                }.bind(this)\n              );\n            }\n          }\n\n          // Autoplay muted MP4 videos\n          if (\n            nextVideoId &&\n            videos[nextVideoId] &&\n            videos[nextVideoId].style === \"muted\"\n          ) {\n            if (nextVideoType === \"mp4\") {\n              this.playMp4Video(nextVideoId);\n            }\n          }\n\n          // Set unmuted videos to loaded state\n          if (\n            nextVideoId &&\n            videos[nextVideoId] &&\n            videos[nextVideoId].style != \"muted\"\n          ) {\n            setParentAsLoaded($(\"#\" + nextVideoId));\n          }\n        }\n\n        // Pause any existing media\n        var $currentMedia = $currentSlide.find(this.selectors.media);\n        if ($currentMedia.length) {\n          $currentMedia.trigger(\"mediaHidden\");\n        }\n\n        // Prep next slide media\n        var $nextMedia = $nextSlide.find(this.selectors.media);\n        if ($nextMedia.length) {\n          $nextMedia.trigger(\"mediaVisible\");\n          $nextSlide\n            .find(\".shopify-model-viewer-ui__button\")\n            .attr(\"tabindex\", 0);\n          $nextSlide.find(\".product-single__close-media\").attr(\"tabindex\", 0);\n        }\n      },\n\n      resizeSlides: function () {\n        if (!this.settings.hasMultipleImages) {\n          return;\n        }\n\n        $(window).trigger(\"resize.slick\");\n        setTimeout(\n          function () {\n            if (this.$mainSlider && this.settings.slickMainInitialized) {\n              this.$mainSlider.slick(\"setPosition\");\n            }\n            if (this.$thumbSlider && this.settings.slickThumbInitialized) {\n              this.$thumbSlider.slick(\"setPosition\");\n            }\n          }.bind(this),\n          500\n        ); // same timing as modal open transition\n      },\n\n      _slideIndex: function ($el) {\n        return $el.data(\"index\");\n      },\n\n      /*============================================================================\n        Products when in quick view modal\n      ==============================================================================*/\n      openModalProduct: function () {\n        var initialized = false;\n        if (!this.settings.modalInit) {\n          var $formHolder = $(this.selectors.modalFormHolder);\n          var url = $formHolder.data(\"url\");\n          var template = $formHolder.data(\"template\");\n\n          // If no alt template, use stripped down ajax version\n          if (template !== \"preorder\") {\n            url = url + \"?view=ajax\";\n          }\n\n          $formHolder.load(\n            url + \" #AddToCartForm-\" + this.sectionId,\n            function () {\n              $formHolder.addClass(\"product-form-holder--loaded\");\n              this.formSetup();\n              if (window.Shopify && window.Shopify.PaymentButton) {\n                window.Shopify.PaymentButton.init();\n              }\n            }.bind(this)\n          );\n\n          this.productSetup();\n          this.loadModalContent();\n          this.createImageCarousels();\n          this.customMediaListners();\n          this.settings.modalInit = true;\n\n          document.dispatchEvent(\n            new CustomEvent(\"quickview:loaded\", {\n              detail: {\n                productId: this.sectionId,\n              },\n            })\n          );\n        } else {\n          initialized = true;\n        }\n\n        this.resizeSlides();\n        AOS.refreshHard();\n\n        document.dispatchEvent(\n          new CustomEvent(\"quickview:open\", {\n            detail: {\n              initialized: initialized,\n              productId: this.sectionId,\n            },\n          })\n        );\n      },\n\n      closeModalProduct: function () {\n        this.stopVideo();\n        $(\"body\").off(this.settings.namespace);\n        $(window).off(this.settings.namespace);\n      },\n\n      loadModalContent: function () {\n        // Load videos if they exist\n        var videoTypes = this.checkIfVideos();\n\n        // Lazyload mp4 videos\n        if (videoTypes && videoTypes.indexOf(\"mp4\") > -1) {\n          this.$modal\n            .find('.product__video[data-video-type=\"mp4\"]')\n            .find(\".product__video-src\")\n            .each(\n              function (i, video) {\n                var $el = $(video);\n                var src = $el.attr(\"src\");\n                var type = $el.attr(\"type\");\n                var newEl = document.createElement(\"source\");\n                newEl.src = src;\n                newEl.type = type;\n                $el.after(newEl);\n              }.bind(this)\n            );\n        }\n      },\n\n      /*============================================================================\n        Product media (3D)\n      ==============================================================================*/\n      initModelViewerLibraries: function () {\n        var $modelViewerElements = $(this.selectors.media, this.$container);\n\n        if ($modelViewerElements.length < 1) return;\n\n        theme.ProductMedia.init($modelViewerElements, this.sectionId);\n      },\n\n      initShopifyXrLaunch: function () {\n        var self = this;\n        $(document).on(\"shopify_xr_launch\", function () {\n          var $currentMedia = $(\n            self.selectors.productMediaWrapper +\n              \":not(.\" +\n              classes.hidden +\n              \")\",\n            self.$container\n          );\n          $currentMedia.trigger(\"xrLaunch\");\n        });\n      },\n\n      customMediaListners: function () {\n        $(\"body\").on(\n          \"click\",\n          this.selectors.closeMedia,\n          function () {\n            this.$mainSlider\n              .find(selectors.currentSlide)\n              .find(this.selectors.media)\n              .trigger(\"mediaHidden\");\n          }.bind(this)\n        );\n\n        this.$container\n          .find(\"model-viewer\")\n          .on(\n            \"shopify_model_viewer_ui_toggle_play\",\n            function (evt) {\n              this.mediaLoaded(evt);\n            }.bind(this)\n          )\n          .on(\n            \"shopify_model_viewer_ui_toggle_pause\",\n            function (evt) {\n              this.mediaUnloaded(evt);\n            }.bind(this)\n          );\n      },\n\n      mediaLoaded: function (evt) {\n        this.$container\n          .find(this.selectors.closeMedia)\n          .removeClass(classes.hidden);\n        this.toggleSliderSwiping(false);\n      },\n\n      mediaUnloaded: function (evt) {\n        this.$container\n          .find(this.selectors.closeMedia)\n          .addClass(classes.hidden);\n        this.toggleSliderSwiping(true);\n      },\n\n      toggleSliderSwiping: function (enable) {\n        if (this.$mainSlider && this.settings.slickMainInitialized) {\n          this.$mainSlider.slick(\"slickSetOption\", \"swipe\", enable);\n          this.$mainSlider.slick(\"slickSetOption\", \"draggable\", enable);\n          this.$mainSlider.slick(\"slickSetOption\", \"touchMove\", enable);\n          this.$mainSlider.slick(\"slickSetOption\", \"accessibility\", enable);\n        }\n      },\n\n      onUnload: function () {\n        this.$container.off(this.settings.namespace);\n        $(\"body\").off(this.settings.namespace);\n        this.destroyImageCarousels();\n        theme.ProductMedia.removeSectionModels(this.sectionId);\n      },\n    });\n\n    return Product;\n  })();\n\n  theme.Recommendations = (function () {\n    function Recommendations(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = (this.sectionId = $container.attr(\"data-section-id\"));\n      this.url = $container.data(\"url\");\n\n      this.selectors = {\n        recommendations: \"#Recommendations-\" + sectionId,\n        placeholder: \".product-recommendations-placeholder\",\n        sectionClass: \" .product-recommendations\",\n        productResults: \".grid-product\",\n      };\n\n      this.init();\n    }\n\n    Recommendations.prototype = $.extend({}, Recommendations.prototype, {\n      init: function () {\n        var $section = $(this.selectors.recommendations);\n\n        if (!$section.length || $section.data(\"enable\") === false) {\n          return;\n        }\n\n        var $placeholder = $section.find(this.selectors.placeholder);\n        var id = $section.data(\"product-id\");\n        var limit = $section.data(\"limit\");\n\n        var url =\n          this.url +\n          \"?section_id=product-recommendations&limit=\" +\n          limit +\n          \"&product_id=\" +\n          id;\n\n        $placeholder.load(\n          url + this.selectors.sectionClass,\n          function (data) {\n            theme.reinitProductGridItem($section);\n            this.updateVariantInventory($section);\n\n            // If no results, hide the entire section\n            if (\n              $(data)\n                .find(this.selectors.sectionClass)\n                .find(this.selectors.productResults).length === 0\n            ) {\n              $section.addClass(\"hide\");\n            }\n          }.bind(this)\n        );\n      },\n\n      // Recommended products load via JS and don't add variant inventory to the\n      // global variable that we later check. This function scrapes a data div\n      // to get that info and manually add the values.\n      updateVariantInventory: function ($section) {\n        window.inventories = window.inventories || {};\n\n        $section.find(\".js-product-inventory-data\").each(function () {\n          var $el = $(this);\n          var sectionId = $el.data(\"section-id\");\n          window.inventories[sectionId] = {};\n          $(\".js-variant-inventory-data\", $el).each(function () {\n            var $child = $(this);\n            window.inventories[sectionId][$child.data(\"id\")] = {\n              quantity: $child.data(\"quantity\"),\n              incoming: $child.data(\"incoming\"),\n              next_incoming_date: $child.data(\"date\"),\n            };\n          });\n        });\n      },\n    });\n\n    return Recommendations;\n  })();\n\n  theme.StoreAvailability = (function () {\n    var selectors = {\n      drawerOpenBtn: \".js-drawer-open-availability\",\n      productTitle: \"[data-availability-product-title]\",\n    };\n\n    function StoreAvailability(container) {\n      this.container = container;\n      this.baseUrl = container.dataset.baseUrl;\n      this.productTitle = container.dataset.productName;\n    }\n\n    StoreAvailability.prototype = Object.assign(\n      {},\n      StoreAvailability.prototype,\n      {\n        updateContent: function (variantId) {\n          var variantSectionUrl =\n            this.baseUrl +\n            \"/variants/\" +\n            variantId +\n            \"/?section_id=store-availability\";\n\n          this.container.innerHTML = \"\";\n\n          var self = this;\n\n          fetch(variantSectionUrl)\n            .then(function (response) {\n              return response.text();\n            })\n            .then(function (storeAvailabilityHTML) {\n              if (storeAvailabilityHTML.trim() === \"\") {\n                return;\n              }\n\n              self.container.innerHTML = storeAvailabilityHTML;\n              self.container.innerHTML =\n                self.container.firstElementChild.innerHTML;\n\n              // Only create drawer if have open button\n              if (!self.container.querySelector(selectors.drawerOpenBtn)) {\n                return;\n              }\n\n              self.drawer = new theme.Drawers(\n                \"StoreAvailabilityDrawer\",\n                \"availability\"\n              );\n\n              self.container.querySelector(selectors.productTitle).textContent =\n                self.productTitle;\n            });\n        },\n      }\n    );\n\n    return StoreAvailability;\n  })();\n\n  theme.Collection = (function () {\n    var isAnimating = false;\n\n    var selectors = {\n      sortSelect: \"#SortBy\",\n      tags: \".tags\",\n      hero: \".collection-hero\",\n      title: \".collection-title\",\n      parallaxContainer: \".parallax-container\",\n    };\n\n    var data = {\n      sortBy: \"data-default-sortby\",\n    };\n\n    var classes = {\n      activeTag: \"tag--active\",\n    };\n\n    function Collection(container) {\n      this.container = container;\n      this.sectionId = $(container).attr(\"data-section-id\");\n      this.namespace = \".collection-\" + this.sectionId;\n\n      var $heroImageContainer = (this.$heroContainer =\n        $(container).find(\".collection-hero\"));\n      if ($heroImageContainer.length) {\n        this.checkIfNeedReload();\n        theme.loadImageSection($heroImageContainer);\n\n        if ($(container).data(\"parallax\")) {\n          var $parallaxContainer = $(container).find(\n            selectors.parallaxContainer\n          );\n          var args = {\n            namespace: this.namespace,\n          };\n          theme.parallaxSections[this.namespace] = new theme.Parallax(\n            $parallaxContainer,\n            args\n          );\n        }\n      } else if (theme.settings.overlayHeader) {\n        theme.headerNav.disableOverlayHeader();\n      }\n\n      // Ajax pagination\n      $(window).on(\n        \"popstate\",\n        function (state) {\n          if (state) {\n            this.getNewCollectionContent(location.href);\n          }\n        }.bind(this)\n      );\n\n      this.init();\n    }\n\n    Collection.prototype = $.extend({}, Collection.prototype, {\n      init: function () {\n        // init is called on load and when tags are selected\n        this.$container = $(this.container);\n        this.sectionId = this.$container.attr(\"data-section-id\");\n\n        this.$sortSelect = $(selectors.sortSelect);\n        this.$sortSelect.on(\"change\", this.onSortChange.bind(this));\n        this.defaultSort = this.getDefaultSortValue();\n\n        $(\"button.tag-group-toggle\").on(\"click\", function () {\n          $(this).toggleClass(\"open\");\n        });\n\n        $(\".tag-group\").each(function () {\n          var list_size = $(this).find(\".tags li\").length;\n          $(this).addClass(\"items-length-\" + list_size);\n        });\n\n        this.initParams();\n        this.sortTags();\n        this.initTagAjax();\n        theme.FiltersDrawer = new theme.Drawers(\"filtersDrawer\", \"filters\");\n      },\n\n      initTagAjax: function () {\n        this.$container.on(\n          \"click\" + this.namespace,\n          \".tags a\",\n          function (evt) {\n            var $el = $(evt.currentTarget);\n            if ($el.hasClass(\"no-ajax\")) {\n              return;\n            }\n\n            evt.preventDefault();\n\n            if (isAnimating) {\n              return;\n            }\n\n            isAnimating = true;\n\n            var newUrl = $el.attr(\"href\");\n            $(selectors.tags)\n              .find(\".\" + classes.activeTag)\n              .removeClass(classes.activeTag);\n            $el.parent().addClass(classes.activeTag);\n            history.pushState({}, \"\", newUrl);\n            $(\".grid-product\").addClass(\"unload\");\n            this.getNewCollectionContent(newUrl);\n          }.bind(this)\n        );\n      },\n\n      getNewCollectionContent: function (url) {\n        url = url.indexOf(\"?\") === -1 ? url + \"?view=ajax\" : url + \"&view=ajax\";\n        $(\"#CollectionAjaxResult\").load(\n          url + \" #CollectionAjaxContent\",\n          function (data) {\n            isAnimating = false;\n            this.reInit(data);\n          }.bind(this)\n        );\n      },\n\n      initParams: function () {\n        this.queryParams = {};\n\n        if (location.search.length) {\n          var aKeyValue;\n          var aCouples = location.search.substr(1).split(\"&\");\n          for (var i = 0; i < aCouples.length; i++) {\n            aKeyValue = aCouples[i].split(\"=\");\n            if (aKeyValue.length > 1) {\n              this.queryParams[decodeURIComponent(aKeyValue[0])] =\n                decodeURIComponent(aKeyValue[1]);\n            }\n          }\n        }\n      },\n\n      getSortValue: function () {\n        return this.$sortSelect.val() || this.defaultSort;\n      },\n\n      getDefaultSortValue: function () {\n        return this.$sortSelect.attr(data.sortBy);\n      },\n\n      onSortChange: function () {\n        this.queryParams.sort_by = this.getSortValue();\n\n        if (this.queryParams.page) {\n          delete this.queryParams.page;\n        }\n\n        window.location.search = $.param(this.queryParams);\n      },\n\n      sortTags: function () {\n        var $sortTags = $(\"#SortTags\");\n\n        if (!$sortTags.length) {\n          return;\n        }\n\n        $sortTags.on(\"change\", function () {\n          location.href = $(this).val();\n        });\n      },\n\n      reInit: function (data) {\n        // Reload collection template (it can be anywhere in the sections.instance array)\n        for (var i = 0; i < sections.instances.length; i++) {\n          var instance = sections.instances[i];\n          if (instance[\"type\"] === \"collection-template\") {\n            instance.forceReload();\n          }\n        }\n\n        // Update collection title\n        if (data) {\n          var title = $(data).find(selectors.title).text();\n          $(selectors.title).text(title);\n        }\n\n        theme.reinitProductGridItem();\n      },\n\n      forceReload: function () {\n        this.onUnload();\n        this.init();\n      },\n\n      // A liquid variable in the header needs a full page refresh\n      // if the collection header hero image setting is enabled\n      // and the header is set to sticky. Only necessary in the editor.\n      checkIfNeedReload: function () {\n        if (!Shopify.designMode) {\n          return;\n        }\n\n        if (theme.settings.overlayHeader) {\n          if (!$(\".header-wrapper\").hasClass(\"header-wrapper--overlay\")) {\n            location.reload();\n          }\n        }\n      },\n\n      onUnload: function () {\n        $(window).off(this.namespace);\n        this.$container.off(this.namespace);\n\n        if (theme.parallaxSections[this.namespace]) {\n          theme.parallaxSections[this.namespace].destroy();\n          delete theme.parallaxSections[this.namespace];\n        }\n      },\n    });\n\n    return Collection;\n  })();\n\n  theme.CollectionSwitcher = (function () {\n    var selectors = {\n      trigger: \".collection-switcher__trigger\",\n      collection: \".collection-switcher__collection\",\n      slider: \".collection-switcher__collection-grid\",\n    };\n\n    function CollectionSwitcher(container) {\n      this.$container = $(container);\n      this.sectionId = this.$container.attr(\"data-section-id\");\n\n      this.config = {\n        perRow: this.$container.attr(\"data-per-row\"),\n        perRowMobile: 2, // fixed always\n      };\n\n      this.sliderArgs = {\n        arrows: true,\n        speed: 700,\n        infinite: false,\n        slidesToShow: this.config.perRow,\n        slidesToScroll: this.config.perRow,\n      };\n\n      this.$activeSlider = null;\n\n      this.init();\n    }\n\n    CollectionSwitcher.prototype = $.extend({}, CollectionSwitcher.prototype, {\n      init: function () {\n        this.$triggers = this.$container.find(selectors.trigger);\n        this.$collections = this.$container.find(selectors.collection);\n\n        var $firstSlider = this.$container.find(selectors.slider).first();\n        if ($firstSlider.length) {\n          this.initSlider($firstSlider);\n\n          $(\"body\").on(\n            \"matchSmall unmatchSmall\",\n            function () {\n              this.initSlider();\n            }.bind(this)\n          );\n        }\n\n        this.$triggers.on(\"click\", this.switch.bind(this));\n      },\n\n      initSlider: function ($slider) {\n        if (this.$activeSlider) {\n          this.$activeSlider.off(\"afterChange\").slick(\"unslick\");\n        }\n\n        if (!$slider) {\n          $slider = this.$activeSlider;\n        }\n\n        if (!$slider.length) {\n          return;\n        }\n\n        // Mobile-specific per-row setting\n        if (theme.config.bpSmall) {\n          this.sliderArgs.slidesToShow = this.config.perRowMobile;\n          this.sliderArgs.slidesToScroll = this.config.perRowMobile;\n        } else {\n          this.sliderArgs.slidesToShow = parseInt(this.config.perRow);\n          this.sliderArgs.slidesToScroll = parseInt(this.config.perRow);\n        }\n\n        this.$activeSlider = $slider.slick(this.sliderArgs);\n\n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n\n      switch: function (evt) {\n        evt.preventDefault();\n\n        this.$triggers.removeClass(\"is-active\");\n\n        var containerId = $(evt.currentTarget)\n          .addClass(\"is-active\")\n          .attr(\"aria-controls\");\n        var $container = $(\"#\" + containerId);\n        var $newSlider = $container.find(selectors.slider);\n\n        // Hide collections, show new one\n        this.$collections.addClass(\"hide\");\n        $container.removeClass(\"hide\");\n\n        this.initSlider($newSlider);\n      },\n\n      onUnload: function () {},\n    });\n\n    return CollectionSwitcher;\n  })();\n\n  theme.HeaderSection = (function () {\n    var selectors = {\n      drawer: \"#NavDrawer\",\n      mobileSubNavToggle: \".mobile-nav__toggle-btn\",\n      hasSublist: \".mobile-nav__has-sublist\",\n    };\n\n    var classes = {\n      navExpanded: \"mobile-nav--expanded\",\n    };\n\n    function Header(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = (this.sectionId = $container.attr(\"data-section-id\"));\n\n      // Reload any slideshow if when the header is reloaded to make sure the\n      // sticky header works as expected (it can be anywhere in the sections.instance array)\n      for (var i = 0; i < sections.instances.length; i++) {\n        var instance = sections.instances[i];\n        if (instance[\"type\"] === \"slideshow-section\") {\n          instance.forceReload();\n        }\n      }\n\n      this.initDrawers();\n      theme.headerNav.init();\n    }\n\n    Header.prototype = $.extend({}, Header.prototype, {\n      initDrawers: function () {\n        theme.NavDrawer = new theme.Drawers(\"NavDrawer\", \"nav\");\n        new theme.CartDrawer();\n        this.drawerMenuButtons();\n      },\n\n      drawerMenuButtons: function () {\n        $(selectors.drawer)\n          .find(\".js-drawer-close\")\n          .on(\"click\", function (evt) {\n            evt.preventDefault();\n            theme.NavDrawer.close();\n          });\n\n        var $mobileSubNavToggle = $(selectors.mobileSubNavToggle);\n\n        $mobileSubNavToggle.attr(\"aria-expanded\", \"false\");\n        $mobileSubNavToggle.each(function (i, el) {\n          var $el = $(el);\n          $el.attr(\"aria-controls\", $el.attr(\"data-aria-controls\"));\n        });\n\n        $mobileSubNavToggle.on(\"click\", function () {\n          var $el = $(this);\n          var currentlyExpanded = $el.attr(\"aria-expanded\");\n          var toggleState = false;\n\n          // Updated aria-expanded value based on state pre-click\n          if (currentlyExpanded === \"true\") {\n            $el.attr(\"aria-expanded\", \"false\");\n          } else {\n            $el.attr(\"aria-expanded\", \"true\");\n            toggleState = true;\n          }\n\n          // Toggle class that expands/collapses sublist\n          $el\n            .closest(selectors.hasSublist)\n            .toggleClass(classes.navExpanded, toggleState);\n        });\n      },\n\n      onUnload: function () {\n        theme.NavDrawer.close();\n        theme.headerNav.unload();\n      },\n    });\n\n    return Header;\n  })();\n\n  theme.FooterSection = (function () {\n    var selectors = {\n      disclosureLocale: \"[data-disclosure-locale]\",\n      disclosureCurrency: \"[data-disclosure-currency]\",\n    };\n\n    function Footer(container) {\n      var $container = (this.$container = $(container));\n\n      this.cache = {};\n      this.cacheSelectors();\n\n      if (this.cache.$localeDisclosure.length) {\n        this.localeDisclosure = new theme.Disclosure(\n          this.cache.$localeDisclosure\n        );\n      }\n\n      if (this.cache.$currencyDisclosure.length) {\n        this.currencyDisclosure = new theme.Disclosure(\n          this.cache.$currencyDisclosure\n        );\n      }\n    }\n\n    Footer.prototype = $.extend({}, Footer.prototype, {\n      cacheSelectors: function () {\n        this.cache = {\n          $localeDisclosure: this.$container.find(selectors.disclosureLocale),\n          $currencyDisclosure: this.$container.find(\n            selectors.disclosureCurrency\n          ),\n        };\n      },\n\n      onUnload: function () {\n        if (this.cache.$localeDisclosure.length) {\n          this.localeDisclosure.unload();\n        }\n\n        if (this.cache.$currencyDisclosure.length) {\n          this.currencyDisclosure.unload();\n        }\n      },\n    });\n\n    return Footer;\n  })();\n\n  theme.FeaturedContentSection = (function () {\n    function FeaturedContent() {\n      $(\".rte\").find(\"a:not(:has(img))\").addClass(\"text-link\");\n    }\n\n    return FeaturedContent;\n  })();\n\n  theme.slideshows = {};\n\n  theme.SlideshowSection = (function () {\n    var selectors = {\n      parallaxContainer: \".parallax-container\",\n    };\n\n    function SlideshowSection(container) {\n      var $container = (this.$container = $(container));\n      var $section = $container.parent();\n      var sectionId = $container.attr(\"data-section-id\");\n      var slideshow = (this.slideshow = \"#Slideshow-\" + sectionId);\n      this.namespace = \".\" + sectionId;\n\n      var $imageContainer = $(container).find(\".hero\");\n      if ($imageContainer.length) {\n        theme.loadImageSection($imageContainer);\n      }\n\n      this.init();\n\n      if ($container.data(\"parallax\")) {\n        var args = {\n          namespace: this.namespace,\n        };\n\n        theme.parallaxSections[this.namespace] = new theme.Parallax(\n          $container.find(selectors.parallaxContainer),\n          args\n        );\n      }\n    }\n\n    SlideshowSection.prototype = $.extend({}, SlideshowSection.prototype, {\n      init: function () {\n        var args = {\n          arrows: $(this.slideshow).data(\"arrows\"),\n          dots: $(this.slideshow).data(\"dots\"),\n          fade: true,\n          speed: 500, // same as $slideshowImageAnimationSpeed in CSS\n        };\n\n        theme.slideshows[this.slideshow] = new theme.Slideshow(\n          this.slideshow,\n          args\n        );\n      },\n\n      forceReload: function () {\n        this.onUnload();\n        this.init();\n      },\n\n      onUnload: function () {\n        if (theme.parallaxSections[this.namespace]) {\n          theme.parallaxSections[this.namespace].destroy();\n          delete theme.parallaxSections[this.namespace];\n        }\n\n        if (theme.slideshows[this.slideshow]) {\n          theme.slideshows[this.slideshow].destroy();\n          delete theme.slideshows[this.slideshow];\n        }\n      },\n\n      onSelect: function () {\n        $(this.slideshow).slick(\"slickPause\");\n      },\n\n      onDeselect: function () {\n        $(this.slideshow).slick(\"slickPlay\");\n      },\n\n      onBlockSelect: function (evt) {\n        var $slideshow = $(this.slideshow);\n\n        // Ignore the cloned version\n        var $slide = $(\n          \".slideshow__slide--\" + evt.detail.blockId + \":not(.slick-cloned)\"\n        );\n        var slideIndex = $slide.data(\"slick-index\");\n\n        // Go to selected slide, pause autoplay\n        $slideshow.slick(\"slickGoTo\", slideIndex).slick(\"slickPause\");\n      },\n\n      onBlockDeselect: function () {\n        $(this.slideshow).slick(\"slickPlay\");\n      },\n    });\n\n    return SlideshowSection;\n  })();\n\n  theme.VideoSection = (function () {\n    var youtubeReady;\n    var videos = [];\n    var youtubePlayers = [];\n    var youtubeVideoOptions = {\n      width: 1280,\n      height: 720,\n      playerVars: {\n        autohide: 0,\n        branding: 0,\n        cc_load_policy: 0,\n        controls: 0,\n        fs: 0,\n        iv_load_policy: 3,\n        modestbranding: 1,\n        playsinline: 1,\n        quality: \"hd720\",\n        rel: 0,\n        showinfo: 0,\n        wmode: \"opaque\",\n      },\n    };\n\n    var vimeoReady = false;\n    var vimeoVideoOptions = {\n      byline: false,\n      title: false,\n      portrait: false,\n      loop: true,\n    };\n\n    var selectors = {\n      videoParent: \".video-parent-section\",\n    };\n\n    var classes = {\n      loading: \"loading\",\n      loaded: \"loaded\",\n      interactable: \"video-interactable\",\n    };\n\n    function videoSection(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = (this.sectionId = $container.attr(\"data-section-id\"));\n      var youtubePlayerId = (this.youtubePlayerId =\n        \"YouTubeVideo-\" + this.sectionId);\n      this.namespace = \".\" + youtubePlayerId;\n      var vimeoPlayerId = (this.vimeoPlayerId = \"Vimeo-\" + this.sectionId);\n      var $vimeoTrigger = (this.$vimeoTrigger = $(\n        \"#VimeoTrigger-\" + this.sectionId\n      ));\n      var mp4Video = \"Mp4Video-\" + this.sectionId;\n\n      var $youtubeDiv = $(\"#\" + youtubePlayerId);\n      var $vimeoDiv = $(\"#\" + vimeoPlayerId);\n      var $mp4Div = $(\"#\" + mp4Video);\n\n      this.vimeoPlayer = [];\n\n      if ($youtubeDiv.length) {\n        this.youtubeVideoId = $youtubeDiv.data(\"video-id\");\n        this.initYoutubeVideo();\n      }\n\n      if ($vimeoDiv.length) {\n        this.vimeoVideoId = $vimeoDiv.data(\"video-id\");\n        this.initVimeoVideo();\n      }\n\n      if ($mp4Div.length) {\n        setParentAsLoaded($mp4Div);\n\n        startMp4Playback(mp4Video)\n          .then(function () {\n            // Video played as expected, don't do anything\n          })\n          .catch(function (error) {\n            // Video cannot be played with autoplay, so let\n            // user interact with video element itself\n            $mp4Div.attr(\"controls\", \"\");\n            setVideoToBeInteractedWith($mp4Div);\n          });\n      }\n    }\n\n    function startMp4Playback(mp4Video) {\n      return document.querySelector(\"#\" + mp4Video).play();\n    }\n\n    function onVideoPlayerReady(evt, id) {\n      var $player = $(\"#\" + id);\n      var playerId = $player.attr(\"id\");\n      youtubePlayers[playerId] = evt.target; // update stored player\n      var player = youtubePlayers[playerId];\n\n      setParentAsLoading($player);\n\n      youtubePlayers[playerId].mute();\n\n      // Remove from tabindex because YouTube iframes are annoying and you can focus\n      // on the YouTube logo and it breaks\n      $player.attr(\"tabindex\", \"-1\");\n\n      // Add out of view pausing\n      videoVisibilityCheck(playerId);\n      $(window).on(\n        \"scroll.\" + playerId,\n        { id: playerId },\n        $.throttle(150, videoVisibilityCheck)\n      );\n    }\n\n    function videoVisibilityCheck(id) {\n      var playerId;\n\n      if (typeof id === \"string\") {\n        playerId = id;\n      } else {\n        // Data comes in as part of the scroll event\n        if (!id.data) {\n          return;\n        }\n        playerId = id.data.id;\n      }\n\n      if (theme.isElementVisible($(\"#\" + playerId))) {\n        playVisibleVideo(playerId);\n      } else {\n        pauseHiddenVideo(playerId);\n      }\n    }\n\n    function playVisibleVideo(id) {\n      if (\n        youtubePlayers[id] &&\n        typeof youtubePlayers[id].playVideo === \"function\"\n      ) {\n        youtubePlayers[id].playVideo();\n      }\n    }\n\n    function pauseHiddenVideo(id) {\n      if (\n        youtubePlayers[id] &&\n        typeof youtubePlayers[id].pauseVideo === \"function\"\n      ) {\n        youtubePlayers[id].pauseVideo();\n      }\n    }\n\n    function onVideoStateChange(evt, id) {\n      var $player = $(\"#\" + id);\n      var playerId = $player.attr(\"id\");\n      var player = youtubePlayers[playerId];\n\n      switch (evt.data) {\n        case -1: // unstarted\n          // Handle low power state on iOS by checking if\n          // video is reset to unplayed after attempting to buffer\n          if (videos[playerId].attemptedToPlay) {\n            setParentAsLoaded($player);\n            setVideoToBeInteractedWith($player);\n          }\n          break;\n        case 0: // ended\n          player.playVideo();\n          break;\n        case 1: // playing\n          setParentAsLoaded($player);\n          break;\n        case 3: // buffering\n          videos[playerId].attemptedToPlay = true;\n          break;\n      }\n    }\n\n    function setParentAsLoading($el) {\n      $el.closest(selectors.videoParent).addClass(classes.loading);\n    }\n\n    function setParentAsLoaded($el) {\n      $el\n        .closest(selectors.videoParent)\n        .removeClass(classes.loading)\n        .addClass(classes.loaded);\n    }\n\n    function setVideoToBeInteractedWith($el) {\n      $el.closest(selectors.videoParent).addClass(classes.interactable);\n    }\n\n    videoSection.prototype = $.extend({}, videoSection.prototype, {\n      initYoutubeVideo: function () {\n        videos[this.youtubePlayerId] = {\n          id: this.youtubePlayerId,\n          videoId: this.youtubeVideoId,\n          type: \"youtube\",\n          attemptedToPlay: false,\n          events: {\n            onReady: function (evt) {\n              onVideoPlayerReady(evt, this.youtubePlayerId);\n            }.bind(this),\n            onStateChange: function (evt) {\n              onVideoStateChange(evt, this.youtubePlayerId);\n            }.bind(this),\n          },\n        };\n\n        if (!youtubeReady) {\n          theme.LibraryLoader.load(\"youtubeSdk\");\n          $(\"body\").on(\n            \"youTubeReady\" + this.namespace,\n            this.loadYoutubeVideo.bind(this)\n          );\n        } else {\n          this.loadYoutubeVideo();\n        }\n      },\n\n      loadYoutubeVideo: function () {\n        var args = $.extend(\n          {},\n          youtubeVideoOptions,\n          videos[this.youtubePlayerId]\n        );\n        args.playerVars.controls = 0;\n        youtubePlayers[this.youtubePlayerId] = new YT.Player(\n          this.youtubePlayerId,\n          args\n        );\n\n        youtubeReady = true;\n      },\n\n      initVimeoVideo: function () {\n        videos[this.vimeoPlayerId] = {\n          divId: this.vimeoPlayerId,\n          id: this.vimeoVideoId,\n          type: \"vimeo\",\n        };\n\n        var $player = $(\"#\" + this.vimeoPlayerId);\n        setParentAsLoading($player);\n\n        // Button to play video on mobile\n        this.$vimeoTrigger.on(\n          \"click\",\n          +this.namespace,\n          function (evt) {\n            // $(evt.currentTarget).addClass('hide');\n            this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n          }.bind(this)\n        );\n\n        if (!vimeoReady) {\n          window.loadVimeo();\n          $(\"body\").on(\n            \"vimeoReady\" + this.namespace,\n            this.loadVimeoVideo.bind(this)\n          );\n        } else {\n          this.loadVimeoVideo();\n        }\n      },\n\n      loadVimeoVideo: function () {\n        var args = $.extend({}, vimeoVideoOptions, videos[this.vimeoPlayerId]);\n        this.vimeoPlayer[this.vimeoPlayerId] = new Vimeo.Player(\n          videos[this.vimeoPlayerId].divId,\n          args\n        );\n\n        vimeoReady = true;\n\n        // Only autoplay on larger screens\n        if (!theme.config.bpSmall) {\n          this.requestToPlayVimeoVideo(this.vimeoPlayerId);\n        } else {\n          var $player = $(\"#\" + this.vimeoPlayerId);\n          setParentAsLoaded($player);\n        }\n      },\n\n      requestToPlayVimeoVideo: function (id) {\n        // The slider may initialize and attempt to play the video before\n        // the API is even ready, because it sucks.\n\n        if (!vimeoReady) {\n          // Wait for the trigger, then play it\n          $(\"body\").on(\n            \"vimeoReady\" + this.namespace,\n            function () {\n              this.playVimeoVideo(id);\n            }.bind(this)\n          );\n          return;\n        }\n\n        this.playVimeoVideo(id);\n      },\n\n      playVimeoVideo: function (id) {\n        this.vimeoPlayer[id].play();\n        this.vimeoPlayer[id].setVolume(0);\n\n        var $player = $(\"#\" + id);\n        setParentAsLoaded($player);\n      },\n\n      onUnload: function (evt) {\n        var sectionId = evt.target.id.replace(\"shopify-section-\", \"\");\n        var playerId = \"YouTubeVideo-\" + sectionId;\n        youtubePlayers[playerId].destroy();\n        $(window).off(\"scroll\" + this.namespace);\n        $(\"body\").off(\"vimeoReady\" + this.namespace);\n      },\n    });\n\n    return videoSection;\n  })();\n\n  theme.BackgroundImage = (function () {\n    var selectors = {\n      parallaxContainer: \".parallax-container\",\n    };\n\n    function backgroundImage(container) {\n      var $container = $(container);\n      var sectionId = $container.attr(\"data-section-id\");\n      this.namespace = \".\" + sectionId;\n\n      if (!$container.length) {\n        return;\n      }\n\n      if ($container.data(\"parallax\")) {\n        var $parallaxContainer = $container.find(selectors.parallaxContainer);\n        var args = {\n          namespace: this.namespace,\n          desktopOnly: true,\n        };\n\n        theme.parallaxSections[this.namespace] = new theme.Parallax(\n          $parallaxContainer,\n          args\n        );\n      }\n    }\n\n    backgroundImage.prototype = $.extend({}, backgroundImage.prototype, {\n      onUnload: function (evt) {\n        theme.parallaxSections[this.namespace].destroy();\n        delete theme.parallaxSections[this.namespace];\n      },\n    });\n\n    return backgroundImage;\n  })();\n\n  theme.Testimonials = (function () {\n    var slideCount = 0;\n    var defaults = {\n      accessibility: true,\n      arrows: false,\n      dots: true,\n      infinite: true,\n      centerMode: true,\n      centerPadding: \"60px\",\n      touchThreshold: 20,\n      rtl: theme.config.rtl,\n      slidesToShow: 3,\n      slidesToScroll: 3,\n      pauseOnHover: false,\n      pauseonFocus: true,\n    };\n\n    function Testimonials(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = $container.attr(\"data-section-id\");\n      var wrapper = (this.wrapper = \".testimonials-wrapper\");\n      var slider = (this.slider = \"#Testimonials-\" + sectionId);\n      var $slider = $(slider);\n\n      this.namespace = \".testimonial-\" + sectionId;\n      this.sliderActive = false;\n      var mobileOptions = $.extend({}, defaults, {\n        slidesToShow: 1,\n        slidesToScroll: 1,\n        centerPadding: \"30px\",\n        adaptiveHeight: true,\n      });\n\n      slideCount = $slider.data(\"count\");\n\n      // Override slidesToShow/Scroll if there are not enough blocks\n      if (slideCount < defaults.slidesToShow) {\n        defaults.slidesToShow = slideCount;\n        defaults.slidesToScroll = slideCount;\n      }\n\n      $slider.on(\"init\", this.a11y.bind(this));\n\n      if (theme.config.bpSmall) {\n        this.init($slider, mobileOptions);\n      } else {\n        this.init($slider, defaults);\n      }\n\n      $(\"body\").on(\n        \"matchSmall\",\n        function () {\n          this.init($slider, mobileOptions);\n        }.bind(this)\n      );\n\n      $(\"body\").on(\n        \"unmatchSmall\",\n        function () {\n          this.init($slider, defaults);\n        }.bind(this)\n      );\n\n      this.checkVisibility();\n      $(window).on(\n        \"scroll\" + this.namespace,\n        $.throttle(50, this.checkVisibility.bind(this))\n      );\n    }\n\n    Testimonials.prototype = $.extend({}, Testimonials.prototype, {\n      onUnload: function () {\n        $(this.slider, this.wrapper).slick(\"unslick\");\n      },\n\n      onBlockSelect: function (evt) {\n        // Ignore the cloned version\n        var $slide = $(\n          \".testimonials-slide--\" + evt.detail.blockId + \":not(.slick-cloned)\"\n        );\n        var slideIndex = $slide.data(\"slick-index\");\n\n        // Go to selected slide\n        $(this.slider, this.wrapper).slick(\"slickGoTo\", slideIndex);\n      },\n\n      checkVisibility: function () {\n        if (theme.isElementVisible(this.$container)) {\n          var curIndex = $(this.slider, this.wrapper).slick(\n            \"slickCurrentSlide\"\n          );\n          var nextIndex = curIndex + 1;\n\n          // Do not auto-scroll forward if 3 or fewer slides on desktop\n          if (slideCount > 3) {\n            setTimeout(\n              function () {\n                $(this.slider, this.wrapper).slick(\"slickGoTo\", nextIndex);\n              }.bind(this),\n              500\n            );\n          }\n\n          $(window).off(this.namespace);\n        }\n      },\n\n      init: function (obj, args) {\n        if (this.sliderActive) {\n          obj.slick(\"unslick\");\n          this.sliderActive = false;\n        }\n\n        obj.slick(args);\n        this.sliderActive = true;\n\n        if (AOS) {\n          AOS.refresh();\n        }\n      },\n\n      a11y: function (event, obj) {\n        var $list = obj.$list;\n        var $wrapper = $(this.wrapper, this.$container);\n\n        // Remove default Slick aria-live attr until slider is focused\n        $list.removeAttr(\"aria-live\");\n\n        // When an element in the slider is focused set aria-live\n        $wrapper.on(\"focusin\", function (evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.attr(\"aria-live\", \"polite\");\n          }\n        });\n\n        // Remove aria-live\n        $wrapper.on(\"focusout\", function (evt) {\n          if ($wrapper.has(evt.target).length) {\n            $list.removeAttr(\"aria-live\");\n          }\n        });\n      },\n    });\n\n    return Testimonials;\n  })();\n\n  theme.NewsletterPopup = (function () {\n    function NewsletterPopup(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = $container.attr(\"data-section-id\");\n      this.cookieName = \"newsletter-\" + sectionId;\n\n      if (!$container.length) {\n        return;\n      }\n\n      // Prevent popup on Shopify robot challenge page\n      if (window.location.pathname === \"/challenge\") {\n        return;\n      }\n\n      this.data = {\n        secondsBeforeShow: $container.data(\"delay-seconds\"),\n        daysBeforeReappear: $container.data(\"delay-days\"),\n        cookie: Cookies.get(this.cookieName),\n        testMode: $container.data(\"test-mode\"),\n      };\n\n      this.modal = new theme.Modals(\n        \"NewsletterPopup-\" + sectionId,\n        \"newsletter-popup-modal\"\n      );\n\n      // Open modal if errors or success message exist\n      if (\n        $container.find(\".errors\").length ||\n        $container.find(\".note--success\").length\n      ) {\n        this.modal.open();\n      }\n\n      // Set cookie as opened if success message\n      if ($container.find(\".note--success\").length) {\n        this.closePopup(true);\n        return;\n      }\n\n      $(\"body\").on(\n        \"modalClose.\" + $container.attr(\"id\"),\n        this.closePopup.bind(this)\n      );\n\n      if (!this.data.cookie || this.data.testMode) {\n        this.initPopupDelay();\n      }\n    }\n\n    NewsletterPopup.prototype = $.extend({}, NewsletterPopup.prototype, {\n      initPopupDelay: function () {\n        setTimeout(\n          function () {\n            this.modal.open();\n          }.bind(this),\n          this.data.secondsBeforeShow * 1000\n        );\n      },\n\n      closePopup: function (success) {\n        // Remove a cookie in case it was set in test mode\n        if (this.data.testMode) {\n          Cookies.remove(this.cookieName, { path: \"/\" });\n          return;\n        }\n\n        var expiry = success ? 200 : this.data.daysBeforeReappear;\n\n        Cookies.set(this.cookieName, \"opened\", { path: \"/\", expires: expiry });\n      },\n\n      onLoad: function () {\n        this.modal.open();\n      },\n\n      onSelect: function () {\n        this.modal.open();\n      },\n\n      onDeselect: function () {\n        this.modal.close();\n      },\n\n      onUnload: function () {},\n    });\n\n    return NewsletterPopup;\n  })();\n\n  theme.FadingImages = (function () {\n    var classes = {\n      activeImage: \"active-image\",\n      finishedImage: \"finished-image\",\n      activeTitles: \"active-titles\",\n      finishedTitles: \"finished-titles\",\n      compensation: \"compensation\",\n    };\n\n    function FadingImages(container) {\n      var $container = (this.$container = $(container));\n      var sectionId = $container.attr(\"data-section-id\");\n      var namespace = (this.namespace = \".fading-images-\" + sectionId);\n\n      if (!$container.length) {\n        return;\n      }\n\n      var $imageContainer = $container.find(\".fading-images\");\n      theme.loadImageSection($imageContainer);\n\n      this.data = {\n        isInit: false,\n        interval: $container.data(\"interval\"),\n        block_count: $container.data(\"count\"),\n        finish_interval: 1000,\n        timer_offset: 400,\n        active_image: 1,\n        active_title: 1,\n        removed_compensation: false,\n      };\n\n      this.selectors = {\n        $allTitles: $container.find(\".fading-images-overlay__titles\"),\n      };\n\n      this.checkVisibility();\n      $(window).on(\n        \"scroll\" + this.namespace,\n        $.throttle(100, this.checkVisibility.bind(this))\n      );\n    }\n\n    FadingImages.prototype = $.extend({}, FadingImages.prototype, {\n      checkVisibility: function () {\n        if (this.data.isInit) {\n          $(window).off(\"scroll\" + this.namespace);\n          return;\n        }\n\n        if (theme.isElementVisible(this.$container)) {\n          this.startImages();\n          this.startTitles();\n          this.data.isInit = true;\n        }\n      },\n\n      nextImage: function () {\n        var $container = this.$container;\n\n        if (!this.data.removed_compensation) {\n          $container\n            .find(\n              \".fading-images__item[data-slide-index=\" +\n                this.data.active_image +\n                \"]\"\n            )\n            .removeClass(classes.compensation);\n          this.data.removed_compensation = true;\n        }\n\n        $container\n          .find(\n            \".fading-images__item[data-slide-index=\" +\n              this.data.active_image +\n              \"]\"\n          )\n          .removeClass(classes.activeImage)\n          .addClass(classes.finishedImage);\n\n        var target_image = this.data.active_image;\n        window.setTimeout(function () {\n          $container\n            .find(\".fading-images__item[data-slide-index=\" + target_image + \"]\")\n            .removeClass(classes.finishedImage);\n        }, this.data.finish_interval);\n\n        this.data.active_image++;\n        if (this.data.active_image > this.data.block_count) {\n          this.data.active_image = 1;\n        }\n\n        $container\n          .find(\n            \".fading-images__item[data-slide-index=\" +\n              this.data.active_image +\n              \"]\"\n          )\n          .addClass(classes.activeImage);\n      },\n\n      nextTitle: function () {\n        var $container = this.$container;\n        var $allTitles = this.selectors.$allTitles;\n\n        this.selectors.$allTitles\n          .removeClass(classes.activeTitles)\n          .addClass(classes.finishedTitles);\n\n        this.data.active_title++;\n        if (this.data.active_title > this.data.block_count) {\n          this.data.active_title = 1;\n        }\n\n        var target_title = this.data.active_title;\n        window.setTimeout(function () {\n          var newText1 = $container\n            .find(\".fading-images__item[data-slide-index=\" + target_title + \"]\")\n            .attr(\"data-slide-title1\");\n          var newText2 = $container\n            .find(\".fading-images__item[data-slide-index=\" + target_title + \"]\")\n            .attr(\"data-slide-title2\");\n          $container.find(\".fading-images-overlay__title--1\").text(newText1);\n          $container.find(\".fading-images-overlay__title--2\").text(newText2);\n          $allTitles\n            .removeClass(classes.finishedTitles)\n            .addClass(classes.activeTitles);\n        }, this.data.finish_interval - 200);\n      },\n\n      startImages: function () {\n        // Prep and show first image\n        this.$container\n          .find(\n            \".fading-images__item[data-slide-index=\" +\n              this.data.active_image +\n              \"]\"\n          )\n          .addClass(classes.activeImage)\n          .addClass(classes.compensation);\n\n        // Begin timer\n        window.setTimeout(\n          function () {\n            var fading_images_timer = window.setInterval(\n              this.nextImage.bind(this),\n              this.data.interval\n            );\n          }.bind(this),\n          this.data.timer_offset\n        );\n      },\n\n      startTitles: function () {\n        var $container = this.$container;\n        var $allTitles = this.selectors.$allTitles;\n        // Prep and show first titles\n        var target_title = this.data.active_title;\n        window.setTimeout(function () {\n          var newText1 = $container\n            .find(\".fading-images__item[data-slide-index=\" + target_title + \"]\")\n            .attr(\"data-slide-title1\");\n          var newText2 = $container\n            .find(\".fading-images__item[data-slide-index=\" + target_title + \"]\")\n            .attr(\"data-slide-title2\");\n          $container.find(\".fading-images-overlay__title--1\").text(newText1);\n          $container.find(\".fading-images-overlay__title--2\").text(newText2);\n          $allTitles.addClass(classes.activeTitles);\n        }, 750);\n\n        // Begin timer\n        var fading_titles_timer = window.setInterval(\n          this.nextTitle.bind(this),\n          this.data.interval\n        );\n      },\n\n      onLoad: function () {},\n\n      onSelect: function () {},\n\n      onDeselect: function () {},\n\n      onUnload: function () {},\n    });\n\n    return FadingImages;\n  })();\n\n  theme.Maps = (function () {\n    var config = {\n      zoom: 14,\n    };\n    var apiStatus = null;\n    var mapsToLoad = [];\n\n    var errors = {\n      addressNoResults: theme.strings.addressNoResults,\n      addressQueryLimit: theme.strings.addressQueryLimit,\n      addressError: theme.strings.addressError,\n      authError: theme.strings.authError,\n    };\n\n    var selectors = {\n      section: '[data-section-type=\"map\"]',\n      map: \"[data-map]\",\n      mapOverlay: \"[data-map-overlay]\",\n    };\n\n    var classes = {\n      mapError: \"map-section--load-error\",\n      errorMsg: \"map-section__error errors text-center\",\n    };\n\n    // Global function called by Google on auth errors.\n    // Show an auto error message on all map instances.\n    window.gm_authFailure = function () {\n      if (!Shopify.designMode) {\n        return;\n      }\n\n      $(selectors.section).addClass(classes.mapError);\n      $(selectors.map).remove();\n      $(selectors.mapOverlay).after(\n        '<div class=\"' +\n          classes.errorMsg +\n          '\">' +\n          theme.strings.authError +\n          \"</div>\"\n      );\n    };\n\n    function Map(container) {\n      this.$container = $(container);\n      this.sectionId = this.$container.attr(\"data-section-id\");\n      this.namespace = \".map-\" + this.sectionId;\n      this.$map = this.$container.find(selectors.map);\n      this.key = this.$map.data(\"api-key\");\n\n      if (!this.key) {\n        return;\n      }\n\n      // Lazyload API\n      this.checkVisibility();\n      $(window).on(\n        \"scroll\" + this.namespace,\n        $.throttle(50, this.checkVisibility.bind(this))\n      );\n    }\n\n    function initAllMaps() {\n      // API has loaded, load all Map instances in queue\n      $.each(mapsToLoad, function (index, instance) {\n        instance.createMap();\n      });\n    }\n\n    function geolocate($map) {\n      var deferred = $.Deferred();\n      var geocoder = new google.maps.Geocoder();\n      var address = $map.data(\"address-setting\");\n\n      geocoder.geocode({ address: address }, function (results, status) {\n        if (status !== google.maps.GeocoderStatus.OK) {\n          deferred.reject(status);\n        }\n\n        deferred.resolve(results);\n      });\n\n      return deferred;\n    }\n\n    Map.prototype = $.extend({}, Map.prototype, {\n      prepMapApi: function () {\n        if (apiStatus === \"loaded\") {\n          this.createMap();\n        } else {\n          mapsToLoad.push(this);\n\n          if (apiStatus !== \"loading\") {\n            apiStatus = \"loading\";\n            if (\n              typeof window.google === \"undefined\" ||\n              typeof window.google.maps === \"undefined\"\n            ) {\n              $.getScript(\n                \"https://maps.googleapis.com/maps/api/js?key=\" + this.key\n              ).then(function () {\n                apiStatus = \"loaded\";\n                initAllMaps();\n              });\n            }\n          }\n        }\n      },\n\n      createMap: function () {\n        var $map = this.$map;\n\n        return geolocate($map)\n          .then(\n            function (results) {\n              var mapOptions = {\n                zoom: config.zoom,\n                backgroundColor: \"none\",\n                center: results[0].geometry.location,\n                draggable: $map.attr(\"data-map-controls\") ? true : false,\n                clickableIcons: $map.attr(\"data-map-controls\") ? true : false,\n                scrollwheel: false,\n                disableDoubleClickZoom: true,\n                disableDefaultUI: true,\n              };\n\n              var map = (this.map = new google.maps.Map($map[0], mapOptions));\n              var center = (this.center = map.getCenter());\n\n              var marker = new google.maps.Marker({\n                map: map,\n                position: map.getCenter(),\n              });\n\n              var addInfoPanel = $map.attr(\"data-map-info-panel\")\n                ? true\n                : false;\n              if (addInfoPanel) {\n                var locationName = $map.attr(\"data-name\");\n                var locationAddress = $map.attr(\"data-address-setting\");\n                var infoWdw = new google.maps.InfoWindow({\n                  content: `<strong>${locationName}</strong><br><span>${locationAddress}</span>`,\n                });\n                marker.addListener(\"click\", function () {\n                  infoWdw.open(map, marker);\n                });\n              }\n\n              google.maps.event.addDomListener(\n                window,\n                \"resize\",\n                $.debounce(250, function () {\n                  google.maps.event.trigger(map, \"resize\");\n                  map.setCenter(center);\n                  $map.removeAttr(\"style\");\n                })\n              );\n            }.bind(this)\n          )\n          .fail(function () {\n            var errorMessage;\n\n            switch (status) {\n              case \"ZERO_RESULTS\":\n                errorMessage = errors.addressNoResults;\n                break;\n              case \"OVER_QUERY_LIMIT\":\n                errorMessage = errors.addressQueryLimit;\n                break;\n              case \"REQUEST_DENIED\":\n                errorMessage = errors.authError;\n                break;\n              default:\n                errorMessage = errors.addressError;\n                break;\n            }\n\n            // Show errors only to merchant in the editor.\n            if (Shopify.designMode) {\n              $map\n                .parent()\n                .addClass(classes.mapError)\n                .html(\n                  '<div class=\"' +\n                    classes.errorMsg +\n                    '\">' +\n                    errorMessage +\n                    \"</div>\"\n                );\n            }\n          });\n      },\n\n      checkVisibility: function () {\n        if (theme.isElementVisible(this.$container, 600)) {\n          this.prepMapApi();\n          $(window).off(this.namespace);\n        }\n      },\n\n      onUnload: function () {\n        if (this.$map.length === 0) {\n          return;\n        }\n        // Causes a harmless JS error when a section without an active map is reloaded\n        google.maps.event.clearListeners(this.map, \"resize\");\n      },\n    });\n\n    return Map;\n  })();\n\n  theme.Blog = (function () {\n    function Blog(container) {\n      this.tagFilters();\n    }\n\n    Blog.prototype = $.extend({}, Blog.prototype, {\n      tagFilters: function () {\n        var $filterBy = $(\"#BlogTagFilter\");\n\n        if (!$filterBy.length) {\n          return;\n        }\n\n        $filterBy.on(\"change\", function () {\n          location.href = $(this).val();\n        });\n      },\n\n      onUnload: function () {},\n    });\n\n    return Blog;\n  })();\n\n  theme.Photoswipe = (function () {\n    var selectors = {\n      trigger: \".js-photoswipe__zoom\",\n      images: \".photoswipe__image\",\n      activeImage: \".slick-active .photoswipe__image\",\n    };\n\n    function Photoswipe(container, sectionId) {\n      this.$container = $(container);\n      this.sectionId = sectionId;\n      this.namespace = \".photoswipe-\" + this.sectionId;\n      this.gallery;\n      this.$images;\n      this.inSlideshow = false;\n\n      if (this.$container.attr(\"data-zoom\") === \"false\") {\n        return;\n      }\n\n      if (this.$container.attr(\"data-has-slideshow\") === \"true\") {\n        this.inSlideshow = true;\n      }\n\n      this.init();\n    }\n\n    Photoswipe.prototype = $.extend({}, Photoswipe.prototype, {\n      init: function () {\n        var $trigger = this.$container.find(selectors.trigger);\n        this.$images = this.$container.find(selectors.images);\n        var items = [];\n\n        // Init gallery on active image\n        $trigger.on(\n          \"click\" + this.namespace,\n          function (evt) {\n            items = this.getImageData();\n            if (this.inSlideshow) {\n              var index = this.$container\n                .find(selectors.activeImage)\n                .data(\"index\");\n            } else {\n              var index = $(evt.currentTarget).data(\"index\");\n            }\n            this.initGallery(items, index);\n          }.bind(this)\n        );\n      },\n\n      getImageData: function () {\n        var haveImages = false;\n        var items = [];\n        var options = {};\n\n        this.$images.each(function () {\n          var haveImages = true;\n          var smallSrc = $(this).prop(\"currentSrc\") || $(this).prop(\"src\");\n          var item = {\n            msrc: smallSrc,\n            src: $(this).data(\"photoswipe-src\"),\n            w: $(this).data(\"photoswipe-width\"),\n            h: $(this).data(\"photoswipe-height\"),\n            el: $(this)[0],\n            initialZoomLevel: 0.5,\n          };\n\n          items.push(item);\n        });\n\n        return items;\n      },\n\n      initGallery: function (items, index) {\n        var pswpElement = document.querySelectorAll(\".pswp\")[0];\n\n        var options = {\n          allowPanToNext: false,\n          captionEl: false,\n          closeOnScroll: false,\n          counterEl: false,\n          history: false,\n          index: index - 1,\n          pinchToClose: false,\n          preloaderEl: false,\n          scaleMode: \"zoom\",\n          shareEl: false,\n          tapToToggleControls: false,\n          getThumbBoundsFn: function (index) {\n            var pageYScroll =\n              window.pageYOffset || document.documentElement.scrollTop;\n            var thumbnail = items[index].el;\n            var rect = thumbnail.getBoundingClientRect();\n            return { x: rect.left, y: rect.top + pageYScroll, w: rect.width };\n          },\n        };\n\n        this.gallery = new PhotoSwipe(\n          pswpElement,\n          PhotoSwipeUI_Default,\n          items,\n          options\n        );\n\n        this.gallery.init();\n        this.gallery.listen(\"afterChange\", this.afterChange.bind(this));\n      },\n\n      afterChange: function () {\n        if (this.inSlideshow) {\n          var $slideshow = $(\"#ProductPhotos-\" + this.sectionId);\n          if ($slideshow.hasClass(\"slick-initialized\")) {\n            var newIndex = this.gallery.getCurrentIndex();\n            $slideshow.slick(\"slickGoTo\", newIndex);\n          }\n        }\n      },\n    });\n\n    return Photoswipe;\n  })();\n\n  window.onYouTubeIframeAPIReady = function () {\n    theme.config.youTubeReady = true;\n    $(\"body\").trigger(\"youTubeReady\");\n  };\n\n  window.loadVimeo = function () {\n    if (theme.config.vimeoLoading) {\n      return;\n    }\n\n    if (!theme.config.vimeoReady) {\n      theme.config.vimeoLoading = true;\n      var tag = document.createElement(\"script\");\n      tag.src = \"https://player.vimeo.com/api/player.js\";\n      var firstScriptTag = document.getElementsByTagName(\"script\")[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n\n      // Because there's no way to check for the Vimeo API being loaded\n      // asynchronously, we use this terrible timeout to wait for it being ready\n      checkIfVimeoIsReady()\n        .then(function () {\n          theme.config.vimeoReady = true;\n          theme.config.vimeoLoading = false;\n          $(\"body\").trigger(\"vimeoReady\");\n        })\n        .fail(function () {\n          // No vimeo API to talk to\n        });\n    }\n  };\n\n  function checkIfVimeoIsReady() {\n    var deferred = $.Deferred();\n    var wait;\n    var timeout;\n\n    wait = setInterval(function () {\n      if (!Vimeo) {\n        return;\n      }\n\n      clearInterval(wait);\n      clearTimeout(timeout);\n      deferred.resolve();\n    }, 500);\n\n    timeout = setTimeout(function () {\n      clearInterval(wait);\n      deferred.reject();\n    }, 4000); // subjective. test up to 8 times over 4 seconds\n\n    return deferred;\n  }\n\n  theme.init = function () {\n    theme.setGlobals();\n    theme.pageTransitions();\n    theme.initExcerpt();\n    theme.initSortables();\n    if (theme.settings.predictiveSearch) {\n      theme.predictiveSearch.init();\n    }\n    theme.videoModal();\n    theme.articleImages.init();\n    theme.customerTemplates.init();\n    theme.collapsibles.init();\n\n    theme.rte.init();\n    theme.tabs.init();\n    theme.popups.init();\n    theme.loginRegister.init();\n    theme.slick.init();\n    theme.ajaxEnhancements.init();\n\n    if ($(\".cart-item__cart-page\").length > 0) {\n      theme.initCartPage();\n    }\n\n    AOS.init({\n      easing: \"ease-out-quad\",\n      once: true,\n      offset: 60,\n      disableMutationObserver: true,\n    });\n\n    $(document.documentElement).on(\"keyup.tab\", function (evt) {\n      if (evt.keyCode === 9) {\n        $(document.documentElement).addClass(\"tab-outline\");\n        $(document.documentElement).off(\"keyup.tab\");\n      }\n    });\n  };\n\n  theme.setGlobals = function () {\n    theme.config.hasSessionStorage = theme.isSessionStorageSupported();\n\n    if ($(\"#userObject\").length > 0) {\n      theme.userObject = JSON.parse($(\"#userObject\").html());\n      if (window.debugMode) {\n        console.dir(theme.userObject);\n      }\n      $(\"#userObject\").remove();\n    }\n\n    if (theme.config.isTouch) {\n      $(\"body\").addClass(\"supports-touch\");\n    }\n\n    enquire.register(theme.config.mediaQuerySmall, {\n      match: function () {\n        theme.config.bpSmall = true;\n        $(\"body\").trigger(\"matchSmall\");\n      },\n      unmatch: function () {\n        theme.config.bpSmall = false;\n        $(\"body\").trigger(\"unmatchSmall\");\n      },\n    });\n  };\n\n  theme.loadImageSection = function ($container) {\n    // Wait until images inside container have lazyloaded class\n    function setAsLoaded() {\n      $container.removeClass(\"loading loading--delayed\").addClass(\"loaded\");\n    }\n\n    function checkForLazyloadedImage() {\n      return $container.find(\".lazyloaded\").length;\n    }\n\n    // If it has SVGs it's in the onboarding state so set as loaded\n    if ($container.find(\"svg\").length) {\n      setAsLoaded();\n      return;\n    }\n\n    if (checkForLazyloadedImage() > 0) {\n      setAsLoaded();\n      return;\n    }\n\n    var interval = setInterval(function () {\n      if (checkForLazyloadedImage() > 0) {\n        clearInterval(interval);\n        setAsLoaded();\n      }\n    }, 80);\n  };\n\n  theme.isSessionStorageSupported = function () {\n    // Return false if we are in an iframe without access to sessionStorage\n    if (window.self !== window.top) {\n      return false;\n    }\n\n    var testKey = \"test\";\n    var storage = window.sessionStorage;\n    try {\n      storage.setItem(testKey, \"1\");\n      storage.removeItem(testKey);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  theme.isElementVisible = function ($el, threshold) {\n    var rect = $el[0].getBoundingClientRect();\n    var windowHeight =\n      window.innerHeight || document.documentElement.clientHeight;\n    threshold = threshold ? threshold : 0;\n\n    return (\n      rect.bottom >= 0 &&\n      rect.right >= 0 &&\n      rect.top <= windowHeight + threshold &&\n      rect.left <= (window.innerWidth || document.documentElement.clientWidth)\n    );\n  };\n\n  theme.pageTransitions = function () {\n    if ($(\"body\").data(\"transitions\") == true) {\n      // Hack test to fix Safari page cache issue.\n      // window.onpageshow doesn't always run when navigating\n      // back to the page, so the unloading class remains, leaving\n      // a white page. Setting a timeout to remove that class when leaving\n      // the page actually finishes running when they come back.\n      if (!!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/)) {\n        $(\"a\").on(\"click\", function () {\n          window.setTimeout(function () {\n            $(\"body\").removeClass(\"unloading\");\n          }, 1200);\n        });\n      }\n\n      // Add disable transition class to malito, anchor, and YouTube links\n      $(\n        'a[href^=\"mailto:\"], a[href^=\"#\"], a[target=\"_blank\"], a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"], a[download]'\n      ).each(function () {\n        $(this).addClass(\"js-no-transition\");\n      });\n\n      $(\"a:not(.js-no-transition)\").bind(\"click\", function (evt) {\n        if (evt.metaKey) return true;\n        evt.preventDefault();\n        $(\"body\").addClass(\"unloading\");\n        var src = $(this).attr(\"href\");\n        window.setTimeout(function () {\n          location.href = src;\n        }, 50);\n      });\n\n      $(\"a.mobile-nav__link\").bind(\"click\", function () {\n        theme.NavDrawer.close();\n      });\n    }\n  };\n\n  theme.reinitProductGridItem = function ($scope) {\n    if (AOS) {\n      AOS.refreshHard();\n    }\n\n    // Refresh reviews app\n    if (window.SPR) {\n      SPR.initDomEls();\n      SPR.loadBadges();\n    }\n\n    // Re-register product templates in quick view modals.\n    // Will not double-register.\n    sections.register(\"product-template\", theme.Product, $scope);\n\n    // Re-hook up collapsible box triggers\n    theme.collapsibles.init();\n  };\n  /**\n   * @param  {string} input_type - Type of the input, e.g. 'text', 'date' etc.\n   * @param  {string} value - Input value to be validated\n   * @param  {boolean} is_required - Boolean to mark if input is required to fill or not.\n   */\n  /**\n   * Validates cart participant form fields and displays accessible error messages\n   * @param {jQuery} $field - The field wrapper element\n   * @param {jQuery} $input - The input element to validate\n   * @param {string} fieldType - Type of field (firstName, lastName, email, etc.)\n   * @param {string} key - Cart key identifier\n   * @param {string} index - Participant index\n   * @returns {boolean} - Returns true if validation passes\n   */\n  theme.validateCartField = function ($field, $input, fieldType, key, index) {\n    const nativeInput = $input && $input[0] ? $input[0] : null;\n    const value = `${nativeInput ? nativeInput.value : ($input.val() ?? \"\")}`.trim();\n    const inputType = $input.attr('type') || 'text';\n    const isRequired = $input.attr('required') !== undefined;\n    const errorElementId = `${fieldType}-error-${key}-${index}`;\n    const errorElement =\n      $field.find(`[data-error-for=\"${fieldType}\"]`).first().length > 0\n        ? $field.find(`[data-error-for=\"${fieldType}\"]`).first()\n        : $field.find(`[id=\"${errorElementId}\"]`).first();\n    const allErrorElements = $field.find(\".error-message\");\n    let errorMessage = '';\n\n    if (window.debugMode) {\n      console.log('[validateCartField]', fieldType, 'value:', value, 'required:', isRequired);\n      console.log('[validateCartField]', 'errorElementId:', errorElementId);\n    }\n\n    // Clear previous error state\n    allErrorElements.addClass('visually-hidden').text('');\n    $input.attr('aria-invalid', 'false');\n    $field.removeClass('field--error');\n    $field.removeClass('field--success');\n\n    // Validation logic\n    if (isRequired && !value) {\n      errorMessage = theme.strings.cartValidation[`required_${fieldType}`] || theme.strings.cartValidation.required_general;\n    } else if (value) {\n      if (fieldType === 'companyid') {\n        const companyIdRegex = /^\\d{7}-\\d$/;\n        if (!companyIdRegex.test(value)) {\n          errorMessage = theme.strings.cartValidation.invalid_companyid || theme.strings.cartValidation.required_companyid;\n        }\n      } else {\n        switch (inputType) {\n          case 'email':\n            const emailRegex = /\\S+@\\S+\\.\\S+/;\n            if (!emailRegex.test(value)) {\n              errorMessage = theme.strings.cartValidation.invalid_email;\n            }\n            break;\n          case 'tel':\n            if (value.length < 6) {\n              errorMessage = theme.strings.cartValidation.required_tel;\n            } else {\n              const telRegex = /^[0-9\\s\\+\\-]+$/;\n              if (!telRegex.test(value)) {\n                errorMessage = theme.strings.cartValidation.required_tel;\n              }\n            }\n            break;\n          case 'date':\n            if (value.length >= 10) {\n              const dateArray = value.replaceAll(\"-\", \".\").replaceAll(\"/\", \".\").split(\".\");\n              const yearNo = dateArray[0];\n              const firstTwo = `${yearNo.substring(0, 2)}`;\n              if (!((firstTwo == \"20\" || firstTwo == \"19\") && yearNo.length == 4)) {\n                errorMessage = theme.strings.cartValidation.required_age;\n              }\n            } else if (isRequired) {\n              errorMessage = theme.strings.cartValidation.required_age;\n            }\n            break;\n          case 'text':\n          default:\n            if (isRequired && value.length < 2) {\n              errorMessage = theme.strings.cartValidation[`required_${fieldType}`] || theme.strings.cartValidation.required_general;\n            }\n            break;\n        }\n      }\n    }\n\n    // Display error if validation failed\n    if (errorMessage) {\n      if (window.debugMode) {\n        console.log('[validateCartField] Error:', errorMessage);\n      }\n      if (errorElement.length > 0) {\n        errorElement.removeClass('visually-hidden').text(errorMessage);\n      }\n      $input.attr('aria-invalid', 'true');\n      $field.addClass('field--error');\n      return false;\n    }\n\n    if (window.debugMode) {\n      console.log('[validateCartField] \u2705 Valid');\n    }\n    if (value) {\n      $field.addClass('field--success');\n    }\n    return true;\n  };\n\n  theme.inputValidationMagic = async function (input_type, value, is_required) {\n    let validation_successful = false;\n    if (window.debugMode) {\n      console.log(\n        \"[inputValidationMagic]\",\n        input_type,\n        \"with value\",\n        value,\n        \"(is required: \" + is_required + \")\"\n      );\n    }\n\n    if (input_type == \"text\" || input_type == \"textarea\") {\n      if (is_required == false) {\n        // Just make it instant validated if it's not required input..\n        validation_successful = true;\n      } else {\n        if (value.length >= 2) {\n          validation_successful = true;\n        }\n      }\n    }\n\n    if (input_type == \"date\") {\n      if (value.length >= 10) {\n        /*\n          Because we are using input type=\"date\" element, the value is in format YYYY-MM-DD\n          However, some browsers might have different format. Prior checking year length we are\n          converting all separating characters to dot (.) instead and then check if year length is max 4.\n          This check is done because otherwise user can input 5 character long years.\n        */\n        const date_array = value\n          .replaceAll(\"-\", \".\")\n          .replaceAll(\"/\", \".\")\n          .split(\".\"); // yyyy,mm,dd\n        const yearNo = date_array[0];\n        const firstTwo = `${yearNo.substring(0, 2)}`;\n\n        if ((firstTwo == \"20\" || firstTwo == \"19\") && yearNo.length == 4) {\n          validation_successful = true;\n        }\n      }\n    }\n    if (input_type == \"tel\") {\n      if (value.length >= 6) {\n        // Finnish numbers are generally 7-12 chars\n        // Found this regex from the internet to test the tel numbers.\n        // src: https://regexlib.com/REDetails.aspx?regexp_id=2801\n        // you can play around with regex here: https://regex101.com/\n        // var finnish_tel_no_format =\n        //   /^((([\\+][\\s]{0,1})|([0]{2}[\\s-]{0,1}))([358]{3})([\\s-]{0,1})|([0]{1}))(([1-9]{1}[0-9]{0,1})([\\s-]{0,1})([0-9]{2,4})([\\s-]{0,1})([0-9]{2,4})([\\s-]{0,1}))([0-9]{0,3}){1}$/;\n        // var is_tel_no =\n        //   value.match(finnish_tel_no_format) != null &&\n        //   value.match(finnish_tel_no_format).length > 0\n        //     ? true\n        //     : false;\n        // validation_successful = is_tel_no;\n        //KK-1905 need to enable foreign phone numbers also\n        var tel_no_format = /^[0-9\\s\\+\\-]+$/;\n        var is_tel_no =\n           value.match(tel_no_format) != null &&\n           value.match(tel_no_format).length > 0\n             ? true\n             : false;\n        validation_successful = is_tel_no;\n      }\n    }\n\n    if (input_type == \"email\") {\n      if (value.length >= 5) {\n        // Found this regex from the internet to test the emails.\n        // src: https://ui.dev/validate-email-address-javascript/\n        // you can play around with regex here: https://regex101.com/\n        var email_format = /\\S+@\\S+\\.\\S+/;\n        var is_email =\n          value.match(email_format) != null &&\n          value.match(email_format).length > 0\n            ? true\n            : false;\n        validation_successful = is_email;\n      }\n    }\n\n    // Checkboxes should pass instantly.\n    if (input_type == \"checkbox\") {\n      validation_successful = true;\n    }\n\n    if (window.debugMode) {\n      if (validation_successful == true) {\n        console.log(\"[inputValidationMagic] \u2705\", input_type);\n      } else {\n        console.log(\"[inputValidationMagic] \u274C\", input_type);\n      }\n    }\n    return validation_successful;\n  };\n\n  /**\n   * Creates an alert div element\n   * based on : https://github.com/lalaman/lala-alerts-js\n   * @param {String} message\n   * @param {String} status; success, error, warning\n   * @param {Integer} timeout\n   * @return {Element} sum\n   */\n  theme.alert = function (message, status = \"error\", timeout = 3500) {\n    //Used to determine whether to remove setTimeout or not\n    let timeout_check;\n\n    const alert = document.createElement(\"div\");\n    alert.className += \"kk-alert \" + status;\n\n    const close_button = document.createElement(\"button\");\n    close_button.innerHTML = \"&times;\";\n\n    /*\n      There are 3 event listeners:\n      1. Clicking x to close alert\n      2. Mousing over to prevent timeout\n      3. Mousing out to start timeout\n    */\n\n    alert.addEventListener(\"click\", function (evt) {\n      const parent = this.parentNode;\n      alert.parentNode.removeChild(alert);\n    });\n\n    alert.addEventListener(\"mouseover\", function () {\n      this.classList.remove(\"fade-out\");\n      clearTimeout(timeout_check);\n    });\n\n    alert.addEventListener(\"mouseout\", function () {\n      timeout_check = setTimeout(function () {\n        alert.className += \" fade-out\";\n        if (alert.parentNode) {\n          timeout_check = setTimeout(function () {\n            alert.parentNode.removeChild(alert);\n          }, 500);\n        }\n      }, 3000);\n    });\n\n    //Add message and close button\n    alert.innerHTML = message;\n    alert.appendChild(close_button);\n\n    //Prepend new alert to container\n    let alert_wrapper = document.getElementById(\"kk-alert-wrapper\");\n    alert_wrapper.insertBefore(alert, alert_wrapper.childNodes[0]);\n\n    //If they haven't clicked close within the timeout period, fade out and remove element\n    timeout_check = setTimeout(function () {\n      const parent = alert;\n      parent.className += \" fade-out\";\n      if (parent.parentNode) {\n        timeout_check = setTimeout(function () {\n          parent.parentNode.removeChild(parent);\n        }, 500);\n      }\n    }, timeout);\n  };\n\n  theme.startReloadingCartPage = async function () {\n    if (!window.top.location.pathname.includes(\"/cart\")) return;\n    theme.utils.cart_is_reloading = true;\n    document.body.classList.add(\"--loading\");\n    document.querySelector(\".body-loader\").setAttribute(\"aria-hidden\", \"false\");\n  };\n\n  theme.reloadCartPage = async function () {\n    if (!window.top.location.pathname.includes(\"/cart\")) return;\n    /*\n    const res = await fetch('/cart?view=ajax');\n    const txt = await res.text();\n    */\n    // Todo better reload?\n    if (theme.utils.cart_is_reloading === true) {\n      window.top.location.reload(true);\n    }\n    theme.utils.cart_is_reloading = false;\n  };\n\n  /**\n   * Updates the participant counts on the cart page to match the total participant amounts for each product variant.\n   *\n   * This addresses an issue when the customer visits checkout and returns to cart where the event participants\n   * have been split into separate line items and they all share the same participant count of 1, e.g.\n   *\n   * Example event:\n   * 1st participant\n   * John Doe\n   * ...\n   *\n   * Example event:\n   * 1st participant <- should be 2nd participant, this function fixes it\n   * Jane Doe\n   * ...\n   */\n  theme.updateParticipantCounts = function () {\n    const participantCards = Array.from(document.querySelectorAll(\"[data-participant-card]\"));\n    const participantCounts = participantCards.reduce((acc, elem) => {\n      const variantId = elem.dataset.key.split(\":\")[0];\n      if (!acc[variantId]) return { ...acc, [variantId]: 0 };\n      return acc;\n    }, {});\n    participantCards.forEach((elem) => {\n      const variantId = elem.dataset.key.split(\":\")[0];\n      const titleElem = elem.querySelector(\"[data-participant-index]\");\n      if (!titleElem) return;\n      participantCounts[variantId] += 1;\n      const participantIndex = participantCounts[variantId];\n      const titleText = titleElem.textContent.trim();\n      titleElem.textContent = `${participantIndex}${titleText.replace(/^\\d+/, \"\")}`;\n    })\n  }\n\n  theme.initCartPage = function () {\n    new theme.CartDrawer();\n    theme.updateParticipantCounts();\n\n    // Reset stuck checkout loading state when cart is initialized.\n    $('button[name=\"checkout\"]').removeClass(\"btn--loading\").data(\"kkProcessing\", false);\n\n    // We init each of the accordions\n    const selectors = {\n      accordion: \".cart__item--accordion\",\n      next: \"[data-next-step]\",\n      edit: \"[data-edit-step]\",\n      remove: \"[data-remove-step]\",\n      fillSelf: \"[data-fill-self]\",\n      form: \".cart__item--accordion-form\",\n      cartForm: \"form.cart\",\n      add_to_cart: 'button[name=\"checkout\"]',\n      add_to_cart_wrapper: \".cart__checkout-wrapper\",\n      terms: \".ajaxcart__note--terms\",\n    };\n\n    $(document).on(\"cart:updated\", function (evt) {\n      if (evt.detail?.skipLoader) {\n        theme.startReloadingCartPage();\n      }\n      theme.reloadCartPage();\n    });\n\n    const any_accordion = $(selectors.accordion);\n    const any_next = any_accordion.find(selectors.next);\n    const any_edit = any_accordion.find(selectors.edit);\n    const any_remove = any_accordion.find(selectors.remove);\n    const any_fill_self = any_accordion.find(selectors.fillSelf);\n    const any_input = any_accordion.find(selectors.form).find(\"input,textarea\");\n    let checkout_allowed = false;\n    let loaded_values_from_cache = false;\n\n    function extractInputContext(input) {\n      const accordion = input.closest(selectors.accordion);\n      const fieldType = input.attr(\"data-field-key\") || null;\n      const key = accordion.attr(\"data-key\");\n      const index = accordion.attr(\"data-index\");\n      if (!fieldType || !key || !index) return null;\n\n      return {\n        key,\n        index,\n        fieldType,\n      };\n    }\n\n    // Browsers may autofill without firing input events; sync touched state before submit/next validation.\n    function syncTouchedStateFromValues(scope) {\n      const forms = scope.find(selectors.form);\n      forms.each(function () {\n        const form = $(this);\n        let formIsTouched = true;\n        const requiredInputs = form.find(\n          \"input[required], textarea[required], select[required]\"\n        );\n\n        requiredInputs.each(function () {\n          const input = $(this);\n          const value = `${this.value ?? input.val() ?? \"\"}`.trim();\n          const label = input.closest(\"label\");\n          const field = input.closest(\".field\");\n          const context = extractInputContext(input);\n          let isValid = value.length > 0;\n\n          if (isValid && context?.fieldType) {\n            isValid = theme.validateCartField(\n              field,\n              input,\n              context.fieldType,\n              context.key,\n              context.index\n            );\n          }\n\n          if (isValid) {\n            label.attr(\"data-touched\", true);\n            field.removeClass(\"field--error\");\n          } else {\n            label.attr(\"data-touched\", false);\n            formIsTouched = false;\n          }\n        });\n\n        // Also normalize optional mapped fields to clear stale error styles/states.\n        const optionalMappedInputs = form.find(\n          \"input[data-field-key]:not([required]), textarea[data-field-key]:not([required]), select[data-field-key]:not([required])\"\n        );\n        optionalMappedInputs.each(function () {\n          const input = $(this);\n          const field = input.closest(\".field\");\n          const context = extractInputContext(input);\n          const value = `${this.value ?? input.val() ?? \"\"}`.trim();\n          const needsRefresh =\n            value.length > 0 ||\n            field.hasClass(\"field--error\") ||\n            input.attr(\"aria-invalid\") === \"true\";\n\n          if (context?.fieldType && needsRefresh) {\n            theme.validateCartField(\n              field,\n              input,\n              context.fieldType,\n              context.key,\n              context.index\n            );\n          }\n        });\n\n        form.attr(\"data-touched\", formIsTouched ? \"true\" : \"false\");\n      });\n    }\n\n    function getUntouchedRequiredInputs(scope) {\n      return scope\n        .find('label[data-touched=\"false\"] > [required]')\n        .filter(function () {\n          const input = $(this);\n          const value = `${this.value ?? input.val() ?? \"\"}`.trim();\n          const fieldHasError = input.closest(\".field\").hasClass(\"field--error\");\n          const isAriaInvalid = input.attr(\"aria-invalid\") === \"true\";\n          return value.length === 0 || fieldHasError || isAriaInvalid;\n        });\n    }\n\n    async function settleAutofillState(scope) {\n      const activeElement = document.activeElement;\n      if (activeElement && scope.find(activeElement).length > 0 && typeof activeElement.blur === \"function\") {\n        activeElement.blur();\n      }\n\n      // Browser autofill can commit sibling fields after click/blur events; wait one short tick before validating.\n      await new Promise((resolve) => setTimeout(resolve, 80));\n      syncTouchedStateFromValues(scope);\n    }\n\n    function loadCustomSortedProps() {\n      // Custom sort visible properties of cart.\n      const sort_order = [\n        \"{{ 'cart.form.organization' | t }}\",\n        \"{{ 'cart.form.first_name' | t }}\",\n        \"{{ 'cart.form.last_name' | t }}\",\n        \"{{ 'cart.form.title' | t }}\",\n        \"{{ 'cart.form.email' | t }}\",\n        \"{{ 'cart.form.tel' | t }}\",\n        \"{{ 'cart.form.other' | t }}\",\n        \"{{ 'cart.form.allergen' | t }}\",\n        \"{{ 'cart.form.age' | t }}\",\n        \"{{ 'cart.form.room' | t }}\",\n      ];\n\n      const cart_items = document.querySelectorAll(\n        \"tr.product[data-product-id]\"\n      );\n      cart_items.forEach(function (item) {\n        const description_HTML = item.querySelector(\".product__description\");\n        const properties = item.querySelectorAll(\n          \".product__description__property\"\n        );\n        const variation = item.querySelector(\".product__description__variant\");\n\n        const sorted_properties_HTML = [].slice\n          .call(properties)\n          .sort(function (a, b) {\n            return (\n              sort_order.indexOf(a.textContent.trim().split(\":\")[0]) -\n              sort_order.indexOf(b.textContent.trim().split(\":\")[0])\n            );\n          });\n\n        // remove the un-ordered props\n        properties.forEach(function (prop) {\n          prop.remove();\n        });\n        variation.remove();\n\n        // append the ordered props\n        sorted_properties_HTML.forEach(function (prop) {\n          description_HTML.appendChild(prop);\n        });\n      });\n    }\n\n    const sanitizeInput = function (value, input_type) {\n      let _value = value;\n      if (input_type == \"tel\" || input_type == \"email\") {\n        _value = value.replace(/\\s{1,}/g, \"\").replace(/<\\/?[^>]+(>|$)/g, \"\"); // all spaces and html tags\n      } else {\n        _value = value.replace(/\\s{2,}/g, \" \").replace(/<\\/?[^>]+(>|$)/g, \"\"); // double spaces and html tags\n      }\n      return _value.trimStart(); // remove empty spaces from start of string.\n    };\n\n    /**\n     * @returns {object} Returns key-value mapped cache with current cart page structure.\n     */\n    const buildCacheSchema = function () {\n      let _cache = {};\n      for (const input of any_input) {\n        const cacheKey = input.id;\n        const cacheInputType = input.getAttribute(\"type\");\n        if (cacheInputType !== \"checkbox\") {\n          const cacheValue = input.value;\n          _cache[cacheKey] = cacheValue;\n        } else {\n          const cacheValue = `${input.checked}`;\n          _cache[cacheKey] = cacheValue;\n        }\n      }\n      return _cache;\n    };\n\n    const initValuesFromCache = async function () {\n      const hasCache = sessionStorage.getItem(cache_key);\n      if (hasCache) {\n        const cacheItems = JSON.parse(hasCache);\n        for (const [key, value] of Object.entries(cacheItems)) {\n          const cacheHtmlInput = document.getElementById(key);\n          if (!cacheHtmlInput) continue;\n          const cacheHtmlField = cacheHtmlInput.closest(\".field\");\n          if (cacheHtmlInput && value != \"\" && value.length > 1) {\n            const input_type = cacheHtmlInput.getAttribute(\"type\");\n            const input_required = cacheHtmlInput.hasAttribute(\"required\");\n\n            if (input_type === \"checkbox\") {\n              // console.log('CHECKBOX ==>', value);\n              cacheHtmlInput.checked = value === \"true\" ? true : false;\n              continue;\n            }\n\n            const _value = sanitizeInput(value, input_type);\n            cacheHtmlInput.value = _value;\n\n            const updates = [];\n            updates[key] = _value;\n            updateCacheItems(updates);\n\n            const input_validation = await theme.inputValidationMagic(\n              input_type,\n              _value,\n              input_required\n            );\n\n            if (input_validation == false) {\n              cacheHtmlField.classList.add(\"field--error\");\n              continue;\n            }\n\n            cacheHtmlField.classList.add(\"field--success\");\n            cacheHtmlField.classList.add(\"field--show-floating-label\");\n\n            const this_label = cacheHtmlInput.closest(\"label\");\n            this_label?.setAttribute(\"data-touched\", true);\n\n            const this_form = cacheHtmlInput.closest(selectors.form);\n            const untouched_labels = getUntouchedRequiredInputs($(this_form));\n\n            loaded_values_from_cache = true;\n            if (window.debugMode) {\n              console.log(\"loaded_values_from_cache\");\n            }\n\n            // When all inputs are filled\n            if (untouched_labels.length == 0) {\n              const $this_accordion = $(this_form).closest(selectors.accordion);\n              const $this_accordion_next = $this_accordion.find(selectors.next);\n\n              $this_accordion_next.removeAttr(\"disabled\");\n              this_form.setAttribute(\"data-touched\", true);\n            }\n          }\n        }\n      }\n    };\n\n    /**\n     * @param {string[]} keys - Array of cache keys to delete. If nothing provided, only update sessionStorage with fresh values.\n     * @returns {object} Returns the updated 'cache' object and sets sessionStorage value '_kk_func_cart_cache'.\n     */\n    const deleteCacheItems = function (keys) {\n      const cache = JSON.parse(sessionStorage.getItem(cache_key));\n      if (!cache) return;\n      let oldIndex;\n      let newIndex = 0;\n\n      const newCache = Object.entries(cache).reduce((acc, [key, value]) => {\n        if (keys.includes(key)) return acc; // Do not include properties for removed participant in the new cache\n        const [prefix, lineItemKey, participantIndex, fieldName] = key.split('-');\n        if (participantIndex !== oldIndex) ++newIndex; // Participant changed, increment index\n        oldIndex = participantIndex; // Keep track of what the participant index was for the next iteration\n        const newKey = [prefix, lineItemKey, newIndex, fieldName].join('-');\n        return { ...acc, [newKey]: value};\n      }, {})\n\n      sessionStorage.setItem(cache_key, JSON.stringify(newCache));\n      return newCache;\n    };\n\n    /**\n     * @param {object=} cacheItems - Object of cache items to overwrite. If nothing provided, only update sessionStorage with fresh values.\n     * @returns {object} Returns the updated 'cache' object and sets sessionStorage value '_kk_func_cart_cache'.\n     */\n    const updateCacheItems = function (cacheItems) {\n      if (cacheItems) {\n        for (const [key, value] of Object.entries(cacheItems)) {\n          cache[key] = `${value}`;\n          // console.log('cache', key, 'set to', value);\n        }\n      }\n\n      sessionStorage.setItem(cache_key, JSON.stringify(cache));\n      // console.log('cache updated to', cache);\n      return cache;\n    };\n\n    const cache = buildCacheSchema();\n    const cache_key = \"_kk_func_cart_cache\";\n    initValuesFromCache();\n    loadCustomSortedProps();\n\n    // this fixes nasty cart page bug where pressing enter resets the form\n    $(selectors.cartForm).on(\"submit\", function (evt) {\n      evt.preventDefault();\n    });\n\n    function setCheckoutAllowed(allowed = false) {\n      if (allowed === true) {\n        checkout_allowed = true;\n\n        const scrollTarget = $(\".cart__footer\");\n        theme.utils.smoothScrollTo(scrollTarget);\n\n        /*\n          Focus on terms checkbox unless it's checked. If it's already checked, focus \"Continue\" button instead.\n          This aims to improve accessibility and make checking out faster for keyboard navigators.\n        */\n        const $termsCheckbox = $(selectors.terms).find(\n          'input[type=\"checkbox\"]'\n        );\n        if ($termsCheckbox.is(\":checked\") === false) {\n          $termsCheckbox.focus();\n        } else {\n          $(selectors.add_to_cart).focus();\n        }\n      } else {\n        checkout_allowed = false;\n      }\n\n      return checkout_allowed;\n    }\n\n    // Handle \"Next/Seuraava\" button clicks\n    any_next.on(\"click\", async function (evt) {\n      evt.preventDefault();\n      var this_accordion = $(this).closest(selectors.accordion);\n      await settleAutofillState(this_accordion);\n      var untouched_forms = $(selectors.accordion).find(\n        selectors.form + '[data-touched=\"false\"]'\n      );\n\n      // Validate all fields in this accordion using new accessible validation\n      const accordionKey = this_accordion.attr(\"data-key\");\n      const accordionIndex = this_accordion.attr(\"data-index\");\n      let hasValidationErrors = false;\n      let firstErrorField = null;\n\n      // Find all required inputs in this accordion\n      const requiredInputs = this_accordion.find('input[required], textarea[required], select[required]');\n\n      requiredInputs.each(function() {\n        const input = $(this);\n        const field = input.closest('.field');\n\n        const context = extractInputContext(input);\n        if (context?.fieldType) {\n          const validationResult = theme.validateCartField(\n            field,\n            input,\n            context.fieldType,\n            context.key,\n            context.index\n          );\n          if (!validationResult) {\n            hasValidationErrors = true;\n            if (!firstErrorField) {\n              firstErrorField = input;\n            }\n          }\n        }\n      });\n\n      // Check if form is properly filled (fallback to original logic)\n      const this_accordion_untouched_required = getUntouchedRequiredInputs(this_accordion);\n      if (\n        this_accordion.find(selectors.form).attr(\"data-touched\") != \"true\" ||\n        this_accordion.find(\".field--error\").length > 0 ||\n        hasValidationErrors ||\n        this_accordion_untouched_required.length > 0\n      ) {\n        // Mark untouched labels for visual feedback\n        this_accordion_untouched_required\n          .each(function (index, label) {\n            $(label).closest(\".field\").addClass(\"field--error\");\n          });\n\n        // Focus on first error field for accessibility\n        if (firstErrorField) {\n          firstErrorField.focus();\n        }\n\n        theme.alert(theme.strings.checkFormInputs);\n        return;\n      }\n\n      // Update name of the particpant in place of \"1st participant\" text\n      var index_of_accordion = this_accordion.attr(\"data-index\");\n      var name_holder = this_accordion.find(\".participant-name\");\n      var first_name = this_accordion\n        .find('input[data-field-key=\"firstName\"]')\n        .val();\n      var last_name = this_accordion\n        .find('input[data-field-key=\"lastName\"]')\n        .val();\n      name_holder.text(`${index_of_accordion}. ${first_name} ${last_name}`);\n\n      /*\n        If user filled all forms but returns to edit one form, and clicks \"Next\", it does not take to\n        next accordion/item but instead just shows the checkout buttons.\n      */\n      if (untouched_forms.length == 0) {\n        setCheckoutAllowed(true);\n        return;\n      }\n\n      // Try open next accordion of same item\n      var next_accordion = this_accordion.next(selectors.accordion);\n      if (next_accordion.length > 0) {\n        next_accordion.addClass(\"open\");\n        return;\n      }\n\n      // Try to open next item's first accordion\n      var next_item = this_accordion.closest(\".cart__item\").next(\".cart__item\");\n      if (next_item.length > 0) {\n        next_item.find(selectors.accordion).first().addClass(\"open\");\n        return;\n      }\n\n      // All product participant forms are filled, let's go!\n      var untouched_forms = $(selectors.accordion).find(\n        selectors.form + '[data-touched=\"false\"]'\n      );\n      if (untouched_forms.length > 0) {\n        getUntouchedRequiredInputs(untouched_forms)\n          .each(function (index, label) {\n            $(label).closest(\".field\").addClass(\"field--error\");\n          });\n        theme.alert(theme.strings.checkFormInputs);\n        return;\n      }\n\n      setCheckoutAllowed(true);\n    });\n\n    // Handle removing of single participant\n    any_remove.on(\"click\", function (evt) {\n      evt.preventDefault();\n      const step_item_id = $(this).attr(\"data-remove-step\");\n      const services_identifier = $(this).attr(\"data-services-identifier\");\n      const accordion_parent = $(this).closest(selectors.accordion);\n      const this_key = accordion_parent.attr(\"data-key\");\n      const cart_parent = $('.cart-item[data-key=\"' + this_key + '\"]');\n      const cart_item_quantity = parseInt(cart_parent.attr(\"data-quantity\")) - 1;\n      const update = {};\n      update[step_item_id] = cart_item_quantity;\n\n      // Collect all input ids of the removed participant\n      const inputIds = accordion_parent.find('.field__input').map(function () { return this.id; }).get();\n      // Delete removed participant's fields from session storage\n      deleteCacheItems(inputIds);\n\n      // also clear service products linked\n      const this_services = $('[data-parent=\"' + services_identifier + '\"]');\n      if (this_services.length > 0) {\n        this_services.each(function (index, el) {\n          const service_item_id = $(el).val();\n          update[service_item_id] = cart_item_quantity;\n        });\n      }\n\n      $.post(\"/cart/update.js\", {\n        updates: update,\n        dataType: \"json\",\n      }).done(function (res) {\n        const cart_data = res;\n        theme.startReloadingCartPage();\n        document.dispatchEvent(\n          new CustomEvent(\"cart:updated\", {\n            detail: {\n              cart: cart_data,\n              skipLoader: true,\n            },\n          })\n        );\n      });\n    });\n\n    // Open accordion for editing\n    any_edit.on(\"click\", function (evt) {\n      evt.preventDefault();\n      var this_accordion = $(this).closest(selectors.accordion);\n      any_accordion.removeClass(\"open\");\n      this_accordion.addClass(\"open\");\n\n      setCheckoutAllowed(false);\n    });\n\n    // Fill own details toggle for logged in Customers\n    any_fill_self.on(\"change\", function (evt) {\n      evt.preventDefault();\n      if (!theme.userObject.myyntikanava) handleFillSelfCheckbox(evt.currentTarget);\n    });\n\n    function handleFillSelfCheckbox(any_fill_self) {\n      if ($(any_fill_self).is(\":checked\")) {\n        const this_accordion = $(any_fill_self).closest(selectors.accordion);\n        const userProps = Object.keys(theme.userObject.properties);\n        userProps.forEach(function (key) {\n          const value = theme.userObject.properties[key];\n          const targetInput = this_accordion.find(`input[name=\"${key}\"]`);\n          if (value !== \"\" && targetInput) {\n            targetInput.val(value);\n            targetInput\n              .closest(\".field\")\n              .addClass(\"field--show-floating-label\");\n            targetInput.closest(\"label\").attr(\"data-touched\", true);\n            targetInput.trigger(\"input\");\n          }\n        });\n        theme.alert(theme.strings.selfFilled, \"success\", 7500);\n      } else {\n        const this_accordion = $(any_fill_self).closest(selectors.accordion);\n        const userProps = Object.keys(theme.userObject.properties);\n        userProps.forEach(function (key) {\n          const value = \"\";\n          const targetInput = this_accordion.find(`input[name=\"${key}\"]`);\n          targetInput.val(value);\n          const field = targetInput.closest(\".field\");\n          field.removeClass(\"field--show-floating-label\");\n          field.removeClass(\"field--error\");\n          field.removeClass(\"field--success\");\n          targetInput.attr(\"aria-invalid\", \"false\");\n          targetInput.closest(\"label\").attr(\"data-touched\", false);\n          \n          // Clear any error messages\n          const inputId = targetInput.attr(\"id\");\n          if (inputId) {\n            const errorElement = field.find(`[id*=\"${inputId.split('-').slice(-1)[0]}-error\"]`);\n            errorElement.addClass('visually-hidden').text('');\n          }\n        });\n        \n        // Reset form touched state\n        const this_form = this_accordion.find(selectors.form);\n        this_form.attr(\"data-touched\", false);\n      }\n    }\n\n    if (\n      window.theme.items_with_participants === 1 &&\n      theme.userObject.viewAsCustomer === true &&\n      theme.userObject.myyntikanava === false &&\n      loaded_values_from_cache === false\n    ) {\n      any_fill_self.prop(\"checked\", true);\n      handleFillSelfCheckbox(any_fill_self);\n      if (window.debugMode) {\n        console.log(\"values not already loaded from cache, bring own details\");\n      }\n    }\n\n    // Handle input changes\n    any_input.on(\n      \"blur input paste change\",\n      $.throttle(250, async function (evt) {\n        const input = $(this);\n        const field = input.closest(\".field\");\n        const input_type = input.attr(\"type\");\n\n        // Some browsers commit autofill values slightly after blur/change; defer one tick to avoid stale validation.\n        if (evt?.type === \"blur\" || evt?.type === \"change\") {\n          await new Promise((resolve) => setTimeout(resolve, 40));\n        }\n\n        const rawValue = `${this.value ?? input.val() ?? \"\"}`;\n        const _value = sanitizeInput(rawValue, input_type);\n        input.val(_value);\n\n        const input_value = `${this.value ?? input.val() ?? \"\"}`;\n        const this_label = input.closest(\"label\");\n        const this_form = input.closest(selectors.form);\n\n        const updates = [];\n        updates[input.attr(\"id\")] =\n          input_type != \"checkbox\" ? input_value : input.is(\":checked\");\n        updateCacheItems(updates);\n\n        // Prefer machine-readable data-field-key with fallback to legacy id parsing.\n        const context = extractInputContext(input);\n        if (context?.fieldType) {\n          const validationResult = theme.validateCartField(\n            field,\n            input,\n            context.fieldType,\n            context.key,\n            context.index\n          );\n\n          if (validationResult) {\n            // Mark input as touched if validation passes\n            this_label.attr(\"data-touched\", true);\n          } else {\n            // Mark as not touched if validation fails\n            this_label.attr(\"data-touched\", false);\n            this_form.attr(\"data-touched\", false);\n            return;\n          }\n        } else {\n          // Fallback for fields that don't match expected pattern\n          const input_required = input.attr(\"required\") ? true : false;\n          if (input_value.length < 1) {\n            if (input_required === true) {\n              this_label.attr(\"data-touched\", false);\n              this_form.attr(\"data-touched\", false);\n            }\n            field.removeClass(\"field--error\").removeClass(\"field--success\");\n            return;\n          }\n\n          const input_validation = await theme.inputValidationMagic(\n            input_type,\n            input_value,\n            input_required\n          );\n\n          if (input_validation == false) {\n            field.addClass(\"field--error\");\n            if (input_required === true) {\n              this_label.attr(\"data-touched\", false);\n              this_form.attr(\"data-touched\", false);\n            }\n            return;\n          }\n\n          field.removeClass(\"field-error\").addClass(\"field--success\");\n          this_label.attr(\"data-touched\", true);\n        }\n\n        if (window.debugMode) {\n          console.log(\"[any_input change] we mark it touched\");\n        }\n\n        const untouched_labels = getUntouchedRequiredInputs(this_form);\n\n        // When all inputs are filled\n        if (untouched_labels.length == 0) {\n          const this_accordion = this_form.closest(selectors.accordion);\n          const this_accordion_next = this_accordion.find(selectors.next);\n          this_accordion_next.removeAttr(\"disabled\");\n          //this_accordion.find(selectors.form)\n          this_form.attr(\"data-touched\", true);\n        }\n      })\n    );\n\n    any_input.on(\"focus\", function () {\n      const input = $(this);\n      const field = input.closest(\".field\");\n      input.attr(\"aria-invalid\", \"false\");\n      field.removeClass(\"field--error\");\n      field.find(\".error-message\").addClass(\"visually-hidden\").text(\"\");\n    });\n\n    // Hide terms & cart button by default\n    const untouched_labels = getUntouchedRequiredInputs($(document));\n\n    // When all inputs are filled\n    if (untouched_labels.length > 0) {\n      setCheckoutAllowed(false);\n    } else {\n      $(selectors.form).attr(\"data-touched\", true);\n    }\n\n    // Handle cart click\n    // Additional context: Handle input validation and splitting participants and service products to separate line items before navigating to checkout.\n    $(selectors.add_to_cart).on(\"click\", async function (evt) {\n      evt.preventDefault();\n      const checkoutBtn = $(this);\n      if (checkoutBtn.data(\"kkProcessing\") === true) {\n        return;\n      }\n      checkoutBtn.data(\"kkProcessing\", true);\n\n      await settleAutofillState($(document));\n\n      // Run comprehensive validation using new accessible validation\n      let hasValidationErrors = false;\n      let firstErrorInput = null;\n\n      // Find all participant forms and validate them\n      const allForms = $(selectors.form);\n\n      allForms.each(function() {\n        const form = $(this);\n        const requiredInputs = form.find('input[required], textarea[required], select[required]');\n\n        requiredInputs.each(function() {\n          const input = $(this);\n          const field = input.closest('.field');\n\n          const context = extractInputContext(input);\n          if (context?.fieldType) {\n            const validationResult = theme.validateCartField(\n              field,\n              input,\n              context.fieldType,\n              context.key,\n              context.index\n            );\n            if (!validationResult) {\n              hasValidationErrors = true;\n              if (!firstErrorInput) {\n                firstErrorInput = input;\n              }\n            }\n          }\n        });\n      });\n\n      // Double check that nothing is blank (fallback validation).\n      const required_inputs = $(\"label > [required]\");\n      const untouched_labels = getUntouchedRequiredInputs($(document));\n      const error_fields = $(\".field.field--error\");\n      const blank_inputs = [];\n\n      required_inputs.each(function () {\n        const $input = $(this);\n        const trimmedVal = `${this.value ?? $input.val() ?? \"\"}`.trim();\n        if (trimmedVal.length === 0 || trimmedVal === \"\") {\n          blank_inputs.push($input);\n        }\n      });\n\n      const invalid_inputs = [\n        ...new Set([...blank_inputs, ...untouched_labels, ...error_fields]),\n      ];\n\n      if (window.debugMode) {\n        console.log(\"hasValidationErrors\", hasValidationErrors);\n        console.log(\"invalid_inputs\", invalid_inputs);\n        console.log(\"untouched_labels.length\", untouched_labels.length);\n        console.log(\"invalid_inputs.length\", invalid_inputs.length);\n      }\n\n      if (untouched_labels.length > 0 || invalid_inputs.length > 0 || hasValidationErrors) {\n        if (window.debugMode) {\n          console.log(\"trigger 1 - validation errors found\");\n        }\n        // This is triggered if one or more required inputs is invalid.\n        $(this).removeClass(\"btn--loading\");\n        checkoutBtn.data(\"kkProcessing\", false);\n\n        for (const input of invalid_inputs) {\n          $(input).closest(\".field\").addClass(\"field--error\");\n        }\n\n        // Prioritize first error input from new validation, then fallback to old validation\n        const $firstMissingInput = firstErrorInput ? $(firstErrorInput) : $(invalid_inputs[0]);\n        $firstMissingInput.focus();\n\n        const scrollTarget = $firstMissingInput.closest(selectors.accordion);\n        theme.utils.smoothScrollTo(scrollTarget, function () {\n          theme.alert(theme.strings.cartMissingFields);\n        });\n\n        return false;\n      }\n      if (\n        $(\"#CartPageAgree\").length > 0 &&\n        $(\"#CartPageAgree\").is(\":checked\") == false &&\n        theme.userObject.myyntikanava == false\n      ) {\n        if (window.debugMode) {\n          console.log(\"trigger 2\");\n        }\n        // This gets triggered if terms checkbox is not checked.\n        $(this).removeClass(\"btn--loading\");\n        checkoutBtn.data(\"kkProcessing\", false);\n\n        // Show error message using the same pattern as other field validations\n        const $checkbox = $(\"#CartPageAgree\");\n        const $errorElement = $(\"#CartPageAgree-error\");\n        const errorMessage = theme.strings.cartTermsConfirmation;\n\n        // Add error class and show error message\n        $checkbox.addClass(\"field__input--error\");\n        $checkbox.attr(\"aria-invalid\", \"true\");\n        $errorElement.text(errorMessage).show();\n\n        // Focus the checkbox and scroll to it\n        $checkbox.focus();\n        const scrollTarget = $(\".cart__footer\");\n        theme.utils.smoothScrollTo(scrollTarget);\n\n        return false;\n      }\n      if ($(\"#CartPageAgree:checked\").length > 0 | theme.userObject.myyntikanava == true) {\n        var serialized_form = {};\n        // Go through cart forms on different products\n        var all_forms = $(selectors.form);\n        all_forms.each(function (index, form) {\n          var form = $(form);\n          var form_id = form.attr(\"data-row-id\");\n          var inputs = form.find(\"input,textarea\");\n          var items = { services: [] };\n\n          // Single input of a form\n          inputs.each(function (indx, input) {\n            var input = $(input);\n            var input_type = input.attr(\"data-type\");\n            var name = input.attr(\"name\");\n            var value = input.val();\n\n            if (input_type != \"service\") {\n              items[name] = value.replace(\n                /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n                \"\"\n              );\n            } else if (input_type == \"service\" && input.is(\":checked\")) {\n              // service products have vat_percent and vat_multiplier amount set as data attributes.\n              // these are used to display vat amount and percentage in minicart.\n              items[\"services\"].push({\n                name: name,\n                vat_percent: input.attr(\"data-vat-percent\"),\n                vat_multiplier: input.attr(\"data-vat-multiplier\"),\n              });\n            }\n          });\n\n          if (!serialized_form[form_id]) {\n            serialized_form[form_id] = [];\n          }\n          serialized_form[form_id].push(items);\n        });\n\n        var cart_items = [];\n        var cart_backup = [];\n\n        $.getJSON(\"/cart\", function (data) {\n          cart_backup = data.items;\n          var visitedAttendees = [];\n\n          cart_backup.forEach(function (line_item) {\n            var item_id = line_item.id;\n\n            if (serialized_form[item_id]) {\n              var participants = serialized_form[item_id];\n              participants.forEach(function (attendee, index) {\n                if (window.debugMode) {\n                  console.log(\"[addToCart] attendee\", attendee);\n                }\n                if (\n                  visitedAttendees.includes(\n                    attendee[\"S\u00E4hk\u00F6posti\"] + line_item.id + \"|\" + index\n                  )\n                ) {\n                  return;\n                }\n                visitedAttendees.push(\n                  attendee[\"S\u00E4hk\u00F6posti\"] + line_item.id + \"|\" + index\n                );\n                var service_items = participants[index].services;\n                delete participants[index].services;\n                var participant = participants[index];\n                var serviceProducts = [];\n\n                if (window.debugMode) {\n                  console.log(\"[addToCart] participant\"), participant;\n                }\n\n                var cart_item = {\n                  id: line_item.id,\n                  quantity: 1,\n                  properties: {\n                    ...line_item.properties, // Merge existing and new properties\n                    ...participant,\n                    _index: index, // Index is only being used to ease free product flow. Theme developers don't really need to worry about it; it's used in EMS only\n                  },\n                };\n\n                // generate service line item props\n                if (service_items && service_items.length > 0) {\n                  service_items.forEach(function (service, indx) {\n                    var service_item = {\n                      id: parseInt(service.name), // it comes as string by default.\n                      quantity: 1,\n                      properties: {\n                        ...participant,\n                        _parent_id: `${line_item.id}:${index}`,\n                        _vat_percent: service.vat_percent,\n                        _vat_multiplier: service.vat_multiplier,\n                        _participants_form_supertype: line_item.properties[\"_participants_form_supertype\"],\n                      },\n                    };\n                    cart_items.push(service_item);\n                    serviceProducts.push(service.name);\n                  });\n                }\n\n                if (serviceProducts.length > 0) {\n                  cart_item.properties[\"_service_products_in_cart\"] = serviceProducts.join(\",\");\n                } else if (cart_item.properties[\"_service_products_in_cart\"]) {\n                  // If participant had service product(s) in cart and they were removed, we need to remove the prop to stop the checkbox from toggling back on when returning to cart.\n                  delete cart_item.properties[\"_service_products_in_cart\"];\n                }\n\n                /*\n                  Service products that are added to a single participant is found within \"_service_products_in_cart\" line item prop. These are ids.\n                  This is used to toggle the checkbox on/off when returning to cart from checkout.\n\n                  Likewise, each service product that is added to participant has a \"_parent_id\" line item prop that indicates which line item key it is tied to.\n                  If line item has this, we skip adding of it when checkout button is clicked to avoid duplicates.\n                */\n\n                cart_items.push(cart_item);\n                if (window.debugMode) {\n                  console.log(\"[addToCart] added_item\", index, cart_item);\n                }\n              });\n            } else {\n              var cart_item = {\n                id: line_item.id,\n                quantity: line_item.quantity,\n                properties: line_item.properties,\n              };\n\n              if (!cart_item.properties[\"_parent_id\"]) {\n                cart_items.push(cart_item);\n              }\n            }\n          });\n\n          if (window.debugMode) {\n            console.log(\"[addToCart] cart_items\", cart_items);\n          }\n\n          // Need to first clear cart, then add everything again.\n          $.post(\"/cart/clear.js\", function (res) {\n            // Update with new properties, then go to checkout\n            $.post(\n              \"/cart/add.js\",\n              { items: cart_items.reverse() },\n              async function (res) {\n                // Clear cache before continuing\n                sessionStorage.removeItem(cache_key);\n                // Goto normal checkout flow or API flow.\n                if (!$(selectors.add_to_cart).hasClass(\"cart__checkout--api\")) {\n                  window.top.location.href = \"/checkout\";\n                } else {\n                  try {\n                    const cart_request = await fetch(\"/cart.json\");\n                    const cart_json = await cart_request.json();\n\n                    const api_request = await fetch(theme.api.endpoint, {\n                      method: \"POST\",\n                      headers: {\n                        \"X-Authorization-Content-SHA256\": theme.api.digest,\n                        \"Content-Type\": \"application/json\",\n                      },\n                      body: JSON.stringify(cart_json),\n                    });\n                    const api_response = await api_request.json();\n\n                    if (api_response.error) {\n                      throw api_response.error;\n                    }\n\n                    $.post(\"/cart/clear.js\", function () {\n                      // cart should be cleared or it's left hingering.\n                      window.top.location.href = api_response.result;\n                    });\n                  } catch (error) {\n                    $(selectors.add_to_cart).removeClass(\"cart__checkout--api\");\n                    console.error(\n                      \"Something went wrong => fallback to checkout flow from API flow:\"\n                    );\n                    console.error(error);\n                    window.top.location.href = \"/checkout\";\n                  }\n                }\n              }\n            ).fail(function (err) {\n              if (err && err.responseText) {\n                var json = JSON.parse(err.responseText);\n                console.error(json.description);\n                theme.alert(json.description);\n\n                // if add fails, we readd the backup cart and display errors.\n                $.post(\"/cart/add.js\", { items: cart_backup }, function (res) {\n                  $(selectors.add_to_cart).removeClass(\"btn--loading\");\n                  $(selectors.add_to_cart).data(\"kkProcessing\", false);\n                }).fail(function (err) {\n                  if (err && err.responseText) {\n                    var json = JSON.parse(err.responseText);\n                    console.error(json.description);\n                    theme.alert(json.description);\n                  }\n                  $(selectors.add_to_cart).data(\"kkProcessing\", false);\n                });\n              }\n              $(selectors.add_to_cart).data(\"kkProcessing\", false);\n            });\n          });\n        });\n      } else {\n        checkoutBtn.data(\"kkProcessing\", false);\n      }\n    });\n  };\n\n  window.onpageshow = function (evt) {\n    // Removes unload class when returning to page via history\n    if (evt.persisted) {\n      $(\"body\").removeClass(\"unloading\");\n    }\n\n    // Browser back/forward cache can keep stale loading state on checkout button.\n    if (window.location.pathname.includes(\"/cart\")) {\n      $('button[name=\"checkout\"]').removeClass(\"btn--loading\").data(\"kkProcessing\", false);\n    }\n  };\n\n  $(document).ready(function () {\n    theme.init();\n\n    window.sections = new theme.Sections();\n    sections.register(\"header-section\", theme.HeaderSection);\n    sections.register(\"slideshow-section\", theme.SlideshowSection);\n    sections.register(\"video-section\", theme.VideoSection);\n    sections.register(\"product\", theme.Product);\n    sections.register(\"product-recommendations\", theme.Recommendations);\n    sections.register(\"store-availability\", theme.StoreAvailability);\n    sections.register(\"product-template\", theme.Product);\n    sections.register(\"collection-template\", theme.Collection);\n    sections.register(\"featured-content-section\", theme.FeaturedContentSection);\n    sections.register(\"collection-switcher\", theme.CollectionSwitcher);\n    sections.register(\"testimonials\", theme.Testimonials);\n    sections.register(\"newsletter-popup\", theme.NewsletterPopup);\n    sections.register(\"fading-images\", theme.FadingImages);\n    sections.register(\"background-image\", theme.BackgroundImage);\n    sections.register(\"map\", theme.Maps);\n    sections.register(\"blog\", theme.Blog);\n    sections.register(\"photoswipe\", theme.Photoswipe);\n    sections.register(\"footer-section\", theme.FooterSection);\n\n    document.dispatchEvent(new CustomEvent(\"page:loaded\"));\n\n    $.fn.isInViewport = function () {\n      var elementTop = $(this).offset().top;\n      var elementBottom = elementTop + $(this).outerHeight();\n\n      var viewportTop = $(window).scrollTop();\n      var viewportBottom = viewportTop + $(window).height();\n\n      return elementBottom > viewportTop && elementTop < viewportBottom;\n    };\n  });\n})(theme.jQuery);\n"],
  "mappings": "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",
  "names": ["status", "key", "params", "cartData", "vat_string_member", "res", "q", "sections", "selectors", "index", "variant", "vatRegular", "vatString", "vatPercent", "vatMultiplier", "vatMember", "data", "haveImages", "untouched_labels", "cache", "any_fill_self", "cart_item", "err", "json"]
}
