{"version":3,"file":"main.js","mappings":"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","sources":["webpack://leshuttle/./node_modules/flatpickr/dist/esm/utils/polyfills.js","webpack://leshuttle/./node_modules/flatpickr/dist/l10n/fr.js","webpack://leshuttle/./node_modules/flatpickr/dist/l10n/nl.js","webpack://leshuttle/./src/scripts/forms/file-uploader.js","webpack://leshuttle/./src/scripts/forms/updateableFormHelper-crafted.js","webpack://leshuttle/webpack/bootstrap","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/Logger.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/services/svgService.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/SVGLoader.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/controlBodyScroll.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/overlay.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/accessibility/focusable.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/MediaQueries.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/offCanvas.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/accordion.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/HoverIntent.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/flyoutDelegates.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/types/options.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/l10n/default.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/utils/index.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/utils/dom.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/utils/formatting.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/utils/dates.js","webpack://leshuttle/./node_modules/flatpickr/dist/esm/index.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/quantityTick.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/bookingBar.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/datePicker.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/showDialog.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/accordionClose.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/stories/Molecules/Cards/Flip/flip-card.js","webpack://leshuttle/./node_modules/dialog-polyfill/dist/dialog-polyfill.esm.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/modal.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/forms/inputs/SelectFormatting.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/tabs.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/set-video-source.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/EnsureStylesheetLoaded.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/loader-events.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/inline-video.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/device-detection.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/molecules/slider-card-set.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/article-media.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/autocomplete.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/hero-autocomplete.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/search-dialog.js","webpack://leshuttle/./src/scripts/utilities/Localization.js","webpack://leshuttle/./src/scripts/utilities/Debounce.js","webpack://leshuttle/./src/scripts/components/Search.js","webpack://leshuttle/./src/scripts/utilities/CookieUtils.js","webpack://leshuttle/./src/scripts/components/CountryModal.js","webpack://leshuttle/./src/scripts/components/SiteAlerts.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/LazyLoad.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/match-height.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/stories/Molecules/TextBlocks/SupportListTextBlock/support-list.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/drag-scroll.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/ready.js","webpack://leshuttle/./src/scripts/components/ArticleListing.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/stories/Components/ImageZoom/image-zoom.js","webpack://leshuttle/./src/scripts/utilities/IntersectionAnimator.js","webpack://leshuttle/./src/scripts/components/layout/LoadSections.js","webpack://leshuttle/./src/scripts/components/ListPaging.js","webpack://leshuttle/./src/scripts/forms/auto-postback.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/media-block.js","webpack://leshuttle/./node_modules/async-validator/dist-web/index.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation/submitAjaxForm.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation/FormValidation.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/index.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/kentico-required.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/email.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/maxLength.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/minLength.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/number.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/phone.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation-rules/regex.js","webpack://leshuttle/./node_modules/@chrisjwarnes/form-validator/src/validation/init.js","webpack://leshuttle/./src/scripts/forms/file-upload.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/loading-button.js","webpack://leshuttle/./src/scripts/components/SalesHorizonForm.js","webpack://leshuttle/./src/scripts/tracking/tracking.js","webpack://leshuttle/./src/scripts/tracking/ab-test-logger.js","webpack://leshuttle/./src/scripts/main.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/copy-to-clipboard.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/dialog.js","webpack://leshuttle/./node_modules/@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/MacDetection.js","webpack://leshuttle/./src/scripts/forms/rules/recaptcha.js","webpack://leshuttle/./src/scripts/forms/index.js","webpack://leshuttle/./src/scripts/forms/validation/web-tracking.js","webpack://leshuttle/./src/scripts/forms/validation/google-analytics.js","webpack://leshuttle/./src/scripts/utilities/CmsWidgetLoader.js","webpack://leshuttle/./src/scripts/components/BookingBar.js","webpack://leshuttle/./src/scripts/components/NewsletterForm.js","webpack://leshuttle/./src/scripts/utilities/LiveChat.js","webpack://leshuttle/./src/scripts/tracking/setup-tracking.js"],"sourcesContent":["\"use strict\";\nif (typeof Object.assign !== \"function\") {\n Object.assign = function (target) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (!target) {\n throw TypeError(\"Cannot convert undefined or null to object\");\n }\n var _loop_1 = function (source) {\n if (source) {\n Object.keys(source).forEach(function (key) { return (target[key] = source[key]); });\n }\n };\n for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n var source = args_1[_a];\n _loop_1(source);\n }\n return target;\n };\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.fr = {}));\n}(this, (function (exports) { 'use strict';\n\n var fp = typeof window !== \"undefined\" && window.flatpickr !== undefined\n ? window.flatpickr\n : {\n l10ns: {},\n };\n var French = {\n firstDayOfWeek: 1,\n weekdays: {\n shorthand: [\"dim\", \"lun\", \"mar\", \"mer\", \"jeu\", \"ven\", \"sam\"],\n longhand: [\n \"dimanche\",\n \"lundi\",\n \"mardi\",\n \"mercredi\",\n \"jeudi\",\n \"vendredi\",\n \"samedi\",\n ],\n },\n months: {\n shorthand: [\n \"janv\",\n \"févr\",\n \"mars\",\n \"avr\",\n \"mai\",\n \"juin\",\n \"juil\",\n \"août\",\n \"sept\",\n \"oct\",\n \"nov\",\n \"déc\",\n ],\n longhand: [\n \"janvier\",\n \"février\",\n \"mars\",\n \"avril\",\n \"mai\",\n \"juin\",\n \"juillet\",\n \"août\",\n \"septembre\",\n \"octobre\",\n \"novembre\",\n \"décembre\",\n ],\n },\n ordinal: function (nth) {\n if (nth > 1)\n return \"\";\n return \"er\";\n },\n rangeSeparator: \" au \",\n weekAbbreviation: \"Sem\",\n scrollTitle: \"Défiler pour augmenter la valeur\",\n toggleTitle: \"Cliquer pour basculer\",\n time_24hr: true,\n };\n fp.l10ns.fr = French;\n var fr = fp.l10ns;\n\n exports.French = French;\n exports.default = fr;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.nl = {}));\n}(this, (function (exports) { 'use strict';\n\n var fp = typeof window !== \"undefined\" && window.flatpickr !== undefined\n ? window.flatpickr\n : {\n l10ns: {},\n };\n var Dutch = {\n weekdays: {\n shorthand: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n longhand: [\n \"zondag\",\n \"maandag\",\n \"dinsdag\",\n \"woensdag\",\n \"donderdag\",\n \"vrijdag\",\n \"zaterdag\",\n ],\n },\n months: {\n shorthand: [\n \"jan\",\n \"feb\",\n \"mrt\",\n \"apr\",\n \"mei\",\n \"jun\",\n \"jul\",\n \"aug\",\n \"sept\",\n \"okt\",\n \"nov\",\n \"dec\",\n ],\n longhand: [\n \"januari\",\n \"februari\",\n \"maart\",\n \"april\",\n \"mei\",\n \"juni\",\n \"juli\",\n \"augustus\",\n \"september\",\n \"oktober\",\n \"november\",\n \"december\",\n ],\n },\n firstDayOfWeek: 1,\n weekAbbreviation: \"wk\",\n rangeSeparator: \" t/m \",\n scrollTitle: \"Scroll voor volgende / vorige\",\n toggleTitle: \"Klik om te wisselen\",\n time_24hr: true,\n ordinal: function (nth) {\n if (nth === 1 || nth === 8 || nth >= 20)\n return \"ste\";\n return \"de\";\n },\n };\n fp.l10ns.nl = Dutch;\n var nl = fp.l10ns;\n\n exports.Dutch = Dutch;\n exports.default = nl;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","window.kentico = window.kentico || {}\nwindow.kentico._forms = window.kentico._forms || {}\n\nwindow.kentico._forms.formFileUploaderComponent = (function (document) {\n function disableElements (form) {\n form.fileUploaderDisabledElements = []\n const elements = form.elements\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i]\n if (!element.disabled) {\n form.fileUploaderDisabledElements.push(i)\n element.disabled = true\n }\n }\n }\n\n function enableElements (form) {\n form.fileUploaderDisabledElements.forEach(function (disabledElement) {\n form.elements[disabledElement].disabled = false\n })\n }\n\n function clearTempFile (\n fileInput,\n inputReplacementFilename,\n inputPlaceholder,\n tempFileIdentifierInput,\n inputTextButton,\n inputIconButton\n ) {\n fileInput.value = null\n fileInput.removeAttribute('hidden')\n inputReplacementFilename.setAttribute('hidden', 'hidden')\n\n inputPlaceholder.innerText = inputPlaceholder.originalText\n tempFileIdentifierInput.value = ''\n\n inputTextButton.setAttribute('hidden', 'hidden')\n inputIconButton.setAttribute('data-icon', 'select')\n inputIconButton.removeAttribute('title')\n }\n\n function attachScript (config) {\n const fileInput = document.getElementById(config.fileInputId)\n const inputPlaceholder = document.getElementById(\n config.fileInputId + '-placeholder'\n )\n const inputReplacementFilename = document.getElementById(\n config.fileInputId + '-replacement'\n )\n const inputTextButton = document.getElementById(\n config.fileInputId + '-button'\n )\n const inputIconButton = document.getElementById(config.fileInputId + '-icon')\n\n const tempFileIdentifierInput = document.getElementById(\n config.tempFileIdentifierInputId\n )\n const systemFileNameInput = document.getElementById(\n config.systemFileNameInputId\n )\n let originalFileNameInput = document.getElementById(\n config.originalFileNameInputId\n )\n const deletePersistentFileInput = document.getElementById(\n config.deletePersistentFileInputId\n )\n const tempFileOriginalName = config.tempFileOriginalName\n\n const deleteFileIconButtonTitle = config.deleteFileIconButtonTitle\n\n inputPlaceholder.originalText = inputPlaceholder.innerText\n inputTextButton.originalText = inputTextButton.innerText\n\n // If a file is selected, set text of the label and file input replacement to its filename.\n if (\n (originalFileNameInput.value || tempFileOriginalName) &&\n deletePersistentFileInput.value.toUpperCase() === 'FALSE'\n ) {\n inputPlaceholder.innerText =\n config.originalFileNamePlain || tempFileOriginalName\n\n inputTextButton.removeAttribute('hidden')\n inputIconButton.setAttribute('data-icon', 'remove')\n inputIconButton.setAttribute('title', deleteFileIconButtonTitle)\n\n inputReplacementFilename.removeAttribute('hidden')\n fileInput.setAttribute('hidden', 'hidden')\n }\n\n // If file has not yet been persisted, send a request to delete it.\n const deleteTempFile = function () {\n if (tempFileIdentifierInput.value) {\n const deleteRequest = new XMLHttpRequest()\n\n deleteRequest.open(\n 'POST',\n config.deleteEndpoint +\n '&tempFileIdentifier=' +\n tempFileIdentifierInput.value\n )\n deleteRequest.send()\n }\n }\n\n // Deletes both permanent and temp files.\n const deleteFile = function () {\n if (systemFileNameInput.value) {\n deletePersistentFileInput.value = true\n }\n\n deleteTempFile()\n\n clearTempFile(\n fileInput,\n inputReplacementFilename,\n inputPlaceholder,\n tempFileIdentifierInput,\n inputTextButton,\n inputIconButton\n )\n }\n\n // Wrapper for the deleteFile function used when the icon button is clicked.\n const deleteFileIcon = function (event) {\n if (inputIconButton.getAttribute('data-icon') === 'remove') {\n event.preventDefault()\n deleteFile()\n }\n }\n\n inputTextButton.addEventListener('click', deleteFile)\n inputIconButton.addEventListener('click', deleteFileIcon)\n\n fileInput.addEventListener('change', function () {\n // In IE11 change fires also when setting fileInput value to null.\n if (!fileInput.value) {\n return\n }\n\n inputTextButton.removeAttribute('hidden')\n inputIconButton.setAttribute('data-icon', 'loading')\n disableElements(fileInput.form)\n\n // Validate file size.\n const file = fileInput.files[0]\n if (file !== undefined) {\n if (file.size > config.maxFileSize * 1024) {\n fileInput.value = null\n tempFileIdentifierInput.value = ''\n originalFileNameInput = ''\n\n window.alert(config.maxFileSizeExceededErrorMessage)\n enableElements(fileInput.form)\n inputIconButton.setAttribute('data-icon', 'select')\n\n return\n }\n }\n\n const data = new FormData()\n const submitRequest = new XMLHttpRequest()\n submitRequest.contentType = 'multipart/form-data'\n\n data.append('file', file)\n\n submitRequest.addEventListener('load', function (e) {\n if (submitRequest.readyState === 4) {\n if (submitRequest.status === 200) {\n let result = submitRequest.response\n // IE11 and Edge do not support response type 'json'\n if (typeof result === 'string') {\n result = JSON.parse(result)\n }\n\n if (result.errorMessage) {\n fileInput.value = null\n alert(result.errorMessage)\n\n inputIconButton.setAttribute('data-icon', 'select')\n inputTextButton.setAttribute('hidden', 'hidden')\n } else {\n if (systemFileNameInput.value) {\n deletePersistentFileInput.value = true\n }\n deleteTempFile()\n\n const filename = fileInput.files[0].name\n\n tempFileIdentifierInput.value = result.fileIdentifier\n\n inputPlaceholder.innerText = filename\n inputTextButton.removeAttribute('hidden')\n inputIconButton.setAttribute('data-icon', 'remove')\n inputIconButton.setAttribute('title', deleteFileIconButtonTitle)\n\n inputReplacementFilename.innerText = filename\n inputReplacementFilename.removeAttribute('hidden')\n fileInput.setAttribute('hidden', 'hidden')\n }\n } else {\n alert('Error sending file: ' + submitRequest.statusText)\n\n inputIconButton.setAttribute('data-icon', 'select')\n inputTextButton.setAttribute('hidden', 'hidden')\n }\n\n inputTextButton.innerHTML = inputTextButton.originalText\n enableElements(fileInput.form)\n }\n })\n\n submitRequest.upload.addEventListener('progress', function (event) {\n inputTextButton.innerText =\n parseInt((event.loaded / event.total) * 100) + '%'\n })\n\n submitRequest.open('POST', config.submitEndpoint)\n submitRequest.responseType = 'json'\n submitRequest.send(data)\n })\n }\n\n return {\n attachScript\n }\n})(document)\n","window.kentico = window.kentico || {}\n\nwindow.kentico.updatableFormHelper = (function () {\n // Duration for which user must not type anything in order for the form to be submitted.\n const KEY_UP_DEBOUNCE_DURATION = 800\n\n const errorMessages = {\n en: 'We apologize, an error occurred on our side while handling your request. Please refresh and retry your request as it may have been temporary.',\n fr: 'Nous nous excusons, une erreur s\\'est produite de notre c�t� lors du traitement de votre demande. Veuillez actualiser et r�essayer votre demande car elle pourrait �tre temporaire.',\n nl: 'Onze excuses, er is een fout opgetreden aan onze kant tijdens het verwerken van uw verzoek. Vernieuw en probeer uw verzoek opnieuw, omdat dit tijdelijk kan zijn.'\n }\n\n /**\n * Registers event listeners and updates the form upon changes of the form data.\n * @param {object} config Configuration object.\n * @param {string} config.formId ID of the form element.\n * @param {string} config.targetAttributeName Data attribute of element that is used to be replaced by HTML received from the server.\n * @param {string} config.unobservedAttributeName Data attribute which marks an input as not being observed for changes.\n */\n function registerEventListeners (config) {\n console.log(config)\n if (!config || !config.formId || !config.targetAttributeName || !config.unobservedAttributeName) {\n throw new Error('Invalid configuration passed.')\n }\n\n const writeableTypes = ['email', 'number', 'password', 'search', 'tel', 'text', 'time']\n\n const observedForm = document.getElementById(config.formId)\n if (!(observedForm && observedForm.getAttribute(config.targetAttributeName))) {\n return\n }\n\n for (let i = 0; i < observedForm.length; i++) {\n const observedFormElement = observedForm.elements[i]\n const handleElement = !observedFormElement.hasAttribute(config.unobservedAttributeName) &&\n observedFormElement.type !== 'submit'\n\n if (handleElement) {\n const isWriteableElement = (observedFormElement.tagName === 'INPUT' && writeableTypes.indexOf(observedFormElement.type) !== -1) || observedFormElement.tagName === 'TEXTAREA'\n\n if (isWriteableElement) {\n observedFormElement.previousValue = observedFormElement.value\n\n observedFormElement.addEventListener('keyup', debounce(function (e) {\n setTimeout(function () {\n if (!observedForm.updating && e.target.previousValue !== e.target.value) {\n observedForm.keyupUpdate = true\n const changedFieldName = extractFieldName(e.target)\n updateForm(observedForm, e.target, changedFieldName)\n }\n }, 0)\n }, KEY_UP_DEBOUNCE_DURATION))\n\n observedFormElement.addEventListener('blur', function (e) {\n setTimeout(function () {\n if (!observedForm.updating && e.target.previousValue !== e.target.value) {\n const changedFieldName = extractFieldName(e.target)\n updateForm(observedForm, e.relatedTarget, changedFieldName)\n }\n }, 0)\n })\n }\n\n observedFormElement.addEventListener('change', function (e) {\n setTimeout(function () {\n if (!observedForm.updating) {\n const changedFieldName = extractFieldName(e.target)\n updateForm(observedForm, null, changedFieldName)\n }\n }, 0)\n })\n }\n }\n }\n\n /**\n * Updates the form markup.\n * @param {HTMLElement} form Element of the form to update.\n * @param {Element} nextFocusElement Element which shout get focus after update.\n */\n function updateForm (form, nextFocusElement, changedFieldName) {\n if (!form) {\n return\n }\n\n // If form is not updatable then do nothing\n const elementIdSelector = form.getAttribute('data-ktc-ajax-update')\n if (!elementIdSelector) {\n return\n }\n\n form.querySelectorAll(\"input[type='submit']\").forEach((item) => {\n item.setAttribute('onclick', 'return false;')\n })\n\n form.updating = true\n\n const formData = new FormData(form)\n formData.append('kentico_update_form', 'true')\n\n if (changedFieldName) {\n formData.append('kentico_changed_form_field_name', changedFieldName)\n }\n\n const focus = nextFocusElement || document.activeElement\n\n const onResponse = function (event) {\n if (!event.target.response.data) {\n let selectionEnd = null\n let selectionStart = null\n if (focus && (focus.type === 'text' || focus.type === 'search' || focus.type === 'password' || focus.type === 'tel' || focus.type === 'url')) {\n selectionStart = focus.selectionStart\n selectionEnd = focus.selectionEnd\n }\n\n const currentScrollPosition = window.scrollY\n const element = document.getElementById(elementIdSelector)\n\n renderMarkup(event.target.responseText, element)\n window.scrollTo(0, currentScrollPosition)\n\n if (focus.id) {\n const newInput = document.getElementById(focus.id)\n if (newInput) {\n newInput.focus()\n setCaretPosition(newInput, selectionStart, selectionEnd)\n }\n }\n }\n const parent = form.parentElement\n parent.dispatchEvent(new CustomEvent('form-updated', { bubbles: true }))\n }\n\n createRequest(form, formData, onResponse)\n }\n\n function submitForm (event) {\n event.preventDefault()\n const form = event.target\n form.validator.validateForm().then(function () {\n const formData = new FormData(form)\n const onResponse = function (event) {\n if (event.target.status !== 200) {\n console.log('Form error occurred')\n console.log(event)\n const replaceTargetId = form.getAttribute('data-ktc-ajax-update')\n const currentScrollPosition = window.scrollY\n const element = document.getElementById(replaceTargetId)\n const currentCulture = getCurrentCulture()\n const errorMessage = errorMessages[currentCulture] || errorMessages.en // Fallback to 'en' if culture not found\n renderMarkup(errorMessage, element)\n window.scrollTo(0, currentScrollPosition)\n return\n }\n\n const contentType = event.target.getResponseHeader('Content-Type')\n\n if (contentType.indexOf('application/json') === -1) {\n const replaceTargetId = form.getAttribute('data-ktc-ajax-update')\n const currentScrollPosition = window.scrollY\n const element = document.getElementById(replaceTargetId)\n renderMarkup(event.target.response, element)\n window.scrollTo(0, currentScrollPosition)\n\n const parent = form.parentElement\n if (parent) {\n parent.dispatchEvent(new CustomEvent('form-updated', { bubbles: true }))\n }\n } else {\n const json = JSON.parse(event.target.response)\n\n location.href = json.redirectTo\n }\n }\n\n createRequest(form, formData, onResponse)\n })\n }\n\n const renderMarkup = (markup, targetElement) => {\n targetElement.innerHTML = markup\n const scripts = targetElement.querySelectorAll('script')\n Array.prototype.forEach.call(scripts, (scriptElement) => {\n const parent = scriptElement.parentNode\n const temp = document.createElement('script');\n [...scriptElement.attributes].forEach((attr) => {\n temp.setAttribute(attr.name, attr.value)\n })\n\n temp.innerHTML = scriptElement.innerHTML\n parent.replaceChild(temp, scriptElement)\n scriptElement.remove()\n })\n }\n\n function createRequest (form, formData, onResponse) {\n const xhr = new XMLHttpRequest()\n\n xhr.addEventListener('load', onResponse)\n\n xhr.open('POST', form.action)\n xhr.send(formData)\n }\n\n /**\n * Sets the caret position.\n * @param {HTMLInputElement} input Input element in which the caret position should be set.\n * @param {number} selectionStart Selection start position.\n * @param {number} selectionEnd Selection end position.\n */\n function setCaretPosition (input, selectionStart, selectionEnd) {\n if (selectionStart === null && selectionEnd === null) {\n return\n }\n\n if (input.setSelectionRange) {\n input.setSelectionRange(selectionStart, selectionEnd)\n }\n }\n\n function debounce (func, wait, immediate) {\n let timeout\n\n return function () {\n const context = this\n const args = arguments\n\n const later = function () {\n timeout = null\n\n if (!immediate) {\n func.apply(context, args)\n }\n }\n\n const callNow = immediate && !timeout\n clearTimeout(timeout)\n timeout = setTimeout(later, wait || 200)\n\n if (callNow) {\n func.apply(context, args)\n }\n }\n }\n\n function extractFieldName (targetElement) {\n const fullName = targetElement.getAttribute('name') ?? ''\n const splitName = fullName.split('.')\n const secondToLast = splitName.length - 2\n return secondToLast >= 0 ? splitName[secondToLast] : ''\n }\n\n function getCurrentCulture () {\n const culture = document.documentElement.getAttribute('data-culture')\n if (!culture) {\n return 'en' // Fallback to 'en' if no culture is set\n }\n\n return culture.split('-')[0]\n }\n\n return {\n registerEventListeners,\n updateForm,\n submitForm\n }\n}())\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","export const AppName = 'LeShuttle'\nexport class Logger {\n constructor (context, level) {\n // 1: Error, 2: Warning, 3: info, 4: Log\n this.level = typeof level === 'undefined' ? 4 : level\n\n this.prefix = `${AppName} | ${context} | `\n }\n\n hasNativeSupport () {\n return typeof console !== 'undefined'\n }\n\n formatMessage (message) {\n return this.prefix + message\n }\n\n error (message) {\n if (this.level > 0 && this.hasNativeSupport()) {\n console.error(this.formatMessage(message))\n }\n }\n\n warn (message) {\n if (this.level > 1 && this.hasNativeSupport()) {\n console.warn(this.formatMessage(message))\n }\n }\n\n info (message) {\n if (this.level > 2 && this.hasNativeSupport()) {\n console.info(this.formatMessage(message))\n }\n }\n\n log (message) {\n if (this.level > 3 && this.hasNativeSupport()) {\n console.log(this.formatMessage(message))\n }\n }\n}\n","const getSVG = function (svgUrl, logger) {\n const options = {\n method: 'GET',\n credentials: 'same-origin'\n }\n\n return fetch(svgUrl, options)\n .then(function (response) {\n logger.log('processing spritesheet response')\n return response.text()\n })\n .then(function (svg) {\n logger.log('removing XML doctype')\n return svg.replace('<?xml version=\"1.0\" encoding=\"utf-8\"?>', '')\n })\n}\n\nexport default {\n getSVG\n}\n","// <copyright file=\"SVGLoader.js\" company=\"Crafted Media Ltd.\">\n// Copyright (c) Crafted Media Ltd. All rights reserved.\n// Created by Chris Warnes\n// </copyright>\n\nimport { Logger } from './Logger'\nimport svgService from '../services/svgService'\n\nclass SVGLoader {\n constructor (elem) {\n this.svgUrl = elem.getAttribute('data-src')\n this.parent = elem\n this.logger = new Logger('SVG Loader')\n this.service = svgService\n\n this.logger.log('initialising SVG Loader')\n }\n\n load () {\n this.logger.log('Retrieving svg symbols.')\n const self = this\n return this.service.getSVG(this.svgUrl, this.logger)\n .then(function (svgs) {\n self.loadSVGs(svgs)\n }, function (err) {\n self.logger.error(`sprite sheet failed to load with error: ${err}`)\n })\n .catch(function (error) {\n self.logger.error(`sprite sheet failed to load with error: ${error}`)\n })\n }\n\n loadSVGs (svgs) {\n this.parent.innerHTML = svgs\n\n if (this.parent.firstChild.tagName.toLowerCase() === 'svg') {\n this.parent.firstChild.setAttribute('version', '1.1')\n } else {\n this.parent.innerHTML = ''\n this.logger.error('data expected from sprite sheet was not in the correct format.')\n }\n this.logger.log('spritesheet loaded')\n }\n}\n\nconst loadSprites = function () {\n const sprites = document.querySelectorAll('.svg-symbols')\n\n for (const sprite of sprites) {\n const loader = new SVGLoader(sprite)\n loader.load()\n }\n}\n\nexport {\n SVGLoader,\n loadSprites\n}\n","// Provides a method for preventing body scroll when key events occur - such as opening dialogues, activating menus and so forth.\n\nconst lockClass = 'body-lock'\n\nconst bodyHtml = document.querySelectorAll('body, html')\n\nconst stopBodyScroll = (dataLockAttribute = '') => {\n if (!document.body.classList.contains(lockClass)) {\n document.body.style.top = `-${window.scrollY}px`\n document.body.style.height = `calc(100vh + ${window.scrollY}px)`\n document.body.classList.add(lockClass)\n document.body.style.position = 'fixed'\n document.body.style.overflow = 'hidden'\n window.scrollTo(0, parseInt(window.scrollY || '0') * -1)\n if (dataLockAttribute !== '') {\n document.body.setAttribute('data-lock', dataLockAttribute)\n }\n }\n}\n\nconst allowBodyScroll = (timeout = 500) => {\n for (const elem of bodyHtml) {\n elem.style.scrollBehavior = 'auto'\n }\n setTimeout(() => {\n if (document.body.classList.contains(lockClass)) {\n document.body.classList.remove(lockClass)\n const scrollY = document.body.style.top\n document.body.style.position = ''\n document.body.style.top = ''\n document.body.style.height = ''\n document.body.style.overflow = ''\n document.body.removeAttribute('data-lock')\n\n window.scrollTo({\n top: parseInt(scrollY || '0') * -1,\n left: 0,\n behavior: 'auto'\n })\n }\n for (const elem of bodyHtml) {\n elem.style.removeProperty('scroll-behavior')\n }\n }, timeout)\n}\n\nexport {\n stopBodyScroll,\n allowBodyScroll\n}\n","const openClass = 'overlay--open'\n\n// A class to add an overlay background to the page. Used by offcanvas menus for example.\nexport class Overlay {\n constructor (extraClass = '') {\n this.elem = document.createElement('div')\n this.elem.classList.add('overlay')\n if (extraClass) {\n this.elem.classList.add(extraClass)\n }\n\n // this.elem2 = document.createElement('div')\n // this.elem2.classList.add('overlay', 'overlay--blur')\n\n // document.body.insertBefore(this.elem2, document.body.childNodes[0])\n document.body.insertBefore(this.elem, document.body.childNodes[0])\n }\n\n open () {\n requestAnimationFrame(() => {\n this.elem.classList.add(openClass)\n // this.elem2.classList.add(openClass)\n })\n }\n\n close () {\n requestAnimationFrame(() => {\n this.elem.classList.remove(openClass)\n // this.elem2.classList.remove(openClass)\n })\n }\n}\n","// full focussable list (extend line 29 as required for the project)\n// 'a, button, input, textarea, select, details, iframe, embed, object, summary dialog, audio[controls], video[controls], [contenteditable], [tabindex]'\n\nfunction keyDownListener (elem, keyCode, func, shiftKey = false, prevent = true) {\n elem.addEventListener('keydown', (e) => {\n if (e.keyCode === keyCode && e.shiftKey === shiftKey) {\n func()\n if (prevent) {\n e.preventDefault()\n }\n }\n })\n}\n\n// A class to provide focus to popup elements when context is switched.\nclass Focusable {\n constructor (elem, setup = false) {\n this.elem = elem\n this.eventsAttached = false\n\n if (setup === true) {\n this.setup()\n }\n }\n\n get all () {\n return [\n ...this.elem.querySelectorAll(\n 'a, button, input, textarea, select, detail, summary'\n )\n ].filter(el => {\n return (\n !el.hasAttribute('disabled') &&\n !el.hasAttribute('hidden') &&\n window.getComputedStyle(el).getPropertyValue('display') !== 'none'\n )\n })\n }\n\n get keyboardOnly () {\n return this.all.filter(el => el.tabIndex > -1)\n }\n\n get firstFocusable () {\n return this.keyboardOnly[0]\n }\n\n get lastFocusable () {\n return this.keyboardOnly[this.length - 1]\n }\n\n get length () {\n return this.keyboardOnly.length\n }\n\n focusFirst () {\n this.firstFocusable.focus()\n }\n\n focusLast () {\n this.lastFocusable.focus()\n }\n\n setup () {\n if (!this.eventsAttached) {\n // Tab\n keyDownListener(this.lastFocusable, 9, () => {\n this.focusFirst()\n })\n\n // Shift Tab\n keyDownListener(this.firstFocusable, 9, () => this.focusLast(), true)\n\n // Home key\n keyDownListener(this.elem, 36, () => this.focusFirst(), false)\n\n // End key\n keyDownListener(this.elem, 35, () => this.focusLast(), false)\n this.eventsAttached = true\n }\n }\n\n onEscape (func) {\n keyDownListener(this.elem, 27, func, false, false)\n }\n}\n\nexport {\n Focusable\n}\n","// $small-break: 375px;\n// $medium-break: 834px;\n// $large-break: 1280px;\n// $extra-large-break: 1536px;\n// $extra-extra-large-break: 1920px;\n\nconst mobileDownQuery = window.matchMedia('(max-width: 833px)')\nconst tabletDownQuery = window.matchMedia('(max-width: 1279px)')\nconst tabletQuery = window.matchMedia('(min-width: 834px)')\nconst desktopQuery = window.matchMedia('(min-width: 1280px)')\nconst largeTouchDeviceQuery = window.matchMedia('(hover: none) and (min-width: 1280px)')\nconst touchDeviceQuery = window.matchMedia('(pointer: coarse)')\n\nconst isMobileDown = function () {\n return mobileDownQuery.matches\n}\n\nconst isTablet = function () {\n return tabletQuery.matches\n}\n\nconst isTabletDown = function () {\n return tabletDownQuery.matches\n}\n\nconst isDesktop = function () {\n return desktopQuery.matches\n}\n\nconst isLargeTouchDevice = function () {\n return largeTouchDeviceQuery.matches\n}\n\nconst isTouchDevice = function () {\n return touchDeviceQuery.matches\n}\n\nconst getSize = function () {\n if (isDesktop()) {\n return 'Desktop'\n }\n if (isTablet()) {\n return 'Tablet'\n }\n return 'Mobile'\n}\n\nexport {\n mobileDownQuery,\n tabletQuery,\n tabletDownQuery,\n desktopQuery,\n largeTouchDeviceQuery,\n isMobileDown,\n isTablet,\n isTabletDown,\n isDesktop,\n getSize,\n isLargeTouchDevice,\n isTouchDevice\n}\n","import { stopBodyScroll, allowBodyScroll } from '../controls/controlBodyScroll'\nimport { Overlay } from './overlay'\nimport { Focusable } from '../../accessibility/focusable'\nimport { isTouchDevice } from '../../utilities/MediaQueries.js'\n\n// eslint-disable-next-line no-unused-vars\n// const resizeDB = new EventDebouncer('resize', 'optimised-resize')\n// eslint-disable-next-line no-unused-vars\n// const scrollDB = new EventDebouncer('scroll', 'optimised-scroll')\n\nconst openClass = 'offcanvas--open'\nconst lockClass = 'body-lock'\nconst togglerOpenedAttr = 'data-opened'\n\n// A class to handle the opening and closing of off canvas elements.\n// Bindings, buttons, state and overlays are applied here.\nexport class OffCanvas {\n constructor (elem) {\n this.elem = elem\n this.id = this.elem.id\n this.isOpen = this.elem.classList.contains(openClass)\n this.setAria()\n this.vh = 0\n this.offsetLeft = 0\n this.offsetTop = 0\n this.focusState = new Focusable(elem)\n // this.aspect = this.elem.getAttribute('data-aspect') || 'height' // 'height' or 'width'\n\n this.focusState.onEscape(() => this.close())\n\n // Optionally create an overlay for this offcanvas.\n if (this.elem.hasAttribute('data-overlay')) {\n const overlayClass = this.elem.getAttribute('data-overlay-class')\n this.overlay = new Overlay(overlayClass)\n\n this.overlay.elem.addEventListener('click', (e) => {\n this.close()\n })\n } else {\n this.overlay = false\n }\n\n this.toggler = null\n\n // Find all elements that close this offcanvas.\n const closers = document.querySelectorAll(`[data-close],[data-close*=\"${this.id}\"]`)\n\n // Find all elements that toggle this offcanvas.\n this.togglers = document.querySelectorAll(`[data-offcanvas-toggle='${this.id}']`)\n\n for (const closer of closers) {\n closer.addEventListener('click', (e) => {\n e.preventDefault()\n this.close()\n }, true)\n }\n\n // Open or close this off canvas.\n for (const toggler of this.togglers) {\n toggler.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (!this.isOpen) {\n if (toggler.dataset && toggler.dataset.offcanvasOffset) {\n this.offsetLeft = parseInt(toggler.getBoundingClientRect().left) - 16\n this.offsetTop = parseInt(toggler.getBoundingClientRect().bottom)\n } else {\n this.offsetLeft = 0\n this.offsetTop = 0\n }\n toggler.setAttribute(togglerOpenedAttr, '')\n toggler.setAttribute('aria-expanded', 'true')\n this.toggler = toggler\n } else {\n toggler.setAttribute('aria-expanded', 'false')\n }\n this.toggle()\n }, true)\n }\n\n this.elem.addEventListener('click', (e) => {\n e.stopPropagation()\n document.dispatchEvent(new CustomEvent('close-multi-select', { detail: { target: e.target } }))\n }, false)\n\n document.addEventListener('click', (e) => {\n const linkedID = e.target.getAttribute('data-dialog-close')\n if (linkedID && linkedID !== 'SiteSearch') {\n this.close()\n }\n }, false)\n\n this.elem.addEventListener('offcanvas--close', (e) => {\n this.close()\n })\n\n // this.setupSizing()\n }\n\n setFocussable () {\n\n }\n\n /*\n Variable sizing - uncomment to re-enable.\n setupSizing () {\n if (window.matchMedia('(max-width: 1200px)').matches) {\n if (this.aspect === 'width') {\n this.setWidth()\n } else {\n this.setHeight()\n }\n if (window.addEventListener) {\n window.addEventListener('optimised-resize', () => this.setHeight())\n window.addEventListener('orientationchange', () => this.setHeight())\n window.addEventListener('optimised-scroll', () => this.setHeight())\n }\n }\n }\n\n setHeight () {\n const vh = window.innerHeight * 0.01\n\n if (this.vh !== vh) {\n this.vh = vh\n this.elem.style.setProperty('--vh', `${vh}px`)\n }\n }\n\n setWidth () {\n const vw = window.innerHeight * 0.01\n\n if (this.vw !== vw) {\n this.vw = vw\n this.elem.style.setProperty('--vw', `${vw}px`)\n }\n }\n*/\n\n // Handles opening and setup. State updated.\n open () {\n if (!this.isOpen) {\n if (this.offsetLeft !== 0) {\n this.elem.style.left = `${this.offsetLeft}px`\n }\n if (this.offsetTop !== 0) {\n this.elem.style.top = `${this.offsetTop + 8}px`\n this.overlay.elem.style.top = `${this.offsetTop}px`\n }\n if (this.elem.scrollTo) {\n this.elem.scrollTo(0, 0)\n }\n\n if (this.overlay) {\n this.overlay.open()\n }\n\n requestAnimationFrame(() => {\n this.elem.classList.add(openClass)\n this.isOpen = true\n this.setAria()\n stopBodyScroll()\n setTimeout(() => {\n this.focusState.setup()\n if (!isTouchDevice()) {\n this.focusState.focusFirst()\n }\n }, 500)\n })\n }\n }\n\n // Handles closing and cleanup. State is updated.\n close () {\n if (this.overlay) {\n this.overlay.close()\n }\n\n this.elem.dispatchEvent(new CustomEvent('offcanvas:closing'))\n\n if (this.elem.classList.contains(openClass)) {\n requestAnimationFrame(() => {\n this.elem.classList.remove(openClass)\n this.isOpen = false\n this.setAria()\n if (this.toggler) {\n if (!isTouchDevice()) {\n this.toggler.focus()\n }\n this.toggler = null\n }\n })\n\n for (const toggler of this.togglers) {\n if (toggler.hasAttribute(togglerOpenedAttr)) {\n toggler.removeAttribute(togglerOpenedAttr)\n }\n }\n }\n\n setTimeout(() => {\n const openCanvas = document.querySelector(`.${openClass}`)\n\n if (openCanvas === null && (document.body.classList.contains(lockClass))) {\n console.log('close offcanvas')\n allowBodyScroll()\n }\n }, 50)\n }\n\n setAria () {\n if (this.isOpen) {\n this.elem.setAttribute('aria-hidden', 'false')\n } else {\n this.elem.setAttribute('aria-hidden', 'true')\n }\n }\n\n toggle () {\n if (this.isOpen) {\n this.close()\n } else {\n this.open()\n }\n }\n}\n\nexport function loadOffcanvas () {\n const elems = document.querySelectorAll('[data-offcanvas]')\n const offCanvases = []\n\n for (const element of elems) {\n offCanvases.push(new OffCanvas(element))\n }\n\n return offCanvases\n}\n","// A class to handle the opening and closing of accordions. Key bindings, aria attributes and instantiation are all handled.\nexport class Accordion {\n constructor (elem) {\n this.elem = elem\n this.panels = elem.querySelectorAll('details')\n this.allowMultiple = elem.hasAttribute('data-allow-multiple')\n this.setupEvents()\n }\n\n setupEvents () {\n for (const panel of this.panels) {\n const summary = panel.querySelector('summary')\n\n summary.addEventListener('click', () => {\n if (!this.isOpen(panel) && !this.allowMultiple) {\n this.closeOthers(panel)\n }\n })\n\n summary.addEventListener('keydown', (event) => {\n const key = event.which.toString()\n if (key.match(/38|40|35|36/)) {\n switch (key) {\n // Home key\n case '36':\n this.focusPanel(0)\n break\n // End key\n case '35':\n this.focusPanel(this.panels.length - 1)\n break\n // ArrowUp key\n case '38':\n this.focusPanel(this.getPanelIndex(panel) - 1)\n break\n // ArrowDown key\n case '40':\n this.focusPanel(this.getPanelIndex(panel) + 1)\n break\n }\n event.preventDefault()\n }\n })\n }\n }\n\n getPanelIndex (panel) {\n return Array.prototype.indexOf.call(this.panels, panel)\n }\n\n focusPanel (index) {\n if (index < this.panels.length && index >= 0) {\n const panel = this.panels[index]\n const summary = panel.querySelector('summary')\n summary.focus()\n }\n }\n\n isOpen (panel) {\n return panel.hasAttribute('open')\n }\n\n closeOthers (panel) {\n for (const pnl of this.panels) {\n if (pnl !== panel) {\n pnl.removeAttribute('open')\n }\n }\n }\n}\n\nexport const setupAccordions = function (parent) {\n const elems = parent.querySelectorAll('.accordion')\n\n const accordions = []\n\n for (const elem of elems) {\n accordions.push(new Accordion(elem))\n }\n\n return accordions\n}\n","const defaultConfig = {\n exitDelay: 400,\n interval: 100,\n sensitivity: 7\n}\n\n// A Class to provide hoverIntent functionality to a set of elements. Prevents mouse over from over-firing, or firing too eagerly.\n\nexport class HoverIntent {\n constructor (elements, userConfig) {\n this.config = this.combineConfig(userConfig)\n this.currX = 0\n this.currY = 0\n this.prevX = 0\n this.prevY = 0\n this.allElems = elements\n this.pollTimer = ''\n this.exitTimer = ''\n this.init()\n }\n\n combineConfig (userConfig) {\n const result = defaultConfig\n for (const i in userConfig) {\n result[i] = userConfig[i]\n }\n return result\n }\n\n mouseTrack (ev) {\n this.currX = ev.pageX\n this.currY = ev.pageY\n }\n\n mouseCompare = (targetElem) => {\n const distX = this.prevX - this.currX\n const distY = this.prevY - this.currY\n const distance = Math.sqrt(distX * distX + distY * distY)\n\n if (distance < this.config.sensitivity) {\n // if we re-entered an element, cancel delayed exit and clear any active elements immediately\n clearTimeout(this.exitTimer)\n for (const elem of this.allElems) {\n if (elem.isActive) {\n this.config.onExit(elem)\n elem.isActive = false\n }\n }\n\n // trigger hover\n this.config.onEnter(targetElem)\n targetElem.isActive = true\n } else {\n // update previous coordinates and try again later\n this.prevX = this.currX\n this.prevY = this.currY\n this.pollTimer = setTimeout(() => {\n this.mouseCompare(targetElem)\n }, this.config.interval)\n }\n }\n\n init () {\n for (const elem of this.allElems) {\n elem.isActive = false\n elem.addEventListener('mousemove', this.mouseTrack)\n elem.addEventListener('mouseenter', (ev) => {\n this.prevX = ev.pageX\n this.prevY = ev.pageY\n if (elem.isActive) {\n clearTimeout(this.exitTimer)\n return\n }\n this.pollTimer = setTimeout(() => {\n this.mouseCompare(elem)\n }, this.config.interval)\n })\n elem.addEventListener('mouseleave', (ev) => {\n clearTimeout(this.pollTimer)\n if (!elem.isActive) {\n return\n }\n this.exitTimer = setTimeout(() => {\n this.config.onExit(elem, ev)\n elem.isActive = false\n }, this.config.exitDelay)\n })\n }\n }\n}\n\nexport function setupHoverIntent (elements, userConfig) {\n const hoverIntents = []\n hoverIntents.push(new HoverIntent(elements, userConfig))\n\n return hoverIntents\n}\n","import { Overlay } from '../patterns/overlay'\nimport { Focusable } from '../../accessibility/focusable'\nimport { stopBodyScroll, allowBodyScroll } from '../controls/controlBodyScroll'\nimport { setupHoverIntent } from '../../utilities/HoverIntent'\nimport { isDesktop, isLargeTouchDevice } from '../../utilities/MediaQueries.js'\n\nconst openClass = 'hdr-bar__link-open'\nconst menuOpenClass = 'offcanvas--sub-menus-open'\n\n// A class to handle the opening and closing of off canvas elements via flyout menu.\n// Hover intent is used to trigger dialog opening.\nexport class FlyoutDelegates {\n constructor (elem) {\n this.elem = elem\n\n this.togglers = this.elem.querySelectorAll('[data-flyout-toggle=\"true\"]')\n this.toggleElements = []\n this.lastClicked = {}\n this.header = document.getElementById('Header')\n\n this.mainMenu = document.getElementById('leshuttle-menu')\n this.overlay = new Overlay('overlay--desktop-mm')\n\n this.mainMenu.addEventListener('mouseleave', (e) => {\n if (isDesktop()) {\n this.timer = setTimeout(() => {\n this.closeOtherDelegates('ALL')\n this.closeMenu(false)\n }, 100)\n }\n })\n\n for (const toggler of this.togglers) {\n const toggleElem = {}\n toggleElem.elem = toggler\n toggleElem.open = false\n toggleElem.controlId = toggler.getAttribute('aria-controls')\n toggleElem.target = document.getElementById(toggleElem.controlId)\n toggleElem.menu = toggleElem.target.querySelector('.sub-menu')\n toggleElem.summary = toggleElem.target.querySelector('summary')\n toggleElem.focusState = new Focusable(toggleElem.menu, true)\n toggleElem.focusState.onEscape(() => this.closeMenu())\n this.toggleElements.push(toggleElem)\n\n toggler.addEventListener('click', (e) => {\n if (isLargeTouchDevice()) {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n }\n\n for (const toggler of this.toggleElements) {\n toggler.elem.addEventListener('keydown', (e) => {\n clearTimeout(this.timer)\n if (e.keyCode === 13) {\n e.preventDefault()\n e.stopPropagation()\n this.toggle(toggler)\n setTimeout(() => {\n toggler.focusState.focusFirst()\n }, 100)\n }\n })\n\n const elems = []\n elems.push(toggler.elem)\n\n setupHoverIntent(elems, {\n // required parameters\n onEnter: (targetItem) => {\n this.openByButton(targetItem)\n },\n onExit: (targetItem, event) => {\n // Create timeout that can be cancelled to close the menu.\n this.closeByButton(targetItem, event)\n },\n exitDelay: 400,\n interval: 100,\n sensitivity: 7\n })\n\n /* toggler.elem.addEventListener('mouseover', (e) => {\n if (toggler.open === false) {\n this.mainMenu.style.top = `${this.header.getBoundingClientRect().bottom}px`\n this.overlay.elem.style.top = `${this.header.getBoundingClientRect().bottom}px`\n e.preventDefault()\n e.stopPropagation()\n this.toggle(toggler)\n }\n }) */\n }\n }\n\n mainMenuOpen () {\n return this.mainMenu.classList.contains(menuOpenClass)\n }\n\n openMenu () {\n requestAnimationFrame(() => {\n stopBodyScroll()\n this.mainMenu.classList.add(menuOpenClass)\n this.overlay.open()\n this.mainMenu.setAttribute('aria-hidden', 'false')\n })\n }\n\n closeMenu (refocus = true) {\n requestAnimationFrame(() => {\n this.allowScrollTimer = setTimeout(() => {\n allowBodyScroll()\n }, 300)\n this.mainMenu.classList.remove(menuOpenClass)\n this.overlay.close()\n this.mainMenu.setAttribute('aria-hidden', 'true')\n if (refocus && typeof (this.lastClicked.elem) !== 'undefined') {\n this.lastClicked.elem.focus()\n }\n })\n }\n\n toggleOpen (toggler) {\n if (toggler.open === false) {\n this.mainMenu.style.top = `${this.header.getBoundingClientRect().bottom}px`\n this.overlay.elem.style.top = `${this.header.getBoundingClientRect().bottom}px`\n toggler.preventDefault()\n toggler.stopPropagation()\n this.toggle(toggler)\n }\n }\n\n delegateOpen (toggler) {\n return toggler.target.hasAttribute('open')\n }\n\n openDelegate (toggler) {\n toggler.open = true\n this.lastClicked = toggler\n toggler.elem.classList.add(openClass)\n }\n\n closeDelegate (toggler) {\n toggler.open = false\n toggler.elem.classList.remove(openClass)\n toggler.target.removeAttribute('open')\n }\n\n closeOtherDelegates (toggler) {\n for (const everyToggler of this.toggleElements) {\n if (everyToggler !== toggler && everyToggler.open) {\n this.closeDelegate(everyToggler)\n }\n }\n }\n\n openByButton (toggleButton) {\n stopBodyScroll()\n clearTimeout(this.timer)\n clearTimeout(this.allowScrollTimer)\n const activeElem = toggleButton.getAttribute('aria-controls')\n const toggler = this.toggleElements.find(tgl => tgl.controlId === activeElem)\n if (toggler.open === false) {\n this.mainMenu.style.top = `${this.header.getBoundingClientRect().bottom}px`\n this.overlay.elem.style.top = `${this.header.getBoundingClientRect().bottom}px`\n this.toggle(toggler)\n }\n }\n\n closeByButton (toggleButton, event) {\n const activeElem = toggleButton.getAttribute('aria-controls')\n const toggler = this.toggleElements.find(tgl => tgl.controlId === activeElem)\n if (toggler.open) {\n if (!this.isMouseOverElement(event)) {\n toggler.open = false\n toggler.elem.classList.remove(openClass)\n toggler.target.removeAttribute('open')\n this.closeMenu(false)\n }\n }\n }\n\n toggle (toggler) {\n // is this menu open?\n this.closeOtherDelegates(toggler)\n if (this.delegateOpen(toggler)) {\n this.closeMenu()\n this.closeDelegate(toggler)\n toggler.summary.click()\n } else {\n this.openMenu()\n\n if (this.delegateOpen(toggler) === false) {\n this.openDelegate(toggler)\n toggler.summary.click()\n }\n }\n }\n\n isMouseOverElement (event) {\n // Get a reference to the element by its ID\n const element = document.getElementById('leshuttle-menu')\n\n if (!element) {\n // Element with the specified ID does not exist\n return false\n }\n // Get the position of the element's bounding box\n const elementRect = element.getBoundingClientRect()\n\n // Get the mouse's current position from the event object\n const mouseX = event.clientX\n const mouseY = event.clientY\n\n // Check if the mouse is within the element's bounding box\n if (\n mouseX >= elementRect.left &&\n mouseX <= elementRect.right &&\n mouseY >= (elementRect.top - 10) &&\n mouseY <= (elementRect.bottom + 10)\n ) {\n // Mouse is over the element\n return true\n }\n\n // Mouse is not over the element\n return false\n }\n}\n\nexport function loadFlyoutDelegates () {\n const elems = document.querySelectorAll('[data-flyout-togglers=\"true\"]')\n const flyoutDelegates = []\n\n for (const element of elems) {\n flyoutDelegates.push(new FlyoutDelegates(element))\n // setupHoverIntent(elems, )\n }\n\n return flyoutDelegates\n}\n","export var HOOKS = [\n \"onChange\",\n \"onClose\",\n \"onDayCreate\",\n \"onDestroy\",\n \"onKeyDown\",\n \"onMonthChange\",\n \"onOpen\",\n \"onParseConfig\",\n \"onReady\",\n \"onValueUpdate\",\n \"onYearChange\",\n \"onPreCalendarPosition\",\n];\nexport var defaults = {\n _disable: [],\n allowInput: false,\n allowInvalidPreload: false,\n altFormat: \"F j, Y\",\n altInput: false,\n altInputClass: \"form-control input\",\n animate: typeof window === \"object\" &&\n window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n ariaDateFormat: \"F j, Y\",\n autoFillDefaultTime: true,\n clickOpens: true,\n closeOnSelect: true,\n conjunction: \", \",\n dateFormat: \"Y-m-d\",\n defaultHour: 12,\n defaultMinute: 0,\n defaultSeconds: 0,\n disable: [],\n disableMobile: false,\n enableSeconds: false,\n enableTime: false,\n errorHandler: function (err) {\n return typeof console !== \"undefined\" && console.warn(err);\n },\n getWeek: function (givenDate) {\n var date = new Date(givenDate.getTime());\n date.setHours(0, 0, 0, 0);\n date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\n var week1 = new Date(date.getFullYear(), 0, 4);\n return (1 +\n Math.round(((date.getTime() - week1.getTime()) / 86400000 -\n 3 +\n ((week1.getDay() + 6) % 7)) /\n 7));\n },\n hourIncrement: 1,\n ignoredFocusElements: [],\n inline: false,\n locale: \"default\",\n minuteIncrement: 5,\n mode: \"single\",\n monthSelectorType: \"dropdown\",\n nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n noCalendar: false,\n now: new Date(),\n onChange: [],\n onClose: [],\n onDayCreate: [],\n onDestroy: [],\n onKeyDown: [],\n onMonthChange: [],\n onOpen: [],\n onParseConfig: [],\n onReady: [],\n onValueUpdate: [],\n onYearChange: [],\n onPreCalendarPosition: [],\n plugins: [],\n position: \"auto\",\n positionElement: undefined,\n prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n shorthandCurrentMonth: false,\n showMonths: 1,\n static: false,\n time_24hr: false,\n weekNumbers: false,\n wrap: false,\n};\n","export var english = {\n weekdays: {\n shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n longhand: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n },\n months: {\n shorthand: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n longhand: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n },\n daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n firstDayOfWeek: 0,\n ordinal: function (nth) {\n var s = nth % 100;\n if (s > 3 && s < 21)\n return \"th\";\n switch (s % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n },\n rangeSeparator: \" to \",\n weekAbbreviation: \"Wk\",\n scrollTitle: \"Scroll to increment\",\n toggleTitle: \"Click to toggle\",\n amPM: [\"AM\", \"PM\"],\n yearAriaLabel: \"Year\",\n monthAriaLabel: \"Month\",\n hourAriaLabel: \"Hour\",\n minuteAriaLabel: \"Minute\",\n time_24hr: false,\n};\nexport default english;\n","export var pad = function (number, length) {\n if (length === void 0) { length = 2; }\n return (\"000\" + number).slice(length * -1);\n};\nexport var int = function (bool) { return (bool === true ? 1 : 0); };\nexport function debounce(fn, wait) {\n var t;\n return function () {\n var _this = this;\n var args = arguments;\n clearTimeout(t);\n t = setTimeout(function () { return fn.apply(_this, args); }, wait);\n };\n}\nexport var arrayify = function (obj) {\n return obj instanceof Array ? obj : [obj];\n};\n","export function toggleClass(elem, className, bool) {\n if (bool === true)\n return elem.classList.add(className);\n elem.classList.remove(className);\n}\nexport function createElement(tag, className, content) {\n var e = window.document.createElement(tag);\n className = className || \"\";\n content = content || \"\";\n e.className = className;\n if (content !== undefined)\n e.textContent = content;\n return e;\n}\nexport function clearNode(node) {\n while (node.firstChild)\n node.removeChild(node.firstChild);\n}\nexport function findParent(node, condition) {\n if (condition(node))\n return node;\n else if (node.parentNode)\n return findParent(node.parentNode, condition);\n return undefined;\n}\nexport function createNumberInput(inputClassName, opts) {\n var wrapper = createElement(\"div\", \"numInputWrapper\"), numInput = createElement(\"input\", \"numInput \" + inputClassName), arrowUp = createElement(\"span\", \"arrowUp\"), arrowDown = createElement(\"span\", \"arrowDown\");\n if (navigator.userAgent.indexOf(\"MSIE 9.0\") === -1) {\n numInput.type = \"number\";\n }\n else {\n numInput.type = \"text\";\n numInput.pattern = \"\\\\d*\";\n }\n if (opts !== undefined)\n for (var key in opts)\n numInput.setAttribute(key, opts[key]);\n wrapper.appendChild(numInput);\n wrapper.appendChild(arrowUp);\n wrapper.appendChild(arrowDown);\n return wrapper;\n}\nexport function getEventTarget(event) {\n try {\n if (typeof event.composedPath === \"function\") {\n var path = event.composedPath();\n return path[0];\n }\n return event.target;\n }\n catch (error) {\n return event.target;\n }\n}\n","import { int, pad } from \"../utils\";\nvar doNothing = function () { return undefined; };\nexport var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\nexport var revFormat = {\n D: doNothing,\n F: function (dateObj, monthName, locale) {\n dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n },\n G: function (dateObj, hour) {\n dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n },\n H: function (dateObj, hour) {\n dateObj.setHours(parseFloat(hour));\n },\n J: function (dateObj, day) {\n dateObj.setDate(parseFloat(day));\n },\n K: function (dateObj, amPM, locale) {\n dateObj.setHours((dateObj.getHours() % 12) +\n 12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n },\n M: function (dateObj, shortMonth, locale) {\n dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n },\n S: function (dateObj, seconds) {\n dateObj.setSeconds(parseFloat(seconds));\n },\n U: function (_, unixSeconds) { return new Date(parseFloat(unixSeconds) * 1000); },\n W: function (dateObj, weekNum, locale) {\n var weekNumber = parseInt(weekNum);\n var date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);\n return date;\n },\n Y: function (dateObj, year) {\n dateObj.setFullYear(parseFloat(year));\n },\n Z: function (_, ISODate) { return new Date(ISODate); },\n d: function (dateObj, day) {\n dateObj.setDate(parseFloat(day));\n },\n h: function (dateObj, hour) {\n dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n },\n i: function (dateObj, minutes) {\n dateObj.setMinutes(parseFloat(minutes));\n },\n j: function (dateObj, day) {\n dateObj.setDate(parseFloat(day));\n },\n l: doNothing,\n m: function (dateObj, month) {\n dateObj.setMonth(parseFloat(month) - 1);\n },\n n: function (dateObj, month) {\n dateObj.setMonth(parseFloat(month) - 1);\n },\n s: function (dateObj, seconds) {\n dateObj.setSeconds(parseFloat(seconds));\n },\n u: function (_, unixMillSeconds) {\n return new Date(parseFloat(unixMillSeconds));\n },\n w: doNothing,\n y: function (dateObj, year) {\n dateObj.setFullYear(2000 + parseFloat(year));\n },\n};\nexport var tokenRegex = {\n D: \"\",\n F: \"\",\n G: \"(\\\\d\\\\d|\\\\d)\",\n H: \"(\\\\d\\\\d|\\\\d)\",\n J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n K: \"\",\n M: \"\",\n S: \"(\\\\d\\\\d|\\\\d)\",\n U: \"(.+)\",\n W: \"(\\\\d\\\\d|\\\\d)\",\n Y: \"(\\\\d{4})\",\n Z: \"(.+)\",\n d: \"(\\\\d\\\\d|\\\\d)\",\n h: \"(\\\\d\\\\d|\\\\d)\",\n i: \"(\\\\d\\\\d|\\\\d)\",\n j: \"(\\\\d\\\\d|\\\\d)\",\n l: \"\",\n m: \"(\\\\d\\\\d|\\\\d)\",\n n: \"(\\\\d\\\\d|\\\\d)\",\n s: \"(\\\\d\\\\d|\\\\d)\",\n u: \"(.+)\",\n w: \"(\\\\d\\\\d|\\\\d)\",\n y: \"(\\\\d{2})\",\n};\nexport var formats = {\n Z: function (date) { return date.toISOString(); },\n D: function (date, locale, options) {\n return locale.weekdays.shorthand[formats.w(date, locale, options)];\n },\n F: function (date, locale, options) {\n return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n },\n G: function (date, locale, options) {\n return pad(formats.h(date, locale, options));\n },\n H: function (date) { return pad(date.getHours()); },\n J: function (date, locale) {\n return locale.ordinal !== undefined\n ? date.getDate() + locale.ordinal(date.getDate())\n : date.getDate();\n },\n K: function (date, locale) { return locale.amPM[int(date.getHours() > 11)]; },\n M: function (date, locale) {\n return monthToStr(date.getMonth(), true, locale);\n },\n S: function (date) { return pad(date.getSeconds()); },\n U: function (date) { return date.getTime() / 1000; },\n W: function (date, _, options) {\n return options.getWeek(date);\n },\n Y: function (date) { return pad(date.getFullYear(), 4); },\n d: function (date) { return pad(date.getDate()); },\n h: function (date) { return (date.getHours() % 12 ? date.getHours() % 12 : 12); },\n i: function (date) { return pad(date.getMinutes()); },\n j: function (date) { return date.getDate(); },\n l: function (date, locale) {\n return locale.weekdays.longhand[date.getDay()];\n },\n m: function (date) { return pad(date.getMonth() + 1); },\n n: function (date) { return date.getMonth() + 1; },\n s: function (date) { return date.getSeconds(); },\n u: function (date) { return date.getTime(); },\n w: function (date) { return date.getDay(); },\n y: function (date) { return String(date.getFullYear()).substring(2); },\n};\n","import { tokenRegex, revFormat, formats, } from \"./formatting\";\nimport { defaults } from \"../types/options\";\nimport { english } from \"../l10n/default\";\nexport var createDateFormatter = function (_a) {\n var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c, _d = _a.isMobile, isMobile = _d === void 0 ? false : _d;\n return function (dateObj, frmt, overrideLocale) {\n var locale = overrideLocale || l10n;\n if (config.formatDate !== undefined && !isMobile) {\n return config.formatDate(dateObj, frmt, locale);\n }\n return frmt\n .split(\"\")\n .map(function (c, i, arr) {\n return formats[c] && arr[i - 1] !== \"\\\\\"\n ? formats[c](dateObj, locale, config)\n : c !== \"\\\\\"\n ? c\n : \"\";\n })\n .join(\"\");\n };\n};\nexport var createDateParser = function (_a) {\n var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;\n return function (date, givenFormat, timeless, customLocale) {\n if (date !== 0 && !date)\n return undefined;\n var locale = customLocale || l10n;\n var parsedDate;\n var dateOrig = date;\n if (date instanceof Date)\n parsedDate = new Date(date.getTime());\n else if (typeof date !== \"string\" &&\n date.toFixed !== undefined)\n parsedDate = new Date(date);\n else if (typeof date === \"string\") {\n var format = givenFormat || (config || defaults).dateFormat;\n var datestr = String(date).trim();\n if (datestr === \"today\") {\n parsedDate = new Date();\n timeless = true;\n }\n else if (config && config.parseDate) {\n parsedDate = config.parseDate(date, format);\n }\n else if (/Z$/.test(datestr) ||\n /GMT$/.test(datestr)) {\n parsedDate = new Date(date);\n }\n else {\n var matched = void 0, ops = [];\n for (var i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n var token = format[i];\n var isBackSlash = token === \"\\\\\";\n var escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n if (tokenRegex[token] && !escaped) {\n regexStr += tokenRegex[token];\n var match = new RegExp(regexStr).exec(date);\n if (match && (matched = true)) {\n ops[token !== \"Y\" ? \"push\" : \"unshift\"]({\n fn: revFormat[token],\n val: match[++matchIndex],\n });\n }\n }\n else if (!isBackSlash)\n regexStr += \".\";\n }\n parsedDate =\n !config || !config.noCalendar\n ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)\n : new Date(new Date().setHours(0, 0, 0, 0));\n ops.forEach(function (_a) {\n var fn = _a.fn, val = _a.val;\n return (parsedDate = fn(parsedDate, val, locale) || parsedDate);\n });\n parsedDate = matched ? parsedDate : undefined;\n }\n }\n if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n config.errorHandler(new Error(\"Invalid date provided: \" + dateOrig));\n return undefined;\n }\n if (timeless === true)\n parsedDate.setHours(0, 0, 0, 0);\n return parsedDate;\n };\n};\nexport function compareDates(date1, date2, timeless) {\n if (timeless === void 0) { timeless = true; }\n if (timeless !== false) {\n return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -\n new Date(date2.getTime()).setHours(0, 0, 0, 0));\n }\n return date1.getTime() - date2.getTime();\n}\nexport function compareTimes(date1, date2) {\n return (3600 * (date1.getHours() - date2.getHours()) +\n 60 * (date1.getMinutes() - date2.getMinutes()) +\n date1.getSeconds() -\n date2.getSeconds());\n}\nexport var isBetween = function (ts, ts1, ts2) {\n return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n};\nexport var calculateSecondsSinceMidnight = function (hours, minutes, seconds) {\n return hours * 3600 + minutes * 60 + seconds;\n};\nexport var parseSeconds = function (secondsSinceMidnight) {\n var hours = Math.floor(secondsSinceMidnight / 3600), minutes = (secondsSinceMidnight - hours * 3600) / 60;\n return [hours, minutes, secondsSinceMidnight - hours * 3600 - minutes * 60];\n};\nexport var duration = {\n DAY: 86400000,\n};\nexport function getDefaultHours(config) {\n var hours = config.defaultHour;\n var minutes = config.defaultMinute;\n var seconds = config.defaultSeconds;\n if (config.minDate !== undefined) {\n var minHour = config.minDate.getHours();\n var minMinutes = config.minDate.getMinutes();\n var minSeconds = config.minDate.getSeconds();\n if (hours < minHour) {\n hours = minHour;\n }\n if (hours === minHour && minutes < minMinutes) {\n minutes = minMinutes;\n }\n if (hours === minHour && minutes === minMinutes && seconds < minSeconds)\n seconds = config.minDate.getSeconds();\n }\n if (config.maxDate !== undefined) {\n var maxHr = config.maxDate.getHours();\n var maxMinutes = config.maxDate.getMinutes();\n hours = Math.min(hours, maxHr);\n if (hours === maxHr)\n minutes = Math.min(maxMinutes, minutes);\n if (hours === maxHr && minutes === maxMinutes)\n seconds = config.maxDate.getSeconds();\n }\n return { hours: hours, minutes: minutes, seconds: seconds };\n}\n","var __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nimport { defaults as defaultOptions, HOOKS, } from \"./types/options\";\nimport English from \"./l10n/default\";\nimport { arrayify, debounce, int, pad } from \"./utils\";\nimport { clearNode, createElement, createNumberInput, findParent, toggleClass, getEventTarget, } from \"./utils/dom\";\nimport { compareDates, createDateParser, createDateFormatter, duration, isBetween, getDefaultHours, calculateSecondsSinceMidnight, parseSeconds, } from \"./utils/dates\";\nimport { tokenRegex, monthToStr } from \"./utils/formatting\";\nimport \"./utils/polyfills\";\nvar DEBOUNCED_CHANGE_MS = 300;\nfunction FlatpickrInstance(element, instanceConfig) {\n var self = {\n config: __assign(__assign({}, defaultOptions), flatpickr.defaultConfig),\n l10n: English,\n };\n self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n self._handlers = [];\n self.pluginElements = [];\n self.loadedPlugins = [];\n self._bind = bind;\n self._setHoursFromDate = setHoursFromDate;\n self._positionCalendar = positionCalendar;\n self.changeMonth = changeMonth;\n self.changeYear = changeYear;\n self.clear = clear;\n self.close = close;\n self.onMouseOver = onMouseOver;\n self._createElement = createElement;\n self.createDay = createDay;\n self.destroy = destroy;\n self.isEnabled = isEnabled;\n self.jumpToDate = jumpToDate;\n self.updateValue = updateValue;\n self.open = open;\n self.redraw = redraw;\n self.set = set;\n self.setDate = setDate;\n self.toggle = toggle;\n function setupHelperFunctions() {\n self.utils = {\n getDaysInMonth: function (month, yr) {\n if (month === void 0) { month = self.currentMonth; }\n if (yr === void 0) { yr = self.currentYear; }\n if (month === 1 && ((yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0))\n return 29;\n return self.l10n.daysInMonth[month];\n },\n };\n }\n function init() {\n self.element = self.input = element;\n self.isOpen = false;\n parseConfig();\n setupLocale();\n setupInputs();\n setupDates();\n setupHelperFunctions();\n if (!self.isMobile)\n build();\n bindEvents();\n if (self.selectedDates.length || self.config.noCalendar) {\n if (self.config.enableTime) {\n setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj : undefined);\n }\n updateValue(false);\n }\n setCalendarWidth();\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n if (!self.isMobile && isSafari) {\n positionCalendar();\n }\n triggerEvent(\"onReady\");\n }\n function getClosestActiveElement() {\n var _a;\n return (((_a = self.calendarContainer) === null || _a === void 0 ? void 0 : _a.getRootNode())\n .activeElement || document.activeElement);\n }\n function bindToInstance(fn) {\n return fn.bind(self);\n }\n function setCalendarWidth() {\n var config = self.config;\n if (config.weekNumbers === false && config.showMonths === 1) {\n return;\n }\n else if (config.noCalendar !== true) {\n window.requestAnimationFrame(function () {\n if (self.calendarContainer !== undefined) {\n self.calendarContainer.style.visibility = \"hidden\";\n self.calendarContainer.style.display = \"block\";\n }\n if (self.daysContainer !== undefined) {\n var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n self.daysContainer.style.width = daysWidth + \"px\";\n self.calendarContainer.style.width =\n daysWidth +\n (self.weekWrapper !== undefined\n ? self.weekWrapper.offsetWidth\n : 0) +\n \"px\";\n self.calendarContainer.style.removeProperty(\"visibility\");\n self.calendarContainer.style.removeProperty(\"display\");\n }\n });\n }\n }\n function updateTime(e) {\n if (self.selectedDates.length === 0) {\n var defaultDate = self.config.minDate === undefined ||\n compareDates(new Date(), self.config.minDate) >= 0\n ? new Date()\n : new Date(self.config.minDate.getTime());\n var defaults = getDefaultHours(self.config);\n defaultDate.setHours(defaults.hours, defaults.minutes, defaults.seconds, defaultDate.getMilliseconds());\n self.selectedDates = [defaultDate];\n self.latestSelectedDateObj = defaultDate;\n }\n if (e !== undefined && e.type !== \"blur\") {\n timeWrapper(e);\n }\n var prevValue = self._input.value;\n setHoursFromInputs();\n updateValue();\n if (self._input.value !== prevValue) {\n self._debouncedChange();\n }\n }\n function ampm2military(hour, amPM) {\n return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);\n }\n function military2ampm(hour) {\n switch (hour % 24) {\n case 0:\n case 12:\n return 12;\n default:\n return hour % 12;\n }\n }\n function setHoursFromInputs() {\n if (self.hourElement === undefined || self.minuteElement === undefined)\n return;\n var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined\n ? (parseInt(self.secondElement.value, 10) || 0) % 60\n : 0;\n if (self.amPM !== undefined) {\n hours = ampm2military(hours, self.amPM.textContent);\n }\n var limitMinHours = self.config.minTime !== undefined ||\n (self.config.minDate &&\n self.minDateHasTime &&\n self.latestSelectedDateObj &&\n compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===\n 0);\n var limitMaxHours = self.config.maxTime !== undefined ||\n (self.config.maxDate &&\n self.maxDateHasTime &&\n self.latestSelectedDateObj &&\n compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===\n 0);\n if (self.config.maxTime !== undefined &&\n self.config.minTime !== undefined &&\n self.config.minTime > self.config.maxTime) {\n var minBound = calculateSecondsSinceMidnight(self.config.minTime.getHours(), self.config.minTime.getMinutes(), self.config.minTime.getSeconds());\n var maxBound = calculateSecondsSinceMidnight(self.config.maxTime.getHours(), self.config.maxTime.getMinutes(), self.config.maxTime.getSeconds());\n var currentTime = calculateSecondsSinceMidnight(hours, minutes, seconds);\n if (currentTime > maxBound && currentTime < minBound) {\n var result = parseSeconds(minBound);\n hours = result[0];\n minutes = result[1];\n seconds = result[2];\n }\n }\n else {\n if (limitMaxHours) {\n var maxTime = self.config.maxTime !== undefined\n ? self.config.maxTime\n : self.config.maxDate;\n hours = Math.min(hours, maxTime.getHours());\n if (hours === maxTime.getHours())\n minutes = Math.min(minutes, maxTime.getMinutes());\n if (minutes === maxTime.getMinutes())\n seconds = Math.min(seconds, maxTime.getSeconds());\n }\n if (limitMinHours) {\n var minTime = self.config.minTime !== undefined\n ? self.config.minTime\n : self.config.minDate;\n hours = Math.max(hours, minTime.getHours());\n if (hours === minTime.getHours() && minutes < minTime.getMinutes())\n minutes = minTime.getMinutes();\n if (minutes === minTime.getMinutes())\n seconds = Math.max(seconds, minTime.getSeconds());\n }\n }\n setHours(hours, minutes, seconds);\n }\n function setHoursFromDate(dateObj) {\n var date = dateObj || self.latestSelectedDateObj;\n if (date && date instanceof Date) {\n setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n }\n }\n function setHours(hours, minutes, seconds) {\n if (self.latestSelectedDateObj !== undefined) {\n self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n }\n if (!self.hourElement || !self.minuteElement || self.isMobile)\n return;\n self.hourElement.value = pad(!self.config.time_24hr\n ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)\n : hours);\n self.minuteElement.value = pad(minutes);\n if (self.amPM !== undefined)\n self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n if (self.secondElement !== undefined)\n self.secondElement.value = pad(seconds);\n }\n function onYearInput(event) {\n var eventTarget = getEventTarget(event);\n var year = parseInt(eventTarget.value) + (event.delta || 0);\n if (year / 1000 > 1 ||\n (event.key === \"Enter\" && !/[^\\d]/.test(year.toString()))) {\n changeYear(year);\n }\n }\n function bind(element, event, handler, options) {\n if (event instanceof Array)\n return event.forEach(function (ev) { return bind(element, ev, handler, options); });\n if (element instanceof Array)\n return element.forEach(function (el) { return bind(el, event, handler, options); });\n element.addEventListener(event, handler, options);\n self._handlers.push({\n remove: function () { return element.removeEventListener(event, handler, options); },\n });\n }\n function triggerChange() {\n triggerEvent(\"onChange\");\n }\n function bindEvents() {\n if (self.config.wrap) {\n [\"open\", \"close\", \"toggle\", \"clear\"].forEach(function (evt) {\n Array.prototype.forEach.call(self.element.querySelectorAll(\"[data-\" + evt + \"]\"), function (el) {\n return bind(el, \"click\", self[evt]);\n });\n });\n }\n if (self.isMobile) {\n setupMobile();\n return;\n }\n var debouncedResize = debounce(onResize, 50);\n self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))\n bind(self.daysContainer, \"mouseover\", function (e) {\n if (self.config.mode === \"range\")\n onMouseOver(getEventTarget(e));\n });\n bind(self._input, \"keydown\", onKeyDown);\n if (self.calendarContainer !== undefined) {\n bind(self.calendarContainer, \"keydown\", onKeyDown);\n }\n if (!self.config.inline && !self.config.static)\n bind(window, \"resize\", debouncedResize);\n if (window.ontouchstart !== undefined)\n bind(window.document, \"touchstart\", documentClick);\n else\n bind(window.document, \"mousedown\", documentClick);\n bind(window.document, \"focus\", documentClick, { capture: true });\n if (self.config.clickOpens === true) {\n bind(self._input, \"focus\", self.open);\n bind(self._input, \"click\", self.open);\n }\n if (self.daysContainer !== undefined) {\n bind(self.monthNav, \"click\", onMonthNavClick);\n bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n bind(self.daysContainer, \"click\", selectDate);\n }\n if (self.timeContainer !== undefined &&\n self.minuteElement !== undefined &&\n self.hourElement !== undefined) {\n var selText = function (e) {\n return getEventTarget(e).select();\n };\n bind(self.timeContainer, [\"increment\"], updateTime);\n bind(self.timeContainer, \"blur\", updateTime, { capture: true });\n bind(self.timeContainer, \"click\", timeIncrement);\n bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n if (self.secondElement !== undefined)\n bind(self.secondElement, \"focus\", function () { return self.secondElement && self.secondElement.select(); });\n if (self.amPM !== undefined) {\n bind(self.amPM, \"click\", function (e) {\n updateTime(e);\n });\n }\n }\n if (self.config.allowInput) {\n bind(self._input, \"blur\", onBlur);\n }\n }\n function jumpToDate(jumpDate, triggerChange) {\n var jumpTo = jumpDate !== undefined\n ? self.parseDate(jumpDate)\n : self.latestSelectedDateObj ||\n (self.config.minDate && self.config.minDate > self.now\n ? self.config.minDate\n : self.config.maxDate && self.config.maxDate < self.now\n ? self.config.maxDate\n : self.now);\n var oldYear = self.currentYear;\n var oldMonth = self.currentMonth;\n try {\n if (jumpTo !== undefined) {\n self.currentYear = jumpTo.getFullYear();\n self.currentMonth = jumpTo.getMonth();\n }\n }\n catch (e) {\n e.message = \"Invalid date supplied: \" + jumpTo;\n self.config.errorHandler(e);\n }\n if (triggerChange && self.currentYear !== oldYear) {\n triggerEvent(\"onYearChange\");\n buildMonthSwitch();\n }\n if (triggerChange &&\n (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {\n triggerEvent(\"onMonthChange\");\n }\n self.redraw();\n }\n function timeIncrement(e) {\n var eventTarget = getEventTarget(e);\n if (~eventTarget.className.indexOf(\"arrow\"))\n incrementNumInput(e, eventTarget.classList.contains(\"arrowUp\") ? 1 : -1);\n }\n function incrementNumInput(e, delta, inputElem) {\n var target = e && getEventTarget(e);\n var input = inputElem ||\n (target && target.parentNode && target.parentNode.firstChild);\n var event = createEvent(\"increment\");\n event.delta = delta;\n input && input.dispatchEvent(event);\n }\n function build() {\n var fragment = window.document.createDocumentFragment();\n self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n self.calendarContainer.tabIndex = -1;\n if (!self.config.noCalendar) {\n fragment.appendChild(buildMonthNav());\n self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n if (self.config.weekNumbers) {\n var _a = buildWeeks(), weekWrapper = _a.weekWrapper, weekNumbers = _a.weekNumbers;\n self.innerContainer.appendChild(weekWrapper);\n self.weekNumbers = weekNumbers;\n self.weekWrapper = weekWrapper;\n }\n self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n self.rContainer.appendChild(buildWeekdays());\n if (!self.daysContainer) {\n self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n self.daysContainer.tabIndex = -1;\n }\n buildDays();\n self.rContainer.appendChild(self.daysContainer);\n self.innerContainer.appendChild(self.rContainer);\n fragment.appendChild(self.innerContainer);\n }\n if (self.config.enableTime) {\n fragment.appendChild(buildTime());\n }\n toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n self.calendarContainer.appendChild(fragment);\n var customAppend = self.config.appendTo !== undefined &&\n self.config.appendTo.nodeType !== undefined;\n if (self.config.inline || self.config.static) {\n self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n if (self.config.inline) {\n if (!customAppend && self.element.parentNode)\n self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);\n else if (self.config.appendTo !== undefined)\n self.config.appendTo.appendChild(self.calendarContainer);\n }\n if (self.config.static) {\n var wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n if (self.element.parentNode)\n self.element.parentNode.insertBefore(wrapper, self.element);\n wrapper.appendChild(self.element);\n if (self.altInput)\n wrapper.appendChild(self.altInput);\n wrapper.appendChild(self.calendarContainer);\n }\n }\n if (!self.config.static && !self.config.inline)\n (self.config.appendTo !== undefined\n ? self.config.appendTo\n : window.document.body).appendChild(self.calendarContainer);\n }\n function createDay(className, date, _dayNumber, i) {\n var dateIsEnabled = isEnabled(date, true), dayElement = createElement(\"span\", className, date.getDate().toString());\n dayElement.dateObj = date;\n dayElement.$i = i;\n dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n if (className.indexOf(\"hidden\") === -1 &&\n compareDates(date, self.now) === 0) {\n self.todayDateElem = dayElement;\n dayElement.classList.add(\"today\");\n dayElement.setAttribute(\"aria-current\", \"date\");\n }\n if (dateIsEnabled) {\n dayElement.tabIndex = -1;\n if (isDateSelected(date)) {\n dayElement.classList.add(\"selected\");\n self.selectedDateElem = dayElement;\n if (self.config.mode === \"range\") {\n toggleClass(dayElement, \"startRange\", self.selectedDates[0] &&\n compareDates(date, self.selectedDates[0], true) === 0);\n toggleClass(dayElement, \"endRange\", self.selectedDates[1] &&\n compareDates(date, self.selectedDates[1], true) === 0);\n if (className === \"nextMonthDay\")\n dayElement.classList.add(\"inRange\");\n }\n }\n }\n else {\n dayElement.classList.add(\"flatpickr-disabled\");\n }\n if (self.config.mode === \"range\") {\n if (isDateInRange(date) && !isDateSelected(date))\n dayElement.classList.add(\"inRange\");\n }\n if (self.weekNumbers &&\n self.config.showMonths === 1 &&\n className !== \"prevMonthDay\" &&\n i % 7 === 6) {\n self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n }\n triggerEvent(\"onDayCreate\", dayElement);\n return dayElement;\n }\n function focusOnDayElem(targetNode) {\n targetNode.focus();\n if (self.config.mode === \"range\")\n onMouseOver(targetNode);\n }\n function getFirstAvailableDay(delta) {\n var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n var endMonth = delta > 0 ? self.config.showMonths : -1;\n for (var m = startMonth; m != endMonth; m += delta) {\n var month = self.daysContainer.children[m];\n var startIndex = delta > 0 ? 0 : month.children.length - 1;\n var endIndex = delta > 0 ? month.children.length : -1;\n for (var i = startIndex; i != endIndex; i += delta) {\n var c = month.children[i];\n if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj))\n return c;\n }\n }\n return undefined;\n }\n function getNextAvailableDay(current, delta) {\n var givenMonth = current.className.indexOf(\"Month\") === -1\n ? current.dateObj.getMonth()\n : self.currentMonth;\n var endMonth = delta > 0 ? self.config.showMonths : -1;\n var loopDelta = delta > 0 ? 1 : -1;\n for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n var month = self.daysContainer.children[m];\n var startIndex = givenMonth - self.currentMonth === m\n ? current.$i + delta\n : delta < 0\n ? month.children.length - 1\n : 0;\n var numMonthDays = month.children.length;\n for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n var c = month.children[i];\n if (c.className.indexOf(\"hidden\") === -1 &&\n isEnabled(c.dateObj) &&\n Math.abs(current.$i - i) >= Math.abs(delta))\n return focusOnDayElem(c);\n }\n }\n self.changeMonth(loopDelta);\n focusOnDay(getFirstAvailableDay(loopDelta), 0);\n return undefined;\n }\n function focusOnDay(current, offset) {\n var activeElement = getClosestActiveElement();\n var dayFocused = isInView(activeElement || document.body);\n var startElem = current !== undefined\n ? current\n : dayFocused\n ? activeElement\n : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)\n ? self.selectedDateElem\n : self.todayDateElem !== undefined && isInView(self.todayDateElem)\n ? self.todayDateElem\n : getFirstAvailableDay(offset > 0 ? 1 : -1);\n if (startElem === undefined) {\n self._input.focus();\n }\n else if (!dayFocused) {\n focusOnDayElem(startElem);\n }\n else {\n getNextAvailableDay(startElem, offset);\n }\n }\n function buildMonthDays(year, month) {\n var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12, year);\n var daysInMonth = self.utils.getDaysInMonth(month, year), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\", nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;\n for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n days.appendChild(createDay(\"flatpickr-day \" + prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n }\n for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n days.appendChild(createDay(\"flatpickr-day\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n }\n for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&\n (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n days.appendChild(createDay(\"flatpickr-day \" + nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n }\n var dayContainer = createElement(\"div\", \"dayContainer\");\n dayContainer.appendChild(days);\n return dayContainer;\n }\n function buildDays() {\n if (self.daysContainer === undefined) {\n return;\n }\n clearNode(self.daysContainer);\n if (self.weekNumbers)\n clearNode(self.weekNumbers);\n var frag = document.createDocumentFragment();\n for (var i = 0; i < self.config.showMonths; i++) {\n var d = new Date(self.currentYear, self.currentMonth, 1);\n d.setMonth(self.currentMonth + i);\n frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n }\n self.daysContainer.appendChild(frag);\n self.days = self.daysContainer.firstChild;\n if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n onMouseOver();\n }\n }\n function buildMonthSwitch() {\n if (self.config.showMonths > 1 ||\n self.config.monthSelectorType !== \"dropdown\")\n return;\n var shouldBuildMonth = function (month) {\n if (self.config.minDate !== undefined &&\n self.currentYear === self.config.minDate.getFullYear() &&\n month < self.config.minDate.getMonth()) {\n return false;\n }\n return !(self.config.maxDate !== undefined &&\n self.currentYear === self.config.maxDate.getFullYear() &&\n month > self.config.maxDate.getMonth());\n };\n self.monthsDropdownContainer.tabIndex = -1;\n self.monthsDropdownContainer.innerHTML = \"\";\n for (var i = 0; i < 12; i++) {\n if (!shouldBuildMonth(i))\n continue;\n var month = createElement(\"option\", \"flatpickr-monthDropdown-month\");\n month.value = new Date(self.currentYear, i).getMonth().toString();\n month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);\n month.tabIndex = -1;\n if (self.currentMonth === i) {\n month.selected = true;\n }\n self.monthsDropdownContainer.appendChild(month);\n }\n }\n function buildMonth() {\n var container = createElement(\"div\", \"flatpickr-month\");\n var monthNavFragment = window.document.createDocumentFragment();\n var monthElement;\n if (self.config.showMonths > 1 ||\n self.config.monthSelectorType === \"static\") {\n monthElement = createElement(\"span\", \"cur-month\");\n }\n else {\n self.monthsDropdownContainer = createElement(\"select\", \"flatpickr-monthDropdown-months\");\n self.monthsDropdownContainer.setAttribute(\"aria-label\", self.l10n.monthAriaLabel);\n bind(self.monthsDropdownContainer, \"change\", function (e) {\n var target = getEventTarget(e);\n var selectedMonth = parseInt(target.value, 10);\n self.changeMonth(selectedMonth - self.currentMonth);\n triggerEvent(\"onMonthChange\");\n });\n buildMonthSwitch();\n monthElement = self.monthsDropdownContainer;\n }\n var yearInput = createNumberInput(\"cur-year\", { tabindex: \"-1\" });\n var yearElement = yearInput.getElementsByTagName(\"input\")[0];\n yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n if (self.config.minDate) {\n yearElement.setAttribute(\"min\", self.config.minDate.getFullYear().toString());\n }\n if (self.config.maxDate) {\n yearElement.setAttribute(\"max\", self.config.maxDate.getFullYear().toString());\n yearElement.disabled =\n !!self.config.minDate &&\n self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n }\n var currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n currentMonth.appendChild(monthElement);\n currentMonth.appendChild(yearInput);\n monthNavFragment.appendChild(currentMonth);\n container.appendChild(monthNavFragment);\n return {\n container: container,\n yearElement: yearElement,\n monthElement: monthElement,\n };\n }\n function buildMonths() {\n clearNode(self.monthNav);\n self.monthNav.appendChild(self.prevMonthNav);\n if (self.config.showMonths) {\n self.yearElements = [];\n self.monthElements = [];\n }\n for (var m = self.config.showMonths; m--;) {\n var month = buildMonth();\n self.yearElements.push(month.yearElement);\n self.monthElements.push(month.monthElement);\n self.monthNav.appendChild(month.container);\n }\n self.monthNav.appendChild(self.nextMonthNav);\n }\n function buildMonthNav() {\n self.monthNav = createElement(\"div\", \"flatpickr-months\");\n self.yearElements = [];\n self.monthElements = [];\n self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n self.prevMonthNav.innerHTML = self.config.prevArrow;\n self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n self.nextMonthNav.innerHTML = self.config.nextArrow;\n buildMonths();\n Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n get: function () { return self.__hidePrevMonthArrow; },\n set: function (bool) {\n if (self.__hidePrevMonthArrow !== bool) {\n toggleClass(self.prevMonthNav, \"flatpickr-disabled\", bool);\n self.__hidePrevMonthArrow = bool;\n }\n },\n });\n Object.defineProperty(self, \"_hideNextMonthArrow\", {\n get: function () { return self.__hideNextMonthArrow; },\n set: function (bool) {\n if (self.__hideNextMonthArrow !== bool) {\n toggleClass(self.nextMonthNav, \"flatpickr-disabled\", bool);\n self.__hideNextMonthArrow = bool;\n }\n },\n });\n self.currentYearElement = self.yearElements[0];\n updateNavigationCurrentMonth();\n return self.monthNav;\n }\n function buildTime() {\n self.calendarContainer.classList.add(\"hasTime\");\n if (self.config.noCalendar)\n self.calendarContainer.classList.add(\"noCalendar\");\n var defaults = getDefaultHours(self.config);\n self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n self.timeContainer.tabIndex = -1;\n var separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n var hourInput = createNumberInput(\"flatpickr-hour\", {\n \"aria-label\": self.l10n.hourAriaLabel,\n });\n self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n var minuteInput = createNumberInput(\"flatpickr-minute\", {\n \"aria-label\": self.l10n.minuteAriaLabel,\n });\n self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n self.hourElement.value = pad(self.latestSelectedDateObj\n ? self.latestSelectedDateObj.getHours()\n : self.config.time_24hr\n ? defaults.hours\n : military2ampm(defaults.hours));\n self.minuteElement.value = pad(self.latestSelectedDateObj\n ? self.latestSelectedDateObj.getMinutes()\n : defaults.minutes);\n self.hourElement.setAttribute(\"step\", self.config.hourIncrement.toString());\n self.minuteElement.setAttribute(\"step\", self.config.minuteIncrement.toString());\n self.hourElement.setAttribute(\"min\", self.config.time_24hr ? \"0\" : \"1\");\n self.hourElement.setAttribute(\"max\", self.config.time_24hr ? \"23\" : \"12\");\n self.hourElement.setAttribute(\"maxlength\", \"2\");\n self.minuteElement.setAttribute(\"min\", \"0\");\n self.minuteElement.setAttribute(\"max\", \"59\");\n self.minuteElement.setAttribute(\"maxlength\", \"2\");\n self.timeContainer.appendChild(hourInput);\n self.timeContainer.appendChild(separator);\n self.timeContainer.appendChild(minuteInput);\n if (self.config.time_24hr)\n self.timeContainer.classList.add(\"time24hr\");\n if (self.config.enableSeconds) {\n self.timeContainer.classList.add(\"hasSeconds\");\n var secondInput = createNumberInput(\"flatpickr-second\");\n self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n self.secondElement.value = pad(self.latestSelectedDateObj\n ? self.latestSelectedDateObj.getSeconds()\n : defaults.seconds);\n self.secondElement.setAttribute(\"step\", self.minuteElement.getAttribute(\"step\"));\n self.secondElement.setAttribute(\"min\", \"0\");\n self.secondElement.setAttribute(\"max\", \"59\");\n self.secondElement.setAttribute(\"maxlength\", \"2\");\n self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n self.timeContainer.appendChild(secondInput);\n }\n if (!self.config.time_24hr) {\n self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj\n ? self.hourElement.value\n : self.config.defaultHour) > 11)]);\n self.amPM.title = self.l10n.toggleTitle;\n self.amPM.tabIndex = -1;\n self.timeContainer.appendChild(self.amPM);\n }\n return self.timeContainer;\n }\n function buildWeekdays() {\n if (!self.weekdayContainer)\n self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");\n else\n clearNode(self.weekdayContainer);\n for (var i = self.config.showMonths; i--;) {\n var container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n self.weekdayContainer.appendChild(container);\n }\n updateWeekdays();\n return self.weekdayContainer;\n }\n function updateWeekdays() {\n if (!self.weekdayContainer) {\n return;\n }\n var firstDayOfWeek = self.l10n.firstDayOfWeek;\n var weekdays = __spreadArrays(self.l10n.weekdays.shorthand);\n if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n weekdays = __spreadArrays(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));\n }\n for (var i = self.config.showMonths; i--;) {\n self.weekdayContainer.children[i].innerHTML = \"\\n <span class='flatpickr-weekday'>\\n \" + weekdays.join(\"</span><span class='flatpickr-weekday'>\") + \"\\n </span>\\n \";\n }\n }\n function buildWeeks() {\n self.calendarContainer.classList.add(\"hasWeeks\");\n var weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n var weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n weekWrapper.appendChild(weekNumbers);\n return {\n weekWrapper: weekWrapper,\n weekNumbers: weekNumbers,\n };\n }\n function changeMonth(value, isOffset) {\n if (isOffset === void 0) { isOffset = true; }\n var delta = isOffset ? value : value - self.currentMonth;\n if ((delta < 0 && self._hidePrevMonthArrow === true) ||\n (delta > 0 && self._hideNextMonthArrow === true))\n return;\n self.currentMonth += delta;\n if (self.currentMonth < 0 || self.currentMonth > 11) {\n self.currentYear += self.currentMonth > 11 ? 1 : -1;\n self.currentMonth = (self.currentMonth + 12) % 12;\n triggerEvent(\"onYearChange\");\n buildMonthSwitch();\n }\n buildDays();\n triggerEvent(\"onMonthChange\");\n updateNavigationCurrentMonth();\n }\n function clear(triggerChangeEvent, toInitial) {\n if (triggerChangeEvent === void 0) { triggerChangeEvent = true; }\n if (toInitial === void 0) { toInitial = true; }\n self.input.value = \"\";\n if (self.altInput !== undefined)\n self.altInput.value = \"\";\n if (self.mobileInput !== undefined)\n self.mobileInput.value = \"\";\n self.selectedDates = [];\n self.latestSelectedDateObj = undefined;\n if (toInitial === true) {\n self.currentYear = self._initialDate.getFullYear();\n self.currentMonth = self._initialDate.getMonth();\n }\n if (self.config.enableTime === true) {\n var _a = getDefaultHours(self.config), hours = _a.hours, minutes = _a.minutes, seconds = _a.seconds;\n setHours(hours, minutes, seconds);\n }\n self.redraw();\n if (triggerChangeEvent)\n triggerEvent(\"onChange\");\n }\n function close() {\n self.isOpen = false;\n if (!self.isMobile) {\n if (self.calendarContainer !== undefined) {\n self.calendarContainer.classList.remove(\"open\");\n }\n if (self._input !== undefined) {\n self._input.classList.remove(\"active\");\n }\n }\n triggerEvent(\"onClose\");\n }\n function destroy() {\n if (self.config !== undefined)\n triggerEvent(\"onDestroy\");\n for (var i = self._handlers.length; i--;) {\n self._handlers[i].remove();\n }\n self._handlers = [];\n if (self.mobileInput) {\n if (self.mobileInput.parentNode)\n self.mobileInput.parentNode.removeChild(self.mobileInput);\n self.mobileInput = undefined;\n }\n else if (self.calendarContainer && self.calendarContainer.parentNode) {\n if (self.config.static && self.calendarContainer.parentNode) {\n var wrapper = self.calendarContainer.parentNode;\n wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n if (wrapper.parentNode) {\n while (wrapper.firstChild)\n wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n wrapper.parentNode.removeChild(wrapper);\n }\n }\n else\n self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n }\n if (self.altInput) {\n self.input.type = \"text\";\n if (self.altInput.parentNode)\n self.altInput.parentNode.removeChild(self.altInput);\n delete self.altInput;\n }\n if (self.input) {\n self.input.type = self.input._type;\n self.input.classList.remove(\"flatpickr-input\");\n self.input.removeAttribute(\"readonly\");\n }\n [\n \"_showTimeInput\",\n \"latestSelectedDateObj\",\n \"_hideNextMonthArrow\",\n \"_hidePrevMonthArrow\",\n \"__hideNextMonthArrow\",\n \"__hidePrevMonthArrow\",\n \"isMobile\",\n \"isOpen\",\n \"selectedDateElem\",\n \"minDateHasTime\",\n \"maxDateHasTime\",\n \"days\",\n \"daysContainer\",\n \"_input\",\n \"_positionElement\",\n \"innerContainer\",\n \"rContainer\",\n \"monthNav\",\n \"todayDateElem\",\n \"calendarContainer\",\n \"weekdayContainer\",\n \"prevMonthNav\",\n \"nextMonthNav\",\n \"monthsDropdownContainer\",\n \"currentMonthElement\",\n \"currentYearElement\",\n \"navigationCurrentMonth\",\n \"selectedDateElem\",\n \"config\",\n ].forEach(function (k) {\n try {\n delete self[k];\n }\n catch (_) { }\n });\n }\n function isCalendarElem(elem) {\n return self.calendarContainer.contains(elem);\n }\n function documentClick(e) {\n if (self.isOpen && !self.config.inline) {\n var eventTarget_1 = getEventTarget(e);\n var isCalendarElement = isCalendarElem(eventTarget_1);\n var isInput = eventTarget_1 === self.input ||\n eventTarget_1 === self.altInput ||\n self.element.contains(eventTarget_1) ||\n (e.path &&\n e.path.indexOf &&\n (~e.path.indexOf(self.input) ||\n ~e.path.indexOf(self.altInput)));\n var lostFocus = !isInput &&\n !isCalendarElement &&\n !isCalendarElem(e.relatedTarget);\n var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {\n return elem.contains(eventTarget_1);\n });\n if (lostFocus && isIgnored) {\n if (self.config.allowInput) {\n self.setDate(self._input.value, false, self.config.altInput\n ? self.config.altFormat\n : self.config.dateFormat);\n }\n if (self.timeContainer !== undefined &&\n self.minuteElement !== undefined &&\n self.hourElement !== undefined &&\n self.input.value !== \"\" &&\n self.input.value !== undefined) {\n updateTime();\n }\n self.close();\n if (self.config &&\n self.config.mode === \"range\" &&\n self.selectedDates.length === 1)\n self.clear(false);\n }\n }\n }\n function changeYear(newYear) {\n if (!newYear ||\n (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||\n (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))\n return;\n var newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;\n self.currentYear = newYearNum || self.currentYear;\n if (self.config.maxDate &&\n self.currentYear === self.config.maxDate.getFullYear()) {\n self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n }\n else if (self.config.minDate &&\n self.currentYear === self.config.minDate.getFullYear()) {\n self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n }\n if (isNewYear) {\n self.redraw();\n triggerEvent(\"onYearChange\");\n buildMonthSwitch();\n }\n }\n function isEnabled(date, timeless) {\n var _a;\n if (timeless === void 0) { timeless = true; }\n var dateToCheck = self.parseDate(date, undefined, timeless);\n if ((self.config.minDate &&\n dateToCheck &&\n compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||\n (self.config.maxDate &&\n dateToCheck &&\n compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))\n return false;\n if (!self.config.enable && self.config.disable.length === 0)\n return true;\n if (dateToCheck === undefined)\n return false;\n var bool = !!self.config.enable, array = (_a = self.config.enable) !== null && _a !== void 0 ? _a : self.config.disable;\n for (var i = 0, d = void 0; i < array.length; i++) {\n d = array[i];\n if (typeof d === \"function\" &&\n d(dateToCheck))\n return bool;\n else if (d instanceof Date &&\n dateToCheck !== undefined &&\n d.getTime() === dateToCheck.getTime())\n return bool;\n else if (typeof d === \"string\") {\n var parsed = self.parseDate(d, undefined, true);\n return parsed && parsed.getTime() === dateToCheck.getTime()\n ? bool\n : !bool;\n }\n else if (typeof d === \"object\" &&\n dateToCheck !== undefined &&\n d.from &&\n d.to &&\n dateToCheck.getTime() >= d.from.getTime() &&\n dateToCheck.getTime() <= d.to.getTime())\n return bool;\n }\n return !bool;\n }\n function isInView(elem) {\n if (self.daysContainer !== undefined)\n return (elem.className.indexOf(\"hidden\") === -1 &&\n elem.className.indexOf(\"flatpickr-disabled\") === -1 &&\n self.daysContainer.contains(elem));\n return false;\n }\n function onBlur(e) {\n var isInput = e.target === self._input;\n var valueChanged = self._input.value.trimEnd() !== getDateStr();\n if (isInput &&\n valueChanged &&\n !(e.relatedTarget && isCalendarElem(e.relatedTarget))) {\n self.setDate(self._input.value, true, e.target === self.altInput\n ? self.config.altFormat\n : self.config.dateFormat);\n }\n }\n function onKeyDown(e) {\n var eventTarget = getEventTarget(e);\n var isInput = self.config.wrap\n ? element.contains(eventTarget)\n : eventTarget === self._input;\n var allowInput = self.config.allowInput;\n var allowKeydown = self.isOpen && (!allowInput || !isInput);\n var allowInlineKeydown = self.config.inline && isInput && !allowInput;\n if (e.keyCode === 13 && isInput) {\n if (allowInput) {\n self.setDate(self._input.value, true, eventTarget === self.altInput\n ? self.config.altFormat\n : self.config.dateFormat);\n self.close();\n return eventTarget.blur();\n }\n else {\n self.open();\n }\n }\n else if (isCalendarElem(eventTarget) ||\n allowKeydown ||\n allowInlineKeydown) {\n var isTimeObj = !!self.timeContainer &&\n self.timeContainer.contains(eventTarget);\n switch (e.keyCode) {\n case 13:\n if (isTimeObj) {\n e.preventDefault();\n updateTime();\n focusAndClose();\n }\n else\n selectDate(e);\n break;\n case 27:\n e.preventDefault();\n focusAndClose();\n break;\n case 8:\n case 46:\n if (isInput && !self.config.allowInput) {\n e.preventDefault();\n self.clear();\n }\n break;\n case 37:\n case 39:\n if (!isTimeObj && !isInput) {\n e.preventDefault();\n var activeElement = getClosestActiveElement();\n if (self.daysContainer !== undefined &&\n (allowInput === false ||\n (activeElement && isInView(activeElement)))) {\n var delta_1 = e.keyCode === 39 ? 1 : -1;\n if (!e.ctrlKey)\n focusOnDay(undefined, delta_1);\n else {\n e.stopPropagation();\n changeMonth(delta_1);\n focusOnDay(getFirstAvailableDay(1), 0);\n }\n }\n }\n else if (self.hourElement)\n self.hourElement.focus();\n break;\n case 38:\n case 40:\n e.preventDefault();\n var delta = e.keyCode === 40 ? 1 : -1;\n if ((self.daysContainer &&\n eventTarget.$i !== undefined) ||\n eventTarget === self.input ||\n eventTarget === self.altInput) {\n if (e.ctrlKey) {\n e.stopPropagation();\n changeYear(self.currentYear - delta);\n focusOnDay(getFirstAvailableDay(1), 0);\n }\n else if (!isTimeObj)\n focusOnDay(undefined, delta * 7);\n }\n else if (eventTarget === self.currentYearElement) {\n changeYear(self.currentYear - delta);\n }\n else if (self.config.enableTime) {\n if (!isTimeObj && self.hourElement)\n self.hourElement.focus();\n updateTime(e);\n self._debouncedChange();\n }\n break;\n case 9:\n if (isTimeObj) {\n var elems = [\n self.hourElement,\n self.minuteElement,\n self.secondElement,\n self.amPM,\n ]\n .concat(self.pluginElements)\n .filter(function (x) { return x; });\n var i = elems.indexOf(eventTarget);\n if (i !== -1) {\n var target = elems[i + (e.shiftKey ? -1 : 1)];\n e.preventDefault();\n (target || self._input).focus();\n }\n }\n else if (!self.config.noCalendar &&\n self.daysContainer &&\n self.daysContainer.contains(eventTarget) &&\n e.shiftKey) {\n e.preventDefault();\n self._input.focus();\n }\n break;\n default:\n break;\n }\n }\n if (self.amPM !== undefined && eventTarget === self.amPM) {\n switch (e.key) {\n case self.l10n.amPM[0].charAt(0):\n case self.l10n.amPM[0].charAt(0).toLowerCase():\n self.amPM.textContent = self.l10n.amPM[0];\n setHoursFromInputs();\n updateValue();\n break;\n case self.l10n.amPM[1].charAt(0):\n case self.l10n.amPM[1].charAt(0).toLowerCase():\n self.amPM.textContent = self.l10n.amPM[1];\n setHoursFromInputs();\n updateValue();\n break;\n }\n }\n if (isInput || isCalendarElem(eventTarget)) {\n triggerEvent(\"onKeyDown\", e);\n }\n }\n function onMouseOver(elem, cellClass) {\n if (cellClass === void 0) { cellClass = \"flatpickr-day\"; }\n if (self.selectedDates.length !== 1 ||\n (elem &&\n (!elem.classList.contains(cellClass) ||\n elem.classList.contains(\"flatpickr-disabled\"))))\n return;\n var hoverDate = elem\n ? elem.dateObj.getTime()\n : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());\n var containsDisabled = false;\n var minRange = 0, maxRange = 0;\n for (var t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {\n if (!isEnabled(new Date(t), true)) {\n containsDisabled =\n containsDisabled || (t > rangeStartDate && t < rangeEndDate);\n if (t < initialDate && (!minRange || t > minRange))\n minRange = t;\n else if (t > initialDate && (!maxRange || t < maxRange))\n maxRange = t;\n }\n }\n var hoverableCells = Array.from(self.rContainer.querySelectorAll(\"*:nth-child(-n+\" + self.config.showMonths + \") > .\" + cellClass));\n hoverableCells.forEach(function (dayElem) {\n var date = dayElem.dateObj;\n var timestamp = date.getTime();\n var outOfRange = (minRange > 0 && timestamp < minRange) ||\n (maxRange > 0 && timestamp > maxRange);\n if (outOfRange) {\n dayElem.classList.add(\"notAllowed\");\n [\"inRange\", \"startRange\", \"endRange\"].forEach(function (c) {\n dayElem.classList.remove(c);\n });\n return;\n }\n else if (containsDisabled && !outOfRange)\n return;\n [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach(function (c) {\n dayElem.classList.remove(c);\n });\n if (elem !== undefined) {\n elem.classList.add(hoverDate <= self.selectedDates[0].getTime()\n ? \"startRange\"\n : \"endRange\");\n if (initialDate < hoverDate && timestamp === initialDate)\n dayElem.classList.add(\"startRange\");\n else if (initialDate > hoverDate && timestamp === initialDate)\n dayElem.classList.add(\"endRange\");\n if (timestamp >= minRange &&\n (maxRange === 0 || timestamp <= maxRange) &&\n isBetween(timestamp, initialDate, hoverDate))\n dayElem.classList.add(\"inRange\");\n }\n });\n }\n function onResize() {\n if (self.isOpen && !self.config.static && !self.config.inline)\n positionCalendar();\n }\n function open(e, positionElement) {\n if (positionElement === void 0) { positionElement = self._positionElement; }\n if (self.isMobile === true) {\n if (e) {\n e.preventDefault();\n var eventTarget = getEventTarget(e);\n if (eventTarget) {\n eventTarget.blur();\n }\n }\n if (self.mobileInput !== undefined) {\n self.mobileInput.focus();\n self.mobileInput.click();\n }\n triggerEvent(\"onOpen\");\n return;\n }\n else if (self._input.disabled || self.config.inline) {\n return;\n }\n var wasOpen = self.isOpen;\n self.isOpen = true;\n if (!wasOpen) {\n self.calendarContainer.classList.add(\"open\");\n self._input.classList.add(\"active\");\n triggerEvent(\"onOpen\");\n positionCalendar(positionElement);\n }\n if (self.config.enableTime === true && self.config.noCalendar === true) {\n if (self.config.allowInput === false &&\n (e === undefined ||\n !self.timeContainer.contains(e.relatedTarget))) {\n setTimeout(function () { return self.hourElement.select(); }, 50);\n }\n }\n }\n function minMaxDateSetter(type) {\n return function (date) {\n var dateObj = (self.config[\"_\" + type + \"Date\"] = self.parseDate(date, self.config.dateFormat));\n var inverseDateObj = self.config[\"_\" + (type === \"min\" ? \"max\" : \"min\") + \"Date\"];\n if (dateObj !== undefined) {\n self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] =\n dateObj.getHours() > 0 ||\n dateObj.getMinutes() > 0 ||\n dateObj.getSeconds() > 0;\n }\n if (self.selectedDates) {\n self.selectedDates = self.selectedDates.filter(function (d) { return isEnabled(d); });\n if (!self.selectedDates.length && type === \"min\")\n setHoursFromDate(dateObj);\n updateValue();\n }\n if (self.daysContainer) {\n redraw();\n if (dateObj !== undefined)\n self.currentYearElement[type] = dateObj.getFullYear().toString();\n else\n self.currentYearElement.removeAttribute(type);\n self.currentYearElement.disabled =\n !!inverseDateObj &&\n dateObj !== undefined &&\n inverseDateObj.getFullYear() === dateObj.getFullYear();\n }\n };\n }\n function parseConfig() {\n var boolOpts = [\n \"wrap\",\n \"weekNumbers\",\n \"allowInput\",\n \"allowInvalidPreload\",\n \"clickOpens\",\n \"time_24hr\",\n \"enableTime\",\n \"noCalendar\",\n \"altInput\",\n \"shorthandCurrentMonth\",\n \"inline\",\n \"static\",\n \"enableSeconds\",\n \"disableMobile\",\n ];\n var userConfig = __assign(__assign({}, JSON.parse(JSON.stringify(element.dataset || {}))), instanceConfig);\n var formats = {};\n self.config.parseDate = userConfig.parseDate;\n self.config.formatDate = userConfig.formatDate;\n Object.defineProperty(self.config, \"enable\", {\n get: function () { return self.config._enable; },\n set: function (dates) {\n self.config._enable = parseDateRules(dates);\n },\n });\n Object.defineProperty(self.config, \"disable\", {\n get: function () { return self.config._disable; },\n set: function (dates) {\n self.config._disable = parseDateRules(dates);\n },\n });\n var timeMode = userConfig.mode === \"time\";\n if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n var defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaultOptions.dateFormat;\n formats.dateFormat =\n userConfig.noCalendar || timeMode\n ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\")\n : defaultDateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n }\n if (userConfig.altInput &&\n (userConfig.enableTime || timeMode) &&\n !userConfig.altFormat) {\n var defaultAltFormat = flatpickr.defaultConfig.altFormat || defaultOptions.altFormat;\n formats.altFormat =\n userConfig.noCalendar || timeMode\n ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\")\n : defaultAltFormat + (\" h:i\" + (userConfig.enableSeconds ? \":S\" : \"\") + \" K\");\n }\n Object.defineProperty(self.config, \"minDate\", {\n get: function () { return self.config._minDate; },\n set: minMaxDateSetter(\"min\"),\n });\n Object.defineProperty(self.config, \"maxDate\", {\n get: function () { return self.config._maxDate; },\n set: minMaxDateSetter(\"max\"),\n });\n var minMaxTimeSetter = function (type) { return function (val) {\n self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i:S\");\n }; };\n Object.defineProperty(self.config, \"minTime\", {\n get: function () { return self.config._minTime; },\n set: minMaxTimeSetter(\"min\"),\n });\n Object.defineProperty(self.config, \"maxTime\", {\n get: function () { return self.config._maxTime; },\n set: minMaxTimeSetter(\"max\"),\n });\n if (userConfig.mode === \"time\") {\n self.config.noCalendar = true;\n self.config.enableTime = true;\n }\n Object.assign(self.config, formats, userConfig);\n for (var i = 0; i < boolOpts.length; i++)\n self.config[boolOpts[i]] =\n self.config[boolOpts[i]] === true ||\n self.config[boolOpts[i]] === \"true\";\n HOOKS.filter(function (hook) { return self.config[hook] !== undefined; }).forEach(function (hook) {\n self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n });\n self.isMobile =\n !self.config.disableMobile &&\n !self.config.inline &&\n self.config.mode === \"single\" &&\n !self.config.disable.length &&\n !self.config.enable &&\n !self.config.weekNumbers &&\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n for (var i = 0; i < self.config.plugins.length; i++) {\n var pluginConf = self.config.plugins[i](self) || {};\n for (var key in pluginConf) {\n if (HOOKS.indexOf(key) > -1) {\n self.config[key] = arrayify(pluginConf[key])\n .map(bindToInstance)\n .concat(self.config[key]);\n }\n else if (typeof userConfig[key] === \"undefined\")\n self.config[key] = pluginConf[key];\n }\n }\n if (!userConfig.altInputClass) {\n self.config.altInputClass =\n getInputElem().className + \" \" + self.config.altInputClass;\n }\n triggerEvent(\"onParseConfig\");\n }\n function getInputElem() {\n return self.config.wrap\n ? element.querySelector(\"[data-input]\")\n : element;\n }\n function setupLocale() {\n if (typeof self.config.locale !== \"object\" &&\n typeof flatpickr.l10ns[self.config.locale] === \"undefined\")\n self.config.errorHandler(new Error(\"flatpickr: invalid locale \" + self.config.locale));\n self.l10n = __assign(__assign({}, flatpickr.l10ns.default), (typeof self.config.locale === \"object\"\n ? self.config.locale\n : self.config.locale !== \"default\"\n ? flatpickr.l10ns[self.config.locale]\n : undefined));\n tokenRegex.D = \"(\" + self.l10n.weekdays.shorthand.join(\"|\") + \")\";\n tokenRegex.l = \"(\" + self.l10n.weekdays.longhand.join(\"|\") + \")\";\n tokenRegex.M = \"(\" + self.l10n.months.shorthand.join(\"|\") + \")\";\n tokenRegex.F = \"(\" + self.l10n.months.longhand.join(\"|\") + \")\";\n tokenRegex.K = \"(\" + self.l10n.amPM[0] + \"|\" + self.l10n.amPM[1] + \"|\" + self.l10n.amPM[0].toLowerCase() + \"|\" + self.l10n.amPM[1].toLowerCase() + \")\";\n var userConfig = __assign(__assign({}, instanceConfig), JSON.parse(JSON.stringify(element.dataset || {})));\n if (userConfig.time_24hr === undefined &&\n flatpickr.defaultConfig.time_24hr === undefined) {\n self.config.time_24hr = self.l10n.time_24hr;\n }\n self.formatDate = createDateFormatter(self);\n self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n }\n function positionCalendar(customPositionElement) {\n if (typeof self.config.position === \"function\") {\n return void self.config.position(self, customPositionElement);\n }\n if (self.calendarContainer === undefined)\n return;\n triggerEvent(\"onPreCalendarPosition\");\n var positionElement = customPositionElement || self._positionElement;\n var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, (function (acc, child) { return acc + child.offsetHeight; }), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(\" \"), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === \"above\" ||\n (configPosVertical !== \"below\" &&\n distanceFromBottom < calendarHeight &&\n inputBounds.top > calendarHeight);\n var top = window.pageYOffset +\n inputBounds.top +\n (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n if (self.config.inline)\n return;\n var left = window.pageXOffset + inputBounds.left;\n var isCenter = false;\n var isRight = false;\n if (configPosHorizontal === \"center\") {\n left -= (calendarWidth - inputBounds.width) / 2;\n isCenter = true;\n }\n else if (configPosHorizontal === \"right\") {\n left -= calendarWidth - inputBounds.width;\n isRight = true;\n }\n toggleClass(self.calendarContainer, \"arrowLeft\", !isCenter && !isRight);\n toggleClass(self.calendarContainer, \"arrowCenter\", isCenter);\n toggleClass(self.calendarContainer, \"arrowRight\", isRight);\n var right = window.document.body.offsetWidth -\n (window.pageXOffset + inputBounds.right);\n var rightMost = left + calendarWidth > window.document.body.offsetWidth;\n var centerMost = right + calendarWidth > window.document.body.offsetWidth;\n toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n if (self.config.static)\n return;\n self.calendarContainer.style.top = top + \"px\";\n if (!rightMost) {\n self.calendarContainer.style.left = left + \"px\";\n self.calendarContainer.style.right = \"auto\";\n }\n else if (!centerMost) {\n self.calendarContainer.style.left = \"auto\";\n self.calendarContainer.style.right = right + \"px\";\n }\n else {\n var doc = getDocumentStyleSheet();\n if (doc === undefined)\n return;\n var bodyWidth = window.document.body.offsetWidth;\n var centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);\n var centerBefore = \".flatpickr-calendar.centerMost:before\";\n var centerAfter = \".flatpickr-calendar.centerMost:after\";\n var centerIndex = doc.cssRules.length;\n var centerStyle = \"{left:\" + inputBounds.left + \"px;right:auto;}\";\n toggleClass(self.calendarContainer, \"rightMost\", false);\n toggleClass(self.calendarContainer, \"centerMost\", true);\n doc.insertRule(centerBefore + \",\" + centerAfter + centerStyle, centerIndex);\n self.calendarContainer.style.left = centerLeft + \"px\";\n self.calendarContainer.style.right = \"auto\";\n }\n }\n function getDocumentStyleSheet() {\n var editableSheet = null;\n for (var i = 0; i < document.styleSheets.length; i++) {\n var sheet = document.styleSheets[i];\n if (!sheet.cssRules)\n continue;\n try {\n sheet.cssRules;\n }\n catch (err) {\n continue;\n }\n editableSheet = sheet;\n break;\n }\n return editableSheet != null ? editableSheet : createStyleSheet();\n }\n function createStyleSheet() {\n var style = document.createElement(\"style\");\n document.head.appendChild(style);\n return style.sheet;\n }\n function redraw() {\n if (self.config.noCalendar || self.isMobile)\n return;\n buildMonthSwitch();\n updateNavigationCurrentMonth();\n buildDays();\n }\n function focusAndClose() {\n self._input.focus();\n if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n navigator.msMaxTouchPoints !== undefined) {\n setTimeout(self.close, 0);\n }\n else {\n self.close();\n }\n }\n function selectDate(e) {\n e.preventDefault();\n e.stopPropagation();\n var isSelectable = function (day) {\n return day.classList &&\n day.classList.contains(\"flatpickr-day\") &&\n !day.classList.contains(\"flatpickr-disabled\") &&\n !day.classList.contains(\"notAllowed\");\n };\n var t = findParent(getEventTarget(e), isSelectable);\n if (t === undefined)\n return;\n var target = t;\n var selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));\n var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||\n selectedDate.getMonth() >\n self.currentMonth + self.config.showMonths - 1) &&\n self.config.mode !== \"range\";\n self.selectedDateElem = target;\n if (self.config.mode === \"single\")\n self.selectedDates = [selectedDate];\n else if (self.config.mode === \"multiple\") {\n var selectedIndex = isDateSelected(selectedDate);\n if (selectedIndex)\n self.selectedDates.splice(parseInt(selectedIndex), 1);\n else\n self.selectedDates.push(selectedDate);\n }\n else if (self.config.mode === \"range\") {\n if (self.selectedDates.length === 2) {\n self.clear(false, false);\n }\n self.latestSelectedDateObj = selectedDate;\n self.selectedDates.push(selectedDate);\n if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)\n self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n }\n setHoursFromInputs();\n if (shouldChangeMonth) {\n var isNewYear = self.currentYear !== selectedDate.getFullYear();\n self.currentYear = selectedDate.getFullYear();\n self.currentMonth = selectedDate.getMonth();\n if (isNewYear) {\n triggerEvent(\"onYearChange\");\n buildMonthSwitch();\n }\n triggerEvent(\"onMonthChange\");\n }\n updateNavigationCurrentMonth();\n buildDays();\n updateValue();\n if (!shouldChangeMonth &&\n self.config.mode !== \"range\" &&\n self.config.showMonths === 1)\n focusOnDayElem(target);\n else if (self.selectedDateElem !== undefined &&\n self.hourElement === undefined) {\n self.selectedDateElem && self.selectedDateElem.focus();\n }\n if (self.hourElement !== undefined)\n self.hourElement !== undefined && self.hourElement.focus();\n if (self.config.closeOnSelect) {\n var single = self.config.mode === \"single\" && !self.config.enableTime;\n var range = self.config.mode === \"range\" &&\n self.selectedDates.length === 2 &&\n !self.config.enableTime;\n if (single || range) {\n focusAndClose();\n }\n }\n triggerChange();\n }\n var CALLBACKS = {\n locale: [setupLocale, updateWeekdays],\n showMonths: [buildMonths, setCalendarWidth, buildWeekdays],\n minDate: [jumpToDate],\n maxDate: [jumpToDate],\n positionElement: [updatePositionElement],\n clickOpens: [\n function () {\n if (self.config.clickOpens === true) {\n bind(self._input, \"focus\", self.open);\n bind(self._input, \"click\", self.open);\n }\n else {\n self._input.removeEventListener(\"focus\", self.open);\n self._input.removeEventListener(\"click\", self.open);\n }\n },\n ],\n };\n function set(option, value) {\n if (option !== null && typeof option === \"object\") {\n Object.assign(self.config, option);\n for (var key in option) {\n if (CALLBACKS[key] !== undefined)\n CALLBACKS[key].forEach(function (x) { return x(); });\n }\n }\n else {\n self.config[option] = value;\n if (CALLBACKS[option] !== undefined)\n CALLBACKS[option].forEach(function (x) { return x(); });\n else if (HOOKS.indexOf(option) > -1)\n self.config[option] = arrayify(value);\n }\n self.redraw();\n updateValue(true);\n }\n function setSelectedDate(inputDate, format) {\n var dates = [];\n if (inputDate instanceof Array)\n dates = inputDate.map(function (d) { return self.parseDate(d, format); });\n else if (inputDate instanceof Date || typeof inputDate === \"number\")\n dates = [self.parseDate(inputDate, format)];\n else if (typeof inputDate === \"string\") {\n switch (self.config.mode) {\n case \"single\":\n case \"time\":\n dates = [self.parseDate(inputDate, format)];\n break;\n case \"multiple\":\n dates = inputDate\n .split(self.config.conjunction)\n .map(function (date) { return self.parseDate(date, format); });\n break;\n case \"range\":\n dates = inputDate\n .split(self.l10n.rangeSeparator)\n .map(function (date) { return self.parseDate(date, format); });\n break;\n default:\n break;\n }\n }\n else\n self.config.errorHandler(new Error(\"Invalid date supplied: \" + JSON.stringify(inputDate)));\n self.selectedDates = (self.config.allowInvalidPreload\n ? dates\n : dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); }));\n if (self.config.mode === \"range\")\n self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n }\n function setDate(date, triggerChange, format) {\n if (triggerChange === void 0) { triggerChange = false; }\n if (format === void 0) { format = self.config.dateFormat; }\n if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))\n return self.clear(triggerChange);\n setSelectedDate(date, format);\n self.latestSelectedDateObj =\n self.selectedDates[self.selectedDates.length - 1];\n self.redraw();\n jumpToDate(undefined, triggerChange);\n setHoursFromDate();\n if (self.selectedDates.length === 0) {\n self.clear(false);\n }\n updateValue(triggerChange);\n if (triggerChange)\n triggerEvent(\"onChange\");\n }\n function parseDateRules(arr) {\n return arr\n .slice()\n .map(function (rule) {\n if (typeof rule === \"string\" ||\n typeof rule === \"number\" ||\n rule instanceof Date) {\n return self.parseDate(rule, undefined, true);\n }\n else if (rule &&\n typeof rule === \"object\" &&\n rule.from &&\n rule.to)\n return {\n from: self.parseDate(rule.from, undefined),\n to: self.parseDate(rule.to, undefined),\n };\n return rule;\n })\n .filter(function (x) { return x; });\n }\n function setupDates() {\n self.selectedDates = [];\n self.now = self.parseDate(self.config.now) || new Date();\n var preloadedDate = self.config.defaultDate ||\n ((self.input.nodeName === \"INPUT\" ||\n self.input.nodeName === \"TEXTAREA\") &&\n self.input.placeholder &&\n self.input.value === self.input.placeholder\n ? null\n : self.input.value);\n if (preloadedDate)\n setSelectedDate(preloadedDate, self.config.dateFormat);\n self._initialDate =\n self.selectedDates.length > 0\n ? self.selectedDates[0]\n : self.config.minDate &&\n self.config.minDate.getTime() > self.now.getTime()\n ? self.config.minDate\n : self.config.maxDate &&\n self.config.maxDate.getTime() < self.now.getTime()\n ? self.config.maxDate\n : self.now;\n self.currentYear = self._initialDate.getFullYear();\n self.currentMonth = self._initialDate.getMonth();\n if (self.selectedDates.length > 0)\n self.latestSelectedDateObj = self.selectedDates[0];\n if (self.config.minTime !== undefined)\n self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n if (self.config.maxTime !== undefined)\n self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n self.minDateHasTime =\n !!self.config.minDate &&\n (self.config.minDate.getHours() > 0 ||\n self.config.minDate.getMinutes() > 0 ||\n self.config.minDate.getSeconds() > 0);\n self.maxDateHasTime =\n !!self.config.maxDate &&\n (self.config.maxDate.getHours() > 0 ||\n self.config.maxDate.getMinutes() > 0 ||\n self.config.maxDate.getSeconds() > 0);\n }\n function setupInputs() {\n self.input = getInputElem();\n if (!self.input) {\n self.config.errorHandler(new Error(\"Invalid input element specified\"));\n return;\n }\n self.input._type = self.input.type;\n self.input.type = \"text\";\n self.input.classList.add(\"flatpickr-input\");\n self._input = self.input;\n if (self.config.altInput) {\n self.altInput = createElement(self.input.nodeName, self.config.altInputClass);\n self._input = self.altInput;\n self.altInput.placeholder = self.input.placeholder;\n self.altInput.disabled = self.input.disabled;\n self.altInput.required = self.input.required;\n self.altInput.tabIndex = self.input.tabIndex;\n self.altInput.type = \"text\";\n self.input.setAttribute(\"type\", \"hidden\");\n if (!self.config.static && self.input.parentNode)\n self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n }\n if (!self.config.allowInput)\n self._input.setAttribute(\"readonly\", \"readonly\");\n updatePositionElement();\n }\n function updatePositionElement() {\n self._positionElement = self.config.positionElement || self._input;\n }\n function setupMobile() {\n var inputType = self.config.enableTime\n ? self.config.noCalendar\n ? \"time\"\n : \"datetime-local\"\n : \"date\";\n self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n self.mobileInput.tabIndex = 1;\n self.mobileInput.type = inputType;\n self.mobileInput.disabled = self.input.disabled;\n self.mobileInput.required = self.input.required;\n self.mobileInput.placeholder = self.input.placeholder;\n self.mobileFormatStr =\n inputType === \"datetime-local\"\n ? \"Y-m-d\\\\TH:i:S\"\n : inputType === \"date\"\n ? \"Y-m-d\"\n : \"H:i:S\";\n if (self.selectedDates.length > 0) {\n self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n }\n if (self.config.minDate)\n self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n if (self.config.maxDate)\n self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n if (self.input.getAttribute(\"step\"))\n self.mobileInput.step = String(self.input.getAttribute(\"step\"));\n self.input.type = \"hidden\";\n if (self.altInput !== undefined)\n self.altInput.type = \"hidden\";\n try {\n if (self.input.parentNode)\n self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n }\n catch (_a) { }\n bind(self.mobileInput, \"change\", function (e) {\n self.setDate(getEventTarget(e).value, false, self.mobileFormatStr);\n triggerEvent(\"onChange\");\n triggerEvent(\"onClose\");\n });\n }\n function toggle(e) {\n if (self.isOpen === true)\n return self.close();\n self.open(e);\n }\n function triggerEvent(event, data) {\n if (self.config === undefined)\n return;\n var hooks = self.config[event];\n if (hooks !== undefined && hooks.length > 0) {\n for (var i = 0; hooks[i] && i < hooks.length; i++)\n hooks[i](self.selectedDates, self.input.value, self, data);\n }\n if (event === \"onChange\") {\n self.input.dispatchEvent(createEvent(\"change\"));\n self.input.dispatchEvent(createEvent(\"input\"));\n }\n }\n function createEvent(name) {\n var e = document.createEvent(\"Event\");\n e.initEvent(name, true, true);\n return e;\n }\n function isDateSelected(date) {\n for (var i = 0; i < self.selectedDates.length; i++) {\n var selectedDate = self.selectedDates[i];\n if (selectedDate instanceof Date &&\n compareDates(selectedDate, date) === 0)\n return \"\" + i;\n }\n return false;\n }\n function isDateInRange(date) {\n if (self.config.mode !== \"range\" || self.selectedDates.length < 2)\n return false;\n return (compareDates(date, self.selectedDates[0]) >= 0 &&\n compareDates(date, self.selectedDates[1]) <= 0);\n }\n function updateNavigationCurrentMonth() {\n if (self.config.noCalendar || self.isMobile || !self.monthNav)\n return;\n self.yearElements.forEach(function (yearElement, i) {\n var d = new Date(self.currentYear, self.currentMonth, 1);\n d.setMonth(self.currentMonth + i);\n if (self.config.showMonths > 1 ||\n self.config.monthSelectorType === \"static\") {\n self.monthElements[i].textContent =\n monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n }\n else {\n self.monthsDropdownContainer.value = d.getMonth().toString();\n }\n yearElement.value = d.getFullYear().toString();\n });\n self._hidePrevMonthArrow =\n self.config.minDate !== undefined &&\n (self.currentYear === self.config.minDate.getFullYear()\n ? self.currentMonth <= self.config.minDate.getMonth()\n : self.currentYear < self.config.minDate.getFullYear());\n self._hideNextMonthArrow =\n self.config.maxDate !== undefined &&\n (self.currentYear === self.config.maxDate.getFullYear()\n ? self.currentMonth + 1 > self.config.maxDate.getMonth()\n : self.currentYear > self.config.maxDate.getFullYear());\n }\n function getDateStr(specificFormat) {\n var format = specificFormat ||\n (self.config.altInput ? self.config.altFormat : self.config.dateFormat);\n return self.selectedDates\n .map(function (dObj) { return self.formatDate(dObj, format); })\n .filter(function (d, i, arr) {\n return self.config.mode !== \"range\" ||\n self.config.enableTime ||\n arr.indexOf(d) === i;\n })\n .join(self.config.mode !== \"range\"\n ? self.config.conjunction\n : self.l10n.rangeSeparator);\n }\n function updateValue(triggerChange) {\n if (triggerChange === void 0) { triggerChange = true; }\n if (self.mobileInput !== undefined && self.mobileFormatStr) {\n self.mobileInput.value =\n self.latestSelectedDateObj !== undefined\n ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)\n : \"\";\n }\n self.input.value = getDateStr(self.config.dateFormat);\n if (self.altInput !== undefined) {\n self.altInput.value = getDateStr(self.config.altFormat);\n }\n if (triggerChange !== false)\n triggerEvent(\"onValueUpdate\");\n }\n function onMonthNavClick(e) {\n var eventTarget = getEventTarget(e);\n var isPrevMonth = self.prevMonthNav.contains(eventTarget);\n var isNextMonth = self.nextMonthNav.contains(eventTarget);\n if (isPrevMonth || isNextMonth) {\n changeMonth(isPrevMonth ? -1 : 1);\n }\n else if (self.yearElements.indexOf(eventTarget) >= 0) {\n eventTarget.select();\n }\n else if (eventTarget.classList.contains(\"arrowUp\")) {\n self.changeYear(self.currentYear + 1);\n }\n else if (eventTarget.classList.contains(\"arrowDown\")) {\n self.changeYear(self.currentYear - 1);\n }\n }\n function timeWrapper(e) {\n e.preventDefault();\n var isKeyDown = e.type === \"keydown\", eventTarget = getEventTarget(e), input = eventTarget;\n if (self.amPM !== undefined && eventTarget === self.amPM) {\n self.amPM.textContent =\n self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n }\n var min = parseFloat(input.getAttribute(\"min\")), max = parseFloat(input.getAttribute(\"max\")), step = parseFloat(input.getAttribute(\"step\")), curValue = parseInt(input.value, 10), delta = e.delta ||\n (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);\n var newValue = curValue + step * delta;\n if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n var isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;\n if (newValue < min) {\n newValue =\n max +\n newValue +\n int(!isHourElem) +\n (int(isHourElem) && int(!self.amPM));\n if (isMinuteElem)\n incrementNumInput(undefined, -1, self.hourElement);\n }\n else if (newValue > max) {\n newValue =\n input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n if (isMinuteElem)\n incrementNumInput(undefined, 1, self.hourElement);\n }\n if (self.amPM &&\n isHourElem &&\n (step === 1\n ? newValue + curValue === 23\n : Math.abs(newValue - curValue) > step)) {\n self.amPM.textContent =\n self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n }\n input.value = pad(newValue);\n }\n }\n init();\n return self;\n}\nfunction _flatpickr(nodeList, config) {\n var nodes = Array.prototype.slice\n .call(nodeList)\n .filter(function (x) { return x instanceof HTMLElement; });\n var instances = [];\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n try {\n if (node.getAttribute(\"data-fp-omit\") !== null)\n continue;\n if (node._flatpickr !== undefined) {\n node._flatpickr.destroy();\n node._flatpickr = undefined;\n }\n node._flatpickr = FlatpickrInstance(node, config || {});\n instances.push(node._flatpickr);\n }\n catch (e) {\n console.error(e);\n }\n }\n return instances.length === 1 ? instances[0] : instances;\n}\nif (typeof HTMLElement !== \"undefined\" &&\n typeof HTMLCollection !== \"undefined\" &&\n typeof NodeList !== \"undefined\") {\n HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n return _flatpickr(this, config);\n };\n HTMLElement.prototype.flatpickr = function (config) {\n return _flatpickr([this], config);\n };\n}\nvar flatpickr = function (selector, config) {\n if (typeof selector === \"string\") {\n return _flatpickr(window.document.querySelectorAll(selector), config);\n }\n else if (selector instanceof Node) {\n return _flatpickr([selector], config);\n }\n else {\n return _flatpickr(selector, config);\n }\n};\nflatpickr.defaultConfig = {};\nflatpickr.l10ns = {\n en: __assign({}, English),\n default: __assign({}, English),\n};\nflatpickr.localize = function (l10n) {\n flatpickr.l10ns.default = __assign(__assign({}, flatpickr.l10ns.default), l10n);\n};\nflatpickr.setDefaults = function (config) {\n flatpickr.defaultConfig = __assign(__assign({}, flatpickr.defaultConfig), config);\n};\nflatpickr.parseDate = createDateParser({});\nflatpickr.formatDate = createDateFormatter({});\nflatpickr.compareDates = compareDates;\nif (typeof jQuery !== \"undefined\" && typeof jQuery.fn !== \"undefined\") {\n jQuery.fn.flatpickr = function (config) {\n return _flatpickr(this, config);\n };\n}\nDate.prototype.fp_incr = function (days) {\n return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n};\nif (typeof window !== \"undefined\") {\n window.flatpickr = flatpickr;\n}\nexport default flatpickr;\n","export class QuantityTicker {\n constructor (elem) {\n /* ELEMENTS */\n this.elem = elem\n this.upTicker = this.elem.querySelector('[data-btn-add]')\n this.label = this.elem.querySelector('[data-label]')\n this.downTicker = this.elem.querySelector('[data-btn-subtract]')\n this.valueInput = this.elem.querySelector('[data-input]')\n\n /* DATA */\n const defaultData = this.elem.dataset\n this.formdata = {}\n this.formdata.quantity = (defaultData.quantity !== undefined && Number.isInteger(defaultData.quantity)) ? defaultData.quantity : 1\n this.formdata.max = defaultData.max !== undefined && Number.isInteger(defaultData.max) ? defaultData.max : 100\n this.formdata.min = defaultData.min !== undefined && Number.isInteger(defaultData.min) ? defaultData.min : 1\n\n /* STATE */\n\n /* EVENTS */\n this.setupEvents()\n\n /* INIT */\n this.initialise()\n }\n\n correctdefaultquantity () {\n if (this.formdata.quantity > this.formdata.max) {\n return this.formdata.max\n }\n if (this.formdata.quantity < this.formdata.min) {\n return this.formdata.min\n }\n return this.formdata.quantity\n }\n\n initialise () {\n this.formdata.quantity = this.correctdefaultquantity()\n this.setValue()\n this.setMinState()\n this.setMaxState()\n }\n\n setValue () {\n this.valueInput.value = this.formdata.quantity\n }\n\n setMinState () {\n if (this.formdata.quantity <= this.formdata.min) {\n this.downTicker.setAttribute('disabled', 'disabled')\n } else {\n this.downTicker.removeAttribute('disabled')\n }\n }\n\n setMaxState () {\n if (this.formdata.quantity >= this.formdata.max) {\n this.upTicker.setAttribute('disabled', 'disabled')\n } else {\n this.upTicker.removeAttribute('disabled')\n }\n }\n\n setupEvents () {\n this.upTicker.addEventListener('click', () => {\n this.increment()\n })\n\n this.downTicker.addEventListener('click', () => {\n this.decrement()\n })\n }\n\n decrement () {\n this.formdata.quantity--\n this.setValue()\n this.setMinState()\n this.setMaxState()\n }\n\n increment () {\n this.formdata.quantity++\n this.setValue()\n this.setMinState()\n this.setMaxState()\n }\n}\n\nexport const setupQuantityTicker = (elem) => {\n const qticker = new QuantityTicker(elem)\n return qticker\n}\n","import { setupDatePickersBookingBar } from './datePicker.js'\nimport { isMobileDown, getSize } from '../../utilities/MediaQueries.js'\nimport { setupQuantityTicker } from './quantityTick.js'\nimport { stopBodyScroll, allowBodyScroll } from '../controls/controlBodyScroll'\nimport { Logger } from '../../utilities/Logger'\n\nexport class BookingBar {\n constructor (elem) {\n /* ELEMENTS */\n this.logger = new Logger('Booking Bar')\n this.elem = elem\n const defaultData = this.elem.dataset\n this.showPax = defaultData.showPax !== undefined ? defaultData.showPax === 'true' : false\n\n this.placeHolder = this.elem.parentElement.previousElementSibling\n this.hasPlaceHolder = this.placeHolder !== null && this.placeHolder !== undefined\n this.directionElem = this.elem.querySelector('[data-bar-direction]')\n this.labelDirectionTo = this.elem.querySelector('[data-bar-direction-to]')\n this.labelDirectionFrom = this.elem.querySelector('[data-bar-direction-from]')\n this.labelDateTerm = this.elem.querySelector('[data-bar-date-term]')\n this.labelDate = this.elem.querySelector('[data-bar-date]')\n this.labelReturnDate = this.elem.querySelector('[data-bar-return-date]')\n this.buttonDirection = this.elem.querySelector('[data-bar-direction-swap]')\n\n this.buttonDateReset = this.elem.querySelector('[data-date-reset]')\n this.inputDates = this.elem.querySelector('[data-bar-dates]')\n this.buttonDate = this.elem.querySelector('[data-bar-date-button]')\n this.buttonReturnDate = this.elem.querySelector('[data-bar-return-date-button]')\n this.modalDate = this.elem.querySelector('[data-bar-date-modal]')\n this.modalDateClose = this.elem.querySelector('[data-bar-date-modal-close]')\n\n this.isReturn = false\n this.initialLoad = true\n\n // this.buttonDateNext = this.elem.querySelector('[data-date-next]')\n this.buttonSearch = this.elem.querySelector('[data-bar-search-button]')\n this.datePicker = {}\n\n /* DATA */\n this.bodyLockAttribute = 'booking-bar'\n this.formData = {}\n this.labelStrings = {}\n this.exportEvent = defaultData.exportEvent !== undefined ? defaultData.exportEvent : ''\n this.showMax = defaultData.showMax !== undefined ? defaultData.showMax === 'true' : false\n this.formData.oneWay = defaultData.oneway !== undefined ? defaultData.oneWay === 'true' : false\n this.formData.embark = defaultData.embark !== undefined ? defaultData.embark : 'Folkestone'\n this.formData.disembark = defaultData.disembark !== undefined ? defaultData.disembark : 'Calais'\n this.formData.outboundDate = defaultData.outbounddate !== undefined ? new Date(defaultData.outboundDate) : new Date()\n this.formData.returnDate = defaultData.returnDate !== undefined ? new Date(defaultData.returnDate) : ''\n this.labelStrings.itineraryLabel = defaultData.itineraryLabel !== undefined ? defaultData.itineraryLabel : 'Add return'\n this.labelDate.textContent = this.formatDate(this.formData.outboundDate)\n this.activeState = ''\n\n /* STATE */\n this.modalOpen = false\n this.lang = defaultData.lang ?? 'en-GB'\n this.activeState = 'date'\n\n /* CLASSES */\n this.barMaxClass = 'b-bar--max'\n this.phMaxClass = 'b-bar__ph--max'\n\n /* Optional passengers section */\n if (this.showPax) {\n /* ELEMENTS */\n this.labelPeople = this.elem.querySelector('[data-bar-passengers]')\n this.labelPeopleTerm = this.elem.querySelector('[data-bar-passengers-term]')\n this.buttonPeople = this.elem.querySelector('[data-bar-people-button]')\n this.buttonPeopleNext = this.elem.querySelector('[data-pax-next]')\n this.buttonPeopleReset = this.elem.querySelector('[data-pax-reset]')\n this.modalPeople = this.elem.querySelector('[data-bar-people-modal]')\n this.modalPeopleClose = this.elem.querySelector('[data-bar-people-modal-close]')\n this.relativePaxWrapper = this.elem.querySelector('[data-relative-pax-wrapper]')\n this.checkRelativePax = this.elem.querySelector('[data-relative-pax-control]')\n this.inputOutboundQty = this.elem.querySelector('[data-bar-outbound-qty]')\n this.inputReturnQty = this.elem.querySelector('[data-bar-return-qty]')\n this.outboundPaxControl = this.elem.querySelector('[data-outbound-pax]')\n this.returnPaxControl = this.elem.querySelector('[data-return-pax]')\n this.outboundPaxLabel = this.outboundPaxControl.querySelector('[data-label]')\n this.allQtyBtns = this.elem.querySelectorAll('.qty-tick__btn')\n\n /* DATA */\n this.formData.outboundPax = defaultData.outboundPax !== undefined && defaultData.outboundPax > 0 ? defaultData.outboundPax : 1\n this.formData.returnPax = defaultData.returnPax !== undefined && defaultData.outboundPax > 0 ? defaultData.returnPax : 1\n this.labelStrings.outboundPaxLabel = defaultData.outboundPaxLabel !== undefined ? defaultData.outboundPaxLabel : 'Passengers'\n this.labelStrings.outboundPaxLabelDiff = defaultData.outboundPaxLabelDiff !== undefined ? defaultData.outboundPaxLabelDiff : 'Outbound Passengers'\n this.labelStrings.outboundPaxLabelShort = defaultData.outboundPaxLabelShort !== undefined ? defaultData.outboundPaxLabelShort : 'out'\n this.labelStrings.returnPaxLabelShort = defaultData.returnPaxLabelShort !== undefined ? defaultData.returnPaxLabelShort : 'rtn'\n this.formData.paxQtyDiff = false // in and outbound quantities different.\n\n /* BINDINGS */\n this.outboundPeople = setupQuantityTicker(this.outboundPaxControl)\n this.returnPeople = setupQuantityTicker(this.returnPaxControl)\n\n this.setupPaxEvents()\n }\n\n /* EVENTS */\n this.setupEvents()\n if (isMobileDown() && this.showPax) {\n this.updatePaxQty()\n }\n\n this.handleClickOutside = this.handleClickOutside.bind(this)\n }\n\n setupPaxEvents () {\n this.allQtyBtns.forEach((btn) => {\n btn.addEventListener('click', () => {\n this.updatePaxQty()\n })\n })\n\n this.checkRelativePax.addEventListener('change', () => {\n this.toggleRelativePax()\n this.updatePaxQty()\n })\n\n this.modalPeopleClose.addEventListener('click', () => {\n this.closePeopleModal()\n this.buttonPeople.focus()\n allowBodyScroll()\n })\n\n this.buttonPeopleReset.addEventListener('click', () => {\n this.resetPeople()\n this.toggleRelativePax()\n this.updatePaxQty()\n })\n\n this.buttonPeople.addEventListener('click', () => {\n this.maximise()\n window.setTimeout(() => {\n this.toggleButtonState(this.buttonPeople)\n if (this.modalDate.hasAttribute('open')) {\n this.closeDateModal()\n }\n // this.toggleModal(this.modalPeople)\n this.openPeopleModal()\n }, 300)\n })\n\n this.buttonPeopleNext.addEventListener('click', () => {\n this.toggleButtonState(this.buttonPeople)\n if (this.modalPeople.hasAttribute('open')) {\n this.closePeopleModal()\n allowBodyScroll()\n }\n })\n }\n\n setupEvents () {\n this.buttonDirection.addEventListener('click', () => {\n this.maximise()\n this.swapDirection()\n })\n\n this.buttonDateReset.addEventListener('click', () => {\n this.resetDates()\n })\n\n this.modalDateClose.addEventListener('click', () => {\n this.closeDateModal()\n this.buttonDate.focus()\n allowBodyScroll()\n })\n\n this.buttonDate.addEventListener('click', () => {\n this.maximise()\n this.isReturn = false\n window.setTimeout(() => {\n this.toggleButtonState(this.buttonDate)\n if (this.showPax && this.modalPeople.hasAttribute('open')) {\n this.closePeopleModal()\n this.activeState = ''\n } else {\n this.activeState = 'date'\n }\n this.openDateModal()\n requestAnimationFrame(() => {\n this.setupDatePicker()\n })\n }, 300)\n })\n\n this.buttonReturnDate.addEventListener('click', () => {\n this.maximise()\n this.isReturn = true\n window.setTimeout(() => {\n this.toggleButtonState(this.buttonReturnDate)\n if (this.showPax && this.modalPeople.hasAttribute('open')) {\n this.closePeopleModal()\n this.activeState = ''\n } else {\n this.activeState = 'date'\n }\n this.openDateModal()\n requestAnimationFrame(() => {\n this.setupDatePicker(true)\n })\n }, 300)\n })\n\n // this.buttonDateNext.addEventListener('click', () => {\n // this.setButtonInactive(this.buttonDate)\n // if (this.showPax) {\n // this.setButtonActive(this.buttonPeople)\n // if (this.modalDate.hasAttribute('open')) {\n // this.closeDateModal()\n // }\n // // this.toggleModal(this.modalPeople)\n // this.openPeopleModal()\n // } else {\n // if (this.modalDate.hasAttribute('open')) {\n // this.closeDateModal()\n // // this.buttonSearch.focus()\n // this.compileformData()\n // }\n // }\n // })\n\n this.buttonSearch.addEventListener('click', () => {\n this.compileformData()\n })\n\n // document.addEventListener('click', (e) => {\n // this.handleClickOutside(e)\n // })\n\n document.addEventListener('keydown', (e) => {\n this.handleEscKey(e)\n })\n }\n\n toggleRelativePax () {\n if (this.showPax) {\n this.returnPaxControl.setAttribute('aria-hidden', !this.checkRelativePax.checked)\n this.formData.paxQtyDiff = this.checkRelativePax.checked\n if (this.checkRelativePax.checked) {\n this.outboundPaxLabel.textContent = this.labelStrings.outboundPaxLabelDiff\n } else {\n this.outboundPaxLabel.textContent = this.labelStrings.outboundPaxLabel\n }\n }\n }\n\n resetPeople () {\n if (this.showPax) {\n this.checkRelativePax.checked = false\n this.inputOutboundQty.value = 1\n this.inputReturnQty.value = 1\n this.outboundPeople.formdata.quantity = 1\n this.outboundPeople.setMinState()\n this.returnPeople.formdata.quantity = 1\n this.returnPeople.setMinState()\n }\n }\n\n passengersSetOneWay () {\n if (this.showPax) {\n // Update underliying data.\n this.inputReturnQty.value = 0\n this.returnPeople.formdata.quantity = 0\n this.checkRelativePax.checked = false\n this.toggleRelativePax() // Hide return pax control.\n // Hide return pax control.\n this.relativePaxWrapper.setAttribute('aria-hidden', true)\n // Hide difference selector difference control.\n }\n }\n\n passengersSetReturn () {\n if (this.showPax) {\n this.inputReturnQty.value = 1\n this.returnPeople.formdata.quantity = 1\n\n // Hide return pax control.\n this.relativePaxWrapper.setAttribute('aria-hidden', false)\n }\n }\n\n getOffset () {\n if (getSize() === 'Tablet') {\n return 73 + 24\n } else {\n return 81 + 24\n }\n }\n\n updatePaxQty () {\n if (this.showPax) {\n if (this.formData.paxQtyDiff) {\n // set data...\n this.formData.outboundPax = this.inputOutboundQty.value\n this.formData.returnPax = this.inputReturnQty.value\n this.labelPeople.textContent = `${this.inputOutboundQty.value} ${this.labelStrings.outboundPaxLabelShort}, ${this.inputReturnQty.value} ${this.labelStrings.returnPaxLabelShort}`\n } else {\n this.formData.outboundPax = this.formData.returnPax = this.inputOutboundQty.value\n this.labelPeople.textContent = this.inputOutboundQty.value\n }\n }\n }\n\n arePaxValid () {\n if (this.showPax) {\n if ((this.formData.paxQtyDiff && this.formData.outboundPax > 0 && this.formData.returnPax > 0) ||\n (!this.formData.paxQtyDiff && this.formData.outboundPax > 0)) {\n return true\n }\n }\n\n return true\n }\n\n areDatesValid () {\n if ((this.formData.oneWay && this.formData.outboundDate !== '') ||\n (!this.formData.oneWay && this.formData.outboundDate !== '' && this.formData.returnDate !== '')) {\n return true\n }\n return false\n }\n\n setButtonActive (button) {\n button.setAttribute('aria-expanded', true)\n }\n\n setButtonInactive (button) {\n button.setAttribute('aria-expanded', false)\n }\n\n toggleButtonState (button = null) {\n if (this.buttonDate) {\n this.buttonDate.setAttribute('aria-expanded', false)\n }\n\n if (this.buttonReturnDate) {\n this.buttonReturnDate.setAttribute('aria-expanded', false)\n }\n\n if (this.buttonPeople) {\n this.buttonPeople.setAttribute('aria-expanded', false)\n }\n\n if (button) {\n button.setAttribute('aria-expanded', true)\n }\n }\n\n setupDatePicker (isReturn = false) {\n if (typeof (this.datePicker.destroy) === 'function' && this.datePicker.destroy !== undefined && this.datePicker.destroy !== null) {\n this.datePicker.destroy()\n }\n\n this.datePicker = setupDatePickersBookingBar(this.inputDates, isReturn, this.initialLoad)\n this.datePicker.config.onChange.push(() => {\n this.addSecondMonthLabel()\n this.setDates()\n })\n\n this.addSecondMonthLabel()\n this.datePicker.config.onMonthChange.push(() => {\n this.addSecondMonthLabel()\n })\n\n this.initialLoad = false\n }\n\n addSecondMonthLabel () {\n // Get ref to calendar control.\n const calRef = this.inputDates.nextElementSibling\n const nextMonth = new Date()\n nextMonth.setDate(1)\n nextMonth.setFullYear(this.datePicker.currentYear)\n nextMonth.setMonth(this.datePicker.currentMonth)\n nextMonth.setMonth(nextMonth.getMonth() + 1)\n\n const secondCalendar = calRef.querySelectorAll('.dayContainer')[1]\n const newContent = `<div class=\"flatpickr-second-month\">${nextMonth.toLocaleDateString(this.lang, { month: 'long' })} ${nextMonth.getFullYear()}</div>`\n secondCalendar.insertAdjacentHTML('beforeend', newContent)\n }\n\n setDates () {\n // IF ONE WAY\n this.formData.outboundDate = this.formatFlatDate(this.datePicker.selectedDates[0])\n this.labelDate.textContent = this.formatDate(this.datePicker.selectedDates[0])\n\n // Repeat the same process for the return date if it exists\n if (this.datePicker.selectedDates[1]) {\n this.formData.returnDate = this.formatFlatDate(this.datePicker.selectedDates[1])\n this.labelReturnDate.textContent = this.formatDate(this.datePicker.selectedDates[1])\n } else {\n this.formData.returnDate = null\n this.labelReturnDate.textContent = this.labelStrings.itineraryLabel\n }\n\n if (!this.isReturn || this.datePicker.selectedDates[1]) {\n this.closeDateModal()\n this.buttonDate.focus()\n allowBodyScroll()\n }\n }\n\n formatFlatDate (date) {\n if (typeof (date) === 'undefined') {\n return\n }\n\n const year = date.getFullYear()\n const month = date.getMonth() + 1\n const day = date.getDate()\n return year + '-' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day\n }\n\n resetDates () {\n this.datePicker.setDate(new Date())\n\n this.formData.outboundDate = new Date()\n this.formData.returnDate = ''\n\n this.labelDate.textContent = this.formatDate(this.formData.outboundDate)\n this.labelReturnDate.textContent = this.labelStrings.itineraryLabel\n }\n\n formatDate (dateInput) {\n if (typeof (dateInput) !== 'undefined') {\n const options = { day: 'numeric', month: 'short' }\n return dateInput.toLocaleDateString(this.lang, options)\n }\n }\n\n handleClickOutside (event) {\n const hasDialogAttached = event.target.getAttribute('data-dialog-open')\n if (this.elem.contains(event.target) || hasDialogAttached !== null) {\n return\n }\n if (this.isAnyModalOpen()) {\n this.closeDialogs()\n return\n }\n this.minimise()\n }\n\n handleEscKey (event) {\n if (event.key === 'Escape' && this.modalOpen === false) {\n this.minimise()\n this.closeDialogs()\n }\n }\n\n swapDirection () {\n const embark = this.formData.embark\n const disembark = this.formData.disembark\n\n this.formData.embark = disembark\n this.formData.disembark = embark\n\n this.labelDirectionFrom.textContent = this.formData.embark\n this.labelDirectionTo.textContent = this.formData.disembark\n }\n\n openDateModal () {\n this.modalDate.setAttribute('aria-hidden', false)\n this.modalDate.setAttribute('open', true)\n this.modalDate.classList.add('b-bar__modal--open')\n this.modalDateClose.focus()\n stopBodyScroll(this.bodyLockAttribute)\n }\n\n closeDateModal () {\n this.modalDate.setAttribute('aria-hidden', true)\n this.modalDate.classList.remove('b-bar__modal--open')\n this.modalDate.removeAttribute('open')\n this.toggleButtonState()\n this.buttonDate.focus()\n }\n\n closePeopleModal () {\n if (this.showPax) {\n this.modalPeople.setAttribute('aria-hidden', true)\n this.modalPeople.classList.remove('b-bar__modal--open')\n this.modalPeople.removeAttribute('open')\n this.toggleButtonState()\n this.buttonPeople.focus()\n }\n }\n\n openPeopleModal () {\n if (this.showPax) {\n this.modalPeople.setAttribute('aria-hidden', false)\n this.modalPeople.classList.add('b-bar__modal--open')\n this.modalPeople.setAttribute('open', true)\n this.modalPeopleClose.focus()\n stopBodyScroll(this.bodyLockAttribute)\n }\n }\n\n isAnyModalOpen () {\n if (this.modalDate.getAttribute('open') === 'true' || (this.showPax && this.modalPeople.getAttribute('open') === 'true')) {\n return true\n } else {\n return false\n }\n }\n\n maximise () {\n this.elem.classList.add(this.barMaxClass)\n if (this.hasPlaceHolder) {\n this.placeHolder.classList.add(this.phMaxClass)\n }\n if (this.showPax) {\n this.updatePaxQty()\n }\n document.addEventListener('click', this.handleClickOutside)\n // this.scrollToView()\n }\n\n scrollToView () {\n const offsetPosition = this.elem.offsetTop - this.getOffset()\n window.scrollTo({\n left: 0,\n top: offsetPosition,\n behavior: 'smooth'\n })\n }\n\n minimise () {\n document.removeEventListener('click', this.handleClickOutside)\n allowBodyScroll()\n if (this.showMax !== true) {\n this.elem.classList.remove(this.barMaxClass)\n if (this.hasPlaceHolder) {\n this.placeHolder.classList.remove(this.phMaxClass)\n }\n }\n }\n\n closeDialogs () {\n if (this.showPax) {\n this.buttonPeople.setAttribute('aria-expanded', false)\n }\n this.buttonDate.setAttribute('aria-expanded', false)\n this.closeDateModal()\n this.closePeopleModal()\n this.modalOpen = false\n document.removeEventListener('click', this.handleClickOutside)\n allowBodyScroll()\n }\n\n compileformData () {\n if (this.exportEvent === '') {\n this.logger.log(JSON.stringify(this.formData))\n } else {\n this.emitFormData()\n }\n }\n\n emitFormData () {\n this.logger.log('submit event')\n const event = new CustomEvent(this.exportEvent, {\n bubbles: true,\n detail: {\n formData: this.formData\n }\n })\n\n this.elem.dispatchEvent(event)\n }\n}\n\nexport const setupBookingBar = function (parent) {\n const elems = parent.querySelectorAll('.b-bar')\n\n const bookingBars = []\n\n for (const elem of elems) {\n bookingBars.push(new BookingBar(elem))\n }\n return bookingBars\n}\n","import flatpickr from 'flatpickr'\nimport { French } from 'flatpickr/dist/l10n/fr.js'\nimport { Dutch } from 'flatpickr/dist/l10n/nl.js'\n\nexport const setupDatePickers = function (parent) {\n const pickerInputs = document.querySelectorAll('input[data-date-picker]')\n\n if (pickerInputs.length > 0) {\n pickerInputs.forEach(function (pickerInput) {\n const lang = pickerInput.dataset.lang ?? 'en-GB'\n const locale = lang === 'fr-FR' ? French : lang === 'nl-NL' ? Dutch : {}\n locale.firstDayOfWeek = 1\n\n const fpConfig = {\n locale,\n showMonths: 1,\n minDate: 'today',\n disableMobile: 'true'\n }\n const fp = flatpickr(pickerInput, fpConfig)\n if (typeof (fp.calendarContainer) !== 'undefined') {\n fp.calendarContainer.classList.add('flatpickr--single-date')\n }\n })\n }\n}\n\nexport const setupDatePickersWithRange = function (parent) {\n const pickerInputs = parent.querySelectorAll('input[data-date-picker-range]')\n\n if (pickerInputs.length > 0) {\n pickerInputs.forEach(function (pickerInput) {\n const lang = pickerInput.dataset.lang ?? 'en-GB'\n const locale = lang === 'fr-FR' ? French : lang === 'nl-NL' ? Dutch : {}\n locale.firstDayOfWeek = 1\n\n const fpConfig = {\n locale,\n showMonths: 2,\n minDate: 'today',\n mode: 'range',\n disableMobile: 'true'\n }\n const dp = flatpickr(pickerInput, fpConfig)\n if (typeof (dp.calendarContainer) !== 'undefined') {\n dp.calendarContainer.classList.add('flatpickr--range-date')\n }\n return dp\n })\n }\n}\n\nexport const setupDatePickersBookingBar = function (element, range, initialLoad) {\n const lang = element.dataset.lang ?? 'en-GB'\n const locale = lang === 'fr-FR' ? French : lang === 'nl-NL' ? Dutch : {}\n locale.firstDayOfWeek = 1\n\n const fpConfig = {\n locale,\n showMonths: 2,\n inline: true,\n minDate: 'today'\n }\n\n if (initialLoad) {\n fpConfig.defaultDate = new Date()\n }\n\n if (range) {\n fpConfig.mode = 'range'\n }\n\n const dp = flatpickr(element, fpConfig)\n return dp\n}\n","// Prevent scroll...\nimport { stopBodyScroll, allowBodyScroll } from '../controls/controlBodyScroll'\n\n// A class to handle the opening of dialogs by clicking remotely.\nclass ShowDialog {\n constructor (elem) {\n this.elem = elem\n this.id = this.elem.dataset.dialogOpen\n this.dialog = document.getElementById(this.id)\n this.elem.addEventListener('click', (e) => {\n this.open()\n })\n }\n\n open () {\n if (this.dialog) {\n stopBodyScroll()\n this.dialog.showModal()\n }\n }\n}\n\n// A class to handle the closing of dialogs by clicking remotely.\nclass CloseDialog {\n constructor (elem) {\n this.elem = elem\n this.id = this.elem.dataset.dialogClose\n this.dialog = document.getElementById(this.id)\n this.elem.addEventListener('click', (e) => {\n this.close()\n })\n }\n\n close () {\n if (this.dialog) {\n allowBodyScroll()\n this.dialog.close()\n }\n }\n}\n\nexport function loadDialogOpeners () {\n const elems = document.querySelectorAll('[data-dialog-open]')\n const dialogOpeners = []\n\n for (const element of elems) {\n dialogOpeners.push(new ShowDialog(element))\n }\n\n const closers = document.querySelectorAll('[data-dialog-close]')\n const dialogClosers = []\n\n for (const celement of closers) {\n dialogClosers.push(new CloseDialog(celement))\n }\n\n return dialogOpeners\n}\n","// Provide a way to close an accordion sub menu externally.\nexport class AccordionCloser {\n constructor (elem) {\n this.elem = elem\n this.id = this.elem.dataset.subCloseId\n this.target = document.getElementById(this.id)\n\n this.elem.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.closeSubMenu()\n })\n\n this.elem.addEventListener('keydown', (e) => {\n if (e.keyCode === 13) {\n e.preventDefault()\n e.stopPropagation()\n this.closeSubMenu()\n }\n })\n }\n\n closeSubMenu () {\n if (this.target.hasAttribute('open')) {\n this.target.removeAttribute('open')\n }\n }\n}\n\nexport function loadAccordionClosers () {\n const elems = document.querySelectorAll('[data-sub-close-id]')\n const accordionClosers = []\n\n for (const element of elems) {\n accordionClosers.push(new AccordionCloser(element))\n }\n\n return accordionClosers\n}\n","export class FlipCard {\n constructor (elem) {\n this.inner = elem.querySelector('[data-flip-card-inner]')\n this.front = elem.querySelector('[data-flip-card-front]')\n this.back = elem.querySelector('[data-flip-card-back]')\n this.toggle = elem.querySelectorAll('[data-flip-card-toggle]')\n\n if (this.toggle === null) {\n return\n }\n\n // loop over this.toggle and add event listeners\n this.toggle.forEach((toggle) => {\n toggle.addEventListener('click', (e) => {\n this.flip()\n })\n })\n }\n\n flip () {\n this.inner.classList.toggle('flip-card--flipped')\n if (this.inner.classList.contains('flip-card--flipped')) {\n this.front.setAttribute('aria-hidden', 'true')\n this.back.setAttribute('aria-hidden', 'false')\n } else {\n this.front.setAttribute('aria-hidden', 'false')\n this.back.setAttribute('aria-hidden', 'true')\n }\n }\n}\n\nexport function setupFlipCards (document) {\n const elems = document.querySelectorAll('[data-flip-card]')\n const flipCards = []\n\n for (const element of elems) {\n flipCards.push(new FlipCard(element))\n }\n\n return flipCards\n}\n","// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n supportCustomEvent = function CustomEvent(event, x) {\n x = x || {};\n var ev = document.createEvent('CustomEvent');\n ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n return ev;\n };\n supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * Dispatches the passed event to both an \"on<type>\" handler as well as via the\n * normal dispatch operation. Does not bubble.\n *\n * @param {!EventTarget} target\n * @param {!Event} event\n * @return {boolean}\n */\nfunction safeDispatchEvent(target, event) {\n var check = 'on' + event.type.toLowerCase();\n if (typeof target[check] === 'function') {\n target[check](event);\n }\n return target.dispatchEvent(event);\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n while (el && el !== document.body) {\n var s = window.getComputedStyle(el);\n var invalid = function(k, ok) {\n return !(s[k] === undefined || s[k] === ok);\n };\n\n if (s.opacity < 1 ||\n invalid('zIndex', 'auto') ||\n invalid('transform', 'none') ||\n invalid('mixBlendMode', 'normal') ||\n invalid('filter', 'none') ||\n invalid('perspective', 'none') ||\n s['isolation'] === 'isolate' ||\n s.position === 'fixed' ||\n s.webkitOverflowScrolling === 'touch') {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n while (el) {\n if (el.localName === 'dialog') {\n return /** @type {HTMLDialogElement} */ (el);\n }\n if (el.parentElement) {\n el = el.parentElement;\n } else if (el.parentNode) {\n el = el.parentNode.host;\n } else {\n el = null;\n }\n }\n return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n // Find the actual focused element when the active element is inside a shadow root\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement;\n }\n\n if (el && el.blur && el !== document.body) {\n el.blur();\n }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n for (var i = 0; i < nodeList.length; ++i) {\n if (nodeList[i] === node) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n if (!el || !el.hasAttribute('method')) {\n return false;\n }\n return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!DocumentFragment|!Element} hostElement\n * @return {?Element}\n */\nfunction findFocusableElementWithin(hostElement) {\n // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n // alternative involves stepping through and trying to focus everything.\n var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n var query = opts.map(function(el) {\n return el + ':not([disabled])';\n });\n // TODO(samthor): tabindex values that are not numeric are not focusable.\n query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])'); // tabindex != \"\", not disabled\n var target = hostElement.querySelector(query.join(', '));\n\n if (!target && 'attachShadow' in Element.prototype) {\n // If we haven't found a focusable target, see if the host element contains an element\n // which has a shadowRoot.\n // Recursively search for the first focusable item in shadow roots.\n var elems = hostElement.querySelectorAll('*');\n for (var i = 0; i < elems.length; i++) {\n if (elems[i].tagName && elems[i].shadowRoot) {\n target = findFocusableElementWithin(elems[i].shadowRoot);\n if (target) {\n break;\n }\n }\n }\n }\n return target;\n}\n\n/**\n * Determines if an element is attached to the DOM.\n * @param {Element} element to check\n * @return {boolean} whether the element is in DOM\n */\nfunction isConnected(element) {\n return element.isConnected || document.body.contains(element);\n}\n\n/**\n * @param {!Event} event\n * @return {?Element}\n */\nfunction findFormSubmitter(event) {\n if (event.submitter) {\n return event.submitter;\n }\n\n var form = event.target;\n if (!(form instanceof HTMLFormElement)) {\n return null;\n }\n\n var submitter = dialogPolyfill.formSubmitter;\n if (!submitter) {\n var target = event.target;\n var root = ('getRootNode' in target && target.getRootNode() || document);\n submitter = root.activeElement;\n }\n\n if (!submitter || submitter.form !== form) {\n return null;\n }\n return submitter;\n}\n\n/**\n * @param {!Event} event\n */\nfunction maybeHandleSubmit(event) {\n if (event.defaultPrevented) {\n return;\n }\n var form = /** @type {!HTMLFormElement} */ (event.target);\n\n // We'd have a value if we clicked on an imagemap.\n var value = dialogPolyfill.imagemapUseValue;\n var submitter = findFormSubmitter(event);\n if (value === null && submitter) {\n value = submitter.value;\n }\n\n // There should always be a dialog as this handler is added specifically on them, but check just\n // in case.\n var dialog = findNearestDialog(form);\n if (!dialog) {\n return;\n }\n\n // Prefer formmethod on the button.\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod !== 'dialog') {\n return;\n }\n event.preventDefault();\n\n if (value != null) {\n // nb. we explicitly check against null/undefined\n dialog.close(value);\n } else {\n dialog.close();\n }\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n this.dialog_ = dialog;\n this.replacedStyleTop_ = false;\n this.openAsModal_ = false;\n\n // Set a11y role. Browsers that support dialog implicitly know this already.\n if (!dialog.hasAttribute('role')) {\n dialog.setAttribute('role', 'dialog');\n }\n\n dialog.show = this.show.bind(this);\n dialog.showModal = this.showModal.bind(this);\n dialog.close = this.close.bind(this);\n\n dialog.addEventListener('submit', maybeHandleSubmit, false);\n\n if (!('returnValue' in dialog)) {\n dialog.returnValue = '';\n }\n\n if ('MutationObserver' in window) {\n var mo = new MutationObserver(this.maybeHideModal.bind(this));\n mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n } else {\n // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n // seem to fire even if the element was removed as part of a parent removal. Use the removed\n // events to force downgrade (useful if removed/immediately added).\n var removed = false;\n var cb = function() {\n removed ? this.downgradeModal() : this.maybeHideModal();\n removed = false;\n }.bind(this);\n var timeout;\n var delayModel = function(ev) {\n if (ev.target !== dialog) { return; } // not for a child element\n var cand = 'DOMNodeRemoved';\n removed |= (ev.type.substr(0, cand.length) === cand);\n window.clearTimeout(timeout);\n timeout = window.setTimeout(cb, 0);\n };\n ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n dialog.addEventListener(name, delayModel);\n });\n }\n // Note that the DOM is observed inside DialogManager while any dialog\n // is being displayed as a modal, to catch modal removal from the DOM.\n\n Object.defineProperty(dialog, 'open', {\n set: this.setOpen.bind(this),\n get: dialog.hasAttribute.bind(dialog, 'open')\n });\n\n this.backdrop_ = document.createElement('div');\n this.backdrop_.className = 'backdrop';\n this.backdrop_.addEventListener('mouseup' , this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('mousedown', this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('click' , this.backdropMouseEvent_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = /** @type {HTMLDialogElement.prototype} */ ({\n\n get dialog() {\n return this.dialog_;\n },\n\n /**\n * Maybe remove this dialog from the modal top layer. This is called when\n * a modal dialog may no longer be tenable, e.g., when the dialog is no\n * longer open or is no longer part of the DOM.\n */\n maybeHideModal: function() {\n if (this.dialog_.hasAttribute('open') && isConnected(this.dialog_)) { return; }\n this.downgradeModal();\n },\n\n /**\n * Remove this dialog from the modal top layer, leaving it as a non-modal.\n */\n downgradeModal: function() {\n if (!this.openAsModal_) { return; }\n this.openAsModal_ = false;\n this.dialog_.style.zIndex = '';\n\n // This won't match the native <dialog> exactly because if the user set top on a centered\n // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n // possible to polyfill this perfectly.\n if (this.replacedStyleTop_) {\n this.dialog_.style.top = '';\n this.replacedStyleTop_ = false;\n }\n\n // Clear the backdrop and remove from the manager.\n this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n dialogPolyfill.dm.removeDialog(this);\n },\n\n /**\n * @param {boolean} value whether to open or close this dialog\n */\n setOpen: function(value) {\n if (value) {\n this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n } else {\n this.dialog_.removeAttribute('open');\n this.maybeHideModal(); // nb. redundant with MutationObserver\n }\n },\n\n /**\n * Handles mouse events ('mouseup', 'mousedown', 'click') on the fake .backdrop element, redirecting them as if\n * they were on the dialog itself.\n *\n * @param {!Event} e to redirect\n */\n backdropMouseEvent_: function(e) {\n if (!this.dialog_.hasAttribute('tabindex')) {\n // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n // would not be needed - clicks would move the implicit cursor there.\n var fake = document.createElement('div');\n this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n fake.tabIndex = -1;\n fake.focus();\n this.dialog_.removeChild(fake);\n } else {\n this.dialog_.focus();\n }\n\n var redirectedEvent = document.createEvent('MouseEvents');\n redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n this.dialog_.dispatchEvent(redirectedEvent);\n e.stopPropagation();\n },\n\n /**\n * Focuses on the first focusable element within the dialog. This will always blur the current\n * focus, even if nothing within the dialog is found.\n */\n focus_: function() {\n // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n if (!target && this.dialog_.tabIndex >= 0) {\n target = this.dialog_;\n }\n if (!target) {\n target = findFocusableElementWithin(this.dialog_);\n }\n safeBlur(document.activeElement);\n target && target.focus();\n },\n\n /**\n * Sets the zIndex for the backdrop and dialog.\n *\n * @param {number} dialogZ\n * @param {number} backdropZ\n */\n updateZIndex: function(dialogZ, backdropZ) {\n if (dialogZ < backdropZ) {\n throw new Error('dialogZ should never be < backdropZ');\n }\n this.dialog_.style.zIndex = dialogZ;\n this.backdrop_.style.zIndex = backdropZ;\n },\n\n /**\n * Shows the dialog. If the dialog is already open, this does nothing.\n */\n show: function() {\n if (!this.dialog_.open) {\n this.setOpen(true);\n this.focus_();\n }\n },\n\n /**\n * Show this dialog modally.\n */\n showModal: function() {\n if (this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n }\n if (!isConnected(this.dialog_)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n }\n if (!dialogPolyfill.dm.pushDialog(this)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n }\n\n if (createsStackingContext(this.dialog_.parentElement)) {\n console.warn('A dialog is being shown inside a stacking context. ' +\n 'This may cause it to be unusable. For more information, see this link: ' +\n 'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n }\n\n this.setOpen(true);\n this.openAsModal_ = true;\n\n // Optionally center vertically, relative to the current viewport.\n if (dialogPolyfill.needsCentering(this.dialog_)) {\n dialogPolyfill.reposition(this.dialog_);\n this.replacedStyleTop_ = true;\n } else {\n this.replacedStyleTop_ = false;\n }\n\n // Insert backdrop.\n this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n // Focus on whatever inside the dialog.\n this.focus_();\n },\n\n /**\n * Closes this HTMLDialogElement. This is optional vs clearing the open\n * attribute, however this fires a 'close' event.\n *\n * @param {string=} opt_returnValue to use as the returnValue\n */\n close: function(opt_returnValue) {\n if (!this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n }\n this.setOpen(false);\n\n // Leave returnValue untouched in case it was set directly on the element\n if (opt_returnValue !== undefined) {\n this.dialog_.returnValue = opt_returnValue;\n }\n\n // Triggering \"close\" event for any attached listeners on the <dialog>.\n var closeEvent = new supportCustomEvent('close', {\n bubbles: false,\n cancelable: false\n });\n safeDispatchEvent(this.dialog_, closeEvent);\n }\n\n});\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n for (var i = 0; i < document.styleSheets.length; ++i) {\n var styleSheet = document.styleSheets[i];\n var cssRules = null;\n // Some browsers throw on cssRules.\n try {\n cssRules = styleSheet.cssRules;\n } catch (e) {}\n if (!cssRules) { continue; }\n for (var j = 0; j < cssRules.length; ++j) {\n var rule = cssRules[j];\n var selectedNodes = null;\n // Ignore errors on invalid selector texts.\n try {\n selectedNodes = document.querySelectorAll(rule.selectorText);\n } catch(e) {}\n if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n continue;\n }\n var cssTop = rule.style.getPropertyValue('top');\n var cssBottom = rule.style.getPropertyValue('bottom');\n if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n return true;\n }\n }\n }\n return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n var computedStyle = window.getComputedStyle(dialog);\n if (computedStyle.position !== 'absolute') {\n return false;\n }\n\n // We must determine whether the top/bottom specified value is non-auto. In\n // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n // Firefox returns the used value. So we do this crazy thing instead: check\n // the inline style and then go through CSS rules.\n if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n return false;\n }\n return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n if (window.HTMLDialogElement || element.showModal) {\n console.warn('This browser already supports <dialog>, the polyfill ' +\n 'may not work correctly', element);\n }\n if (element.localName !== 'dialog') {\n throw new Error('Failed to register dialog: The element is not a dialog.');\n }\n new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n if (!element.showModal) {\n dialogPolyfill.forceRegisterDialog(element);\n }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n /** @type {!Array<!dialogPolyfillInfo>} */\n this.pendingDialogStack = [];\n\n var checkDOM = this.checkDOM_.bind(this);\n\n // The overlay is used to simulate how a modal dialog blocks the document.\n // The blocking dialog is positioned on top of the overlay, and the rest of\n // the dialogs on the pending dialog stack are positioned below it. In the\n // actual implementation, the modal dialog stacking is controlled by the\n // top layer, where z-index has no effect.\n this.overlay = document.createElement('div');\n this.overlay.className = '_dialog_overlay';\n this.overlay.addEventListener('click', function(e) {\n this.forwardTab_ = undefined;\n e.stopPropagation();\n checkDOM([]); // sanity-check DOM\n }.bind(this));\n\n this.handleKey_ = this.handleKey_.bind(this);\n this.handleFocus_ = this.handleFocus_.bind(this);\n\n this.zIndexLow_ = 100000;\n this.zIndexHigh_ = 100000 + 150;\n\n this.forwardTab_ = undefined;\n\n if ('MutationObserver' in window) {\n this.mo_ = new MutationObserver(function(records) {\n var removed = [];\n records.forEach(function(rec) {\n for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n if (!(c instanceof Element)) {\n continue;\n } else if (c.localName === 'dialog') {\n removed.push(c);\n }\n removed = removed.concat(c.querySelectorAll('dialog'));\n }\n });\n removed.length && checkDOM(removed);\n });\n }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n document.documentElement.addEventListener('focus', this.handleFocus_, true);\n document.addEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n document.removeEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n var zIndex = this.zIndexHigh_;\n\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n dpi.updateZIndex(--zIndex, --zIndex);\n if (i === 0) {\n this.overlay.style.zIndex = --zIndex;\n }\n }\n\n // Make the overlay a sibling of the dialog itself.\n var last = this.pendingDialogStack[0];\n if (last) {\n var p = last.dialog.parentNode || document.body;\n p.appendChild(this.overlay);\n } else if (this.overlay.parentNode) {\n this.overlay.parentNode.removeChild(this.overlay);\n }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n while (candidate = findNearestDialog(candidate)) {\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n if (dpi.dialog === candidate) {\n return i === 0; // only valid if top-most\n }\n }\n candidate = candidate.parentElement;\n }\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n var target = event.composedPath ? event.composedPath()[0] : event.target;\n\n if (this.containedByTopDialog_(target)) { return; }\n\n if (document.activeElement === document.documentElement) { return; }\n\n event.preventDefault();\n event.stopPropagation();\n safeBlur(/** @type {Element} */ (target));\n\n if (this.forwardTab_ === undefined) { return; } // move focus only from a tab key\n\n var dpi = this.pendingDialogStack[0];\n var dialog = dpi.dialog;\n var position = dialog.compareDocumentPosition(target);\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n if (this.forwardTab_) {\n // forward\n dpi.focus_();\n } else if (target !== document.documentElement) {\n // backwards if we're not already focused on <html>\n document.documentElement.focus();\n }\n }\n\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n this.forwardTab_ = undefined;\n if (event.keyCode === 27) {\n event.preventDefault();\n event.stopPropagation();\n var cancelEvent = new supportCustomEvent('cancel', {\n bubbles: false,\n cancelable: true\n });\n var dpi = this.pendingDialogStack[0];\n if (dpi && safeDispatchEvent(dpi.dialog, cancelEvent)) {\n dpi.dialog.close();\n }\n } else if (event.keyCode === 9) {\n this.forwardTab_ = !event.shiftKey;\n }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n // This operates on a clone because it may cause it to change. Each change also calls\n // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n // at a time?!\n var clone = this.pendingDialogStack.slice();\n clone.forEach(function(dpi) {\n if (removed.indexOf(dpi.dialog) !== -1) {\n dpi.downgradeModal();\n } else {\n dpi.maybeHideModal();\n }\n });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n if (this.pendingDialogStack.length >= allowed) {\n return false;\n }\n if (this.pendingDialogStack.unshift(dpi) === 1) {\n this.blockDocument();\n }\n this.updateStacking();\n return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n var index = this.pendingDialogStack.indexOf(dpi);\n if (index === -1) { return; }\n\n this.pendingDialogStack.splice(index, 1);\n if (this.pendingDialogStack.length === 0) {\n this.unblockDocument();\n }\n this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.imagemapUseValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n /**\n * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n * one that returns the correct value.\n */\n var testForm = document.createElement('form');\n testForm.setAttribute('method', 'dialog');\n if (testForm.method !== 'dialog') {\n var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n if (methodDescriptor) {\n // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n // and don't bother to update the element.\n var realGet = methodDescriptor.get;\n methodDescriptor.get = function() {\n if (isFormMethodDialog(this)) {\n return 'dialog';\n }\n return realGet.call(this);\n };\n var realSet = methodDescriptor.set;\n /** @this {HTMLElement} */\n methodDescriptor.set = function(v) {\n if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n return this.setAttribute('method', v);\n }\n return realSet.call(this, v);\n };\n Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n }\n }\n\n /**\n * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n * document.activeElement.\n */\n document.addEventListener('click', function(ev) {\n dialogPolyfill.formSubmitter = null;\n dialogPolyfill.imagemapUseValue = null;\n if (ev.defaultPrevented) { return; } // e.g. a submit which prevents default submission\n\n var target = /** @type {Element} */ (ev.target);\n if ('composedPath' in ev) {\n var path = ev.composedPath();\n target = path.shift() || target;\n }\n if (!target || !isFormMethodDialog(target.form)) { return; }\n\n var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n if (!valid) {\n if (!(target.localName === 'input' && target.type === 'image')) { return; }\n // this is a <input type=\"image\">, which can submit forms\n dialogPolyfill.imagemapUseValue = ev.offsetX + ',' + ev.offsetY;\n }\n\n var dialog = findNearestDialog(target);\n if (!dialog) { return; }\n\n dialogPolyfill.formSubmitter = target;\n\n }, false);\n\n /**\n * Global 'submit' handler. This handles submits of `method=\"dialog\"` which are invalid, i.e.,\n * outside a dialog. They get prevented.\n */\n document.addEventListener('submit', function(ev) {\n var form = ev.target;\n var dialog = findNearestDialog(form);\n if (dialog) {\n return; // ignore, handle there\n }\n\n var submitter = findFormSubmitter(ev);\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod === 'dialog') {\n ev.preventDefault();\n }\n });\n\n /**\n * Replace the native HTMLFormElement.submit() method, as it won't fire the\n * submit event and give us a chance to respond.\n */\n var nativeFormSubmit = HTMLFormElement.prototype.submit;\n var replacementFormSubmit = function () {\n if (!isFormMethodDialog(this)) {\n return nativeFormSubmit.call(this);\n }\n var dialog = findNearestDialog(this);\n dialog && dialog.close();\n };\n HTMLFormElement.prototype.submit = replacementFormSubmit;\n}\n\nexport default dialogPolyfill;\n","import { Logger } from '../../utilities/Logger'\nimport { allowBodyScroll, stopBodyScroll } from './controlBodyScroll'\n\nexport class ModalDialogue {\n constructor (elem) {\n this.logger = new Logger('ModalDialogue')\n this.elem = elem\n this.modalId = this.elem.dataset.modalId\n this.elem.isOpen = false\n this.setupEvents()\n }\n\n registerObjects () {\n this.togglers = document.querySelectorAll('[data-modal-toggle=\"' + this.modalId + '\"]')\n this.openers = document.querySelectorAll('[data-modal-open=\"' + this.modalId + '\"]')\n this.closers = document.querySelectorAll('[data-modal-close=\"' + this.modalId + '\"]')\n }\n\n setupEvents () {\n this.registerObjects()\n this.logger.log(`Setting up events for ${this.modalId}`)\n\n const addClickListener = (element, handler) => {\n if (element.dataset.clickbound !== 'true') {\n element.addEventListener('click', handler)\n element.dataset.clickbound = 'true'\n }\n }\n\n this.elem.addEventListener('click', (e) => {\n if (e.target === this.elem && this.elem.hasAttribute('open')) {\n this.close()\n }\n })\n\n this.togglers.forEach((toggler) => {\n addClickListener(toggler, this.toggleHandler.bind(this))\n })\n\n this.openers.forEach((opener) => {\n addClickListener(opener, this.openHandler.bind(this))\n })\n\n this.closers.forEach((closer) => {\n addClickListener(closer, this.closeHandler.bind(this))\n })\n }\n\n toggleHandler (e) {\n e.preventDefault()\n this.toggle()\n }\n\n openHandler (e) {\n e.preventDefault()\n this.open()\n }\n\n closeHandler (e) {\n e.preventDefault()\n e.stopPropagation()\n this.close()\n }\n\n toggle () {\n if (this.elem.isOpen) {\n this.close()\n } else {\n this.open()\n }\n }\n\n open () {\n if (!this.elem.isOpen) {\n stopBodyScroll()\n this.elem.classList.add('is-open')\n this.elem.setAttribute('aria-hidden', 'false')\n this.elem.showModal()\n this.elem.isOpen = true\n }\n }\n\n close () {\n if (this.elem.open) {\n allowBodyScroll()\n this.elem.classList.remove('is-open')\n this.elem.setAttribute('aria-hidden', 'true')\n this.elem.close()\n this.elem.isOpen = false\n }\n }\n}\n\nexport const setupModals = function (parent) {\n const elems = parent.querySelectorAll('[data-modal-id]')\n\n const modals = []\n\n for (const elem of elems) {\n modals.push(new ModalDialogue(elem))\n }\n\n return modals\n}\n\nwindow.setupModal = function (elem) {\n const modal = new ModalDialogue(elem)\n\n return modal\n}\n","// A class to provide bespoke select box styling.\nexport class SelectStyling {\n constructor (elem) {\n this.elem = elem\n\n this.setupEvents()\n }\n\n setupEvents () {\n this.elem.addEventListener('change', () => {\n this.elem.classList.toggle('select--selected', this.elem.value !== '')\n })\n }\n}\n\nexport const setupSelectStyling = function (parent) {\n const elems = parent.querySelectorAll('select')\n\n const selectors = []\n\n for (const elem of elems) {\n selectors.push(new SelectStyling(elem))\n }\n\n return selectors\n}\n\nwindow.setupSelects = function (parent) {\n const selectors = setupSelectStyling(parent)\n\n return selectors\n}\n","export class Tabs {\n constructor (elem) {\n this.elem = elem\n this.button = this.elem.querySelectorAll('[data-tabs-btn]')\n this.content = this.elem.querySelectorAll('[data-tabs-content]')\n this.activateTab = this.activateTab.bind(this)\n this.changeTabEvent = this.elem.dataset.changeTab !== undefined ? this.elem.dataset.changeTab : ''\n\n this.button.forEach((btn) => {\n btn.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.activateTab(e.currentTarget)\n })\n\n btn.addEventListener('keydown', (e) => {\n if (e.keyCode === 13) {\n // Enter key\n e.preventDefault()\n e.stopPropagation()\n this.activateTab(e.currentTarget)\n }\n })\n })\n }\n\n raiseActiveTabEvent (btnValue) {\n if (this.changeTabEvent) {\n const event = new CustomEvent(this.changeTabEvent, {\n bubbles: true,\n detail: {\n buttonID: btnValue\n }\n })\n this.elem.dispatchEvent(event)\n }\n }\n\n activateTab (clickedBtn) {\n const btnValue = clickedBtn.getAttribute('data-tabs-btn')\n this.button.forEach((btn) => {\n if (btn.getAttribute('data-tabs-btn') === btnValue) {\n btn.setAttribute('data-active', 'true')\n this.raiseActiveTabEvent(btnValue)\n } else {\n btn.removeAttribute('data-active')\n }\n })\n\n // Deactivate all tabs and activate the matching one\n this.content.forEach((content) => {\n if (content.getAttribute('data-tabs-content') === btnValue) {\n content.setAttribute('data-active', 'true')\n } else {\n content.removeAttribute('data-active')\n }\n })\n }\n}\n\n// Set the active tab from outside the class.\nexport function selectActiveTab (tabId) {\n // Find the button and content to activate.\n const activeButton = document.querySelector(`[data-tabs-btn='${tabId}']`)\n if (activeButton) {\n const activeParent = activeButton.closest('[data-tabs]')\n if (activeParent) {\n const allButtons = activeParent.querySelectorAll('[data-tabs-btn]')\n const allContent = activeParent.querySelectorAll('[data-tabs-content]')\n\n allButtons.forEach((btn) => {\n if (btn.getAttribute('data-tabs-btn') === tabId) {\n btn.setAttribute('data-active', 'true')\n } else {\n btn.removeAttribute('data-active')\n }\n })\n\n allContent.forEach((content) => {\n if (content.getAttribute('data-tabs-content') === tabId) {\n content.setAttribute('data-active', 'true')\n } else {\n content.removeAttribute('data-active')\n }\n })\n }\n }\n}\n\nexport function setupTabs () {\n const elems = document.querySelectorAll('[data-tabs]')\n const tabs = []\n\n for (const element of elems) {\n tabs.push(new Tabs(element))\n }\n\n window.selectActiveTab = selectActiveTab\n\n return tabs\n}\n","const numberRegex = /\\d+/\n\nconst setVideoSource = function (video, inlineOnly = false) {\n const sources = video.querySelectorAll('source')\n let sourceSet = false\n let i = 0\n\n if (sources.length === 1) {\n video.src = sources[0].dataset.src\n return\n }\n\n while (sourceSet === false) {\n const source = sources.length > i + 1 ? sources[i] : null\n\n // If source is undefined (basically means if there is no version of the video for large desktops)\n // Revert to the previous source\n if (source === null) {\n if (i > 0) {\n video.src = sources[i - 1].dataset.src\n sourceSet = true\n }\n return\n }\n\n const mediaQuery = source.dataset.media\n\n if (mediaQuery === '' || mediaQuery === null) {\n video.src = source.dataset.src\n sourceSet = true\n return\n }\n\n if (inlineOnly === true) {\n const width = video.offsetWidth > (video.offsetHeight / 0.5625) ? video.offsetWidth : video.offsetHeight * 1.777\n const widthFromQuery = mediaQuery.match(numberRegex)\n\n const queryWidth = widthFromQuery ? parseInt(widthFromQuery[0]) : null\n\n if (queryWidth !== null && width <= queryWidth) {\n video.src = source.dataset.src\n sourceSet = true\n }\n } else {\n if (window.matchMedia(mediaQuery).matches) {\n video.src = source.dataset.src\n sourceSet = true\n }\n }\n\n i++\n }\n}\n\nconst getVimeoSources = function (vimeoData) {\n const data = JSON.parse(vimeoData)\n\n const sources = data.map(version => {\n if (version === data[data.length - 1]) {\n return `<source data-src=\"${version.link}\" media=\"\" type=\"${version.videoType}\" />`\n }\n\n return `<source data-src=\"${version.link}\" media=\"(max-width: ${version.width}px)\" type=\"${version.videoType}\" />`\n })\n\n return sources.join('')\n}\n\nexport {\n setVideoSource,\n getVimeoSources\n}\n","import { Logger } from './Logger'\n\nconst eventName = 'stylesheet-loaded'\nconst logger = new Logger('Main Stylesheet')\nlet ss = null\nlet loaded = false\nconst config = { attributes: true, childList: false, subtree: false }\n\nconst callback = function (mutationsList, observer) {\n for (const mutation of mutationsList) {\n if (mutation.type === 'attributes') {\n loaded = true\n logger.log('loaded')\n ss.dispatchEvent(new CustomEvent(eventName))\n }\n }\n}\nlet observer = null\n\nconst setupObserver = function () {\n if (ss === null) {\n ss = document.querySelector('#cssFile')\n\n if (ss) {\n if (ss.sheet != null || ss.media === 'all') {\n ss.media = 'all'\n loaded = true\n }\n }\n }\n\n if (ss !== null && loaded === false) {\n ss.addEventListener('load', function () {\n ss.media = 'all'\n loaded = true\n ss.dispatchEvent(new CustomEvent(eventName))\n logger.log('loaded')\n })\n\n if (ss.sheet != null) {\n ss.media = 'all'\n loaded = true\n }\n\n if (observer === null) {\n observer = new MutationObserver(callback)\n }\n observer.observe(ss, config)\n } else {\n loaded = true\n }\n}\n\nconst EnsureStylesheetLoaded = function () {\n setupObserver()\n const promise = new Promise((resolve, reject) => {\n if (loaded === true) {\n resolve()\n } else {\n if (ss && ss.media === 'all') {\n loaded = true\n resolve()\n }\n if (ss) {\n ss.addEventListener(eventName, function () {\n if (observer !== null) {\n observer.disconnect()\n observer = null\n }\n resolve()\n })\n }\n }\n })\n\n return promise\n}\n\nexport {\n EnsureStylesheetLoaded\n}\n","const options = {\n root: null,\n rootMargin: '60px 0px -50px',\n threshold: 0\n}\n\nconst callback = (entries, observer) => {\n entries.forEach(entry => {\n const elem = entry.target\n if (entry.isIntersecting) {\n elem.isLeaving = true\n elem.dispatchEvent(new CustomEvent(elem.dataset.visibleEvent, { bubbles: true, detail: true }))\n } else if (elem.isLeaving) {\n elem.classList.remove(elem.dataset.completeClass)\n elem.dispatchEvent(new CustomEvent(elem.dataset.hiddenEvent, { bubbles: true, detail: false }))\n }\n })\n}\n\nconst observer = new IntersectionObserver(callback, options)\n\nconst setupInViewEvents = function (elem, visibleEvent, hiddenEvent) {\n elem.dataset.visibleEvent = visibleEvent\n elem.dataset.hiddenEvent = hiddenEvent\n observer.observe(elem)\n}\n\nexport {\n setupInViewEvents\n}\n","import { setVideoSource } from '../../utilities/set-video-source'\nimport { EnsureStylesheetLoaded } from '../../utilities/EnsureStylesheetLoaded'\nimport { setupInViewEvents } from '../../utilities/loader-events'\nimport { Logger } from '../../utilities/Logger'\n\nconst logger = new Logger('Inline videos')\nconst playEvent = 'video:in-view'\nconst pauseEvent = 'video:out-of-view'\n\nconst setupInlineVideo = function (video) {\n EnsureStylesheetLoaded().then(() => {\n let initialised = false\n const autoplay = video.attributes.autoplay !== undefined\n video.addEventListener(playEvent, function () {\n if (!initialised) {\n logger.log('loading inline video')\n setVideoSource(video, true)\n initialised = true\n }\n\n if (autoplay) {\n video.style.opacity = 1\n video.play()\n }\n logger.log('playing inline video')\n })\n\n video.addEventListener(pauseEvent, function () {\n video.pause()\n logger.log('pausing inline video')\n })\n\n setupInViewEvents(video, playEvent, pauseEvent)\n\n // Get associated play and pause controls.\n const videoId = video.attributes.id.value\n const playControls = document.querySelectorAll(`[aria-controls=\"${videoId}\"][data-video-action=\"play\"]`)\n\n for (const playBtn of playControls) {\n playBtn.addEventListener('click', () => {\n if (video.paused) {\n video.play()\n video.style.opacity = 1\n playBtn.setAttribute('aria-label', 'Pause video')\n } else {\n video.pause()\n playBtn.setAttribute('aria-label', 'Play video')\n }\n })\n }\n })\n}\n\nconst setupInlineVideos = function (parent, setupRecheck = true) {\n const videos = parent.querySelectorAll('video[data-play-inline]')\n\n if (setupRecheck) {\n document.addEventListener('recheck-script', (e) => {\n setupInlineVideos(parent, false)\n })\n }\n\n for (const video of videos) {\n setupInlineVideo(video)\n }\n}\n\nexport {\n setupInlineVideos\n}\n","const isTouchDevice = function () {\n return (('ontouchstart' in window) ||\n (navigator.maxTouchPoints > 0) ||\n (navigator.msMaxTouchPoints > 0))\n}\n\nconst isIphone = function () {\n return navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)\n}\n\nconst desktopMedia = window.matchMedia('(min-width: 1200px)')\n\nexport {\n isTouchDevice,\n isIphone,\n desktopMedia\n}\n","import { Logger } from '../../utilities/Logger.js'\nimport { isTouchDevice, desktopMedia } from '../../utilities/device-detection'\n\nconst LARGE_BREAKPOINT = 1280\n\nexport class SliderCardSet {\n constructor (elem) {\n this.wrapper = elem.querySelector('[data-slider-card-set-wrapper]')\n this.pagination = elem.querySelector('[data-slider-card-set-pagination]')\n this.prevBtn = elem.querySelector('[data-slider-card-set-prev]')\n this.nextBtn = elem.querySelector('[data-slider-card-set-next]')\n this.cards = elem.querySelectorAll('[data-slider-card-set-item]')\n this.isFullWidth = elem.hasAttribute('data-slider-card-set-full-width')\n this.currentFocus = 0\n this.adjustNavigationButtons = this.adjustNavigationButtons.bind(this)\n this.logger = new Logger('Slider card set')\n\n if (!this.wrapper || !this.cards?.length) {\n return\n }\n\n if (this.prevBtn) {\n this.prevBtn.addEventListener('click', () => {\n this.setButtonStates()\n const currentFocus = this.getCurrentFocusBasedOnScroll()\n // Update card index.\n\n if (currentFocus > 0) {\n const targetCardLeft =\n this.cards[currentFocus - 1].offsetLeft - this.parentPaddingLeft - this.wrapper.offsetLeft\n\n this.wrapper.scrollTo({\n left: targetCardLeft,\n behavior: 'smooth'\n })\n\n this.cards[currentFocus - 1].focus()\n this.announceCardChange(this.cards[currentFocus - 1])\n } else {\n const zeroLeft = this.cards[0].offsetLeft - this.parentPaddingLeft - this.wrapper.offsetLeft\n this.wrapper.scrollTo({\n left: zeroLeft,\n behavior: 'smooth'\n })\n }\n })\n }\n\n if (this.nextBtn) {\n this.nextBtn.addEventListener('click', () => {\n this.setButtonStates()\n\n const currentFocus = this.getCurrentFocusBasedOnScroll()\n\n if (currentFocus < this.cards.length - 1) {\n const targetCardLeft =\n this.cards[currentFocus + 1].offsetLeft - this.parentPaddingLeft - this.wrapper.offsetLeft\n\n this.wrapper.scrollTo({\n left: targetCardLeft,\n behavior: 'smooth'\n })\n\n this.cards[currentFocus + 1].focus()\n this.announceCardChange(this.cards[currentFocus + 1])\n }\n })\n }\n\n this.wrapper.addEventListener('scrollend', (e) => {\n this.setButtonStates()\n })\n\n this.adjustNavigationButtons()\n\n window.addEventListener('resize', this.adjustNavigationButtons)\n }\n\n announceCardChange (card) {\n const announcement = document.createElement('div')\n announcement.setAttribute('role', 'alert')\n announcement.setAttribute('aria-live', 'polite')\n announcement.classList.add('visually-hidden')\n announcement.innerText = `Viewing ${card.getAttribute('aria-label')}`\n document.body.appendChild(announcement)\n\n // Remove the announcement after it has been read\n setTimeout(() => {\n document.body.removeChild(announcement)\n }, 1000)\n\n setTimeout(() => {\n this.setButtonStates()\n }, 200)\n }\n\n setButtonStates () {\n this.setButtonState(this.prevBtn, this.wrapper.scrollLeft <= 10)\n this.setButtonState(this.nextBtn, this.wrapper.scrollWidth - this.wrapper.scrollLeft <= (this.wrapper.clientWidth + 10))\n }\n\n setButtonState (button, state) {\n button.disabled = state\n }\n\n adjustNavigationButtons () {\n const viewportWidth = window.innerWidth\n\n if (!this.isFullWidth && viewportWidth >= LARGE_BREAKPOINT) {\n this.pagination.style.display = 'none'\n return // exit the function early\n }\n\n const cardWidth = this.cards[0].offsetWidth\n const cardMinWidth = parseFloat(\n getComputedStyle(this.cards[0]).getPropertyValue('flex-basis')\n )\n\n // Check the width against min-width and show/hide navigation buttons\n if (cardWidth > cardMinWidth || (isTouchDevice() && !desktopMedia.matches)) {\n this.pagination.style.display = 'none'\n } else {\n this.pagination.style.display = 'flex'\n }\n }\n\n getCurrentFocusBasedOnScroll () {\n const scrollPosition = this.wrapper.scrollLeft\n this.parentPaddingLeft = parseFloat(\n getComputedStyle(this.wrapper).getPropertyValue('padding-left')\n )\n\n const closestCardIndex = 0\n const minDiff = Math.round(scrollPosition + this.wrapper.offsetLeft)\n\n // First card on screen.\n for (let index = 0; index < this.cards.length; index++) {\n const diff = Math.round(this.cards[index].offsetLeft - this.parentPaddingLeft)\n if (diff >= minDiff) {\n return index\n }\n }\n\n return closestCardIndex\n }\n}\n\nexport function setupSliderCardSets (document) {\n const elems = document.querySelectorAll('[data-slider-card-set]')\n const sliderCardSets = []\n\n for (const element of elems) {\n sliderCardSets.push(new SliderCardSet(element))\n }\n\n return sliderCardSets\n}\n","export class ArticleMedia {\n constructor (elem) {\n this.embed = elem.querySelector('[data-article-media-embed]')\n this.toggle = elem.querySelector('[data-article-media-play]')\n\n if (this.toggle === null) {\n return\n }\n\n this.toggle.addEventListener('click', (e) => {\n this.play()\n })\n }\n\n play () {\n this.embed.classList.add('a-media__video--play')\n }\n}\n\nexport function setupArticleMedias (document) {\n const elems = document.querySelectorAll('[data-article-media]')\n const articleMedias = []\n\n for (const element of elems) {\n articleMedias.push(new ArticleMedia(element))\n }\n\n return articleMedias\n}\n","const openClass = 'ac--open'\n\n// Provides a class to handle the autocomplete functionality.\nclass AutoComplete {\n constructor (elem) {\n this.elem = elem\n this.itemList = elem.querySelector('ul')\n\n this.elem.addEventListener('click', e => e.stopPropagation())\n }\n\n removeContents () {\n this.itemList.innerHTML = ''\n }\n\n returnItemDetails (item, needle) {\n return `<li class=\"ac__item\">\n <a href=\"${item.url}\" class=\"ac__link\">\n ${this.markSearch(item.title, needle)}\n </a>\n </li>`\n }\n\n markSearch (inputString, searchString) {\n if (searchString) {\n // Create a regular expression using the searchString and the 'g' flag for global matching\n const regex = new RegExp(searchString, 'gi')\n // Replace the searchString with the marked version using the replace() function\n const markedString = inputString.replace(regex, '<span class=\"ac__match\">$&</span>')\n\n return markedString\n } else {\n return inputString\n }\n }\n\n open (items, needle) {\n this.elem.classList.add(openClass)\n if (items.length > 0) {\n this.itemList.innerHTML = items.map(x => this.returnItemDetails(x, needle)).join('')\n } else {\n this.close(true)\n }\n }\n\n close (removeContents = true) {\n this.elem.classList.remove(openClass)\n\n if (removeContents) {\n this.removeContents()\n }\n }\n}\n\nexport {\n AutoComplete\n}\n","const openClass = 'ac--open'\n\nclass HeroAutoComplete {\n constructor (elem) {\n this.elem = elem\n this.itemList = elem.querySelector('ul')\n\n this.elem.addEventListener('click', e => e.stopPropagation())\n }\n\n removeContents () {\n this.itemList.innerHTML = ''\n }\n\n returnItemDetails (item) {\n let breadcrumbHtml = ''\n\n if (item.breadcrumb) {\n breadcrumbHtml = `<div class=\"ac__item-bc\">${item.breadcrumb.join(' -> ')}</div>`\n }\n\n return `<li class=\"ac__item\">\n <a href=\"${item.url}\" class=\"ac__link\">\n <div class=\"ac__item-title\">${item.title}</div>\n ${breadcrumbHtml}\n </a>\n </li>`\n }\n\n open (items) {\n this.elem.classList.add(openClass)\n if (items.length > 0) {\n this.itemList.innerHTML = items.map(x => this.returnItemDetails(x)).join('')\n } else {\n this.close(true)\n }\n }\n\n close (removeContents = true) {\n this.elem.classList.remove(openClass)\n\n if (removeContents) {\n this.removeContents()\n }\n }\n}\n\nexport {\n HeroAutoComplete\n}\n","import { Focusable } from '../../accessibility/focusable'\nimport { stopBodyScroll, allowBodyScroll } from '../controls/controlBodyScroll'\nimport { AutoComplete } from './autocomplete'\nimport { HeroAutoComplete } from './hero-autocomplete'\nconst openClass = 's-dialog--open'\n\nclass SearchPanel {\n constructor (elem) {\n if (elem == null) {\n return\n }\n\n this.elem = elem\n this.id = this.elem.id\n this.focusState = new Focusable(elem)\n this.form = this.elem.querySelector('form')\n this.searchBox = this.elem.querySelector('[data-search-input]')\n this.init()\n }\n\n init () {\n this.setAutocompleteType()\n this.setupDialogEvents()\n }\n\n setAutocompleteType () {\n const autoCompleteElem = this.elem.querySelector('[data-autocomplete]')\n const heroAutoCompleteElem = this.elem.querySelector('[data-hero-autocomplete]')\n\n if (autoCompleteElem) {\n this.autoComplete = new AutoComplete(autoCompleteElem)\n } else if (heroAutoCompleteElem) {\n this.autoComplete = new HeroAutoComplete(heroAutoCompleteElem)\n }\n }\n\n setupDialogEvents () {\n this.focusState.onEscape(() => this.close())\n }\n\n open () {\n requestAnimationFrame(() => {\n this.elem.classList.add(openClass)\n document.dispatchEvent(new CustomEvent('recheck-script'))\n if (this.elem.scrollTo) {\n this.elem.scrollTo(0, 0)\n }\n\n stopBodyScroll()\n setTimeout(() => {\n this.focusState.setup()\n this.focusState.focusFirst()\n }, 500)\n })\n }\n\n close () {\n requestAnimationFrame(() => {\n this.elem.classList.remove(openClass)\n console.log('close SearchPanel')\n allowBodyScroll()\n if (this.opener !== null) {\n this.opener.focus()\n this.opener = null\n }\n })\n }\n\n populateAutocomplete (data) {\n if (data == null) {\n data = [{\n url: '#0',\n title: 'Travelling safely with your dog',\n breadcrumb: ['Support', 'Travelling with us']\n },\n {\n url: '#0',\n title: 'Travelling safely with your dog',\n breadcrumb: ['Support', 'Travelling with us']\n },\n {\n url: '#0',\n title: 'Travelling safely with your dog',\n breadcrumb: ['Support', 'Travelling with us']\n },\n {\n url: '#0',\n title: 'Travelling safely with your dog',\n breadcrumb: ['Support', 'Travelling with us']\n }]\n }\n\n this.autoComplete.open(data, this.searchBox.value)\n }\n}\n\nfunction setupSearchPanel () {\n const searchDialog = document.querySelector('[data-search-dialog]')\n\n if (searchDialog) {\n return new SearchPanel(searchDialog)\n }\n}\n\nexport {\n SearchPanel,\n setupSearchPanel\n}\n","const defaultCulture = 'en-GB'\nexport function getCurrentCulture () {\n return document.querySelector('html')?.dataset?.culture ?? defaultCulture\n}\n","export function debounce (func, timeout = 300) {\n let timer\n return (...args) => {\n clearTimeout(timer)\n timer = setTimeout(() => { func.apply(this, args) }, timeout)\n }\n}\n","import { SearchPanel } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/search-dialog'\nimport { getCurrentCulture } from '../utilities/Localization'\nimport { debounce } from '../utilities/Debounce'\n\nexport function setupSearch () {\n const searchPanels = document.querySelectorAll('[data-search-dialog]')\n if (searchPanels.length) {\n for (const panel of searchPanels) {\n const searchPanel = new SearchPanel(panel)\n const searchBox = panel.querySelector('[data-search-input]')\n if (searchBox) {\n if (searchBox.onsearch) {\n searchBox.addEventListener('search', debounce((e) => {\n autoCompleteEvent(e.target.value, searchPanel)\n }, 300))\n } else {\n searchBox.addEventListener('keyup', debounce((e) => {\n autoCompleteEvent(e.target.value, searchPanel)\n }, 300))\n }\n }\n }\n }\n}\n\nfunction getSearchEndpoint (panel) {\n const type = panel?.dataset?.searchDialog ?? 'global'\n switch (type) {\n case 'support':\n return '/api2/search/support'\n case 'global':\n default:\n return '/api2/search'\n }\n}\n\nfunction autoCompleteEvent (searchValue, searchPanel) {\n const endpoint = getSearchEndpoint(searchPanel.elem)\n fetch(`${endpoint}?q=${searchValue}`, {\n headers: {\n 'Accept-Language': getCurrentCulture()\n }\n }).then((res) => {\n if (res.ok) {\n return res.json()\n }\n throw new Error('Failed to get search results')\n })\n .then(data => {\n searchPanel.populateAutocomplete(data)\n })\n .catch((err) => {\n console.log(err)\n })\n}\n","export function setCookie (name, value, days = null) {\n if (!name) {\n return null\n }\n\n let expires = ''\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000))\n expires = '; expires=' + date.toUTCString()\n }\n\n document.cookie = name + '=' + (value || '') + expires + '; path=/;secure'\n}\n\nexport function getCookie (name) {\n const cookieName = name + '='\n const cookies = document.cookie.split(';')\n\n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i]\n while (cookie.charAt(0) === ' ') {\n cookie = cookie.substring(1)\n }\n if (cookie.indexOf(cookieName) === 0) {\n return cookie.substring(cookieName.length, cookie.length)\n }\n }\n return null\n}\n","import { setCookie, getCookie } from '../utilities/CookieUtils'\n\nconst cookieName = 'leshuttle.countrymodal.dismissed'\n\nexport function setupCountryModal () {\n const countryModal = document.querySelector('[data-country-modal]')\n\n if (!countryModal) {\n return\n }\n\n const dismissed = getCookie(cookieName)\n\n if (!dismissed) {\n showModal(countryModal)\n const dismissButton = countryModal.querySelector('button')\n\n if (dismissButton) {\n dismissButton.addEventListener('click', () => {\n dismissModal(countryModal)\n })\n }\n\n const dismissHref = countryModal.querySelector('a')\n\n if (dismissHref) {\n dismissHref.addEventListener('click', () => {\n dismissModal(countryModal)\n })\n }\n }\n}\n\nfunction showModal (modal) {\n modal.classList.remove('hide')\n}\n\nfunction dismissModal (modal) {\n setCookie(cookieName, true)\n\n modal.classList.add('hide')\n}\n","import { setCookie, getCookie } from '../utilities/CookieUtils'\n\nconst cookieName = 'leshuttle.sitealerts.dismissed'\n\nexport function setupSiteAlerts () {\n const siteAlert = document.querySelector('[data-site-alert]')\n const alertId = siteAlert?.dataset?.siteAlert\n\n if (!siteAlert || !alertId) {\n return\n }\n\n const cookieValue = getCookie(cookieName)\n\n if (!cookieValue || !alertSeen(cookieValue, alertId)) {\n showModal(siteAlert)\n const dismissButton = siteAlert.querySelector('button')\n\n if (dismissButton) {\n dismissButton.addEventListener('click', () => {\n dismissModal(siteAlert, alertId)\n })\n }\n }\n}\n\nfunction showModal (modal) {\n modal.classList.remove('hide')\n}\n\nfunction dismissModal (modal, alertId) {\n addSeenAlert(alertId)\n modal.classList.add('hide')\n}\n\nfunction alertSeen (cookieValue, alertId) {\n if (!cookieValue) {\n return false\n }\n return getSeenAlerts(cookieValue)?.find(x => x === alertId)\n}\n\nfunction getSeenAlerts (cookieValue = null) {\n const value = cookieValue || getCookie(cookieName)\n\n if (!value) {\n return []\n }\n\n return JSON.parse(value)\n}\n\nfunction addSeenAlert (alertId) {\n const alerts = getSeenAlerts()\n alerts.push(alertId)\n setCookie(cookieName, JSON.stringify(alerts))\n}\n","import { setupBookingBar } from '../components/controls/bookingBar'\nimport { Logger } from './Logger'\n\nexport class LazyLoader {\n constructor (elem, callback) {\n this.elem = elem\n this.logger = new Logger('Booking bar loader')\n this.component = this.elem.dataset.lazyComp\n this.culture = this.elem.dataset.culture || 'en-GB'\n this.initialise = this.getContent.bind(this)\n this.setupEvents()\n this.scrollTimeout = null\n }\n\n setupEvents () {\n window.addEventListener('scroll', this.initialise)\n }\n\n getContent () {\n this.logger.log('getting content')\n this.logger.log(this.culture)\n window.removeEventListener('scroll', this.initialise)\n if (this.elem.hasAttribute('data-loading')) {\n fetch(this.component, {\n headers: {\n 'Accept-Language': this.culture\n }\n })\n .then((response) => response.text())\n .then((htmlContent) => {\n this.elem.innerHTML = htmlContent\n this.elem.removeAttribute('data-loading')\n setupBookingBar(document)\n })\n }\n }\n}\n\nexport const setupLazyLoaders = function (parent) {\n const elems = parent.querySelectorAll('[data-lazy-comp]')\n const lazyLoaders = []\n\n for (const elem of elems) {\n const lazyLoader = new LazyLoader(elem)\n lazyLoaders.push(lazyLoader)\n lazyLoader.scrollTimeout = setTimeout(() => {\n if (lazyLoader.elem.hasAttribute('data-loading')) {\n lazyLoader.getContent()\n }\n }, 1000)\n }\n\n return lazyLoaders\n}\n","import { isTablet, isDesktop } from './MediaQueries.js'\n\nexport class MatchHeight {\n constructor (elem) {\n this.elem = elem\n this.matchHeightOn = this.elem.dataset.matchHeightOn\n this.items = this.elem.querySelectorAll('[data-match-height-item]')\n this.resizeTimeout = 0\n\n this.matchHeight()\n\n setTimeout(() => {\n this.matchHeight()\n }, 1000)\n\n window.addEventListener('resize', () => {\n clearTimeout(this.resizeTimeout)\n this.resizeTimeout = setTimeout(this.matchHeight.bind(this), 200)\n })\n }\n\n matchHeight () {\n this.items.forEach(item => {\n item.style.height = 'auto'\n })\n requestAnimationFrame(() => {\n if (this.shouldResize()) {\n const maxHeight = {}\n\n this.items.forEach(item => {\n const itemType = item.dataset.matchHeightItem\n const itemHeight = item.offsetHeight\n\n if (!maxHeight[itemType] || itemHeight > maxHeight[itemType]) {\n maxHeight[itemType] = itemHeight\n }\n })\n\n Object.keys(maxHeight).forEach(itemType => {\n const itemsOfType = this.elem.querySelectorAll(`[data-match-height-item=\"${itemType}\"]`)\n itemsOfType.forEach(item => {\n item.style.height = `${maxHeight[itemType]}px`\n })\n })\n }\n })\n }\n\n shouldResize () {\n if (!this.matchHeightOn) {\n return true\n }\n\n let currentScreenSize\n if (isDesktop()) {\n currentScreenSize = 'desktop'\n } else if (isTablet()) {\n currentScreenSize = 'tablet'\n } else {\n currentScreenSize = 'mobile'\n }\n if (currentScreenSize === this.matchHeightOn) {\n return true\n }\n return false\n }\n}\n\nexport function setupMatchHeight (parent) {\n const elems = parent.querySelectorAll('[data-match-height]')\n const items = []\n\n for (const element of elems) {\n items.push(new MatchHeight(element))\n }\n\n return items\n}\n","export class SupportList {\n constructor (elem) {\n this.elem = elem\n this.toggles = elem.querySelectorAll('[data-support-list-toggle]')\n this.list = elem.querySelector('[data-support-list-ul]')\n\n if (this.toggles === null) {\n return\n }\n\n this.toggles.forEach(element => {\n element.addEventListener('click', (e) => {\n this.toggleList(e.target)\n })\n })\n }\n\n toggleList (elem) {\n this.toggles.forEach(element => {\n element.classList.remove('s-list__link--hide')\n })\n elem.classList.add('s-list__link--hide')\n this.list.classList.toggle('s-list__ul--open')\n }\n}\n\nexport function setupSupportLists (document) {\n const elems = document.querySelectorAll('[data-support-list]')\n const supportLists = []\n\n for (const element of elems) {\n supportLists.push(new SupportList(element))\n }\n\n return supportLists\n}\n","import { isTouchDevice, desktopMedia } from '../../utilities/device-detection'\nimport { Logger } from '../../utilities/Logger'\nimport { documentReady } from '../../utilities/ready'\n\nconst logger = new Logger('Drag Scrolling')\n\nclass DragScrolling {\n constructor (elem, checkOverflown = true) {\n if (isTouchDevice() && !desktopMedia.matches) {\n elem.style.overflow = 'auto'\n return elem\n }\n\n this.delta = 6\n this.isDrag = false\n this.elem = elem\n this.pos = { top: 0, left: 0, x: 0, y: 0, startX: 0, startY: 0 }\n this.evRestorer = null\n this.eventsAttached = false\n\n documentReady().then(() => {\n if (this.isOverflown(elem) || checkOverflown === false) {\n this.elem.addEventListener('mousedown', e => this.mouseDownHandler(e))\n this.elem.addEventListener('click', (e) => this.clickHandler(e), false)\n this.eventsAttached = true\n }\n })\n }\n\n reinit () {\n if (isTouchDevice() && !desktopMedia.matches) {\n this.elem.style.overflow = 'auto'\n return this.elem\n }\n\n if (this.isOverflown(this.elem) && !this.eventsAttached) {\n this.elem.addEventListener('onmouseover', e => { document.body.style.cursor = 'grab' })\n this.elem.addEventListener('onmouseout', e => { document.body.style.cursor = 'default' })\n this.elem.addEventListener('mousedown', e => this.mouseDownHandler(e))\n this.elem.addEventListener('click', (e) => this.clickHandler(e), false)\n this.eventsAttached = true\n }\n }\n\n clickHandler (e) {\n if (this.isDrag) {\n e.preventDefault()\n }\n }\n\n mouseDownHandler (e) {\n if (e.button === 0) {\n this.elem.style.cursor = 'grabbing'\n this.elem.style.userSelect = 'none'\n\n this.pos = {\n left: this.elem.scrollLeft,\n top: this.elem.scrollTop,\n // Get the current mouse position\n x: e.clientX,\n y: e.clientY,\n startX: e.pageX,\n startY: e.pageY\n }\n\n this.mmH = this.mouseMoveHandler.bind(this)\n this.muH = this.mouseUpHandler.bind(this)\n\n document.addEventListener('mousemove', this.mmH)\n document.addEventListener('mouseup', this.muH)\n }\n }\n\n mouseMoveHandler (e) {\n // How far the mouse has been moved\n const dx = e.clientX - this.pos.x\n const dy = e.clientY - this.pos.y\n\n // Scroll the element\n this.elem.scrollTop = this.pos.top - dy\n this.elem.scrollLeft = this.pos.left - dx\n }\n\n mouseUpHandler (e) {\n if (e.button === 0) {\n const diffX = Math.abs(e.pageX - this.pos.startX)\n const diffY = Math.abs(e.pageY - this.pos.startY)\n\n if (diffX < this.delta && diffY < this.delta) {\n // This is a click not a drag\n this.isDrag = false\n } else {\n this.isDrag = true\n }\n document.removeEventListener('mousemove', this.mmH)\n document.removeEventListener('mouseup', this.muH)\n this.elem.style.cursor = 'grab'\n this.elem.style.removeProperty('user-select')\n }\n }\n\n isOverflown (element) {\n const computedStyle = getComputedStyle(element)\n const gap = parseFloat(computedStyle.gap) || 0\n const padding = parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight)\n let childWidth = 0\n Array.from(element.children).forEach(child => {\n childWidth += (child.offsetWidth + gap)\n })\n return (element.clientWidth - padding) <= childWidth\n }\n}\n\nconst setupScrolling = function (parent, watch = true) {\n if (watch === true) {\n document.addEventListener('leShuttle:content-change', (e) => {\n setupScrolling(e.target, false)\n })\n }\n\n const scrollers = parent.querySelectorAll('[data-scroll]')\n logger.log('setting up scrolling')\n return [...scrollers].map(x => new DragScrolling(x))\n}\n\nexport {\n DragScrolling,\n setupScrolling\n}\n","export function documentReady () {\n return new Promise((resolve, reject) => {\n if (\n document.readyState === 'complete' ||\n (document.readyState !== 'loading' && !document.documentElement.doScroll)\n ) {\n resolve()\n } else {\n document.addEventListener('DOMContentLoaded', function () {\n resolve()\n })\n }\n })\n}\n","import { setupScrolling } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/drag-scroll'\n\nexport class ArticleListing {\n constructor (elem) {\n this.elem = elem\n this.href = window.location.href\n\n if (this.elem.dataset.listCurrent) {\n this.href = this.elem.dataset.listCurrent\n }\n\n this.fetchUrl = this.href\n\n this.type = ''\n this.offer = ''\n this.country = ''\n this.inspiration = ''\n\n this.categoryDependencies = {\n type: ['country', 'inspiration'],\n country: ['inspiration']\n }\n\n this.setupRadioListeners('type')\n this.setupRadioListeners('offer')\n this.setupRadioListeners('country')\n this.setupRadioListeners('inspiration')\n\n this.setupLinks()\n this.setupForm()\n }\n\n setupForm () {\n const pageForm = this.elem.querySelector('[data-paging-form]')\n\n if (pageForm) {\n pageForm.addEventListener('submit', (e) => {\n e.preventDefault()\n pageForm.validator.validateForm().then((formData) => {\n const kvpairs = []\n for (const entry of formData.entries()) {\n if (entry[1] != null && entry[1].toString().length > 0) {\n kvpairs.push(encodeURIComponent(entry[0]).toLowerCase() + '=' + encodeURIComponent(entry[1]).toLowerCase())\n }\n }\n const queryString = kvpairs.join('&')\n if (queryString.length > 0) {\n this.href = pageForm.action + '?' + queryString\n } else {\n this.href = pageForm.action\n }\n\n this.fetchUrl = this.href\n\n this.navigate()\n }).catch(errors => {\n console.log(errors)\n })\n })\n }\n }\n\n setupLinks () {\n const pageLinks = this.elem.querySelectorAll('[data-paging] a')\n\n if (pageLinks) {\n for (const pageLink of pageLinks) {\n pageLink.addEventListener('click', (e) => {\n e.preventDefault()\n const href = new URL(pageLink.href)\n const fetchHref = href\n\n if (this.type !== undefined && this.type !== '' && this.type !== null) {\n href.searchParams.set('type', this.type)\n }\n\n if (this.offer !== undefined && this.offer !== '' && this.offer !== null) {\n href.searchParams.set('offer', this.offer)\n }\n\n if (this.country !== undefined && this.country !== '' && this.country !== null) {\n href.searchParams.set('country', this.country)\n }\n\n if (this.inspiration !== undefined && this.inspiration !== '' && this.inspiration !== null) {\n href.searchParams.set('inspiration', this.inspiration)\n }\n\n this.href = href.toString()\n this.fetchUrl = fetchHref.toString()\n this.navigate()\n })\n }\n }\n }\n\n setupRadioListeners (category) {\n const radios = this.elem.querySelectorAll(`[data-cat-radio=\"${category}\"]`)\n if (radios.length > 0) {\n const paramName = category.toLowerCase()\n\n for (const radio of radios) {\n radio.addEventListener('click', (e) => {\n this[paramName] = e.target.value\n this.updateUrlParameter(paramName, this[paramName])\n\n if (this.categoryDependencies[category]) {\n this.categoryDependencies[category].forEach(dependentCategory => {\n this[dependentCategory] = ''\n this.updateUrlParameter(dependentCategory, '') // Reset dependent category\n })\n }\n\n this.navigate()\n e.target.focus()\n })\n }\n\n // Initialize the parameter value from the URL\n const href = new URL(this.href)\n this[paramName] = href.searchParams.get(paramName)\n }\n }\n\n updateUrlParameter (param, value) {\n const href = new URL(this.href)\n if (href.searchParams.has('page')) {\n href.searchParams.delete('page')\n }\n if (href.searchParams.has(param)) {\n href.searchParams.delete(param)\n }\n if (value !== '') {\n href.searchParams.set(param, value)\n }\n\n this.href = href.toString()\n this.fetchUrl = this.href\n }\n\n navigate () {\n const options = {\n method: 'GET',\n credentials: 'same-origin',\n headers: {\n 'X-Requested-With': 'XMLHttpRequest'\n }\n }\n\n fetch(this.fetchUrl, options).then((response) => {\n return response.text()\n }).then((data) => {\n this.updateHistory(data, this.href)\n this.updateContents(data)\n this.setupLinks()\n this.setupRadioListeners('type')\n this.setupRadioListeners('offer')\n this.setupRadioListeners('country')\n this.setupRadioListeners('inspiration')\n this.setupForm()\n window.scrollTo({\n top: this.elem.querySelector('[data-filter-form]').offsetTop - 150,\n behavior: 'smooth'\n })\n\n const event = new CustomEvent('form-updated', { bubbles: true })\n this.elem.dispatchEvent(event)\n setupScrolling(this.elem)\n })\n }\n\n updateHistory (data, url) {\n if (window.history) {\n history.replaceState(data, document.title, url)\n }\n }\n\n updateContents (data) {\n this.elem.style.height = `${this.elem.offsetHeight}px`\n\n this.elem.innerHTML = data\n\n window.setTimeout(() => this.elem.style.removeProperty('height'), 1)\n }\n}\n\nexport const setupArticleListing = function () {\n const lists = document.querySelectorAll('[data-article-list-paging]')\n const pagingLists = []\n for (let i = 0; i < lists.length; i++) {\n pagingLists.push(new ArticleListing(lists[i]))\n }\n}\n","import { DragScrolling } from '../../../src/scripts/components/controls/drag-scroll.js'\n\nexport class ImageZoom {\n constructor (elem) {\n this.elem = elem\n this.image = this.elem.querySelector('[data-image-zoom-image]')\n this.zoomImageUrl = this.image.getAttribute('data-image-zoom-image-src')\n\n if (this.zoomImageUrl === null) {\n return\n }\n\n this.container = this.elem.querySelector('[data-image-zoom-container-wrap]')\n this.imageContainer = this.elem.querySelector('[data-image-zoom-container]')\n this.scrolling = new DragScrolling(this.imageContainer, false)\n this.zoomInButton = this.elem.querySelector('[data-image-zoom-in]')\n this.zoomOutButton = this.elem.querySelector('[data-image-zoom-out]')\n this.containerWidth = null\n this.containerHeight = null\n this.imageWidth = null\n this.imageHeight = null\n this.imageLoaded = false\n this.zoomLevel = 0\n this.imageHasSwapped = false\n this.disableZoom()\n\n this.zoomInButton.addEventListener('click', (event) => {\n if (this.zoomLevel < 10) {\n this.zoomLevel += 1\n }\n\n if (!this.imageHasSwapped) {\n this.toggleImageSource()\n this.imageHasSwapped = true\n }\n\n this.disableZoom()\n this.zoomImage()\n })\n\n this.zoomOutButton.addEventListener('click', (event) => {\n if (this.zoomLevel > 0) {\n this.zoomLevel -= 1\n }\n\n if (!this.imageHasSwapped) {\n this.toggleImageSource()\n this.imageHasSwapped = true\n }\n\n this.disableZoom()\n this.zoomImage()\n\n if (this.zoomLevel === 0) {\n this.resetPositionImage()\n }\n })\n\n this.image.addEventListener('load', () => {\n if (this.imageLoaded) {\n return\n }\n\n this.disableZoom()\n this.loadImage()\n this.setPositionImage()\n })\n }\n\n toggleImageSource () {\n const currentSrc = this.image.getAttribute('src')\n const newSrc = currentSrc === this.zoomImageUrl ? this.image.getAttribute('data-original-src') : this.zoomImageUrl\n this.image.setAttribute('src', newSrc)\n this.image.setAttribute('srcset', '')\n }\n\n getOffset (el) {\n const rect = el.getBoundingClientRect()\n return {\n left: rect.left + window.scrollX,\n top: rect.top + window.scrollY\n }\n }\n\n loadImage () {\n this.imageWidth = this.image.offsetWidth\n this.imageHeight = this.image.offsetHeight\n\n this.containerWidth = this.imageContainer.offsetWidth\n this.containerHeight = this.imageContainer.offsetHeight\n this.imageLoaded = true\n }\n\n setPositionImage () {\n this.image.style.top = `${\n this.containerHeight / 2 - this.imageHeight / 2\n }px`\n this.image.style.left = `${this.containerWidth / 2 - this.imageWidth / 2}px`\n }\n\n resetPositionImage () {\n this.image.style.top = '0px'\n this.image.style.left = '0px'\n }\n\n zoomImage () {\n const scaleFactor = (this.zoomLevel / 10) + 1\n this.image.style.width = `${this.imageWidth * scaleFactor}px`\n this.image.style.height = `${this.imageHeight * scaleFactor}px`\n }\n\n disableZoom () {\n this.zoomInButton.style.background =\n this.zoomLevel === 10 ? 'rgba(255, 255, 255, .8)' : '#fff'\n\n if (this.zoomLevel === 0) {\n this.zoomOutButton.setAttribute('disabled', 'disabled')\n } else {\n this.zoomOutButton.removeAttribute('disabled')\n }\n\n this.zoomOutButton.style.background =\n this.zoomLevel === 0 ? 'rgba(255, 255, 255, .8)' : '#fff'\n\n if (this.zoomLevel === 10) {\n this.zoomInButton.setAttribute('disabled', 'disabled')\n } else {\n this.zoomInButton.removeAttribute('disabled')\n }\n }\n}\n\nexport function setupImageZoom () {\n const elems = document.querySelectorAll('[data-image-zoom]')\n const images = []\n\n for (const element of elems) {\n images.push(new ImageZoom(element))\n }\n\n return images\n}\n","const options = {\n root: null,\n rootMargin: '60px 0px -50px',\n threshold: 0\n}\n\nconst options2 = {\n root: null,\n rootMargin: '0px 100%',\n threshold: 0.5\n}\n\nconst completeClass = 'animate-in--complete'\nconst delayClass = 'animate-in--delay'\n\nconst callback = (entries, observer) => {\n entries.forEach(entry => {\n const elem = entry.target\n if (entry.isIntersecting) {\n elem.isLeaving = true\n elem.classList.add(completeClass)\n document.dispatchEvent(new CustomEvent('animate-in--complete'))\n } else if (elem.isLeaving && !elem.classList.contains('loading--once')) {\n elem.classList.remove(completeClass)\n document.dispatchEvent(new CustomEvent('animate-in--complete'))\n }\n })\n}\n\nconst callback2 = (entries, observer) => {\n entries.forEach(entry => {\n const elem = entry.target\n if (entry.isIntersecting) {\n elem.isLeaving = true\n elem.classList.add(completeClass)\n }\n })\n}\n\nconst observer = new IntersectionObserver(callback, options)\nconst observer2 = new IntersectionObserver(callback2, options2)\n\ndocument.addEventListener('update-animation', function (e) {\n const animationUpdates = e.target.querySelectorAll('.animate-in')\n\n for (const element of animationUpdates) {\n if (!element.animationWatch) {\n observer.observe(element)\n element.animationWatch = true\n }\n }\n})\n\nconst setupLoader = function (elem) {\n if (elem.classList.contains(delayClass)) {\n observer2.observe(elem)\n } else {\n observer.observe(elem)\n }\n elem.animationWatch = true\n}\n\nexport {\n setupLoader\n}\n","import { EnsureStylesheetLoaded } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/EnsureStylesheetLoaded'\nimport { setupLoader } from '../../utilities/IntersectionAnimator'\n\nconst ignoredClasses = ['offcanvas']\n\nfunction performLoad (sections, isSS) {\n for (const section of sections) {\n section.classList.remove('loading')\n\n let isAllowed = true\n\n for (const cls of ignoredClasses) {\n if (section.classList.contains(cls)) {\n isAllowed = false\n }\n }\n\n if (isAllowed && isSS === false && !section.dataset.instant) {\n section.classList.add('animate-in')\n setupLoader(section)\n }\n }\n}\n\nexport function loadSections (elem) {\n if (!elem) {\n elem = document\n }\n const sections = elem.querySelectorAll('.loading')\n\n const urlParams = new URLSearchParams(window.location.search)\n const ss = urlParams.has('ss')\n\n if (ss) {\n performLoad(sections, true)\n return\n }\n\n return EnsureStylesheetLoaded().then(function () {\n performLoad(sections, false)\n })\n}\n","import { loadSections } from '../components/layout/LoadSections'\nimport { setupAutoPostback } from '../forms/auto-postback'\n\nexport class ListPaging {\n constructor (elem) {\n this.elem = elem\n this.href = window.location.href\n\n if (this.elem.dataset.listCurrent) {\n this.href = this.elem.dataset.listCurrent\n }\n\n this.fetchUrl = this.href\n\n this.sort = ''\n this.isWidget = elem.dataset.listPaging === 'widget'\n\n if (this.isWidget) {\n this.fetchUrl = elem.dataset.listCurrent\n }\n\n this.setupLinks()\n this.setupForm()\n }\n\n setupForm () {\n const pageForm = this.elem.querySelector('[data-paging-form]')\n\n if (pageForm) {\n pageForm.addEventListener('submit', (e) => {\n e.preventDefault()\n pageForm.validator.validateForm().then((formData) => {\n const kvpairs = []\n for (const entry of formData.entries()) {\n if (entry[1] != null && entry[1].toString().length > 0) {\n kvpairs.push(encodeURIComponent(entry[0]).toLowerCase() + '=' + encodeURIComponent(entry[1]).toLowerCase())\n }\n }\n const queryString = kvpairs.join('&')\n if (queryString.length > 0) {\n this.href = pageForm.action + '?' + queryString\n } else {\n this.href = pageForm.action\n }\n\n this.fetchUrl = this.href\n\n this.navigate()\n }).catch(errors => {\n console.log(errors)\n })\n })\n }\n }\n\n setupLinks () {\n const pageLinks = this.elem.querySelectorAll('[data-paging] a')\n\n if (pageLinks) {\n for (const pageLink of pageLinks) {\n pageLink.addEventListener('click', (e) => {\n e.preventDefault()\n const href = new URL(pageLink.href)\n let fetchHref\n if (this.isWidget) {\n fetchHref = pageLink.dataset.url\n } else {\n fetchHref = href\n\n if (this.sort.length > 0) {\n href.searchParams.set('sort', this.sort)\n }\n }\n\n this.href = href.toString()\n this.fetchUrl = fetchHref.toString()\n this.navigate()\n })\n }\n }\n\n const sort = this.elem.querySelector('[data-sort]')\n if (sort) {\n if (this.sort.length > 0) {\n const href = new URL(this.href)\n sort.value = href.searchParams.get('sort')\n }\n\n sort.addEventListener('change', (e) => {\n this.sort = e.target.value\n const href = new URL(this.href)\n if (href.searchParams.has('page')) {\n href.searchParams.delete('page')\n }\n href.searchParams.set('sort', this.sort)\n this.href = href.toString()\n\n if (this.isWidget) {\n const fhref = new URL(this.fetchUrl)\n fhref.searchParams.set('sort', this.sort)\n if (fhref.searchParams.has('page')) {\n fhref.searchParams.delete('page')\n }\n this.fetchUrl = fhref.toString()\n } else {\n this.fetchUrl = this.href\n }\n this.navigate()\n })\n }\n }\n\n navigate () {\n const options = {\n method: 'GET',\n credentials: 'same-origin',\n headers: {\n 'X-Requested-With': 'XMLHttpRequest'\n }\n }\n\n fetch(this.fetchUrl, options).then((response) => {\n return response.text()\n }).then((data) => {\n this.updateHistory(data, this.href)\n this.updateContents(data)\n window.scrollTo({\n top: this.elem.offsetTop - 150,\n behavior: 'smooth'\n })\n this.setupLinks()\n this.setupForm()\n\n const event = new CustomEvent('form-updated', { bubbles: true })\n this.elem.dispatchEvent(event)\n setupAutoPostback(this.elem)\n })\n }\n\n updateHistory (data, url) {\n if (window.history) {\n history.replaceState(data, document.title, url)\n }\n }\n\n updateContents (data) {\n this.elem.style.height = `${this.elem.offsetHeight}px`\n\n this.elem.innerHTML = data\n loadSections(this.elem)\n\n window.setTimeout(() => this.elem.style.removeProperty('height'), 1)\n }\n}\n\nexport const setupListPaging = function () {\n const lists = document.querySelectorAll('[data-list-paging]')\n const pagingLists = []\n for (let i = 0; i < lists.length; i++) {\n pagingLists.push(new ListPaging(lists[i]))\n }\n}\n","export function setupAutoPostback (elem) {\n const selects = elem.querySelectorAll('[data-auto-post]')\n\n for (const select of selects) {\n select.addEventListener('change', () => {\n const form = select.closest('form')\n if (form) {\n const ev = new Event('submit', { cancelable: true, bubbles: true })\n form.dispatchEvent(ev)\n }\n })\n }\n}\n","import { setupInViewEvents } from '../../utilities/loader-events'\nimport { Logger } from '../../utilities/Logger'\n\nconst playEvent = 'moodVideo:in-view'\nconst pauseEvent = 'moodVideo:out-of-view'\n\nexport class DynamicVideoEmbed {\n constructor (elem) {\n this.logger = new Logger('Dynamic video embed')\n this.elem = elem\n this.controlID = elem.getAttribute('aria-controls')\n this.targetZone = document.getElementById(this.controlID)\n this.imageBlock = this.targetZone.parentNode.querySelector('[data-video-bg]')\n if (this.targetZone !== null) {\n this.videoType = this.targetZone.dataset.videoType\n this.videoId = this.targetZone.dataset.videoId\n this.targetZone.loading = false\n this.elem.addEventListener('click', (e) => {\n if (this.targetZone.loading === false) {\n this.loadVideo()\n }\n })\n }\n }\n\n loadVideo () {\n this.targetZone.loading = true\n this.elem.classList.add('loading')\n requestAnimationFrame(() => {\n const videoSource = this.compileVideoSource()\n if (videoSource) {\n this.addFrame(videoSource)\n this.elem.classList.remove('loading')\n this.elem.dataset.videoLoaded = true\n if (this.imageBlock !== null) {\n this.imageBlock.dataset.videoLoaded = true\n this.imageBlock.addEventListener('transitioned', () => {\n this.imageBlock.parentNode.removeChild(this.imageBlock)\n })\n }\n this.elem.addEventListener('transitioned', () => {\n this.elem.parentNode.removeChild(this.elem)\n })\n } else {\n this.elem.classList.remove('loading')\n }\n })\n }\n\n compileVideoSource () {\n switch (this.videoType) {\n case 'youtube':\n return `https://www.youtube.com/embed/${this.videoId}?autoplay=1&mute=1&rel=0&showinfo=0&controls=1&loop=1&playlist=${this.videoId}`\n case 'vimeo':\n return `https://player.vimeo.com/video/${this.videoId}?autoplay=1&title=0&muted=1&byline=0&portrait=0&loop=1&playlist=${this.videoId}`\n default:\n return false\n }\n }\n\n addFrame (videoSource) {\n const iframe = document.createElement('iframe')\n iframe.setAttribute('frameborder', '0')\n iframe.setAttribute('allowfullscreen', '')\n iframe.setAttribute('allow', 'autoplay; fullscreen')\n iframe.setAttribute('src', videoSource)\n iframe.setAttribute('title', 'LeShuttle video')\n iframe.classList.add('media-block__iframe')\n this.targetZone.appendChild(iframe)\n this.targetZone.classList.add('media-block__video--loaded')\n iframe.focus()\n }\n}\n\nexport class MoodVideo {\n constructor (elem) {\n setupInViewEvents(elem, playEvent, pauseEvent)\n this.logger = new Logger('Mood video')\n this.targetZone = elem\n this.validUrl = true\n this.imageBlock = this.targetZone.parentNode.querySelector('[data-video-bg]')\n if (this.targetZone !== null) {\n this.videoType = this.targetZone.dataset.videoType\n this.videoId = this.targetZone.dataset.videoId\n this.targetZone.loading = false\n this.logger.log('setting up mood video')\n this.targetZone.addEventListener(playEvent, () => {\n this.logger.log('mood video in view')\n if (this.targetZone.loading === false) {\n this.loadVideo()\n }\n })\n this.targetZone.addEventListener(pauseEvent, () => {\n this.logger.log('mood video out of view')\n this.unloadVideo()\n })\n }\n }\n\n unloadVideo () {\n this.targetZone.innerHTML = ''\n this.targetZone.loading = false\n this.targetZone.classList.remove('media-block__video--loaded')\n if (this.imageBlock !== null) {\n this.imageBlock.dataset.videoLoaded = false\n }\n }\n\n loadVideo () {\n this.targetZone.loading = true\n requestAnimationFrame(() => {\n const videoSource = this.compileVideoSource()\n if (videoSource) {\n this.addFrame(videoSource)\n this.targetZone.classList.remove('loading')\n this.targetZone.dataset.videoLoaded = true\n if (this.imageBlock !== null) {\n this.imageBlock.dataset.videoLoaded = true\n }\n }\n })\n }\n\n compileVideoSource () {\n switch (this.videoType) {\n case 'youtube':\n return `https://www.youtube.com/embed/${this.videoId}?autoplay=1&rel=0&showinfo=0&controls=0&mute=1&loop=1&playlist=${this.videoId}`\n case 'vimeo':\n return `https://player.vimeo.com/video/${this.videoId}?autoplay=1&title=0&byline=0&portrait=0&loop=1&muted=1&controls=0`\n default:\n return false\n }\n }\n\n addFrame (videoSource) {\n const iframe = document.createElement('iframe')\n iframe.setAttribute('frameborder', '0')\n iframe.setAttribute('allowfullscreen', '')\n iframe.setAttribute('title', 'LeShuttle video')\n iframe.setAttribute('allow', 'autoplay; fullscreen')\n iframe.setAttribute('src', videoSource)\n iframe.classList.add('media-block__iframe')\n this.targetZone.appendChild(iframe)\n this.targetZone.classList.add('media-block__video--loaded')\n iframe.focus()\n }\n}\n\nexport const setupDynamicVideoButtons = function (parent) {\n const buttons = parent.querySelectorAll('button[data-dynamic-embed]')\n const dynamicVideoButtons = []\n\n for (const button of buttons) {\n dynamicVideoButtons.push(new DynamicVideoEmbed(button))\n }\n return dynamicVideoButtons\n}\n\nexport const setupMoodVideos = function (parent) {\n const videos = parent.querySelectorAll('[data-video-autoplay]')\n const moodVideos = []\n\n for (const video of videos) {\n moodVideos.push(new MoodVideo(video))\n }\n return moodVideos\n}\n","function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n\n _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}\n\nfunction _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nfunction _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}\n\n/* eslint no-console:0 */\nvar formatRegExp = /%[sdj%]/g;\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {\n warning = function warning(type, errors) {\n if (typeof console !== 'undefined' && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === 'undefined') {\n if (errors.every(function (e) {\n return typeof e === 'string';\n })) {\n console.warn(type, errors);\n }\n }\n };\n}\n\nfunction convertFieldsError(errors) {\n if (!errors || !errors.length) return null;\n var fields = {};\n errors.forEach(function (error) {\n var field = error.field;\n fields[field] = fields[field] || [];\n fields[field].push(error);\n });\n return fields;\n}\nfunction format(template) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var i = 0;\n var len = args.length;\n\n if (typeof template === 'function') {\n return template.apply(null, args);\n }\n\n if (typeof template === 'string') {\n var str = template.replace(formatRegExp, function (x) {\n if (x === '%%') {\n return '%';\n }\n\n if (i >= len) {\n return x;\n }\n\n switch (x) {\n case '%s':\n return String(args[i++]);\n\n case '%d':\n return Number(args[i++]);\n\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n\n break;\n\n default:\n return x;\n }\n });\n return str;\n }\n\n return template;\n}\n\nfunction isNativeStringType(type) {\n return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern';\n}\n\nfunction isEmptyValue(value, type) {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (type === 'array' && Array.isArray(value) && !value.length) {\n return true;\n }\n\n if (isNativeStringType(type) && typeof value === 'string' && !value) {\n return true;\n }\n\n return false;\n}\n\nfunction asyncParallelArray(arr, func, callback) {\n var results = [];\n var total = 0;\n var arrLength = arr.length;\n\n function count(errors) {\n results.push.apply(results, errors || []);\n total++;\n\n if (total === arrLength) {\n callback(results);\n }\n }\n\n arr.forEach(function (a) {\n func(a, count);\n });\n}\n\nfunction asyncSerialArray(arr, func, callback) {\n var index = 0;\n var arrLength = arr.length;\n\n function next(errors) {\n if (errors && errors.length) {\n callback(errors);\n return;\n }\n\n var original = index;\n index = index + 1;\n\n if (original < arrLength) {\n func(arr[original], next);\n } else {\n callback([]);\n }\n }\n\n next([]);\n}\n\nfunction flattenObjArr(objArr) {\n var ret = [];\n Object.keys(objArr).forEach(function (k) {\n ret.push.apply(ret, objArr[k] || []);\n });\n return ret;\n}\n\nvar AsyncValidationError = /*#__PURE__*/function (_Error) {\n _inheritsLoose(AsyncValidationError, _Error);\n\n function AsyncValidationError(errors, fields) {\n var _this;\n\n _this = _Error.call(this, 'Async Validation Error') || this;\n _this.errors = errors;\n _this.fields = fields;\n return _this;\n }\n\n return AsyncValidationError;\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nfunction asyncMap(objArr, option, func, callback, source) {\n if (option.first) {\n var _pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n callback(errors);\n return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);\n };\n\n var flattenArr = flattenObjArr(objArr);\n asyncSerialArray(flattenArr, func, next);\n });\n\n _pending[\"catch\"](function (e) {\n return e;\n });\n\n return _pending;\n }\n\n var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];\n var objArrKeys = Object.keys(objArr);\n var objArrLength = objArrKeys.length;\n var total = 0;\n var results = [];\n var pending = new Promise(function (resolve, reject) {\n var next = function next(errors) {\n results.push.apply(results, errors);\n total++;\n\n if (total === objArrLength) {\n callback(results);\n return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);\n }\n };\n\n if (!objArrKeys.length) {\n callback(results);\n resolve(source);\n }\n\n objArrKeys.forEach(function (key) {\n var arr = objArr[key];\n\n if (firstFields.indexOf(key) !== -1) {\n asyncSerialArray(arr, func, next);\n } else {\n asyncParallelArray(arr, func, next);\n }\n });\n });\n pending[\"catch\"](function (e) {\n return e;\n });\n return pending;\n}\n\nfunction isErrorObj(obj) {\n return !!(obj && obj.message !== undefined);\n}\n\nfunction getValue(value, path) {\n var v = value;\n\n for (var i = 0; i < path.length; i++) {\n if (v == undefined) {\n return v;\n }\n\n v = v[path[i]];\n }\n\n return v;\n}\n\nfunction complementError(rule, source) {\n return function (oe) {\n var fieldValue;\n\n if (rule.fullFields) {\n fieldValue = getValue(source, rule.fullFields);\n } else {\n fieldValue = source[oe.field || rule.fullField];\n }\n\n if (isErrorObj(oe)) {\n oe.field = oe.field || rule.fullField;\n oe.fieldValue = fieldValue;\n return oe;\n }\n\n return {\n message: typeof oe === 'function' ? oe() : oe,\n fieldValue: fieldValue,\n field: oe.field || rule.fullField\n };\n };\n}\nfunction deepMerge(target, source) {\n if (source) {\n for (var s in source) {\n if (source.hasOwnProperty(s)) {\n var value = source[s];\n\n if (typeof value === 'object' && typeof target[s] === 'object') {\n target[s] = _extends({}, target[s], value);\n } else {\n target[s] = value;\n }\n }\n }\n }\n\n return target;\n}\n\nvar required$1 = function required(rule, value, source, errors, options, type) {\n if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n errors.push(format(options.messages.required, rule.fullField));\n }\n};\n\n/**\n * Rule for validating whitespace.\n *\n * @param rule The validation rule.\n * @param value The value of the field on the source object.\n * @param source The source object being validated.\n * @param errors An array of errors that this rule may add\n * validation errors to.\n * @param options The validation options.\n * @param options.messages The validation messages.\n */\n\nvar whitespace = function whitespace(rule, value, source, errors, options) {\n if (/^\\s+$/.test(value) || value === '') {\n errors.push(format(options.messages.whitespace, rule.fullField));\n }\n};\n\n// https://github.com/kevva/url-regex/blob/master/index.js\nvar urlReg;\nvar getUrlRegex = (function () {\n if (urlReg) {\n return urlReg;\n }\n\n var word = '[a-fA-F\\\\d:]';\n\n var b = function b(options) {\n return options && options.includeBoundaries ? \"(?:(?<=\\\\s|^)(?=\" + word + \")|(?<=\" + word + \")(?=\\\\s|$))\" : '';\n };\n\n var v4 = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}';\n var v6seg = '[a-fA-F\\\\d]{1,4}';\n var v6 = (\"\\n(?:\\n(?:\" + v6seg + \":){7}(?:\" + v6seg + \"|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8\\n(?:\" + v6seg + \":){6}(?:\" + v4 + \"|:\" + v6seg + \"|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4\\n(?:\" + v6seg + \":){5}(?::\" + v4 + \"|(?::\" + v6seg + \"){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4\\n(?:\" + v6seg + \":){4}(?:(?::\" + v6seg + \"){0,1}:\" + v4 + \"|(?::\" + v6seg + \"){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4\\n(?:\" + v6seg + \":){3}(?:(?::\" + v6seg + \"){0,2}:\" + v4 + \"|(?::\" + v6seg + \"){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){2}(?:(?::\" + v6seg + \"){0,3}:\" + v4 + \"|(?::\" + v6seg + \"){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4\\n(?:\" + v6seg + \":){1}(?:(?::\" + v6seg + \"){0,4}:\" + v4 + \"|(?::\" + v6seg + \"){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4\\n(?::(?:(?::\" + v6seg + \"){0,5}:\" + v4 + \"|(?::\" + v6seg + \"){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4\\n)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1\\n\").replace(/\\s*\\/\\/.*$/gm, '').replace(/\\n/g, '').trim(); // Pre-compile only the exact regexes because adding a global flag make regexes stateful\n\n var v46Exact = new RegExp(\"(?:^\" + v4 + \"$)|(?:^\" + v6 + \"$)\");\n var v4exact = new RegExp(\"^\" + v4 + \"$\");\n var v6exact = new RegExp(\"^\" + v6 + \"$\");\n\n var ip = function ip(options) {\n return options && options.exact ? v46Exact : new RegExp(\"(?:\" + b(options) + v4 + b(options) + \")|(?:\" + b(options) + v6 + b(options) + \")\", 'g');\n };\n\n ip.v4 = function (options) {\n return options && options.exact ? v4exact : new RegExp(\"\" + b(options) + v4 + b(options), 'g');\n };\n\n ip.v6 = function (options) {\n return options && options.exact ? v6exact : new RegExp(\"\" + b(options) + v6 + b(options), 'g');\n };\n\n var protocol = \"(?:(?:[a-z]+:)?//)\";\n var auth = '(?:\\\\S+(?::\\\\S*)?@)?';\n var ipv4 = ip.v4().source;\n var ipv6 = ip.v6().source;\n var host = \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9][-_]*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\";\n var domain = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\";\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n var port = '(?::\\\\d{2,5})?';\n var path = '(?:[/?#][^\\\\s\"]*)?';\n var regex = \"(?:\" + protocol + \"|www\\\\.)\" + auth + \"(?:localhost|\" + ipv4 + \"|\" + ipv6 + \"|\" + host + domain + tld + \")\" + port + path;\n urlReg = new RegExp(\"(?:^\" + regex + \"$)\", 'i');\n return urlReg;\n});\n\n/* eslint max-len:0 */\n\nvar pattern$2 = {\n // http://emailregex.com/\n email: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+\\.)+[a-zA-Z\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]{2,}))$/,\n // url: new RegExp(\n // '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$',\n // 'i',\n // ),\n hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n};\nvar types = {\n integer: function integer(value) {\n return types.number(value) && parseInt(value, 10) === value;\n },\n \"float\": function float(value) {\n return types.number(value) && !types.integer(value);\n },\n array: function array(value) {\n return Array.isArray(value);\n },\n regexp: function regexp(value) {\n if (value instanceof RegExp) {\n return true;\n }\n\n try {\n return !!new RegExp(value);\n } catch (e) {\n return false;\n }\n },\n date: function date(value) {\n return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime());\n },\n number: function number(value) {\n if (isNaN(value)) {\n return false;\n }\n\n return typeof value === 'number';\n },\n object: function object(value) {\n return typeof value === 'object' && !types.array(value);\n },\n method: function method(value) {\n return typeof value === 'function';\n },\n email: function email(value) {\n return typeof value === 'string' && value.length <= 320 && !!value.match(pattern$2.email);\n },\n url: function url(value) {\n return typeof value === 'string' && value.length <= 2048 && !!value.match(getUrlRegex());\n },\n hex: function hex(value) {\n return typeof value === 'string' && !!value.match(pattern$2.hex);\n }\n};\n\nvar type$1 = function type(rule, value, source, errors, options) {\n if (rule.required && value === undefined) {\n required$1(rule, value, source, errors, options);\n return;\n }\n\n var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\n var ruleType = rule.type;\n\n if (custom.indexOf(ruleType) > -1) {\n if (!types[ruleType](value)) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n } // straight typeof check\n\n } else if (ruleType && typeof value !== rule.type) {\n errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\n }\n};\n\nvar range = function range(rule, value, source, errors, options) {\n var len = typeof rule.len === 'number';\n var min = typeof rule.min === 'number';\n var max = typeof rule.max === 'number'; // æ£åˆ™åŒ¹é…ç 点范围从U+010000一直到U+10FFFFçš„æ–‡å—(补充平é¢Supplementary Plane)\n\n var spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var val = value;\n var key = null;\n var num = typeof value === 'number';\n var str = typeof value === 'string';\n var arr = Array.isArray(value);\n\n if (num) {\n key = 'number';\n } else if (str) {\n key = 'string';\n } else if (arr) {\n key = 'array';\n } // if the value is not of a supported type for range validation\n // the validation rule rule should use the\n // type property to also test for a particular type\n\n\n if (!key) {\n return false;\n }\n\n if (arr) {\n val = value.length;\n }\n\n if (str) {\n // 处ç†ç 点大于U+010000çš„æ–‡å—length属性ä¸å‡†ç¡®çš„bug,如\"ð ®·ð ®·ð ®·\".lenght !== 3\n val = value.replace(spRegexp, '_').length;\n }\n\n if (len) {\n if (val !== rule.len) {\n errors.push(format(options.messages[key].len, rule.fullField, rule.len));\n }\n } else if (min && !max && val < rule.min) {\n errors.push(format(options.messages[key].min, rule.fullField, rule.min));\n } else if (max && !min && val > rule.max) {\n errors.push(format(options.messages[key].max, rule.fullField, rule.max));\n } else if (min && max && (val < rule.min || val > rule.max)) {\n errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\n }\n};\n\nvar ENUM$1 = 'enum';\n\nvar enumerable$1 = function enumerable(rule, value, source, errors, options) {\n rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];\n\n if (rule[ENUM$1].indexOf(value) === -1) {\n errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(', ')));\n }\n};\n\nvar pattern$1 = function pattern(rule, value, source, errors, options) {\n if (rule.pattern) {\n if (rule.pattern instanceof RegExp) {\n // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n // flag is accidentally set to `true`, which in a validation scenario\n // is not necessary and the result might be misleading\n rule.pattern.lastIndex = 0;\n\n if (!rule.pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n } else if (typeof rule.pattern === 'string') {\n var _pattern = new RegExp(rule.pattern);\n\n if (!_pattern.test(value)) {\n errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\n }\n }\n }\n};\n\nvar rules = {\n required: required$1,\n whitespace: whitespace,\n type: type$1,\n range: range,\n \"enum\": enumerable$1,\n pattern: pattern$1\n};\n\nvar string = function string(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'string');\n\n if (!isEmptyValue(value, 'string')) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n rules.pattern(rule, value, source, errors, options);\n\n if (rule.whitespace === true) {\n rules.whitespace(rule, value, source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar method = function method(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar number = function number(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (value === '') {\n value = undefined;\n }\n\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar _boolean = function _boolean(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar regexp = function regexp(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar integer = function integer(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar floatFn = function floatFn(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar array = function array(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if ((value === undefined || value === null) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, 'array');\n\n if (value !== undefined && value !== null) {\n rules.type(rule, value, source, errors, options);\n rules.range(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar object = function object(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar ENUM = 'enum';\n\nvar enumerable = function enumerable(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (value !== undefined) {\n rules[ENUM](rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar pattern = function pattern(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, 'string') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'string')) {\n rules.pattern(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar date = function date(rule, value, callback, source, options) {\n // console.log('integer rule called %j', rule);\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); // console.log('validate on %s value', value);\n\n if (validate) {\n if (isEmptyValue(value, 'date') && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n\n if (!isEmptyValue(value, 'date')) {\n var dateObject;\n\n if (value instanceof Date) {\n dateObject = value;\n } else {\n dateObject = new Date(value);\n }\n\n rules.type(rule, dateObject, source, errors, options);\n\n if (dateObject) {\n rules.range(rule, dateObject.getTime(), source, errors, options);\n }\n }\n }\n\n callback(errors);\n};\n\nvar required = function required(rule, value, callback, source, options) {\n var errors = [];\n var type = Array.isArray(value) ? 'array' : typeof value;\n rules.required(rule, value, source, errors, options, type);\n callback(errors);\n};\n\nvar type = function type(rule, value, callback, source, options) {\n var ruleType = rule.type;\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value, ruleType) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options, ruleType);\n\n if (!isEmptyValue(value, ruleType)) {\n rules.type(rule, value, source, errors, options);\n }\n }\n\n callback(errors);\n};\n\nvar any = function any(rule, value, callback, source, options) {\n var errors = [];\n var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\n\n if (validate) {\n if (isEmptyValue(value) && !rule.required) {\n return callback();\n }\n\n rules.required(rule, value, source, errors, options);\n }\n\n callback(errors);\n};\n\nvar validators = {\n string: string,\n method: method,\n number: number,\n \"boolean\": _boolean,\n regexp: regexp,\n integer: integer,\n \"float\": floatFn,\n array: array,\n object: object,\n \"enum\": enumerable,\n pattern: pattern,\n date: date,\n url: type,\n hex: type,\n email: type,\n required: required,\n any: any\n};\n\nfunction newMessages() {\n return {\n \"default\": 'Validation error on field %s',\n required: '%s is required',\n \"enum\": '%s must be one of %s',\n whitespace: '%s cannot be empty',\n date: {\n format: '%s date %s is invalid for format %s',\n parse: '%s date could not be parsed, %s is invalid ',\n invalid: '%s date %s is invalid'\n },\n types: {\n string: '%s is not a %s',\n method: '%s is not a %s (function)',\n array: '%s is not an %s',\n object: '%s is not an %s',\n number: '%s is not a %s',\n date: '%s is not a %s',\n \"boolean\": '%s is not a %s',\n integer: '%s is not an %s',\n \"float\": '%s is not a %s',\n regexp: '%s is not a valid %s',\n email: '%s is not a valid %s',\n url: '%s is not a valid %s',\n hex: '%s is not a valid %s'\n },\n string: {\n len: '%s must be exactly %s characters',\n min: '%s must be at least %s characters',\n max: '%s cannot be longer than %s characters',\n range: '%s must be between %s and %s characters'\n },\n number: {\n len: '%s must equal %s',\n min: '%s cannot be less than %s',\n max: '%s cannot be greater than %s',\n range: '%s must be between %s and %s'\n },\n array: {\n len: '%s must be exactly %s in length',\n min: '%s cannot be less than %s in length',\n max: '%s cannot be greater than %s in length',\n range: '%s must be between %s and %s in length'\n },\n pattern: {\n mismatch: '%s value %s does not match pattern %s'\n },\n clone: function clone() {\n var cloned = JSON.parse(JSON.stringify(this));\n cloned.clone = this.clone;\n return cloned;\n }\n };\n}\nvar messages = newMessages();\n\n/**\n * Encapsulates a validation schema.\n *\n * @param descriptor An object declaring validation rules\n * for this schema.\n */\n\nvar Schema = /*#__PURE__*/function () {\n // ========================= Static =========================\n // ======================== Instance ========================\n function Schema(descriptor) {\n this.rules = null;\n this._messages = messages;\n this.define(descriptor);\n }\n\n var _proto = Schema.prototype;\n\n _proto.define = function define(rules) {\n var _this = this;\n\n if (!rules) {\n throw new Error('Cannot configure a schema with no rules');\n }\n\n if (typeof rules !== 'object' || Array.isArray(rules)) {\n throw new Error('Rules must be an object');\n }\n\n this.rules = {};\n Object.keys(rules).forEach(function (name) {\n var item = rules[name];\n _this.rules[name] = Array.isArray(item) ? item : [item];\n });\n };\n\n _proto.messages = function messages(_messages) {\n if (_messages) {\n this._messages = deepMerge(newMessages(), _messages);\n }\n\n return this._messages;\n };\n\n _proto.validate = function validate(source_, o, oc) {\n var _this2 = this;\n\n if (o === void 0) {\n o = {};\n }\n\n if (oc === void 0) {\n oc = function oc() {};\n }\n\n var source = source_;\n var options = o;\n var callback = oc;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n if (!this.rules || Object.keys(this.rules).length === 0) {\n if (callback) {\n callback(null, source);\n }\n\n return Promise.resolve(source);\n }\n\n function complete(results) {\n var errors = [];\n var fields = {};\n\n function add(e) {\n if (Array.isArray(e)) {\n var _errors;\n\n errors = (_errors = errors).concat.apply(_errors, e);\n } else {\n errors.push(e);\n }\n }\n\n for (var i = 0; i < results.length; i++) {\n add(results[i]);\n }\n\n if (!errors.length) {\n callback(null, source);\n } else {\n fields = convertFieldsError(errors);\n callback(errors, fields);\n }\n }\n\n if (options.messages) {\n var messages$1 = this.messages();\n\n if (messages$1 === messages) {\n messages$1 = newMessages();\n }\n\n deepMerge(messages$1, options.messages);\n options.messages = messages$1;\n } else {\n options.messages = this.messages();\n }\n\n var series = {};\n var keys = options.keys || Object.keys(this.rules);\n keys.forEach(function (z) {\n var arr = _this2.rules[z];\n var value = source[z];\n arr.forEach(function (r) {\n var rule = r;\n\n if (typeof rule.transform === 'function') {\n if (source === source_) {\n source = _extends({}, source);\n }\n\n value = source[z] = rule.transform(value);\n }\n\n if (typeof rule === 'function') {\n rule = {\n validator: rule\n };\n } else {\n rule = _extends({}, rule);\n } // Fill validator. Skip if nothing need to validate\n\n\n rule.validator = _this2.getValidationMethod(rule);\n\n if (!rule.validator) {\n return;\n }\n\n rule.field = z;\n rule.fullField = rule.fullField || z;\n rule.type = _this2.getType(rule);\n series[z] = series[z] || [];\n series[z].push({\n rule: rule,\n value: value,\n source: source,\n field: z\n });\n });\n });\n var errorFields = {};\n return asyncMap(series, options, function (data, doIt) {\n var rule = data.rule;\n var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField === 'object');\n deep = deep && (rule.required || !rule.required && data.value);\n rule.field = data.field;\n\n function addFullField(key, schema) {\n return _extends({}, schema, {\n fullField: rule.fullField + \".\" + key,\n fullFields: rule.fullFields ? [].concat(rule.fullFields, [key]) : [key]\n });\n }\n\n function cb(e) {\n if (e === void 0) {\n e = [];\n }\n\n var errorList = Array.isArray(e) ? e : [e];\n\n if (!options.suppressWarning && errorList.length) {\n Schema.warning('async-validator:', errorList);\n }\n\n if (errorList.length && rule.message !== undefined) {\n errorList = [].concat(rule.message);\n } // Fill error info\n\n\n var filledErrors = errorList.map(complementError(rule, source));\n\n if (options.first && filledErrors.length) {\n errorFields[rule.field] = 1;\n return doIt(filledErrors);\n }\n\n if (!deep) {\n doIt(filledErrors);\n } else {\n // if rule is required but the target object\n // does not exist fail at the rule level and don't\n // go deeper\n if (rule.required && !data.value) {\n if (rule.message !== undefined) {\n filledErrors = [].concat(rule.message).map(complementError(rule, source));\n } else if (options.error) {\n filledErrors = [options.error(rule, format(options.messages.required, rule.field))];\n }\n\n return doIt(filledErrors);\n }\n\n var fieldsSchema = {};\n\n if (rule.defaultField) {\n Object.keys(data.value).map(function (key) {\n fieldsSchema[key] = rule.defaultField;\n });\n }\n\n fieldsSchema = _extends({}, fieldsSchema, data.rule.fields);\n var paredFieldsSchema = {};\n Object.keys(fieldsSchema).forEach(function (field) {\n var fieldSchema = fieldsSchema[field];\n var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];\n paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));\n });\n var schema = new Schema(paredFieldsSchema);\n schema.messages(options.messages);\n\n if (data.rule.options) {\n data.rule.options.messages = options.messages;\n data.rule.options.error = options.error;\n }\n\n schema.validate(data.value, data.rule.options || options, function (errs) {\n var finalErrors = [];\n\n if (filledErrors && filledErrors.length) {\n finalErrors.push.apply(finalErrors, filledErrors);\n }\n\n if (errs && errs.length) {\n finalErrors.push.apply(finalErrors, errs);\n }\n\n doIt(finalErrors.length ? finalErrors : null);\n });\n }\n }\n\n var res;\n\n if (rule.asyncValidator) {\n res = rule.asyncValidator(rule, data.value, cb, data.source, options);\n } else if (rule.validator) {\n try {\n res = rule.validator(rule, data.value, cb, data.source, options);\n } catch (error) {\n console.error == null ? void 0 : console.error(error); // rethrow to report error\n\n if (!options.suppressValidatorError) {\n setTimeout(function () {\n throw error;\n }, 0);\n }\n\n cb(error.message);\n }\n\n if (res === true) {\n cb();\n } else if (res === false) {\n cb(typeof rule.message === 'function' ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + \" fails\");\n } else if (res instanceof Array) {\n cb(res);\n } else if (res instanceof Error) {\n cb(res.message);\n }\n }\n\n if (res && res.then) {\n res.then(function () {\n return cb();\n }, function (e) {\n return cb(e);\n });\n }\n }, function (results) {\n complete(results);\n }, source);\n };\n\n _proto.getType = function getType(rule) {\n if (rule.type === undefined && rule.pattern instanceof RegExp) {\n rule.type = 'pattern';\n }\n\n if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n throw new Error(format('Unknown rule type %s', rule.type));\n }\n\n return rule.type || 'string';\n };\n\n _proto.getValidationMethod = function getValidationMethod(rule) {\n if (typeof rule.validator === 'function') {\n return rule.validator;\n }\n\n var keys = Object.keys(rule);\n var messageIndex = keys.indexOf('message');\n\n if (messageIndex !== -1) {\n keys.splice(messageIndex, 1);\n }\n\n if (keys.length === 1 && keys[0] === 'required') {\n return validators.required;\n }\n\n return validators[this.getType(rule)] || undefined;\n };\n\n return Schema;\n}();\n\nSchema.register = function register(type, validator) {\n if (typeof validator !== 'function') {\n throw new Error('Cannot register a validator by type, validator is not a function');\n }\n\n validators[type] = validator;\n};\n\nSchema.warning = warning;\nSchema.messages = messages;\nSchema.validators = validators;\n\nexport { Schema as default };\n//# sourceMappingURL=index.js.map\n","const parseHTML = function (str) {\n const tmp = document.implementation.createHTMLDocument()\n tmp.body.innerHTML = str\n return tmp.body.children\n}\n\nconst updateContents = function (mode, cssElem, content) {\n const elem = document.querySelector(cssElem)\n const lowerMode = mode.toLowerCase()\n const html = parseHTML(content)\n switch (lowerMode) {\n case 'before':\n for (const content of html.length) {\n elem.insertBefore(content, elem.firstChild)\n }\n break\n\n case 'after':\n for (const content of html.length) {\n elem.appendChild(content)\n }\n break\n\n case 'replace-with':\n elem.outerHTML = content\n break\n\n default:\n elem.innerHTML = content\n break\n }\n\n if (elem && !isElementInViewport(elem)) {\n window.setTimeout(() => {\n elem.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' })\n }, 200)\n }\n\n elem.parentNode.dispatchEvent(new CustomEvent('form-updated', { bubbles: true }))\n}\n\nconst redirect = function (responseData) {\n if (responseData.redirectTo) {\n window.location.href = responseData.redirectTo;\n }\n}\n\nconst isJsonResponse = function (response) {\n if (response.headers) {\n const contentType = response.headers.get('Content-Type')\n if (contentType && contentType.startsWith('application/json')) {\n return true\n }\n }\n\n return false\n}\n\nexport const submitAjaxForm = function (form) {\n const submit = form.querySelector('[type=\"submit\"]')\n if (submit != null) {\n submit.disabled = true\n }\n\n const mode = form.dataset.ajaxMode || 'replace'\n const update = form.dataset.ajaxUpdate\n const formData = new FormData(form)\n\n const fetchOptions = {\n method: form.method,\n credentials: 'same-origin',\n cache: 'no-cache',\n body: formData,\n headers: {\n 'X-Requested-With': 'XMLHttpRequest'\n }\n }\n\n let responseJson = false\n return fetch(form.action, fetchOptions)\n .then(response => {\n if (isJsonResponse(response)) {\n responseJson = true\n return response.json()\n }\n return response.text()\n })\n .then(data => {\n if (responseJson === true) {\n redirect(data);\n } else {\n updateContents(mode, update, data);\n }\n })\n .catch(err => {\n console.error('Ajax form submission error:', err)\n if (submit != null) {\n submit.disabled = false\n }\n })\n}\n\nconst isElementInViewport = function (el) {\n const rect = el.getBoundingClientRect()\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}","import Schema from 'async-validator'\nimport { submitAjaxForm } from './submitAjaxForm'\n\nconst ruleDefinitions = []\n\nconst inputValidClass = 'input-validation-valid'\nconst inputErrorClass = 'input-validation-error'\n\nconst summaryValidClass = 'validation-summary-valid'\nconst summaryErrorClass = 'validation-summary-errors'\n\nconst messageValidClass = 'field-validation-valid'\nconst messageErrorClass = 'field-validation-error'\n\nexport const updatedEvent = 'form-updated'\n\nexport const addRule = function (attribute, rule, fireOnlyOnSubmit = false) {\n ruleDefinitions.push({ attribute, rule, fireOnlyOnSubmit })\n document.dispatchEvent(new CustomEvent(updatedEvent))\n}\n\nexport class FormValidation {\n constructor (form) {\n this.form = form\n this.init()\n }\n\n init () {\n this.fields = this.form.querySelectorAll('[data-val=\"true\"]')\n this.summary = this.form.querySelector('[data-valmsg-summary=\"true\"]')\n this.nonce = Math.random().toString(36).slice(2)\n this.initRules()\n }\n\n setUpEvents () {\n this.form.noValidate = true\n if (!this.form.dataset.ajax) {\n this.form.addEventListener('submit', (e) => {\n if (e.submitter) {\n e.submitter.disabled = true\n }\n if (!this.form.dataset.valid) {\n e.preventDefault()\n this.validateForm().then(() => {\n this.form.dataset.valid = true\n this.form.submit()\n }).catch(function (errors, fields) {\n e.preventDefault()\n if (e.submitter) {\n e.submitter.disabled = false\n }\n })\n }\n })\n } else if (this.form.dataset.ajax === 'auto' || this.form.dataset.ajax === 'true') {\n this.form.addEventListener('submit', (e) => {\n if (e.submitter) {\n e.submitter.disabled = true\n }\n if (!this.form.dataset.valid) {\n e.preventDefault()\n\n this.validateForm().then(() => {\n this.form.dataset.valid = true\n submitAjaxForm(this.form)\n }).catch(function (errors, fields) {\n e.preventDefault()\n if (e.submitter) {\n e.submitter.disabled = false\n }\n })\n }\n })\n }\n\n this.form.addEventListener('blur', (e) => {\n try {\n this.validateField(e.target)\n } catch (err) {\n }\n })\n\n this.form.addEventListener('input', (e) => {\n try {\n this.validateField(e.target)\n } catch (err) {\n }\n })\n\n this.form.addEventListener('change', (e) => {\n try {\n this.validateField(e.target)\n } catch (err) {\n }\n })\n }\n\n initRules () {\n const definition = {}\n const blurDefinition = {}\n for (const field of this.fields) {\n const rules = this.setupRules(field)\n if (rules) {\n definition[field.name] = rules\n }\n\n const blurRules = this.setupBlurRules(field)\n if (blurRules) {\n blurDefinition[field.name] = rules\n }\n }\n this.blurValidator = new Schema(blurDefinition)\n this.validator = new Schema(definition)\n }\n\n setupRules (field) {\n const rules = []\n for (const rule of ruleDefinitions) {\n if (field.dataset[rule.attribute]) {\n const newRule = rule.rule(field)\n if (newRule) {\n rules.push(newRule)\n }\n }\n }\n\n if (rules.length > 0 & field.name.length > 0) {\n return rules.length > 1 ? rules : rules[0]\n }\n }\n\n setupBlurRules (field) {\n const rules = []\n for (const rule of ruleDefinitions.filter(x => x.fireOnlyOnSubmit == false)) {\n if (field.dataset[rule.attribute]) {\n const newRule = rule.rule(field)\n if (newRule) {\n rules.push(newRule)\n }\n }\n }\n\n if (rules.length > 0 & field.name.length > 0) {\n return rules.length > 1 ? rules : rules[0]\n }\n }\n\n handleErrors (errors, fields) {\n for (const key in fields) {\n const field = fields[key]\n this.displayError(field[0])\n }\n this.focusFirst()\n this.validationSummary(errors)\n }\n\n focusFirst() {\n const error = this.form.querySelector(`.${inputErrorClass}`)\n\n if (error) {\n error.focus()\n }\n }\n\n handleFieldError (errors, fields, field) {\n if (Object.hasOwn(fields, field.name)) {\n const err = fields[field.name]\n this.displayError(err[0])\n } else {\n this.clearErrors(field)\n }\n }\n\n clearPreviousErrors () {\n const errors = this.form.querySelectorAll(`.${inputErrorClass}`)\n for (const error of errors) {\n error.classList.remove(inputErrorClass)\n error.removeAttribute('aria-describedby')\n }\n if (this.summary) {\n if (!this.summary.classList.contains(summaryValidClass)) {\n this.summary.classList.add(summaryValidClass)\n }\n if (this.summary.classList.contains(summaryErrorClass)) {\n this.summary.classList.remove(summaryErrorClass)\n }\n }\n\n const messages = this.form.querySelectorAll(`.${messageErrorClass}`)\n\n for (const message of messages) {\n message.classList.remove(messageErrorClass)\n message.classList.add(messageValidClass)\n message.innerText = ''\n }\n\n if (this.summary) {\n const list = this.summary.firstChild\n list.innerHTML = ''\n }\n }\n\n validationSummary (errors) {\n if (this.summary) {\n const list = this.summary.firstChild\n list.innerHTML = ''\n for (let i = 0; i < errors.length; i++) {\n const error = errors[i]\n const li = document.createElement('li')\n li.innerText = error.message\n li.setAttribute('data-error-for', error.field)\n list.appendChild(li)\n }\n this.summary.classList.remove(summaryValidClass)\n this.summary.classList.add(summaryErrorClass)\n }\n }\n\n displayError (field) {\n const elem = this.form.querySelector(`[name=\"${field.field}\"]`)\n\n if (elem) {\n elem.classList.add(inputErrorClass)\n\n const label = this.form.querySelector(`[data-valmsg-for=\"${field.field}\"]`)\n\n if (label && label.dataset.valmsgReplace === 'true') {\n const valId = `${field.field}-val-${this.nonce}`\n label.id = valId\n elem.setAttribute('aria-describedby', valId)\n label.innerText = field.message\n label.classList.remove(messageValidClass)\n label.classList.add(messageErrorClass)\n }\n }\n }\n\n validateForm () {\n this.clearPreviousErrors()\n const formData = this.formToObject()\n return new Promise((resolve, reject) => {\n this.validator.validate(formData, { firstFields: true }).then(() => {\n resolve(new FormData(this.form))\n }).catch(({ errors, fields }) => {\n this.handleErrors(errors, fields)\n reject(errors, fields)\n })\n })\n }\n\n clearErrors (field) {\n if (field.classList.contains(inputErrorClass)) {\n field.classList.remove(inputErrorClass)\n }\n if (!field.classList.contains(inputValidClass)) {\n field.classList.add(inputValidClass)\n }\n\n const label = this.form.querySelector(`[data-valmsg-for=\"${field.name}\"]`)\n\n if (label && label.dataset.valmsgReplace === 'true') {\n label.innerText = ''\n if (!label.classList.contains(messageErrorClass)) {\n label.classList.add(messageErrorClass)\n }\n if (label.classList.contains(messageErrorClass)) {\n label.classList.remove(messageErrorClass)\n }\n }\n\n if (this.summary) {\n const err = this.summary.querySelector(`[data-error-for=\"${field.name}\"]`)\n if (err) {\n err.parentNode.removeChild(err)\n }\n }\n }\n\n validateField (field) {\n const formData = this.formToObject()\n return this.blurValidator.validate(formData, { firstFields: true }).then(() => {\n this.clearErrors(field)\n return true\n }).catch(({ errors, fields }) => {\n this.handleFieldError(errors, fields, field)\n return false\n })\n }\n\n formToObject () {\n const formData = new FormData(this.form)\n const object = {}\n formData.forEach((value, key) => {\n if (key === '') {\n return\n }\n\n if (!Reflect.has(object, key)) {\n object[key] = value\n return\n }\n if (!Array.isArray(object[key])) {\n object[key] = [object[key]]\n }\n object[key].push(value)\n })\n\n return object\n }\n}\n","import { initForms } from './validation/init.js'\nimport { addRule } from './validation/FormValidation.js'\n\n// rules\nimport requiredRule from './validation-rules/required.js'\nimport kenticoRequiredRule from './validation-rules/kentico-required.js'\nimport emailRule from './validation-rules/email.js'\nimport maxlengthRule from './validation-rules/maxLength.js'\nimport minlengthRule from './validation-rules/minLength.js'\nimport numberRule from './validation-rules/number.js'\nimport phoneRule from './validation-rules/phone.js'\nimport regexRule from './validation-rules/regex.js'\n\nconst setupValidation = function() {\n requiredRule()\n emailRule()\n maxlengthRule()\n minlengthRule()\n numberRule()\n phoneRule()\n regexRule()\n}\n\nconst setupKenticoValidation = function () {\n kenticoRequiredRule()\n emailRule()\n maxlengthRule()\n minlengthRule()\n numberRule()\n phoneRule()\n regexRule()\n}\n\nexport {\n initForms,\n setupValidation,\n setupKenticoValidation,\n addRule\n}\n","import { addRule } from '@chrisjwarnes/form-validator/src/validation/FormValidation.js'\nexport default function () {\n addRule('valRequired', function (field) {\n // ignore kentico checkbox invalid field validation.\n\n if (field.hasAttribute('data-ktc-notobserved-element')) {\n if (field.type === 'checkbox' || field.type === 'radio') {\n return {\n type: 'string',\n required: true,\n message: field.dataset.valRequired,\n validator: (rule, value) => true\n }\n }\n }\n\n if (field.type === 'checkbox') {\n const fields = document.querySelectorAll(`[name=\"${field.name}\"]`)\n\n if (fields.length > 1) {\n return {\n type: 'boolean',\n required: true,\n message: field.dataset.valRequired,\n validator: (rule, value) => [...fields].filter(x => x.checked).length > 0\n }\n } else {\n return {\n type: 'boolean',\n required: true,\n message: field.dataset.valRequired,\n validator: (rule, value) => field.checked\n }\n }\n }\n\n if (field.type === 'file') {\n return {\n type: 'string',\n required: true,\n message: field.dataset.valRequired,\n validator: (rule, value) => field.files.length > 0\n }\n }\n\n return {\n type: 'string',\n required: true,\n message: field.dataset.valRequired,\n transform (value) {\n if (value && value.trim) {\n return value.trim()\n }\n return value\n }\n }\n })\n}\n","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valEmail', function (field) {\n return {\n type: 'email',\n message: field.dataset.valEmail\n }\n })\n}\n","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valMaxlength', function (field) {\n return {\n type: 'string',\n max: parseInt(field.dataset.valMaxlengthMax),\n message: field.dataset.valMaxlength\n }\n })\n}","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valMinlength', function (field) {\n return {\n type: 'string',\n min: parseInt(field.dataset.valMinlengthMin),\n message: field.dataset.valMinlength\n }\n })\n}","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valNumber', function (field) {\n return {\n type: 'number',\n message: field.dataset.valNumber,\n transform (value) {\n if (value && value.trim) {\n return Number(value.trim())\n }\n return value\n }\n }\n })\n}\n","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valPhone', function (field) {\n return {\n type: 'string',\n pattern: /^\\+?[0-9\\s-()]+$/,\n message: field.dataset.valPhone\n }\n })\n}\n","import { addRule } from '../validation/FormValidation.js'\nexport default function () {\n addRule('valRegex', function (field) {\n let pattern = field.dataset.valRegexPattern.trim()\n\n if (pattern.charAt(pattern.length - 1) === '/') {\n pattern = pattern.slice(0, -1)\n }\n\n if (pattern.charAt(0) === '/') {\n pattern = pattern.substr(1)\n }\n\n return {\n type: 'string',\n pattern: new RegExp(pattern),\n message: field.dataset.valRegex\n }\n })\n}","import { FormValidation } from './FormValidation.js'\n\nexport const initForm = function (form) {\n if (form.validator) {\n form.validator.init()\n } else {\n const val = new FormValidation(form)\n\n if (val.fields.length > 0) {\n val.setUpEvents()\n \n form.validator = val\n }\n }\n}\n\nexport const initForms = function () {\n var forms = document.querySelectorAll('form')\n\n for (const form of forms) {\n initForm(form)\n }\n\n document.addEventListener('form-updated', function (e) {\n const forms = e.target.querySelectorAll('form')\n\n for (const form of forms) {\n initForm(form)\n }\n })\n}\n","/**\n * This function is used to set up file upload functionality on a form. It is used\n * to set up the file upload UI.\n *\n * @param {Element} parent The parent element of the file upload inputs.\n */\nfunction setupFileUpload (parent) {\n const fups = parent.querySelectorAll('input[type=\"file\"].file-upload__file')\n\n for (const fup of fups) {\n init(fup, parent)\n }\n}\n\n// This function is used to initialize the form.\n// It takes the fileUpload object and the form as arguments.\n// The fileUpload object is used to upload files to the server.\n// The form is used to submit the data.\nconst init = function (fileUpload, form) {\n const label = form.querySelector(`[data-file-for=\"${fileUpload.id}\"]`)\n\n setLabel(fileUpload, label)\n\n fileUpload.addEventListener('input', function (e) {\n setLabel(fileUpload, label)\n })\n}\n\n// This function sets the label text of the fileUpload control to the value of the label parameter.\n// The label parameter is of type String.\n// The fileUpload parameter is an input [type=\"file\"].\nfunction setLabel (fileUpload, label) {\n // if there are more than 1 file selected, show the number of files selected\n if (fileUpload.files.length > 1) {\n label.innerHTML = `${fileUpload.files.length} files selected.`\n // if there is only 1 file selected, show the name of the file\n } else if (fileUpload.files.length > 0) {\n label.innerHTML = fileUpload.files[0].name\n // if there are no files selected, show the empty string\n } else {\n label.innerHTML = label.dataset.empty\n }\n\n if (fileUpload.files.length > 1) {\n label.innerHTML = `${fileUpload.files.length} files selected.`\n } else if (fileUpload.files.length > 0) {\n label.innerHTML = fileUpload.files[0].name\n } else {\n label.innerHTML = label.dataset.empty\n }\n}\n\nexport {\n setupFileUpload\n}\n","import { Logger } from '../../utilities/Logger'\n\nclass LoadingButton {\n constructor (elem) {\n if (elem == null) {\n return\n }\n\n this.logger = new Logger('Loading button')\n this.elem = elem\n this.loadingState = false\n this.init()\n }\n\n init () {\n this.logger.log('loading button initialised')\n }\n\n toggle () {\n if (this.loadingState) {\n this.stopLoading()\n } else {\n this.startLoading()\n }\n }\n\n startLoading () {\n this.loadingState = true\n this.toggleState()\n }\n\n stopLoading () {\n this.loadingState = false\n this.toggleState()\n }\n\n toggleState () {\n if (this.loadingState) {\n this.logger.log('loading started')\n this.elem.dataset.loadStatus = 'loading'\n this.elem.setAttribute('aria-disabled', 'true')\n } else {\n this.logger.log('loading stopped')\n this.elem.removeAttribute('data-load-status')\n this.elem.removeAttribute('aria-disabled')\n }\n }\n}\n\nfunction setupLoadingButtons () {\n const loadingButtons = document.querySelectorAll('[data-loading-button]')\n\n for (const loadingButton of loadingButtons) {\n const buttonInstance = new LoadingButton(loadingButton)\n // Expose the instance globally or through a variable if needed\n loadingButton.loadingButtonInstance = buttonInstance\n }\n}\n\nexport {\n setupLoadingButtons\n}\n","import { getCurrentCulture } from '../utilities/Localization'\nimport { setupLoadingButtons } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/loading-button'\n\nexport function injectSalesHorizonForm (formData, target, modalInstance) {\n if (!formData || !target) {\n return\n }\n\n let requestUri = `/api2/sales-horizon-form?embark=${formData.embark}&disembark=${formData.disembark}&departDate=${getFormattedDate(formData.outboundDate)}`\n\n if (!formData.oneWay) {\n requestUri += `&returnDate=${getFormattedDate(formData.returnDate)}`\n }\n\n fetch(requestUri, {\n method: 'GET',\n headers: {\n 'Accept-Language': getCurrentCulture()\n }\n })\n .then((res) => {\n if (!res.ok) {\n throw new Error('Failed to get sales horizon form')\n }\n return res.text()\n })\n .then(html => {\n if (!html) {\n throw new Error('Failed to get sales horizon form - form HTML was null')\n }\n handleFormInjection(html, target, modalInstance)\n })\n .catch(() => {\n console.log('An unexpected error occurred whilst loading the sales horizon form.')\n })\n}\n\nfunction handleFormInjection (html, target, modalInstance) {\n const container = document.querySelector(target)\n if (!container) {\n return\n }\n container.outerHTML = html\n\n const form = document.getElementById('salesHorizonForm')\n\n if (!form) {\n console.log('Cannot setup sales horizon form - form DOM element was null')\n }\n\n // Binds form validation\n document.dispatchEvent(new CustomEvent('form-updated'), { bubbles: true })\n\n // Re-init dependent controls\n window.setupSelects(form)\n modalInstance.setupEvents()\n setupLoadingButtons()\n\n // Handle loading button state\n form.addEventListener('submit', function () {\n form.validator.validateForm().then(function (formData) {\n const submitBtn = form.querySelector('button[type=\"submit\"]')\n if (submitBtn && typeof (submitBtn.loadingButtonInstance) !== 'undefined') {\n submitBtn.loadingButtonInstance.toggle()\n }\n }).catch(function (errors, fields) {\n })\n })\n}\n\nfunction getFormattedDate (urlDate) {\n if (!urlDate) {\n return null\n }\n\n const date = new Date(urlDate)\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return '' + year + '-' + month + '-' + day\n}\n","import { logBookingEngineConversion } from './ab-test-logger'\n\nwindow.dataLayer = window.dataLayer || []\nconst dataLayer = window.dataLayer\n\nconst rootDs = document.querySelector('[data-dl]')\n\nconst push = function (data) {\n dataLayer.push(data)\n}\n\nconst handleClickEvent = async (event, eventName, additionalData = {}) => {\n const clickUrl = event.currentTarget.getAttribute('href')\n const closestParentWithDataAt = event.currentTarget.closest('[data-at]')\n const clickText = event.currentTarget.textContent.trim()\n const pageUrl = window.location.href\n const pageTitle = rootDs.dataset.pageTitle\n const pageSection = closestParentWithDataAt != null ? closestParentWithDataAt.dataset.at : null\n const abTest = rootDs.dataset.abTest ? JSON.parse(rootDs.dataset.abTest) : null\n\n push({\n event: 'gaEvent',\n event_name: eventName,\n click_url: clickUrl,\n click_text: clickText,\n page_url: pageUrl,\n page_title: pageTitle,\n page_section: pageSection,\n ab_test: abTest,\n ...additionalData\n })\n\n if (clickUrl &&\n (clickUrl.indexOf('/booking?') !== -1 ||\n clickUrl.indexOf('/booking/') !== -1)) {\n await logBookingEngineConversion()\n }\n}\n\nconst sitewideTracking = function () {\n if (rootDs) {\n push({\n event: 'pageview',\n page_title: rootDs.dataset.pageTitle,\n page_type: rootDs.dataset.pageType,\n page_url: window.location.href,\n mobile_app: false,\n step: null,\n step_name: null,\n user_details: {\n logged_in_status: rootDs.dataset.status === 'True',\n user_id: rootDs.dataset.uid,\n email: rootDs.dataset.email,\n country: rootDs.dataset.country,\n language: rootDs.dataset.language\n },\n ab_test: rootDs.dataset.abTest ? JSON.parse(rootDs.dataset.abTest) : null\n })\n }\n}\n\nconst bookingTracking = async () => {\n const bookingUrl = document.querySelector('[data-booking-url]')\n const bookingBar = document.querySelector('[data-bar-search-button]')\n const bookingLinks = Array.from(document.querySelectorAll(`a[href*=\"${bookingUrl.dataset.bookingUrl}\"]`))\n\n const attachEventToLink = (link) => {\n link.addEventListener('click', async (event) => {\n await handleClickEvent(event, 'book_now_click')\n })\n }\n\n bookingLinks.forEach(link => {\n attachEventToLink(link)\n })\n\n if (bookingBar) {\n attachEventToLink(bookingBar)\n }\n\n const observeNewElements = () => {\n const bookingBarContainer = document.querySelector('[data-booking-bar-container]')\n if (!bookingBarContainer) return\n\n const mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const newBookingBar = node.querySelector('[data-bar-search-button]')\n if (newBookingBar) {\n attachEventToLink(newBookingBar)\n }\n }\n })\n })\n })\n\n mutationObserver.observe(bookingBarContainer, {\n childList: true,\n subtree: true\n })\n }\n\n observeNewElements()\n}\n\nconst navigationTracking = () => {\n const addNavigationHandler = (link, eventName) => {\n link.addEventListener('click', async (event) => {\n const hierarchyLevel = link.getAttribute('data-menu-hierarchy')\n let headerHierarchy1 = ''\n let headerHierarchy2 = ''\n let headerHierarchy3 = ''\n\n if (hierarchyLevel === '3') {\n headerHierarchy3 = link.textContent\n const mmList = link.closest('.mm__item')\n if (mmList) {\n const lvl2Link = mmList.querySelector('[data-menu-hierarchy=\"2\"]')\n if (lvl2Link) {\n headerHierarchy2 = lvl2Link.textContent\n }\n const lvl1Link = mmList.querySelector('[data-menu-hierarchy=\"1\"]')\n if (lvl1Link) {\n headerHierarchy1 = lvl1Link.textContent\n }\n }\n } else if (hierarchyLevel === '2') {\n headerHierarchy2 = link.textContent\n const mmList = link.closest('.mm__item')\n if (mmList) {\n const lvl1Link = mmList.querySelector('[data-menu-hierarchy=\"1\"]')\n if (lvl1Link) {\n headerHierarchy1 = lvl1Link.textContent\n }\n }\n } else if (hierarchyLevel === '1') {\n headerHierarchy1 = link.textContent\n }\n\n await handleClickEvent(event, eventName, {\n header_hierarchy_1: headerHierarchy1.trim(),\n header_hierarchy_2: headerHierarchy2.trim(),\n header_hierarchy_3: headerHierarchy3.trim()\n })\n })\n }\n\n const navLinks = document.querySelectorAll('[data-menu-hierarchy]')\n navLinks.forEach(link => {\n addNavigationHandler(link, 'navigation_click')\n })\n}\n\nconst footerTracking = () => {\n const footerLinks = document.querySelectorAll('[data-footer-link]')\n footerLinks.forEach(link => {\n link.addEventListener('click', async (event) => {\n await handleClickEvent(event, 'footer_click')\n })\n })\n}\n\nconst socialTracking = () => {\n const socialLinks = document.querySelectorAll('[data-social-link]')\n socialLinks.forEach(link => {\n link.addEventListener('click', async (event) => {\n await handleClickEvent(event, 'social_click')\n })\n })\n}\n\nconst shareTracking = () => {\n const sharelLinks = document.querySelectorAll('[data-share-link]')\n sharelLinks.forEach(link => {\n link.addEventListener('click', async (event) => {\n await handleClickEvent(event, 'share_click', { share_channel: event.target.dataset.shareLink })\n })\n })\n}\n\nconst callToActionTracking = () => {\n const ctaLinks = document.querySelectorAll('[data-cta-link]')\n ctaLinks.forEach(link => {\n link.addEventListener('click', async (event) => {\n await handleClickEvent(event, 'call_to_action')\n })\n })\n}\n\nexport {\n sitewideTracking,\n bookingTracking,\n navigationTracking,\n footerTracking,\n socialTracking,\n shareTracking,\n callToActionTracking\n}\n","const logBookingEngineConversion = async () => {\n const response = await fetch('/api2/abtesting/logbookingconversion', { method: 'POST' })\n\n if (!response.ok) {\n throw new Error('AB Test Logger: An unexpected error occurred whilst logging a booking engine conversion.')\n }\n}\n\nexport { logBookingEngineConversion }\n","import { Logger } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/Logger'\nimport { loadSprites } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/SVGLoader'\nimport { loadOffcanvas } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/offCanvas'\nimport { setupAccordions } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/accordion'\nimport { loadFlyoutDelegates } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/flyoutDelegates'\nimport { setupBookingBar } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/bookingBar'\nimport { loadDialogOpeners } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/showDialog'\nimport { loadAccordionClosers } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/accordionClose'\nimport { setupCopyToClipboard } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/copy-to-clipboard'\nimport { setupFlipCards } from '@eurotunnel-pax/leshuttle.ui/stories/Molecules/Cards/Flip/flip-card'\nimport { loadDialogs } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/dialog'\nimport { setupModals } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/modal'\nimport { setupSelectStyling } from '@eurotunnel-pax/leshuttle.ui/src/scripts/forms/inputs/SelectFormatting'\nimport { setupDatePickers, setupDatePickersWithRange } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/datePicker'\nimport { setupTabs } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/tabs'\nimport { setupInlineVideos } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/inline-video'\nimport { setupSliderCardSets } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/molecules/slider-card-set'\nimport { setupArticleMedias } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/article-media'\nimport { setupSearch } from './components/Search'\nimport { setupCountryModal } from './components/CountryModal'\nimport { setupSiteAlerts } from './components/SiteAlerts'\nimport { setupLazyLoaders } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/LazyLoad'\nimport { setupMatchHeight } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/match-height'\nimport { setupSupportLists } from '@eurotunnel-pax/leshuttle.ui/stories/Molecules/TextBlocks/SupportListTextBlock/support-list'\nimport { setupArticleListing } from './components/ArticleListing'\nimport { setupImageZoom } from '@eurotunnel-pax/leshuttle.ui/stories/Components/ImageZoom/image-zoom'\nimport { setupListPaging } from './components/ListPaging'\nimport { setupDynamicVideoButtons, setupMoodVideos } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/media-block'\nimport './forms/updateableFormHelper-crafted'\nimport './forms/file-uploader'\nimport { setupWebForms } from './forms'\nimport valRecaptcha from './forms/rules/recaptcha.js'\nimport { handleCmsWidgetLoading } from './utilities/CmsWidgetLoader.js'\nimport { setupBookingBarSubmit } from './components/BookingBar.js'\nimport { handleNewsletterFormSubmit } from './components/NewsletterForm.js'\nimport { setupLoadingButtons } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/patterns/loading-button'\nimport { loadSections } from './components/layout/LoadSections'\nimport { setupScrolling } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/drag-scroll'\nimport { detectMac } from '@eurotunnel-pax/leshuttle.ui/src/scripts/utilities/MacDetection'\nimport { setupTracking } from './tracking/setup-tracking'\nimport { setupLiveChatTriggers } from './utilities/LiveChat.js'\n\nconst logger = new Logger('Application')\n\nlogger.log('Loading Sprite sheet.')\n\nloadSprites()\nloadOffcanvas()\nsetupAccordions(document)\nloadFlyoutDelegates()\nsetupLoadingButtons()\nloadDialogOpeners()\nloadAccordionClosers()\nsetupBookingBar(document)\nsetupCopyToClipboard(document)\nsetupFlipCards(document)\nsetupAccordions(document)\nloadDialogs(document)\nsetupSelectStyling(document)\nsetupModals(document)\nsetupDatePickersWithRange(document)\nsetupDatePickers(document)\nsetupTabs(document)\nsetupInlineVideos(document)\nsetupSliderCardSets(document)\nsetupArticleMedias(document)\nsetupCountryModal()\nsetupSiteAlerts()\nsetupLazyLoaders(document)\nsetupSupportLists(document)\nsetupArticleListing()\nsetupImageZoom(document)\nsetupMoodVideos(document)\nsetupDynamicVideoButtons(document)\nsetupScrolling(document)\nsetupMatchHeight(document)\ndetectMac()\nsetupListPaging()\nvalRecaptcha()\nsetupWebForms()\nhandleCmsWidgetLoading()\nsetupBookingBarSubmit()\nhandleNewsletterFormSubmit()\nsetupLiveChatTriggers()\nwindow.setTimeout(() => {\n setupSearch()\n}, 1000)\nloadSections(document)\nsetupTracking()\n\nif (navigator.userAgent.indexOf('Firefox') !== -1) {\n const elem = document.querySelector('body')\n elem.classList.add('body--firefox')\n}\n","export const setupCopyToClipboard = function (parent) {\n const clips = parent.querySelectorAll('[data-copy-to-clipboard]')\n\n if (clips.length > 0) {\n clips.forEach(function (clip) {\n clip.addEventListener('click', function (e) {\n e.preventDefault()\n copyToClipboard(clip, e)\n })\n })\n }\n}\n\nasync function copyToClipboard (clip, e) {\n try {\n await navigator.clipboard.writeText(clip.dataset.copyToClipboard)\n showCopiedPopup(clip)\n } catch (err) {\n console.error('Failed to copy URL: ', err)\n }\n}\n\nfunction showCopiedPopup (clip) {\n const notificationText = clip.getAttribute('data-copy-to-clipboard-notification') || 'Copied!'\n\n const popup = document.createElement('div')\n popup.className = 'social-sharing__copied-popup'\n popup.textContent = notificationText\n clip.appendChild(popup)\n\n setTimeout(() => {\n popup.remove()\n }, 2000)\n}\n","import dialogPolyfill from 'dialog-polyfill'\n\n// Ensures dialog elements are polyfilled.\nexport function loadDialogs () {\n const elems = document.querySelectorAll('dialog')\n const dialogs = []\n\n for (const element of elems) {\n dialogPolyfill.registerDialog(element)\n }\n\n return dialogs\n}\n","export function detectMac () {\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0\n const elem = document.querySelector('body')\n elem.classList.add(isMac ? 'body--mac' : 'body--not-mac')\n return true\n}\n","import { addRule } from '@chrisjwarnes/form-validator/src'\n\nexport default function () {\n addRule('valRecaptcha', function (field) {\n return {\n type: 'string',\n asyncValidator: (rule, value) => {\n return new Promise((resolve, reject) => {\n console.log('get token')\n if (!window.grecaptcha) {\n reject(new Error('grecaptcha script is missing.'))\n }\n window.grecaptcha.execute(field.dataset.valRecaptchaKey, { action: field.dataset.valRecaptchaAction }).then(function (token) {\n field.value = token\n resolve()\n })\n })\n },\n message: field.dataset.valRecaptcha\n }\n }, true)\n}\n","import { initForms, setupKenticoValidation } from '@chrisjwarnes/form-validator/src'\nimport { addWebTrackingToForms } from './validation/web-tracking'\nimport { addGoogleAnalyticsTrackingToForms } from './validation/google-analytics'\nimport { setupFileUpload } from './file-upload'\n\nfunction setupWebForms () {\n setupKenticoValidation()\n addWebTrackingToForms()\n addGoogleAnalyticsTrackingToForms()\n initForms()\n setupFileUpload(document)\n}\n\nexport {\n setupWebForms\n}\n","import { addRule } from '@chrisjwarnes/form-validator/src'\n\nfunction addWebTrackingToForms () {\n addRule('valWebTracking', function (field) {\n return {\n type: 'string',\n asyncValidator: (rule, value) => {\n return new Promise((resolve, reject) => {\n if (field.value.length === 0) {\n const trackingId = new Date().toISOString().replace(/-/g, '').split('.')[0].replace('T', '').replace(/:/g, '')\n\n value = trackingId\n field.value = value\n }\n resolve()\n })\n }\n }\n })\n}\n\nexport {\n addWebTrackingToForms\n}\n","import { getCookie } from '../../utilities/CookieUtils'\nimport { addRule } from '@chrisjwarnes/form-validator/src'\n\nfunction addGoogleAnalyticsTrackingToForms () {\n addRule('valGoogleAnalytics', function (field) {\n return {\n type: 'string',\n asyncValidator: (rule, value) => {\n return new Promise((resolve, reject) => {\n const gaTrackingId = getCookie('_ga')\n if (gaTrackingId) {\n value = gaTrackingId\n field.value = gaTrackingId\n }\n resolve()\n })\n }\n }\n })\n}\n\nexport {\n addGoogleAnalyticsTrackingToForms\n}\n","import { setupDynamicVideoButtons, setupMoodVideos } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/video/media-block'\n\nexport function handleCmsWidgetLoading () {\n document.addEventListener('cms-widget-loaded', function () {\n setupMoodVideos(document)\n setupDynamicVideoButtons(document)\n })\n}\n","import { ModalDialogue } from '@eurotunnel-pax/leshuttle.ui/src/scripts/components/controls/modal.js'\nimport { getCurrentCulture } from '../utilities/Localization'\nimport { injectSalesHorizonForm } from './SalesHorizonForm'\n\nexport function setupBookingBarSubmit () {\n document.addEventListener('ExportBookingBarData', (e) => {\n const formData = e.detail.formData\n if (formData) {\n console.log(formData)\n setFormDefaults(formData)\n submitBookingBarForm(formData)\n }\n })\n}\n\nfunction submitBookingBarForm (formData) {\n fetch('/api2/booking-bar/submit', {\n method: 'POST',\n cache: 'no-cache',\n redirect: 'follow',\n body: JSON.stringify(formData),\n headers: {\n 'Content-Type': 'application/json',\n 'Accept-Language': getCurrentCulture()\n }\n })\n .then((res) => {\n if (res.redirected) {\n window.location.href = res.url\n return\n }\n return res.text()\n })\n .then(html => injectNoDatesModal(html, formData))\n .catch((error) => {\n console.log('An unexpected error occurred whilst submitting the booking bar form.')\n console.log(error)\n })\n}\n\nfunction setFormDefaults (formData) {\n if (!formData.outboundDate) {\n const outboundDate = new Date()\n outboundDate.setDate(new Date().getDate())\n formData.outboundDate = outboundDate\n }\n\n // Satisfies model binder\n if (formData.returnDate === '') {\n formData.returnDate = null\n }\n}\n\nfunction injectNoDatesModal (html, formData) {\n if (!html) {\n return\n }\n\n // Check if existing and if so, wipe\n let modalWrap = document.getElementById('salesHorizonModalWrap')\n\n if (modalWrap) {\n modalWrap.remove()\n }\n\n modalWrap = document.createElement('div')\n modalWrap.id = 'salesHorizonModalWrap'\n modalWrap.innerHTML = html\n\n const body = document.querySelector('body')\n body.appendChild(modalWrap)\n\n if (modalWrap) {\n const modalElem = document.getElementById('salesHorizonNoDates')\n const modalInstance = new ModalDialogue(modalElem)\n modalInstance.open()\n setupSalesHorizonObserver(modalElem)\n\n // Bind events\n const signUpTrigger = modalElem.querySelector('[data-alert-form-open]')\n signUpTrigger.addEventListener('click', (e) => {\n e.stopPropagation()\n injectSalesHorizonForm(formData, '[data-sales-horizon]', modalInstance)\n })\n }\n}\n\nfunction setupSalesHorizonObserver (modal) {\n const config = { childList: true, subtree: true }\n const callback = (mutationsList, observer) => {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n const newClosers = document.querySelectorAll('[data-modal-close=\"salesHorizonNoDates\"]:not([data-clickbound])')\n newClosers.forEach((closer) => {\n closer.addEventListener('click', (e) => {\n e.preventDefault()\n e.stopPropagation()\n modal.classList.remove('is-open')\n modal.setAttribute('aria-hidden', 'true')\n modal.close()\n modal.isOpen = false\n })\n closer.dataset.clickbound = 'true'\n })\n }\n }\n }\n const observer = new MutationObserver(callback)\n observer.observe(modal, config)\n}\n","export function handleNewsletterFormSubmit () {\n const form = document.querySelector('[data-newsletter-form]')\n if (form) {\n form.addEventListener('submit', function () {\n form.validator.validateForm().then(function (formData) {\n const submitBtn = form.querySelector('button[type=\"submit\"]')\n if (submitBtn && typeof (submitBtn.loadingButtonInstance) !== 'undefined') {\n submitBtn.loadingButtonInstance.toggle()\n }\n }).catch(function (errors, fields) {\n })\n })\n }\n}\n","const setupLiveChatTriggers = () => {\n document.addEventListener('DOMContentLoaded', function () {\n const chatTriggers = document.querySelectorAll('[data-live-chat]')\n if (chatTriggers) {\n chatTriggers.forEach((el, i) => {\n el.addEventListener('click', () => {\n if (window.zE) {\n window.zE('messenger', 'open')\n }\n })\n })\n }\n })\n}\n\nexport {\n setupLiveChatTriggers\n}\n","import { sitewideTracking, bookingTracking, navigationTracking, socialTracking, shareTracking, callToActionTracking, footerTracking } from './tracking'\n\nconst setupTracking = () => {\n const rootDs = document.querySelector('[data-dl]')\n if (rootDs) {\n sitewideTracking()\n bookingTracking()\n navigationTracking()\n socialTracking()\n footerTracking()\n callToActionTracking()\n shareTracking()\n }\n}\n\nexport {\n setupTracking\n}\n"],"names":["Object","assign","target","args","_i","arguments","length","TypeError","_loop_1","source","keys","forEach","key","_a","args_1","exports","fp","window","undefined","flatpickr","l10ns","French","firstDayOfWeek","weekdays","shorthand","longhand","months","ordinal","nth","rangeSeparator","weekAbbreviation","scrollTitle","toggleTitle","time_24hr","fr","default","defineProperty","value","factory","Dutch","nl","kentico","_forms","formFileUploaderComponent","document","enableElements","form","fileUploaderDisabledElements","disabledElement","elements","disabled","attachScript","config","fileInput","getElementById","fileInputId","inputPlaceholder","inputReplacementFilename","inputTextButton","inputIconButton","tempFileIdentifierInput","tempFileIdentifierInputId","systemFileNameInput","systemFileNameInputId","originalFileNameInput","originalFileNameInputId","deletePersistentFileInput","deletePersistentFileInputId","tempFileOriginalName","deleteFileIconButtonTitle","originalText","innerText","toUpperCase","originalFileNamePlain","removeAttribute","setAttribute","deleteTempFile","deleteRequest","XMLHttpRequest","open","deleteEndpoint","send","deleteFile","clearTempFile","addEventListener","event","getAttribute","preventDefault","i","element","push","disableElements","file","files","size","maxFileSize","alert","maxFileSizeExceededErrorMessage","data","FormData","submitRequest","contentType","append","e","readyState","status","result","response","JSON","parse","errorMessage","filename","name","fileIdentifier","statusText","innerHTML","upload","parseInt","loaded","total","submitEndpoint","responseType","updatableFormHelper","errorMessages","en","updateForm","nextFocusElement","changedFieldName","elementIdSelector","querySelectorAll","item","updating","formData","focus","activeElement","createRequest","selectionEnd","selectionStart","type","currentScrollPosition","scrollY","renderMarkup","responseText","scrollTo","id","newInput","input","setSelectionRange","setCaretPosition","parentElement","dispatchEvent","CustomEvent","bubbles","markup","targetElement","scripts","Array","prototype","call","scriptElement","parent","parentNode","temp","createElement","attributes","attr","replaceChild","remove","onResponse","xhr","action","debounce","func","wait","immediate","timeout","context","this","callNow","clearTimeout","setTimeout","apply","extractFieldName","splitName","split","secondToLast","registerEventListeners","formId","targetAttributeName","unobservedAttributeName","Error","writeableTypes","observedForm","observedFormElement","hasAttribute","tagName","indexOf","previousValue","keyupUpdate","relatedTarget","submitForm","validator","validateForm","then","replaceTargetId","currentCulture","culture","documentElement","getCurrentCulture","getResponseHeader","json","location","href","redirectTo","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","Logger","constructor","level","prefix","hasNativeSupport","console","formatMessage","message","error","warn","info","log","getSVG","svgUrl","logger","fetch","method","credentials","text","svg","replace","SVGLoader","elem","service","svgService","load","self","svgs","loadSVGs","err","catch","firstChild","toLowerCase","lockClass","bodyHtml","stopBodyScroll","dataLockAttribute","body","classList","contains","style","top","height","add","position","overflow","allowBodyScroll","scrollBehavior","left","behavior","removeProperty","openClass","Overlay","extraClass","insertBefore","childNodes","requestAnimationFrame","close","keyDownListener","keyCode","shiftKey","prevent","Focusable","setup","eventsAttached","all","filter","el","getComputedStyle","getPropertyValue","keyboardOnly","tabIndex","firstFocusable","lastFocusable","focusFirst","focusLast","onEscape","mobileDownQuery","matchMedia","tabletQuery","desktopQuery","largeTouchDeviceQuery","touchDeviceQuery","isTablet","matches","isDesktop","isTouchDevice","togglerOpenedAttr","OffCanvas","isOpen","setAria","vh","offsetLeft","offsetTop","focusState","overlayClass","overlay","toggler","closers","togglers","closer","stopPropagation","dataset","offcanvasOffset","getBoundingClientRect","bottom","toggle","detail","linkedID","setFocussable","querySelector","Accordion","panels","allowMultiple","setupEvents","panel","summary","closeOthers","which","toString","match","focusPanel","getPanelIndex","index","pnl","setupAccordions","elems","accordions","defaultConfig","exitDelay","interval","sensitivity","HoverIntent","userConfig","combineConfig","currX","currY","prevX","prevY","allElems","pollTimer","exitTimer","init","mouseTrack","ev","pageX","pageY","mouseCompare","targetElem","distX","distY","Math","sqrt","isActive","onExit","onEnter","setupHoverIntent","hoverIntents","menuOpenClass","FlyoutDelegates","toggleElements","lastClicked","header","mainMenu","timer","closeOtherDelegates","closeMenu","toggleElem","controlId","menu","targetItem","openByButton","closeByButton","mainMenuOpen","openMenu","refocus","allowScrollTimer","toggleOpen","delegateOpen","openDelegate","closeDelegate","everyToggler","toggleButton","activeElem","find","tgl","isMouseOverElement","click","elementRect","mouseX","clientX","mouseY","clientY","right","HOOKS","defaults","_disable","allowInput","allowInvalidPreload","altFormat","altInput","altInputClass","animate","navigator","userAgent","ariaDateFormat","autoFillDefaultTime","clickOpens","closeOnSelect","conjunction","dateFormat","defaultHour","defaultMinute","defaultSeconds","disable","disableMobile","enableSeconds","enableTime","errorHandler","getWeek","givenDate","date","Date","getTime","setHours","setDate","getDate","getDay","week1","getFullYear","round","hourIncrement","ignoredFocusElements","inline","locale","minuteIncrement","mode","monthSelectorType","nextArrow","noCalendar","now","onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition","plugins","positionElement","prevArrow","shorthandCurrentMonth","showMonths","static","weekNumbers","wrap","english","daysInMonth","s","amPM","yearAriaLabel","monthAriaLabel","hourAriaLabel","minuteAriaLabel","pad","number","slice","bool","fn","t","_this","arrayify","obj","toggleClass","className","tag","content","textContent","clearNode","node","removeChild","findParent","condition","createNumberInput","inputClassName","opts","wrapper","numInput","arrowUp","arrowDown","pattern","appendChild","getEventTarget","composedPath","doNothing","monthToStr","monthNumber","revFormat","D","F","dateObj","monthName","setMonth","G","hour","getHours","parseFloat","H","J","day","K","RegExp","test","M","shortMonth","S","seconds","setSeconds","U","_","unixSeconds","W","weekNum","weekNumber","Y","year","setFullYear","Z","ISODate","d","h","minutes","setMinutes","j","l","m","month","n","u","unixMillSeconds","w","y","tokenRegex","formats","toISOString","options","getMonth","getSeconds","getMinutes","String","substring","createDateFormatter","_b","_c","l10n","_d","isMobile","frmt","overrideLocale","formatDate","map","c","arr","join","createDateParser","givenFormat","timeless","customLocale","parsedDate","dateOrig","toFixed","format","datestr","trim","parseDate","matched","ops","matchIndex","regexStr","token","isBackSlash","escaped","exec","val","isNaN","compareDates","date1","date2","isBetween","ts","ts1","ts2","min","max","calculateSecondsSinceMidnight","hours","parseSeconds","secondsSinceMidnight","floor","duration","DAY","getDefaultHours","minDate","minHour","minMinutes","minSeconds","maxDate","maxHr","maxMinutes","__assign","p","hasOwnProperty","__spreadArrays","il","r","k","a","jl","DEBOUNCED_CHANGE_MS","FlatpickrInstance","instanceConfig","getClosestActiveElement","calendarContainer","getRootNode","bindToInstance","bind","setCalendarWidth","visibility","display","daysContainer","daysWidth","days","offsetWidth","width","weekWrapper","updateTime","selectedDates","defaultDate","getMilliseconds","latestSelectedDateObj","isKeyDown","eventTarget","step","curValue","delta","newValue","isHourElem","hourElement","isMinuteElem","minuteElement","incrementNumInput","abs","timeWrapper","prevValue","_input","setHoursFromInputs","updateValue","_debouncedChange","secondElement","limitMinHours","minTime","minDateHasTime","limitMaxHours","maxTime","maxDateHasTime","minBound","maxBound","currentTime","setHoursFromDate","onYearInput","changeYear","handler","_handlers","removeEventListener","triggerChange","triggerEvent","jumpToDate","jumpDate","jumpTo","oldYear","currentYear","oldMonth","currentMonth","buildMonthSwitch","redraw","timeIncrement","inputElem","createEvent","createDay","_dayNumber","dateIsEnabled","isEnabled","dayElement","$i","todayDateElem","isDateSelected","selectedDateElem","isDateInRange","insertAdjacentHTML","focusOnDayElem","targetNode","onMouseOver","getFirstAvailableDay","startMonth","endMonth","children","startIndex","endIndex","focusOnDay","current","offset","dayFocused","isInView","startElem","givenMonth","loopDelta","numMonthDays","changeMonth","getNextAvailableDay","buildMonthDays","firstOfMonth","prevMonthDays","utils","getDaysInMonth","createDocumentFragment","isMultiMonth","prevMonthDayClass","nextMonthDayClass","dayNumber","dayIndex","dayNum","dayContainer","buildDays","frag","shouldBuildMonth","monthsDropdownContainer","selected","buildMonth","monthElement","container","monthNavFragment","selectedMonth","yearInput","tabindex","yearElement","getElementsByTagName","buildMonths","monthNav","prevMonthNav","yearElements","monthElements","nextMonthNav","buildWeekdays","weekdayContainer","updateWeekdays","splice","isOffset","_hidePrevMonthArrow","_hideNextMonthArrow","updateNavigationCurrentMonth","isCalendarElem","documentClick","eventTarget_1","isCalendarElement","lostFocus","path","isIgnored","some","timeContainer","clear","newYear","newYearNum","isNewYear","dateToCheck","enable","array","parsed","from","to","onBlur","isInput","valueChanged","trimEnd","getDateStr","allowKeydown","allowInlineKeydown","blur","isTimeObj","focusAndClose","selectDate","delta_1","ctrlKey","currentYearElement","concat","pluginElements","x","charAt","cellClass","hoverDate","firstElementChild","initialDate","rangeStartDate","rangeEndDate","containsDisabled","minRange","maxRange","rContainer","dayElem","timestamp","outOfRange","onResize","positionCalendar","minMaxDateSetter","inverseDateObj","getInputElem","setupLocale","stringify","customPositionElement","_positionElement","calendarHeight","reduce","acc","child","offsetHeight","calendarWidth","configPos","configPosVertical","configPosHorizontal","inputBounds","distanceFromBottom","innerHeight","showOnTop","pageYOffset","pageXOffset","isCenter","isRight","rightMost","centerMost","doc","editableSheet","styleSheets","sheet","cssRules","head","getDocumentStyleSheet","bodyWidth","centerLeft","centerIndex","centerStyle","insertRule","centerBefore","msMaxTouchPoints","selectedDate","shouldChangeMonth","selectedIndex","sort","b","single","range","loadedPlugins","_bind","_setHoursFromDate","_positionCalendar","triggerChangeEvent","toInitial","mobileInput","_initialDate","_createElement","destroy","lastChild","_type","wasOpen","select","set","option","CALLBACKS","setSelectedDate","updatePositionElement","inputDate","dates","parseDateRules","rule","hooks","initEvent","specificFormat","dObj","mobileFormatStr","onMonthNavClick","isPrevMonth","isNextMonth","boolOpts","get","_enable","timeMode","defaultDateFormat","defaultAltFormat","_minDate","_maxDate","minMaxTimeSetter","_minTime","_maxTime","hook","pluginConf","parseConfig","nodeName","placeholder","required","nextSibling","setupInputs","preloadedDate","setupDates","yr","fragment","__hidePrevMonthArrow","__hideNextMonthArrow","innerContainer","buildWeeks","separator","hourInput","minuteInput","military2ampm","secondInput","title","buildTime","customAppend","appendTo","nodeType","build","evt","inputType","defaultValue","setupMobile","debouncedResize","ontouchstart","capture","selText","bindEvents","isSafari","_flatpickr","nodeList","nodes","HTMLElement","instances","HTMLCollection","NodeList","selector","Node","localize","setDefaults","jQuery","fp_incr","QuantityTicker","upTicker","label","downTicker","valueInput","defaultData","formdata","quantity","Number","isInteger","initialise","correctdefaultquantity","setValue","setMinState","setMaxState","increment","decrement","setupQuantityTicker","BookingBar","showPax","placeHolder","previousElementSibling","hasPlaceHolder","directionElem","labelDirectionTo","labelDirectionFrom","labelDateTerm","labelDate","labelReturnDate","buttonDirection","buttonDateReset","inputDates","buttonDate","buttonReturnDate","modalDate","modalDateClose","isReturn","initialLoad","buttonSearch","datePicker","bodyLockAttribute","labelStrings","exportEvent","showMax","oneWay","oneway","embark","disembark","outboundDate","outbounddate","returnDate","itineraryLabel","activeState","modalOpen","lang","barMaxClass","phMaxClass","labelPeople","labelPeopleTerm","buttonPeople","buttonPeopleNext","buttonPeopleReset","modalPeople","modalPeopleClose","relativePaxWrapper","checkRelativePax","inputOutboundQty","inputReturnQty","outboundPaxControl","returnPaxControl","outboundPaxLabel","allQtyBtns","outboundPax","returnPax","outboundPaxLabelDiff","outboundPaxLabelShort","returnPaxLabelShort","paxQtyDiff","outboundPeople","returnPeople","setupPaxEvents","updatePaxQty","handleClickOutside","btn","toggleRelativePax","closePeopleModal","resetPeople","maximise","toggleButtonState","closeDateModal","openPeopleModal","swapDirection","resetDates","openDateModal","setupDatePicker","compileformData","handleEscKey","checked","passengersSetOneWay","passengersSetReturn","getOffset","arePaxValid","areDatesValid","setButtonActive","button","setButtonInactive","fpConfig","setupDatePickersBookingBar","addSecondMonthLabel","setDates","calRef","nextElementSibling","nextMonth","secondCalendar","newContent","toLocaleDateString","formatFlatDate","dateInput","hasDialogAttached","isAnyModalOpen","closeDialogs","minimise","scrollToView","offsetPosition","emitFormData","setupBookingBar","bookingBars","ShowDialog","dialogOpen","dialog","showModal","CloseDialog","dialogClose","AccordionCloser","subCloseId","closeSubMenu","FlipCard","inner","front","back","flip","supportCustomEvent","safeDispatchEvent","check","findNearestDialog","localName","host","safeBlur","shadowRoot","inNodeList","isFormMethodDialog","findFocusableElementWithin","hostElement","query","Element","isConnected","findFormSubmitter","submitter","HTMLFormElement","dialogPolyfill","formSubmitter","maybeHandleSubmit","defaultPrevented","imagemapUseValue","dialogPolyfillInfo","dialog_","replacedStyleTop_","openAsModal_","show","returnValue","MutationObserver","maybeHideModal","observe","attributeFilter","removed","cb","downgradeModal","delayModel","cand","substr","setOpen","backdrop_","backdropMouseEvent_","initCustomEvent","cancelable","Event","zIndex","dm","removeDialog","fake","redirectedEvent","initMouseEvent","screenX","screenY","altKey","metaKey","focus_","updateZIndex","dialogZ","backdropZ","pushDialog","invalid","ok","opacity","webkitOverflowScrolling","createsStackingContext","needsCentering","reposition","opt_returnValue","closeEvent","scrollTop","topValue","styleSheet","selectedNodes","selectorText","cssTop","cssBottom","isInlinePositionSetByStylesheet","HTMLDialogElement","forceRegisterDialog","pendingDialogStack","checkDOM","checkDOM_","forwardTab_","handleKey_","handleFocus_","zIndexLow_","zIndexHigh_","mo_","records","rec","removedNodes","DialogManager","blockDocument","childList","subtree","unblockDocument","disconnect","updateStacking","dpi","last","containedByTopDialog_","candidate","compareDocumentPosition","DOCUMENT_POSITION_PRECEDING","cancelEvent","allowed","unshift","testForm","methodDescriptor","getOwnPropertyDescriptor","realGet","realSet","v","shift","offsetX","offsetY","nativeFormSubmit","submit","ModalDialogue","modalId","registerObjects","openers","addClickListener","clickbound","toggleHandler","opener","openHandler","closeHandler","setupModal","SelectStyling","setupSelectStyling","selectors","setupSelects","Tabs","activateTab","changeTabEvent","changeTab","currentTarget","raiseActiveTabEvent","btnValue","buttonID","clickedBtn","selectActiveTab","tabId","activeButton","activeParent","closest","allButtons","allContent","numberRegex","eventName","ss","callback","mutationsList","observer","mutation","EnsureStylesheetLoaded","media","Promise","resolve","reject","IntersectionObserver","entries","entry","isIntersecting","isLeaving","visibleEvent","completeClass","hiddenEvent","root","rootMargin","threshold","setupInViewEvents","playEvent","pauseEvent","setupInlineVideo","video","initialised","autoplay","inlineOnly","sources","sourceSet","src","mediaQuery","widthFromQuery","queryWidth","setVideoSource","play","pause","videoId","playControls","playBtn","paused","setupInlineVideos","setupRecheck","videos","maxTouchPoints","desktopMedia","SliderCardSet","pagination","prevBtn","nextBtn","cards","isFullWidth","currentFocus","adjustNavigationButtons","setButtonStates","getCurrentFocusBasedOnScroll","targetCardLeft","parentPaddingLeft","announceCardChange","zeroLeft","card","announcement","setButtonState","scrollLeft","scrollWidth","clientWidth","state","viewportWidth","innerWidth","scrollPosition","minDiff","ArticleMedia","embed","AutoComplete","itemList","removeContents","returnItemDetails","needle","url","markSearch","inputString","searchString","regex","items","HeroAutoComplete","breadcrumbHtml","breadcrumb","SearchPanel","searchBox","setAutocompleteType","setupDialogEvents","autoCompleteElem","heroAutoCompleteElem","autoComplete","populateAutocomplete","defaultCulture","autoCompleteEvent","searchValue","searchPanel","endpoint","searchDialog","headers","res","setCookie","expires","setTime","toUTCString","cookie","getCookie","cookieName","cookies","dismissModal","modal","getSeenAlerts","cookieValue","LazyLoader","component","lazyComp","getContent","scrollTimeout","htmlContent","MatchHeight","matchHeightOn","resizeTimeout","matchHeight","shouldResize","maxHeight","itemType","matchHeightItem","itemHeight","currentScreenSize","SupportList","toggles","list","toggleList","DragScrolling","checkOverflown","isDrag","pos","startX","startY","evRestorer","doScroll","isOverflown","mouseDownHandler","clickHandler","reinit","cursor","userSelect","mmH","mouseMoveHandler","muH","mouseUpHandler","dx","dy","diffX","diffY","computedStyle","gap","padding","paddingLeft","paddingRight","childWidth","setupScrolling","watch","scrollers","ArticleListing","listCurrent","fetchUrl","offer","country","inspiration","categoryDependencies","setupRadioListeners","setupLinks","setupForm","pageForm","kvpairs","encodeURIComponent","queryString","navigate","errors","pageLinks","pageLink","URL","fetchHref","searchParams","category","radios","paramName","radio","updateUrlParameter","dependentCategory","param","has","delete","updateHistory","updateContents","history","replaceState","ImageZoom","image","zoomImageUrl","imageContainer","scrolling","zoomInButton","zoomOutButton","containerWidth","containerHeight","imageWidth","imageHeight","imageLoaded","zoomLevel","imageHasSwapped","disableZoom","toggleImageSource","zoomImage","resetPositionImage","loadImage","setPositionImage","newSrc","rect","scrollX","scaleFactor","background","observer2","animationUpdates","animationWatch","setupLoader","ignoredClasses","performLoad","sections","isSS","section","isAllowed","cls","instant","loadSections","URLSearchParams","search","ListPaging","isWidget","listPaging","fhref","selects","setupAutoPostback","DynamicVideoEmbed","controlID","targetZone","imageBlock","videoType","loading","loadVideo","videoSource","compileVideoSource","addFrame","videoLoaded","iframe","MoodVideo","validUrl","unloadVideo","setupDynamicVideoButtons","buttons","dynamicVideoButtons","setupMoodVideos","moodVideos","_extends","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","_construct","Parent","Class","Reflect","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","instance","Function","_wrapNativeSuper","_cache","Map","Wrapper","create","enumerable","writable","configurable","formatRegExp","convertFieldsError","fields","field","template","_len","_key","len","isEmptyValue","isArray","isNativeStringType","asyncSerialArray","arrLength","next","original","process","env","AsyncValidationError","_Error","subClass","superClass","asyncMap","objArr","first","_pending","flattenArr","ret","flattenObjArr","firstFields","objArrKeys","objArrLength","results","pending","count","asyncParallelArray","complementError","oe","fieldValue","fullFields","getValue","fullField","deepMerge","urlReg","required$1","messages","pattern$2","types","integer","regexp","getYear","object","email","word","includeBoundaries","v4","v6seg","v6","v46Exact","v4exact","v6exact","ip","exact","ipv4","ipv6","getUrlRegex","hex","ENUM$1","rules","whitespace","ruleType","num","str","lastIndex","mismatch","validators","string","dateObject","any","newMessages","clone","cloned","Schema","descriptor","_messages","define","_proto","validate","source_","oc","_this2","messages$1","series","z","transform","getValidationMethod","getType","errorFields","doIt","deep","defaultField","addFullField","schema","errorList","suppressWarning","warning","filledErrors","fieldsSchema","paredFieldsSchema","fieldSchema","fieldSchemaList","errs","finalErrors","asyncValidator","suppressValidatorError","_errors","complete","messageIndex","register","cssElem","lowerMode","html","tmp","implementation","createHTMLDocument","parseHTML","outerHTML","isElementInViewport","scrollIntoView","block","submitAjaxForm","ajaxMode","update","ajaxUpdate","fetchOptions","cache","responseJson","startsWith","isJsonResponse","responseData","clientHeight","ruleDefinitions","inputValidClass","inputErrorClass","summaryValidClass","summaryErrorClass","messageValidClass","messageErrorClass","addRule","attribute","fireOnlyOnSubmit","FormValidation","nonce","random","initRules","setUpEvents","noValidate","ajax","valid","validateField","definition","blurDefinition","setupRules","setupBlurRules","blurValidator","newRule","handleErrors","displayError","validationSummary","handleFieldError","hasOwn","clearErrors","clearPreviousErrors","li","valmsgReplace","valId","formToObject","setupKenticoValidation","valRequired","valEmail","valMaxlengthMax","valMaxlength","valMinlengthMin","valMinlength","valNumber","valPhone","valRegexPattern","valRegex","initForm","fileUpload","setLabel","empty","LoadingButton","loadingState","stopLoading","startLoading","toggleState","loadStatus","setupLoadingButtons","loadingButtons","loadingButton","buttonInstance","loadingButtonInstance","injectSalesHorizonForm","modalInstance","requestUri","getFormattedDate","submitBtn","handleFormInjection","urlDate","padStart","dataLayer","rootDs","handleClickEvent","async","additionalData","clickUrl","closestParentWithDataAt","clickText","pageUrl","pageTitle","pageSection","at","abTest","event_name","click_url","click_text","page_url","page_title","page_section","ab_test","logBookingEngineConversion","sitewideTracking","page_type","pageType","mobile_app","step_name","user_details","logged_in_status","user_id","uid","language","navigationTracking","link","hierarchyLevel","headerHierarchy1","headerHierarchy2","headerHierarchy3","mmList","lvl2Link","lvl1Link","header_hierarchy_1","header_hierarchy_2","header_hierarchy_3","addNavigationHandler","sprites","sprite","loadSprites","offCanvases","loadOffcanvas","flyoutDelegates","loadFlyoutDelegates","dialogOpeners","dialogClosers","celement","loadDialogOpeners","accordionClosers","loadAccordionClosers","clips","clip","clipboard","writeText","copyToClipboard","notificationText","popup","showCopiedPopup","setupCopyToClipboard","flipCards","setupFlipCards","registerDialog","loadDialogs","modals","setupModals","pickerInputs","pickerInput","dp","setupDatePickersWithRange","setupDatePickers","tabs","setupTabs","sliderCardSets","setupSliderCardSets","articleMedias","setupArticleMedias","countryModal","dismissButton","dismissHref","setupCountryModal","siteAlert","alertId","alertSeen","alerts","addSeenAlert","setupSiteAlerts","lazyLoaders","lazyLoader","setupLazyLoaders","supportLists","setupSupportLists","lists","pagingLists","setupArticleListing","images","setupImageZoom","setupMatchHeight","isMac","platform","detectMac","setupListPaging","grecaptcha","execute","valRecaptchaKey","valRecaptchaAction","valRecaptcha","trackingId","gaTrackingId","forms","initForms","fups","fup","setupFileUpload","setFormDefaults","redirect","redirected","modalWrap","modalElem","setupSalesHorizonObserver","injectNoDatesModal","submitBookingBarForm","handleNewsletterFormSubmit","chatTriggers","zE","searchPanels","onsearch","setupSearch","bookingUrl","bookingBar","bookingLinks","attachEventToLink","bookingBarContainer","mutations","addedNodes","ELEMENT_NODE","newBookingBar","observeNewElements","bookingTracking","share_channel","shareLink"],"sourceRoot":""}