(function (window, document) { 'use strict'; var instances = new WeakMap(); var activeInstance = null; var adapterDefaults = {}; var fallbackLocales = { it: { months: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'], days: ['Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa', 'Do'], previous: 'Mese precedente', next: 'Mese successivo', choose: 'Scegli la data' }, en: { months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], days: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], previous: 'Previous month', next: 'Next month', choose: 'Choose a date' }, fr: { months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'], days: ['Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'], previous: 'Mois précédent', next: 'Mois suivant', choose: 'Choisir une date' }, es: { months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'], days: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá', 'Do'], previous: 'Mes anterior', next: 'Mes siguiente', choose: 'Elegir una fecha' }, de: { months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], days: ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'], previous: 'Vorheriger Monat', next: 'Nächster Monat', choose: 'Datum auswählen' } }; function startOfDay(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()); } function sameDay(first, second) { return first && second && first.getFullYear() === second.getFullYear() && first.getMonth() === second.getMonth() && first.getDate() === second.getDate(); } function pad(value) { return String(value).padStart(2, '0'); } function isoDate(date) { return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()); } function decodeEntities(value) { var textarea = document.createElement('textarea'); textarea.innerHTML = value || ''; return textarea.value; } function getLanguage(input) { var container = input.closest('#tsmbe-container'); var language = container ? container.getAttribute('data-lang') : ''; if (!language) { var widget = input.closest('.bookingevolution-tsmbe'); language = widget ? widget.getAttribute('data-lang') : ''; } return fallbackLocales[language] ? language : 'en'; } function getLocale(input) { var language = getLanguage(input); var fallback = fallbackLocales[language]; var remote = window.UIDATES && window.UIDATES[language] ? window.UIDATES[language] : adapterDefaults; return { months: remote.monthNames ? remote.monthNames.map(decodeEntities) : fallback.months, days: remote.dayNamesMin ? remote.dayNamesMin.slice(1).concat(remote.dayNamesMin.slice(0, 1)).map(decodeEntities) : fallback.days, previous: decodeEntities(remote.prevText) || fallback.previous, next: decodeEntities(remote.nextText) || fallback.next, choose: fallback.choose }; } function createButton(className, label, text) { var button = document.createElement('button'); button.type = 'button'; button.className = className; button.setAttribute('aria-label', label); button.textContent = text; return button; } function createCalendar(input, options) { var locale = getLocale(input); var panel = document.createElement('div'); var header = document.createElement('div'); var title = document.createElement('h2'); var weekdays = document.createElement('div'); var grid = document.createElement('div'); var previous = createButton('kalm-booking-calendar__nav', locale.previous, '‹'); var next = createButton('kalm-booking-calendar__nav', locale.next, '›'); var today = startOfDay(new Date()); var instance; panel.className = 'kalm-booking-calendar notranslate'; panel.hidden = true; panel.setAttribute('role', 'dialog'); panel.setAttribute('aria-modal', 'false'); panel.setAttribute('aria-label', locale.choose); header.className = 'kalm-booking-calendar__header'; title.className = 'kalm-booking-calendar__title'; title.setAttribute('aria-live', 'polite'); weekdays.className = 'kalm-booking-calendar__weekdays'; weekdays.setAttribute('aria-hidden', 'true'); grid.className = 'kalm-booking-calendar__grid'; grid.setAttribute('role', 'grid'); locale.days.forEach(function (day) { var label = document.createElement('span'); label.className = 'kalm-booking-calendar__weekday'; label.textContent = day; weekdays.appendChild(label); }); header.appendChild(previous); header.appendChild(title); header.appendChild(next); panel.appendChild(header); panel.appendChild(weekdays); panel.appendChild(grid); document.body.appendChild(panel); instance = { input: input, options: options || {}, locale: locale, panel: panel, title: title, grid: grid, selected: null, view: new Date(today.getFullYear(), today.getMonth(), 1), minimum: today }; previous.addEventListener('click', function () { instance.view = new Date(instance.view.getFullYear(), instance.view.getMonth() - 1, 1); render(instance); }); next.addEventListener('click', function () { instance.view = new Date(instance.view.getFullYear(), instance.view.getMonth() + 1, 1); render(instance); }); input.setAttribute('aria-haspopup', 'dialog'); input.setAttribute('aria-expanded', 'false'); input.setAttribute('autocomplete', 'off'); input.addEventListener('click', function () { open(instance); }); input.addEventListener('keydown', function (event) { if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') { event.preventDefault(); open(instance, true); } }); panel.addEventListener('keydown', function (event) { handleGridKeyboard(instance, event); }); instances.set(input, instance); render(instance); return instance; } function render(instance) { var year = instance.view.getFullYear(); var month = instance.view.getMonth(); var first = new Date(year, month, 1); var offset = (first.getDay() + 6) % 7; var cursor = new Date(year, month, 1 - offset); var fragment = document.createDocumentFragment(); instance.title.textContent = instance.locale.months[month] + ' ' + year; instance.grid.innerHTML = ''; for (var index = 0; index < 42; index += 1) { (function (date) { var button = document.createElement('button'); var isDisabled = date < instance.minimum; button.type = 'button'; button.className = 'kalm-booking-calendar__day'; button.textContent = String(date.getDate()); button.dataset.date = isoDate(date); button.setAttribute('role', 'gridcell'); button.setAttribute('aria-label', date.getDate() + ' ' + instance.locale.months[date.getMonth()] + ' ' + date.getFullYear()); button.disabled = isDisabled; button.tabIndex = sameDay(date, instance.selected || instance.minimum) ? 0 : -1; if (date.getMonth() !== month) { button.classList.add('is-outside'); } if (sameDay(date, new Date())) { button.classList.add('is-today'); button.setAttribute('aria-current', 'date'); } if (sameDay(date, instance.selected)) { button.classList.add('is-selected'); button.setAttribute('aria-selected', 'true'); } button.addEventListener('click', function () { setDate(instance, date, true); }); fragment.appendChild(button); }(new Date(cursor.getFullYear(), cursor.getMonth(), cursor.getDate() + index))); } instance.grid.appendChild(fragment); } function setDate(instance, date, closeAfter) { var safeDate = startOfDay(date instanceof Date ? date : new Date(date)); var altSelector = instance.options.altField || '#checkin'; var altField = document.querySelector(altSelector); if (isNaN(safeDate.getTime())) { return; } if (safeDate < instance.minimum) { safeDate = instance.minimum; } instance.selected = safeDate; instance.view = new Date(safeDate.getFullYear(), safeDate.getMonth(), 1); instance.input.value = safeDate.getDate() + ' ' + instance.locale.months[safeDate.getMonth()] + ' ' + safeDate.getFullYear(); if (altField) { altField.value = isoDate(safeDate); altField.dispatchEvent(new Event('change', { bubbles: true })); } instance.input.dispatchEvent(new Event('change', { bubbles: true })); render(instance); if (closeAfter) { close(instance, true); } } function position(instance) { var rect = instance.input.getBoundingClientRect(); var panel = instance.panel; var gap = 8; var panelHeight; var top; var left; panel.style.visibility = 'hidden'; panel.hidden = false; panelHeight = panel.offsetHeight; top = rect.bottom + gap; left = Math.min(rect.left, window.innerWidth - panel.offsetWidth - 12); if (top + panelHeight > window.innerHeight - 12 && rect.top > panelHeight + gap) { top = rect.top - panelHeight - gap; } panel.style.top = Math.max(12, top) + 'px'; panel.style.left = Math.max(12, left) + 'px'; panel.style.visibility = ''; } function open(instance, moveFocus) { if (activeInstance && activeInstance !== instance) { close(activeInstance, false); } activeInstance = instance; instance.input.setAttribute('aria-expanded', 'true'); render(instance); position(instance); if (moveFocus) { window.requestAnimationFrame(function () { var target = instance.grid.querySelector('[tabindex="0"]:not(:disabled)') || instance.grid.querySelector('button:not(:disabled)'); if (target) { target.focus(); } }); } } function close(instance, restoreFocus) { instance.panel.hidden = true; instance.input.setAttribute('aria-expanded', 'false'); if (activeInstance === instance) { activeInstance = null; } if (restoreFocus) { instance.input.focus(); } } function focusDate(instance, date) { if (date < instance.minimum) { date = instance.minimum; } instance.view = new Date(date.getFullYear(), date.getMonth(), 1); render(instance); window.requestAnimationFrame(function () { var target = instance.grid.querySelector('[data-date="' + isoDate(date) + '"]'); if (target) { instance.grid.querySelectorAll('button').forEach(function (button) { button.tabIndex = -1; }); target.tabIndex = 0; target.focus(); } }); } function handleGridKeyboard(instance, event) { var target = event.target.closest('[data-date]'); var date; var nextDate; if (event.key === 'Escape') { event.preventDefault(); close(instance, true); return; } if (!target) { return; } date = new Date(target.dataset.date + 'T00:00:00'); nextDate = new Date(date); if (event.key === 'ArrowLeft') { nextDate.setDate(date.getDate() - 1); } else if (event.key === 'ArrowRight') { nextDate.setDate(date.getDate() + 1); } else if (event.key === 'ArrowUp') { nextDate.setDate(date.getDate() - 7); } else if (event.key === 'ArrowDown') { nextDate.setDate(date.getDate() + 7); } else if (event.key === 'PageUp') { nextDate.setMonth(date.getMonth() - 1); } else if (event.key === 'PageDown') { nextDate.setMonth(date.getMonth() + 1); } else if (event.key === 'Home') { nextDate.setDate(date.getDate() - ((date.getDay() + 6) % 7)); } else if (event.key === 'End') { nextDate.setDate(date.getDate() + (6 - ((date.getDay() + 6) % 7))); } else if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); setDate(instance, date, true); return; } else { return; } event.preventDefault(); focusDate(instance, nextDate); } function installJqueryCompatibilityAdapter() { var $ = window.jQuery; if (!$ || ($.datepicker && $.fn.datepicker)) { return; } $.datepicker = { setDefaults: function (options) { adapterDefaults = Object.assign({}, adapterDefaults, options || {}); } }; $.fn.datepicker = function (command, value) { if (typeof command === 'string') { if (command === 'setDate') { this.each(function () { var instance = instances.get(this) || createCalendar(this, adapterDefaults); setDate(instance, value, false); }); } return this; } return this.each(function () { var instance = instances.get(this); var options = Object.assign({}, adapterDefaults, command || {}); if (instance) { instance.options = options; instance.locale = getLocale(this); render(instance); } else { createCalendar(this, options); } }); }; } function removeBookingEvolutionJqueryUiStyles(root) { var scope = root && root.querySelectorAll ? root : document; scope.querySelectorAll('link[href*="secure.bookingevolution.com/web/jqueryui/"]').forEach(function (stylesheet) { stylesheet.remove(); }); } document.addEventListener('pointerdown', function (event) { if (activeInstance && event.target !== activeInstance.input && !activeInstance.panel.contains(event.target)) { close(activeInstance, false); } }); window.addEventListener('resize', function () { if (activeInstance) { position(activeInstance); } }); window.addEventListener('scroll', function () { if (activeInstance) { position(activeInstance); } }, true); removeBookingEvolutionJqueryUiStyles(document); new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { if (node.nodeType === 1) { if (node.matches && node.matches('link[href*="secure.bookingevolution.com/web/jqueryui/"]')) { node.remove(); } else { removeBookingEvolutionJqueryUiStyles(node); } } }); }); }).observe(document.documentElement, { childList: true, subtree: true }); installJqueryCompatibilityAdapter(); }(window, document));