{
  "version": 3,
  "sources": ["/cdn/shop/t/22/assets/xsell-tracking.js?x=2699"],
  "sourcesContent": ["/*\n * Cross-sell attribution on product pages.\n *\n * 1. Every product link inside a suggestion block gets ?xsell=<block>&xsell_ref=<current product ID>.\n * 2. Landing on a product page with those parameters stores them in sessionStorage, keyed by product handle.\n * 3. When that product (or a product added directly from a block) goes to the cart, hidden line item\n *    properties _xsell_source / _xsell_ref are added so they show on the order line.\n *\n * Blocks are marked with data-xsell-block=\"<value>\" in Liquid (related / recently viewed). The Essential Upsell\n * app block is marked here, as its markup is rendered by the app.\n */\n(function () {\n  if (window.__xsellTrackingInitialized) return;\n  window.__xsellTrackingInitialized = true;\n\n  var script = document.currentScript;\n  var currentHandle = script && script.getAttribute('data-product-handle');\n  var currentProductId = script && script.getAttribute('data-product-id');\n  if (!currentHandle || !currentProductId) return;\n\n  var SOURCES = ['pdp_side', 'pdp_related', 'pdp_recent'];\n  var BLOCK_SELECTOR = '[data-xsell-block]';\n  var APP_BLOCKS = { 'essential-upsell-cross-sell-app-block': 'pdp_side' };\n  var STORAGE_PREFIX = 'xsell:';\n  var UPSELL_CLICK_WINDOW = 10000;\n\n  var lastUpsellClick = 0;\n\n  function isValidSource(value) {\n    return SOURCES.indexOf(value) !== -1;\n  }\n\n  function isValidRef(value) {\n    return typeof value === 'string' && /^\\d{1,20}$/.test(value);\n  }\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Step 2: remember the source when landing from a block\n   * ------------------------------------------------------------------------------------------------------------ */\n\n  function readStoredSource() {\n    try {\n      var stored = JSON.parse(sessionStorage.getItem(STORAGE_PREFIX + currentHandle) || 'null');\n      if (stored && isValidSource(stored.source) && isValidRef(stored.ref)) return stored;\n    } catch (error) {}\n    return null;\n  }\n\n  function storeSourceFromUrl() {\n    var params = new URLSearchParams(window.location.search);\n    var source = params.get('xsell');\n    var ref = params.get('xsell_ref');\n\n    if (!isValidSource(source) || !isValidRef(ref) || ref === currentProductId) return;\n\n    try {\n      sessionStorage.setItem(STORAGE_PREFIX + currentHandle, JSON.stringify({ source: source, ref: ref }));\n    } catch (error) {}\n  }\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Step 1: tag product links inside the blocks\n   * ------------------------------------------------------------------------------------------------------------ */\n\n  function tagLink(link, source) {\n    var href = link.getAttribute('href');\n    if (!href || href.charAt(0) === '#') return;\n\n    var url;\n    try {\n      url = new URL(href, window.location.href);\n    } catch (error) {\n      return;\n    }\n\n    if (url.origin !== window.location.origin || !/\\/products\\/[^/]+/.test(url.pathname)) return;\n    if (url.searchParams.get('xsell') === source && url.searchParams.get('xsell_ref') === currentProductId) return;\n\n    url.searchParams.set('xsell', source);\n    url.searchParams.set('xsell_ref', currentProductId);\n\n    link.setAttribute('href', /^https?:/i.test(href) ? url.href : url.pathname + url.search + url.hash);\n  }\n\n  function markAppBlocks() {\n    Object.keys(APP_BLOCKS).forEach(function (selector) {\n      document.querySelectorAll(selector + ':not([data-xsell-block])').forEach(function (element) {\n        element.setAttribute('data-xsell-block', APP_BLOCKS[selector]);\n      });\n    });\n  }\n\n  function tagAll() {\n    markAppBlocks();\n\n    document.querySelectorAll(BLOCK_SELECTOR).forEach(function (block) {\n      var source = block.getAttribute('data-xsell-block');\n      if (!isValidSource(source)) return;\n\n      block.querySelectorAll('a[href]').forEach(function (link) {\n        tagLink(link, source);\n      });\n\n      // Quick buy modals are moved to <body> when opened, so they carry the block value with them\n      block.querySelectorAll('quick-buy-modal:not([data-xsell-block])').forEach(function (modal) {\n        modal.setAttribute('data-xsell-block', source);\n      });\n    });\n\n    syncAllForms();\n  }\n\n  var tagScheduled = false;\n\n  function scheduleTagAll() {\n    if (tagScheduled) return;\n    tagScheduled = true;\n\n    window.setTimeout(function () {\n      tagScheduled = false;\n      tagAll();\n    }, 50);\n  }\n\n  function getBlockSource(element) {\n    var block = element && element.closest && element.closest(BLOCK_SELECTOR);\n    var source = block && block.getAttribute('data-xsell-block');\n    return isValidSource(source) ? source : null;\n  }\n\n  // Safety net in case an app re-renders a link between two observer passes\n  function onPointerOrClick(event) {\n    var link = event.target.closest && event.target.closest('a[href]');\n    var source = getBlockSource(link);\n    if (source) tagLink(link, source);\n\n    var button = event.target.closest && event.target.closest('button, input[type=\"submit\"]');\n    if (button && button.form) syncForm(button.form);\n\n    if (event.type === 'click' && getBlockSource(event.target) === 'pdp_side' && event.target.closest('[data-essential-upsell-element=\"add-to-cart-button\"]')) {\n      lastUpsellClick = Date.now();\n    }\n  }\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Step 3: hidden line item properties\n   * ------------------------------------------------------------------------------------------------------------ */\n\n  function getFormProductId(form) {\n    var input = form.querySelector('input[name=\"product-id\"]');\n    return input ? input.value : null;\n  }\n\n  function isCartAddForm(form) {\n    return Boolean(form && form.tagName === 'FORM' && /\\/cart\\/add/.test(form.getAttribute('action') || ''));\n  }\n\n  function getFormAttribution(form) {\n    var source = getBlockSource(form);\n    if (source) return { source: source, ref: currentProductId };\n\n    // Product page form: only the product shown on this page, and only if it was reached from a block\n    return getFormProductId(form) === currentProductId ? readStoredSource() : null;\n  }\n\n  function setHiddenProperty(form, name, value) {\n    var input = document.createElement('input');\n    input.type = 'hidden';\n    input.name = 'properties[' + name + ']';\n    input.value = value;\n    input.setAttribute('data-xsell-input', '');\n    form.appendChild(input);\n  }\n\n  // The inputs are kept in the form at all times (not only on submit), because apps such as the slide cart read the\n  // form on the add to cart click, before the submit event\n  function syncForm(form) {\n    if (!isCartAddForm(form)) return;\n\n    var attribution = getFormAttribution(form);\n    var inputs = form.querySelectorAll('input[data-xsell-input]');\n    var current = {};\n\n    inputs.forEach(function (input) {\n      current[input.name] = input.value;\n    });\n\n    if (attribution && inputs.length === 2 && current['properties[_xsell_source]'] === attribution.source && current['properties[_xsell_ref]'] === attribution.ref) return;\n    if (!attribution && inputs.length === 0) return;\n\n    inputs.forEach(function (input) {\n      input.remove();\n    });\n\n    if (attribution) {\n      setHiddenProperty(form, '_xsell_source', attribution.source);\n      setHiddenProperty(form, '_xsell_ref', attribution.ref);\n    }\n  }\n\n  function syncAllForms() {\n    document.querySelectorAll('form[action*=\"/cart/add\"]').forEach(syncForm);\n  }\n\n  function onSubmit(event) {\n    syncForm(event.target);\n  }\n\n  // Essential Upsell adds to cart with a JSON fetch to /cart/add.js and has no option for custom properties\n  function tagUpsellBody(input, init) {\n    if (!lastUpsellClick || Date.now() - lastUpsellClick > UPSELL_CLICK_WINDOW) return null;\n\n    var url = typeof input === 'string' ? input : input && input.url;\n    if (!url || !/\\/cart\\/add(\\.js)?/.test(String(url)) || !init || typeof init.body !== 'string') return null;\n\n    var payload;\n    try {\n      payload = JSON.parse(init.body);\n    } catch (error) {\n      return null;\n    }\n\n    var items = payload && Array.isArray(payload.items) ? payload.items : null;\n    if (!items || !items.length) return null;\n\n    var fromUpsell = items.every(function (item) {\n      return item && item.properties && item.properties.__essential_upsell_funnel_id;\n    });\n    if (!fromUpsell) return null;\n\n    items.forEach(function (item) {\n      item.properties._xsell_source = 'pdp_side';\n      item.properties._xsell_ref = currentProductId;\n    });\n\n    lastUpsellClick = 0;\n    return JSON.stringify(payload);\n  }\n\n  function patchFetch() {\n    var nativeFetch = window.fetch;\n    if (typeof nativeFetch !== 'function' || nativeFetch.__xsellPatched) return;\n\n    function patchedFetch() {\n      var args = Array.prototype.slice.call(arguments);\n\n      try {\n        var body = tagUpsellBody(args[0], args[1]);\n        if (body) args[1] = Object.assign({}, args[1], { body: body });\n      } catch (error) {}\n\n      return nativeFetch.apply(this, args);\n    }\n\n    patchedFetch.__xsellPatched = true;\n    window.fetch = patchedFetch;\n  }\n\n  /* ------------------------------------------------------------------------------------------------------------\n   * Init\n   * ------------------------------------------------------------------------------------------------------------ */\n\n  storeSourceFromUrl();\n  patchFetch();\n\n  document.addEventListener('submit', onSubmit, true);\n  document.addEventListener('pointerdown', onPointerOrClick, true);\n  document.addEventListener('click', onPointerOrClick, true);\n\n  tagAll();\n\n  new MutationObserver(scheduleTagAll).observe(document.body, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n    attributeFilter: ['href']\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
