{
  "version": 3,
  "sources": ["../../static_src/js/website_forms.js"],
  "sourcesContent": ["const PHONE_PATTERN = /^\\+?[0-9()\\s-]{8,20}$/;\n\nlet countriesPromise = null;\nconst countryPickers = [];\n\nfunction getFormMessages(form) {\n    const data = form ? form.dataset : {};\n    return {\n        requiredField: data.msgRequired || \"\",\n        emailInvalid: data.msgEmailInvalid || \"\",\n        phoneInvalid: data.msgPhoneInvalid || \"\",\n        loadingCountries: data.msgCountryLoading || \"\",\n        loadCountriesError: data.msgCountryError || \"\",\n        noCountries: data.msgCountryNone || \"\",\n    };\n}\n\nfunction extractCountries(payload) {\n    if (Array.isArray(payload)) return payload;\n    if (Array.isArray(payload?.items)) return payload.items;\n    if (Array.isArray(payload?.data?.items)) return payload.data.items;\n    if (Array.isArray(payload?.data)) return payload.data;\n    if (Array.isArray(payload?.result?.items)) return payload.result.items;\n    return [];\n}\n\nasync function getCountries() {\n    if (!countriesPromise) {\n        countriesPromise = fetch(\"/api/catalog-countries?all=true\", { method: \"GET\" })\n            .then((response) => {\n                if (!response.ok) {\n                    throw new Error(`Countries catalog request failed with status ${response.status}`);\n                }\n                return response.json();\n            })\n            .then((payload) => {\n                return extractCountries(payload)\n                    .filter((country) => country && country.name)\n                    .filter((country) => country.enabled !== false && country.deleted !== true)\n                    .sort((a, b) => a.name.localeCompare(b.name));\n            });\n    }\n\n    return countriesPromise;\n}\n\nfunction closestFieldContainer(field) {\n    return field.closest(\".website-request-demo__field, .website-contact-sales__field\");\n}\n\nfunction getFieldChrome(field) {\n    if (field.matches(\"textarea\")) return field;\n    return field.closest(\".website-request-demo__input-wrap, .website-contact-sales__input-wrap\");\n}\n\nfunction setFieldError(field, message) {\n    const container = closestFieldContainer(field);\n    if (!container) return;\n\n    const chrome = getFieldChrome(field);\n    if (chrome) chrome.classList.add(\"is-invalid\");\n\n    let error = container.querySelector(\"[data-field-error]\");\n    if (!error) {\n        error = document.createElement(\"p\");\n        error.className = \"website-form-error\";\n        error.dataset.fieldError = \"true\";\n        container.appendChild(error);\n    }\n\n    error.textContent = message;\n}\n\nfunction clearFieldError(field) {\n    const container = closestFieldContainer(field);\n    if (!container) return;\n\n    const chrome = getFieldChrome(field);\n    if (chrome) chrome.classList.remove(\"is-invalid\");\n\n    const error = container.querySelector(\"[data-field-error]\");\n    if (error) error.remove();\n}\n\nfunction validateField(field, messages) {\n    const rawValue = typeof field.value === \"string\" ? field.value : \"\";\n    const value = rawValue.trim();\n\n    if (field.required && !value) {\n        setFieldError(field, messages.requiredField);\n        return false;\n    }\n\n    if (field.name === \"email\" && value && field.validity.typeMismatch) {\n        setFieldError(field, messages.emailInvalid);\n        return false;\n    }\n\n    if (field.name === \"phone\" && value && !PHONE_PATTERN.test(value)) {\n        setFieldError(field, messages.phoneInvalid);\n        return false;\n    }\n\n    clearFieldError(field);\n    return true;\n}\n\nfunction applyFormValidation(form) {\n    form.setAttribute(\"novalidate\", \"novalidate\");\n    const messages = getFormMessages(form);\n\n    const fields = Array.from(\n        form.querySelectorAll(\"input[name='name'], input[name='email'], input[name='phone'], input[name='country'], input[name='company'], textarea[name='message']\")\n    );\n\n    fields.forEach((field) => {\n        field.addEventListener(\"input\", () => {\n            if (field.dataset.touched === \"true\") validateField(field, messages);\n        });\n\n        field.addEventListener(\"blur\", () => {\n            field.dataset.touched = \"true\";\n            validateField(field, messages);\n        });\n    });\n\n    form.addEventListener(\"submit\", (event) => {\n        let firstInvalid = null;\n\n        fields.forEach((field) => {\n            field.dataset.touched = \"true\";\n            const isValid = validateField(field, messages);\n            if (!isValid && !firstInvalid) firstInvalid = field;\n        });\n\n        if (firstInvalid) {\n            event.preventDefault();\n            firstInvalid.focus();\n        }\n    });\n}\n\nfunction renderCountryStatus(dropdown, text) {\n    dropdown.innerHTML = \"\";\n    const row = document.createElement(\"button\");\n    row.type = \"button\";\n    row.className = \"website-form-country-option\";\n    row.disabled = true;\n    row.textContent = text;\n    dropdown.appendChild(row);\n}\n\nfunction renderCountryOptions(picker, countries) {\n    picker.dropdown.innerHTML = \"\";\n\n    if (!countries.length) {\n        renderCountryStatus(picker.dropdown, picker.messages.noCountries);\n        return;\n    }\n\n    countries.forEach((country) => {\n        const option = document.createElement(\"button\");\n        option.type = \"button\";\n        option.className = \"website-form-country-option\";\n        option.dataset.countryValue = country.name;\n        option.textContent = country.name;\n        option.addEventListener(\"click\", () => {\n            picker.input.value = country.name;\n            picker.input.dataset.touched = \"true\";\n            validateField(picker.input, picker.messages);\n            closeCountryPicker(picker);\n        });\n        picker.dropdown.appendChild(option);\n    });\n}\n\nfunction filterCountries(picker) {\n    const query = picker.input.value.trim().toLowerCase();\n    const filtered = picker.countries.filter((country) => country.name.toLowerCase().includes(query));\n    renderCountryOptions(picker, filtered);\n}\n\nfunction openCountryPicker(picker) {\n    picker.element.classList.add(\"is-open\");\n    picker.dropdown.classList.remove(\"is-hidden\");\n\n    if (!picker.loaded && !picker.loadError) {\n        renderCountryStatus(picker.dropdown, picker.messages.loadingCountries);\n        return;\n    }\n\n    if (picker.loadError) {\n        renderCountryStatus(picker.dropdown, picker.messages.loadCountriesError);\n        return;\n    }\n\n    filterCountries(picker);\n}\n\nfunction closeCountryPicker(picker) {\n    picker.element.classList.remove(\"is-open\");\n    picker.dropdown.classList.add(\"is-hidden\");\n}\n\nfunction setupCountryPicker(input) {\n    const pickerElement = input.closest(\"[data-country-picker]\");\n    if (!pickerElement) return;\n\n    const dropdown = pickerElement.querySelector(\"[data-country-dropdown='true']\");\n    const toggle = pickerElement.querySelector(\"[data-country-toggle='true']\");\n    if (!dropdown || !toggle) return;\n\n    const form = input.closest(\"form\");\n    const messages = getFormMessages(form);\n\n    const picker = {\n        element: pickerElement,\n        input,\n        dropdown,\n        toggle,\n        countries: [],\n        loaded: false,\n        loadError: false,\n        messages,\n    };\n\n    countryPickers.push(picker);\n\n    input.addEventListener(\"focus\", () => openCountryPicker(picker));\n    input.addEventListener(\"click\", () => openCountryPicker(picker));\n    input.addEventListener(\"input\", () => openCountryPicker(picker));\n\n    toggle.addEventListener(\"click\", (event) => {\n        event.preventDefault();\n        if (picker.element.classList.contains(\"is-open\")) {\n            closeCountryPicker(picker);\n        } else {\n            input.focus();\n            openCountryPicker(picker);\n        }\n    });\n\n    input.addEventListener(\"keydown\", (event) => {\n        if (event.key === \"Escape\") {\n            closeCountryPicker(picker);\n        }\n    });\n\n    renderCountryStatus(dropdown, messages.loadingCountries);\n}\n\nfunction closeCountryPickersFromOutside(event) {\n    countryPickers.forEach((picker) => {\n        if (!picker.element.contains(event.target)) {\n            closeCountryPicker(picker);\n        }\n    });\n}\n\nasync function initCountryPickers() {\n    const countryInputs = Array.from(document.querySelectorAll(\"input[name='country'][data-country-catalog='true']\"));\n    if (!countryInputs.length) return;\n\n    countryInputs.forEach((input) => setupCountryPicker(input));\n\n    document.addEventListener(\"click\", closeCountryPickersFromOutside);\n\n    try {\n        const countries = await getCountries();\n        countryPickers.forEach((picker) => {\n            picker.countries = countries;\n            picker.loaded = true;\n\n            if (picker.element.classList.contains(\"is-open\")) {\n                filterCountries(picker);\n            }\n        });\n    } catch {\n        countryPickers.forEach((picker) => {\n            picker.loadError = true;\n            picker.loaded = false;\n\n            if (picker.element.classList.contains(\"is-open\")) {\n                renderCountryStatus(picker.dropdown, picker.messages.loadCountriesError);\n            }\n        });\n    }\n}\n\nfunction initWebsiteForms() {\n    const forms = document.querySelectorAll(\".website-request-demo__form, .website-contact-sales__form\");\n    forms.forEach((form) => applyFormValidation(form));\n    initCountryPickers();\n}\n\nif (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", initWebsiteForms);\n} else {\n    initWebsiteForms();\n}\n"],
  "mappings": "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",
  "names": ["PHONE_PATTERN", "countriesPromise", "countryPickers", "getFormMessages", "form", "data", "extractCountries", "payload", "getCountries", "response", "country", "a", "b", "closestFieldContainer", "field", "getFieldChrome", "setFieldError", "message", "container", "chrome", "error", "clearFieldError", "validateField", "messages", "value", "applyFormValidation", "fields", "event", "firstInvalid", "renderCountryStatus", "dropdown", "text", "row", "renderCountryOptions", "picker", "countries", "option", "closeCountryPicker", "filterCountries", "query", "filtered", "openCountryPicker", "setupCountryPicker", "input", "pickerElement", "toggle", "closeCountryPickersFromOutside", "initCountryPickers", "countryInputs", "initWebsiteForms"]
}
