{
  "version": 3,
  "sources": ["/cdn/shop/t/10/assets/aoctant-map-request.js?nocache=1793749438324"],
  "sourcesContent": ["(() => {\n  'use strict';\n\n  /**\n   * AOCTANT Map Request (funnel F3).\n   *\n   * Progressive enhancement over a plain form post to the AOCTANT App Proxy:\n   * - pre-fills place and country from ?place= / ?country= in the address;\n   * - place search (checklist 4b): suggestions as you type for the city and country fields,\n   *   the country filled in for a well-known city, and a one-time \"did you mean\" before sending\n   *   (pressing Send again sends the place as typed);\n   * - validates, posts JSON, and shows the result inline without leaving the page.\n   * Every listener is delegated from the document, so a Theme Editor section reload needs no\n   * re-binding; per-form state lives on the form's own data attributes. The button's wave\n   * decoration is owned by assets/aoctant-button-wave.js; this file only sets aria-busy/disabled on it.\n   * Matching lives in assets/aoctant-place-search.js. If it or the city list fails to load, the\n   * form works exactly as it did before: the place goes to the Map Builder as typed.\n   */\n\n  const formSelector = '.aoctant-map-request__form';\n  const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n  const SUGGESTION_LIMIT = 6;\n  const LOAD_WAIT_MS = 4000;\n\n  /* ---------- City list ---------- */\n\n  const indexes = new Map();\n  const loadIndex = (form) => {\n    const url = form && form.dataset.placesUrl;\n    const search = window.AoctantPlaceSearch;\n    if (!url || !search) return Promise.resolve(null);\n    if (!indexes.has(url)) {\n      const entry = { index: null };\n      entry.promise = fetch(url, { credentials: 'same-origin' })\n        .then((response) => (response.ok ? response.json() : Promise.reject(new Error(String(response.status)))))\n        .then((data) => {\n          entry.index = search.createIndex(data);\n          return entry.index;\n        })\n        .catch(() => null);\n      indexes.set(url, entry);\n    }\n    return indexes.get(url).promise;\n  };\n  const readyIndex = (form) => {\n    const entry = form && indexes.get(form.dataset.placesUrl);\n    return entry ? entry.index : null;\n  };\n  // Waits for the list at most LOAD_WAIT_MS; a slow or failed load never blocks a request.\n  const indexForSubmit = (form) =>\n    Promise.race([loadIndex(form), new Promise((resolve) => setTimeout(() => resolve(null), LOAD_WAIT_MS))]);\n\n  /* ---------- Small helpers ---------- */\n\n  const fieldOf = (form, name) => form.elements.namedItem(name);\n  const fill = (template, values) =>\n    String(template || '').replace(/\\[(\\w+)\\]/g, (match, key) => (key in values ? values[key] : match));\n  const placeLabel = (item) => (item.country ? `${item.name}, ${item.country}` : item.name);\n\n  const showStatus = (form, kind, text, link) => {\n    const status = form.querySelector('.aoctant-map-request__status');\n    if (!status) return;\n    status.dataset.kind = kind;\n    status.replaceChildren();\n    const icon = kind === 'ok' ? form.dataset.successIcon : '';\n    status.classList.toggle('aoctant-map-request__status--icon', Boolean(icon));\n    if (icon) {\n      const image = document.createElement('img');\n      image.className = 'aoctant-map-request__status-icon';\n      image.src = icon;\n      image.alt = '';\n      image.width = 40;\n      image.height = 40;\n      status.append(image);\n    }\n    const message = document.createElement('span');\n    message.textContent = text;\n    if (link) {\n      const anchor = document.createElement('a');\n      anchor.href = link;\n      anchor.textContent = form.dataset.msgStatusLink || 'Check your request';\n      message.append(anchor);\n    }\n    status.append(message);\n    status.hidden = false;\n  };\n\n  // Only same-origin http(s) links from the backend are shown.\n  const safeLink = (value) => {\n    if (!value) return null;\n    try {\n      const url = new URL(value, window.location.origin);\n      return url.origin === window.location.origin && /^https?:$/.test(url.protocol) ? url.href : null;\n    } catch {\n      return null;\n    }\n  };\n\n  // Meta Lead hand-off. Called once per genuinely new request: the service answers 202 with a private status link\n  // only when it created a request (a duplicate gets 202 without one; the honeypot, invalid, rate and busy cases are\n  // not 202). The link is therefore the \"accepted\" signal. The event goes to Shopify's customer events; the Custom\n  // Pixel in Shopify admin forwards it to Meta, so this file never touches fbq or the Meta Pixel itself. The payload\n  // carries no email or place. Tracking must never affect the form, hence the guards.\n  const reportedLeads = new Set();\n  const reportLead = (key) => {\n    if (!key || reportedLeads.has(key)) return;\n    reportedLeads.add(key);\n    try {\n      const analytics = window.Shopify && window.Shopify.analytics;\n      if (!analytics || typeof analytics.publish !== 'function') return;\n      const crypto = window.crypto;\n      const eventId = crypto && typeof crypto.randomUUID === 'function'\n        ? crypto.randomUUID()\n        : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;\n      const result = analytics.publish('aoctant:lead', { source: 'aoctant-map-request', event_id: eventId });\n      if (result && typeof result.catch === 'function') result.catch(() => {});\n    } catch (error) {\n      // Ignored on purpose.\n    }\n  };\n\n  const markInvalid = (input, invalid) => {\n    if (!input) return;\n    if (invalid) input.setAttribute('aria-invalid', 'true');\n    else input.removeAttribute('aria-invalid');\n  };\n\n  const setBusy = (button, busy) => {\n    if (!button) return;\n    button.disabled = busy;\n    button.setAttribute('aria-busy', busy ? 'true' : 'false');\n  };\n\n  /* ---------- Suggestions (ARIA 1.2 combobox with a listbox popup) ---------- */\n\n  const listFor = (input) => (input ? document.getElementById(input.getAttribute('aria-controls') || '') : null);\n\n  const enhance = (root = document) => {\n    root.querySelectorAll(formSelector).forEach((form) => {\n      if (!form.dataset.placesUrl || !window.AoctantPlaceSearch) return;\n      ['place', 'country'].forEach((name) => {\n        const input = fieldOf(form, name);\n        const list = form.querySelector(`[data-suggestions-for=\"${name}\"]`);\n        if (!input || !list || input.getAttribute('role') === 'combobox') return;\n        input.setAttribute('role', 'combobox');\n        input.setAttribute('aria-autocomplete', 'list');\n        input.setAttribute('aria-expanded', 'false');\n        input.setAttribute('aria-controls', list.id);\n        input.setAttribute('autocomplete', 'off'); // the browser's own list would cover ours\n      });\n    });\n  };\n\n  const closeList = (input) => {\n    const list = listFor(input);\n    if (list) {\n      list.hidden = true;\n      list.replaceChildren();\n    }\n    if (input) {\n      input.setAttribute('aria-expanded', 'false');\n      input.removeAttribute('aria-activedescendant');\n    }\n  };\n\n  const options = (list) => Array.from(list ? list.querySelectorAll('[role=\"option\"]') : []);\n\n  const setActive = (input, nextIndex) => {\n    const items = options(listFor(input));\n    if (!items.length) return;\n    const index = (nextIndex + items.length) % items.length;\n    items.forEach((item, i) => item.setAttribute('aria-selected', i === index ? 'true' : 'false'));\n    input.setAttribute('aria-activedescendant', items[index].id);\n    items[index].scrollIntoView({ block: 'nearest' });\n  };\n\n  const activeIndex = (input) => {\n    const id = input.getAttribute('aria-activedescendant');\n    return id ? options(listFor(input)).findIndex((item) => item.id === id) : -1;\n  };\n\n  const renderList = (input, items) => {\n    const list = listFor(input);\n    if (!list) return;\n    if (!items.length) {\n      closeList(input);\n      return;\n    }\n    const rows = items.map((item, i) => {\n      const row = document.createElement('li');\n      row.id = `${list.id}-${i}`;\n      row.className = 'aoctant-map-request__suggestion';\n      row.setAttribute('role', 'option');\n      row.setAttribute('aria-selected', 'false');\n      row.dataset.name = item.name || '';\n      row.dataset.country = item.country || '';\n      const main = document.createElement('span');\n      main.className = 'aoctant-map-request__suggestion-name';\n      main.textContent = item.name || item.country;\n      row.append(main);\n      if (item.name && item.country) {\n        const extra = document.createElement('span');\n        extra.className = 'aoctant-map-request__suggestion-country';\n        extra.textContent = item.country;\n        row.append(extra);\n      }\n      return row;\n    });\n    list.replaceChildren(...rows);\n    list.hidden = false;\n    input.setAttribute('aria-expanded', 'true');\n    input.removeAttribute('aria-activedescendant');\n  };\n\n  const updateSuggestions = (input) => {\n    const form = input.form;\n    const index = readyIndex(form);\n    const search = window.AoctantPlaceSearch;\n    if (!index || !search || document.activeElement !== input) return;\n    if (input.name === 'place') {\n      const country = fieldOf(form, 'country');\n      const typedCountry = country && country.dataset.autofilled !== 'true' ? country.value : '';\n      const items = search.suggestPlaces(index, input.value, { country: typedCountry, limit: SUGGESTION_LIMIT });\n      // Nothing to offer once the field already holds exactly the one suggestion.\n      const exact = items.length === 1 && search.fold(items[0].name) === search.fold(input.value);\n      renderList(input, exact ? [] : items);\n    } else {\n      const items = search.suggestCountries(index, input.value, { limit: SUGGESTION_LIMIT });\n      const exact = items.length === 1 && search.fold(items[0].country) === search.fold(input.value);\n      renderList(input, exact ? [] : items);\n    }\n  };\n\n  const setCountry = (form, value, auto) => {\n    const country = fieldOf(form, 'country');\n    if (!country) return;\n    country.value = value;\n    if (auto) country.dataset.autofilled = 'true';\n    else delete country.dataset.autofilled;\n  };\n\n  const choose = (input, row) => {\n    const form = input.form;\n    if (input.name === 'place') {\n      input.value = row.dataset.name;\n      // The shopper picked a city, not a country: the country follows the city until they type their own.\n      if (row.dataset.country) setCountry(form, row.dataset.country, true);\n    } else {\n      input.value = row.dataset.country;\n      delete input.dataset.autofilled;\n    }\n    closeList(input);\n    clearCheck(form);\n  };\n\n  // Country fills itself for a well-known city; a country the shopper typed is never replaced.\n  const autoFillCountry = (form) => {\n    const index = readyIndex(form);\n    const search = window.AoctantPlaceSearch;\n    const place = fieldOf(form, 'place');\n    const country = fieldOf(form, 'country');\n    if (!index || !search || !place || !country) return;\n    const manual = country.value.trim() && country.dataset.autofilled !== 'true';\n    if (manual) return;\n    const result = search.checkPlace(index, place.value, '');\n    if (result.status === 'found' && result.fillCountry) setCountry(form, result.fillCountry.country, true);\n    else if (country.dataset.autofilled === 'true') setCountry(form, '', false);\n  };\n\n  /* ---------- Place check before sending ---------- */\n\n  const checkBox = (form) => form.querySelector('.aoctant-map-request__check');\n\n  const describe = (input, id, on) => {\n    if (!input) return;\n    const ids = (input.getAttribute('aria-describedby') || '').split(/\\s+/).filter((value) => value && value !== id);\n    if (on) ids.push(id);\n    if (ids.length) input.setAttribute('aria-describedby', ids.join(' '));\n    else input.removeAttribute('aria-describedby');\n  };\n\n  function clearCheck(form) {\n    const box = checkBox(form);\n    if (!box || box.hidden) return;\n    box.hidden = true;\n    box.replaceChildren();\n    describe(fieldOf(form, 'place'), box.id, false);\n    describe(fieldOf(form, 'country'), box.id, false);\n  }\n\n  const actionButton = (text, action, value) => {\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'aoctant-map-request__check-action';\n    button.dataset.checkAction = action;\n    if (value) {\n      button.dataset.name = value.name || '';\n      button.dataset.country = value.country || '';\n    }\n    button.textContent = text;\n    return button;\n  };\n\n  // The country is required, except when the place already carries it (coordinates, \"City, Country\").\n  // Shown instead of sending; for a name that exists in several countries it offers the likely ones.\n  const showCountryNeeded = (form, place, choices) => {\n    const box = checkBox(form);\n    const countryInput = fieldOf(form, 'country');\n    markInvalid(countryInput, true);\n    if (!box) {\n      showStatus(form, 'error', form.dataset.msgCountry);\n      if (countryInput) countryInput.focus();\n      return;\n    }\n    const text = document.createElement('p');\n    text.className = 'aoctant-map-request__check-text';\n    text.textContent = form.dataset.msgCountry || 'Add the country so we find the right place.';\n    const row = document.createElement('div');\n    row.className = 'aoctant-map-request__check-actions';\n    row.append(...choices.map((item) => actionButton(placeLabel(item), 'place', item)));\n    box.replaceChildren(text, row);\n    box.hidden = false;\n    describe(countryInput, box.id, true);\n    if (countryInput) countryInput.focus();\n  };\n\n  const showCheck = (form, result, place, country) => {\n    const box = checkBox(form);\n    if (!box) return false;\n    const d = form.dataset;\n    const notFound = d.msgNotFound || 'We couldn\u2019t find \u201C[place]\u201D.';\n    const didYouMean = d.msgDidYouMean || 'Did you mean [suggestion]?';\n    const actions = [];\n    let shown;\n    let focusField = 'place';\n\n    // One message for every case; [place] is the part that didn't match, as the shopper typed it.\n    if (result.status === 'country-unknown') {\n      focusField = 'country';\n      shown = country;\n      if (result.suggestion) {\n        actions.push(actionButton(fill(didYouMean, { suggestion: result.suggestion.country }), 'country', result.suggestion));\n      }\n    } else {\n      shown = result.status === 'country-mismatch' ? `${place}, ${country}` : place;\n      actions.push(actionButton(fill(didYouMean, { suggestion: placeLabel(result.suggestion) }), 'place', result.suggestion));\n    }\n\n    const text = document.createElement('p');\n    text.className = 'aoctant-map-request__check-text';\n    text.textContent = fill(notFound, { place: shown });\n    const row = document.createElement('div');\n    row.className = 'aoctant-map-request__check-actions';\n    row.append(...actions);\n    box.replaceChildren(text, row);\n    box.hidden = false;\n    // Shown once: pressing Send again with the same place and country sends it as typed.\n    form.dataset.placeConfirmed = signature(place, country);\n\n    const input = fieldOf(form, focusField);\n    describe(input, box.id, true);\n    if (input) input.focus();\n    return true;\n  };\n\n  const signature = (place, country) => {\n    const search = window.AoctantPlaceSearch;\n    const fold = search ? search.fold : (value) => String(value).trim().toLowerCase();\n    return `${fold(place)}|${fold(country)}`;\n  };\n\n  // Resolves true when the request may be sent now.\n  const placeIsSendable = async (form, place, country) => {\n    if (form.dataset.placeConfirmed && form.dataset.placeConfirmed === signature(place, country)) return true;\n    const index = await indexForSubmit(form);\n    const search = window.AoctantPlaceSearch;\n    if (!index || !search) return true;\n    const result = search.checkPlace(index, place, country);\n    // Only a likely mistake is worth a pause. A place that isn't on the list (it holds larger\n    // cities only) goes to the Map Builder as typed; it can find neighborhoods and small towns.\n    if (result.status === 'country-unknown' || (result.suggestion && ['not-found', 'country-mismatch'].includes(result.status))) {\n      return !showCheck(form, result, place, country);\n    }\n    return true;\n  };\n\n  /* ---------- Events ---------- */\n\n  const prefill = (root = document) => {\n    const params = new URLSearchParams(window.location.search);\n    root.querySelectorAll(formSelector).forEach((form) => {\n      [['place', 160], ['country', 80]].forEach(([name, max]) => {\n        const value = (params.get(name) || '').trim().slice(0, max);\n        const input = fieldOf(form, name);\n        if (value && input && !input.value) input.value = value;\n      });\n    });\n  };\n\n  const comboInput = (target) => {\n    const input = target && target.closest ? target.closest('.aoctant-map-request__input[role=\"combobox\"]') : null;\n    return input && input.form && input.form.matches(formSelector) ? input : null;\n  };\n\n  document.addEventListener('focusin', (event) => {\n    const input = comboInput(event.target);\n    if (!input) return;\n    // A country we filled in is selected on focus, so typing replaces it instead of adding to it.\n    if (input.name === 'country' && input.dataset.autofilled === 'true') input.select();\n    loadIndex(input.form).then(() => {\n      if (document.activeElement === input && input.value.trim()) updateSuggestions(input);\n    });\n  });\n\n  document.addEventListener('input', (event) => {\n    const input = comboInput(event.target);\n    if (!input) return;\n    const form = input.form;\n    if (input.name === 'country') {\n      delete input.dataset.autofilled;\n      markInvalid(input, false);\n    }\n    delete form.dataset.placeConfirmed;\n    clearCheck(form);\n    updateSuggestions(input);\n  });\n\n  document.addEventListener('change', (event) => {\n    const input = comboInput(event.target);\n    if (input && input.name === 'place') autoFillCountry(input.form);\n  });\n\n  document.addEventListener('focusout', (event) => {\n    const input = comboInput(event.target);\n    if (input) closeList(input);\n  });\n\n  document.addEventListener('keydown', (event) => {\n    const input = comboInput(event.target);\n    if (!input) return;\n    const open = input.getAttribute('aria-expanded') === 'true';\n    if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n      if (!open) {\n        updateSuggestions(input);\n        if (input.getAttribute('aria-expanded') !== 'true') return;\n      }\n      event.preventDefault();\n      const current = activeIndex(input);\n      setActive(input, event.key === 'ArrowDown' ? current + 1 : current < 0 ? -1 : current - 1);\n    } else if (event.key === 'Enter' && open) {\n      const current = activeIndex(input);\n      if (current < 0) return; // nothing highlighted: Enter sends the form as usual\n      event.preventDefault();\n      choose(input, options(listFor(input))[current]);\n    } else if (event.key === 'Escape' && open) {\n      event.preventDefault();\n      closeList(input);\n    }\n  });\n\n  // pointerdown keeps focus in the field, so the list isn't closed by focusout before the pick lands.\n  document.addEventListener('pointerdown', (event) => {\n    const row = event.target.closest && event.target.closest('.aoctant-map-request__suggestion');\n    if (!row) return;\n    const input = document.querySelector(`[aria-controls=\"${row.parentElement.id}\"]`);\n    if (!input) return;\n    event.preventDefault();\n    choose(input, row);\n  });\n\n  document.addEventListener('click', (event) => {\n    const button = event.target.closest && event.target.closest('[data-check-action]');\n    if (!button) return;\n    const form = button.closest(formSelector);\n    if (!form) return;\n    const action = button.dataset.checkAction;\n    if (action === 'place') {\n      fieldOf(form, 'place').value = button.dataset.name;\n      if (button.dataset.country) setCountry(form, button.dataset.country, true);\n    } else if (action === 'country') {\n      setCountry(form, button.dataset.country, false);\n    }\n    delete form.dataset.placeConfirmed;\n    clearCheck(form);\n    const submit = form.querySelector('[type=\"submit\"]');\n    if (submit) submit.focus();\n  });\n\n  const onSubmit = async (event) => {\n    const form = event.target.closest(formSelector);\n    if (!form) return;\n    event.preventDefault();\n\n    const data = Object.fromEntries(new FormData(form));\n    const place = (data.place || '').trim();\n    const country = (data.country || '').trim();\n    const email = (data.email || '').trim();\n    const placeInput = fieldOf(form, 'place');\n    const emailInput = fieldOf(form, 'email');\n\n    markInvalid(placeInput, place.length < 2);\n    markInvalid(emailInput, !emailPattern.test(email));\n    if (place.length < 2) {\n      showStatus(form, 'error', form.dataset.msgPlace);\n      placeInput.focus();\n      return;\n    }\n    if (!emailPattern.test(email)) {\n      showStatus(form, 'error', form.dataset.msgEmail);\n      emailInput.focus();\n      return;\n    }\n\n    const button = form.querySelector('[type=\"submit\"]');\n    setBusy(button, true);\n    let requestTimeout;\n    try {\n      let sendCountry = country;\n      const search = window.AoctantPlaceSearch;\n      if (!sendCountry && !(search && search.countryInPlace(readyIndex(form), place))) {\n        const index = await indexForSubmit(form);\n        // A well-known city fills its own country; anything else asks for one.\n        const found = index && search ? search.checkPlace(index, place, '') : null;\n        if (index && search.countryInPlace(index, place)) {\n          sendCountry = ''; // \"City, Country\" names its own country\n        } else if (\n          found && found.status === 'not-found' && found.suggestion &&\n          search.distance(search.fold(place), search.fold(found.suggestion.name), 1) <= 1 &&\n          form.dataset.placeConfirmed !== signature(place, '')\n        ) {\n          // A one-letter slip comes first: the suggestion also brings the country. A real small town two or more\n          // letters from a bigger one (Taher) goes straight to asking for its country. Shown once, as before.\n          showCheck(form, found, place, '');\n          return;\n        } else if (found && found.status === 'found' && found.fillCountry) {\n          sendCountry = found.fillCountry.country;\n          setCountry(form, sendCountry, true);\n        } else {\n          const choices = found && found.status === 'found' ? search.placesNamed(index, place) : [];\n          showCountryNeeded(form, place, choices);\n          const status = form.querySelector('.aoctant-map-request__status');\n          if (status) status.hidden = true;\n          return;\n        }\n      }\n      markInvalid(fieldOf(form, 'country'), false);\n      if (!(await placeIsSendable(form, place, sendCountry))) {\n        const status = form.querySelector('.aoctant-map-request__status');\n        if (status) status.hidden = true;\n        return;\n      }\n      const requestController = new AbortController();\n      requestTimeout = setTimeout(() => requestController.abort(), 30000);\n      const response = await fetch(form.action, {\n        method: 'POST',\n        headers: { 'content-type': 'application/json', accept: 'application/json' },\n        body: JSON.stringify({ ...data, place, country: sendCountry, email }),\n        signal: requestController.signal,\n      });\n      const body = await response.json().catch((error) => {\n        if (requestController.signal.aborted) throw error;\n        return {};\n      });\n      if (requestController.signal.aborted) throw new DOMException('Request timed out', 'AbortError');\n      if (response.status === 202) {\n        const message = place\n          ? (form.dataset.msgSuccess || '').replace('[place]', place)\n          : form.dataset.msgSuccessFallback;\n        const statusLink = safeLink(body.statusUrl);\n        showStatus(form, 'ok', message, statusLink);\n        reportLead(statusLink);\n        form.reset();\n        delete form.dataset.placeConfirmed;\n        const countryInput = fieldOf(form, 'country');\n        if (countryInput) delete countryInput.dataset.autofilled;\n        clearCheck(form);\n      } else {\n        showStatus(form, 'error', body.error || form.dataset.msgGeneric);\n      }\n    } catch (error) {\n      showStatus(form, 'error', error?.name === 'AbortError'\n        ? 'This is taking longer than expected. Please check your email before trying again; your request may have arrived.'\n        : form.dataset.msgNetwork);\n    } finally {\n      clearTimeout(requestTimeout);\n      setBusy(button, false);\n    }\n  };\n\n  document.addEventListener('submit', onSubmit);\n\n  const init = (root) => {\n    prefill(root);\n    enhance(root);\n  };\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => init());\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', (event) => init(event.target));\n})();\n"],
  "mappings": "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",
  "names": []
}
