{"version":3,"file":"pages-events-js-kwDmL3JQ.js","sources":["../../../node_modules/vanillajs-datepicker/js/lib/utils.js","../../../node_modules/vanillajs-datepicker/js/lib/date.js","../../../node_modules/vanillajs-datepicker/js/lib/date-format.js","../../../node_modules/vanillajs-datepicker/js/lib/dom.js","../../../node_modules/vanillajs-datepicker/js/lib/event.js","../../../node_modules/vanillajs-datepicker/js/i18n/base-locales.js","../../../node_modules/vanillajs-datepicker/js/options/defaultOptions.js","../../../node_modules/vanillajs-datepicker/js/options/processOptions.js","../../../node_modules/vanillajs-datepicker/js/options/shortcutKeys.js","../../../node_modules/vanillajs-datepicker/js/picker/templates/pickerTemplate.js","../../../node_modules/vanillajs-datepicker/js/picker/templates/daysTemplate.js","../../../node_modules/vanillajs-datepicker/js/picker/templates/weekNumbersTemplate.js","../../../node_modules/vanillajs-datepicker/js/picker/views/View.js","../../../node_modules/vanillajs-datepicker/js/picker/views/DaysView.js","../../../node_modules/vanillajs-datepicker/js/picker/views/MonthsView.js","../../../node_modules/vanillajs-datepicker/js/picker/views/YearsView.js","../../../node_modules/vanillajs-datepicker/js/events/functions.js","../../../node_modules/vanillajs-datepicker/js/events/pickerListeners.js","../../../node_modules/vanillajs-datepicker/js/picker/Picker.js","../../../node_modules/vanillajs-datepicker/js/events/elementListeners.js","../../../node_modules/vanillajs-datepicker/js/events/otherListeners.js","../../../node_modules/vanillajs-datepicker/js/Datepicker.js","../src/entries/pages/events.js"],"sourcesContent":["export function lastItemOf(arr) {\n return arr[arr.length - 1];\n}\n\n// push only the items not included in the array\nexport function pushUnique(arr, ...items) {\n items.forEach((item) => {\n if (arr.includes(item)) {\n return;\n }\n arr.push(item);\n });\n return arr;\n}\n\nexport function stringToArray(str, separator) {\n // convert empty string to an empty array\n return str ? str.split(separator) : [];\n}\n\nexport function isInRange(testVal, min, max) {\n const minOK = min === undefined || testVal >= min;\n const maxOK = max === undefined || testVal <= max;\n return minOK && maxOK;\n}\n\nexport function limitToRange(val, min, max) {\n if (val < min) {\n return min;\n }\n if (val > max) {\n return max;\n }\n return val;\n}\n\nexport function createTagRepeat(tagName, repeat, attributes = {}, index = 0, html = '') {\n const openTagSrc = Object.keys(attributes).reduce((src, attr) => {\n let val = attributes[attr];\n if (typeof val === 'function') {\n val = val(index);\n }\n return `${src} ${attr}=\"${val}\"`;\n }, tagName);\n html += `<${openTagSrc}>`;\n\n const next = index + 1;\n return next < repeat\n ? createTagRepeat(tagName, repeat, attributes, next, html)\n : html;\n}\n\n// Remove the spacing surrounding tags for HTML parser not to create text nodes\n// before/after elements\nexport function optimizeTemplateHTML(html) {\n return html.replace(/>\\s+/g, '>').replace(/\\s+ name.toLowerCase().startsWith(monthName);\n // compare with both short and full names because some locales have periods\n // in the short names (not equal to the first X letters of the full names)\n monthIndex = locale.monthsShort.findIndex(compareNames);\n if (monthIndex < 0) {\n monthIndex = locale.months.findIndex(compareNames);\n }\n if (monthIndex < 0) {\n return NaN;\n }\n }\n\n newDate.setMonth(monthIndex);\n return newDate.getMonth() !== normalizeMonth(monthIndex)\n ? newDate.setDate(0)\n : newDate.getTime();\n },\n d(date, day) {\n return new Date(date).setDate(parseInt(day, 10));\n },\n};\n// format functions for date parts\nconst formatFns = {\n d(date) {\n return date.getDate();\n },\n dd(date) {\n return padZero(date.getDate(), 2);\n },\n D(date, locale) {\n return locale.daysShort[date.getDay()];\n },\n DD(date, locale) {\n return locale.days[date.getDay()];\n },\n m(date) {\n return date.getMonth() + 1;\n },\n mm(date) {\n return padZero(date.getMonth() + 1, 2);\n },\n M(date, locale) {\n return locale.monthsShort[date.getMonth()];\n },\n MM(date, locale) {\n return locale.months[date.getMonth()];\n },\n y(date) {\n return date.getFullYear();\n },\n yy(date) {\n return padZero(date.getFullYear(), 2).slice(-2);\n },\n yyyy(date) {\n return padZero(date.getFullYear(), 4);\n },\n};\n\n// get month index in normal range (0 - 11) from any number\nfunction normalizeMonth(monthIndex) {\n return monthIndex > -1 ? monthIndex % 12 : normalizeMonth(monthIndex + 12);\n}\n\nfunction padZero(num, length) {\n return num.toString().padStart(length, '0');\n}\n\nfunction parseFormatString(format) {\n if (typeof format !== 'string') {\n throw new Error(\"Invalid date format.\");\n }\n if (format in knownFormats) {\n return knownFormats[format];\n }\n\n // sprit the format string into parts and seprators\n const separators = format.split(reFormatTokens);\n const parts = format.match(new RegExp(reFormatTokens, 'g'));\n if (separators.length === 0 || !parts) {\n throw new Error(\"Invalid date format.\");\n }\n\n // collect format functions used in the format\n const partFormatters = parts.map(token => formatFns[token]);\n\n // collect parse function keys used in the format\n // iterate over parseFns' keys in order to keep the order of the keys.\n const partParserKeys = Object.keys(parseFns).reduce((keys, key) => {\n const token = parts.find(part => part[0] !== 'D' && part[0].toLowerCase() === key);\n if (token) {\n keys.push(key);\n }\n return keys;\n }, []);\n\n return knownFormats[format] = {\n parser(dateStr, locale) {\n const dateParts = dateStr.split(reNonDateParts).reduce((dtParts, part, index) => {\n if (part.length > 0 && parts[index]) {\n const token = parts[index][0];\n if (token === 'M') {\n dtParts.m = part;\n } else if (token !== 'D') {\n dtParts[token] = part;\n }\n }\n return dtParts;\n }, {});\n\n // iterate over partParserkeys so that the parsing is made in the oder\n // of year, month and day to prevent the day parser from correcting last\n // day of month wrongly\n return partParserKeys.reduce((origDate, key) => {\n const newDate = parseFns[key](origDate, dateParts[key], locale);\n // ingnore the part failed to parse\n return isNaN(newDate) ? origDate : newDate;\n }, today());\n },\n formatter(date, locale) {\n let dateStr = partFormatters.reduce((str, fn, index) => {\n return str += `${separators[index]}${fn(date, locale)}`;\n }, '');\n // separators' length is always parts' length + 1,\n return dateStr += lastItemOf(separators);\n },\n };\n}\n\nexport function parseDate(dateStr, format, locale) {\n if (dateStr instanceof Date || typeof dateStr === 'number') {\n const date = stripTime(dateStr);\n return isNaN(date) ? undefined : date;\n }\n if (!dateStr) {\n return undefined;\n }\n if (dateStr === 'today') {\n return today();\n }\n\n if (format && format.toValue) {\n const date = format.toValue(dateStr, format, locale);\n return isNaN(date) ? undefined : stripTime(date);\n }\n\n return parseFormatString(format).parser(dateStr, locale);\n}\n\nexport function formatDate(date, format, locale) {\n if (isNaN(date) || (!date && date !== 0)) {\n return '';\n }\n\n const dateObj = typeof date === 'number' ? new Date(date) : date;\n\n if (format.toDisplay) {\n return format.toDisplay(dateObj, format, locale);\n }\n\n return parseFormatString(format).formatter(dateObj, locale);\n}\n","const range = document.createRange();\n\nexport function parseHTML(html) {\n return range.createContextualFragment(html);\n}\n\nexport function getParent(el) {\n return el.parentElement\n || (el.parentNode instanceof ShadowRoot ? el.parentNode.host : undefined);\n}\n\nexport function isActiveElement(el) {\n return el.getRootNode().activeElement === el;\n}\n\n// equivalent to jQuery's :visble\nexport function isVisible(el) {\n return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function hideElement(el) {\n if (el.style.display === 'none') {\n return;\n }\n // back up the existing display setting in data-style-display\n if (el.style.display) {\n el.dataset.styleDisplay = el.style.display;\n }\n el.style.display = 'none';\n}\n\nexport function showElement(el) {\n if (el.style.display !== 'none') {\n return;\n }\n if (el.dataset.styleDisplay) {\n // restore backed-up dispay property\n el.style.display = el.dataset.styleDisplay;\n delete el.dataset.styleDisplay;\n } else {\n el.style.display = '';\n }\n}\n\nexport function emptyChildNodes(el) {\n if (el.firstChild) {\n el.removeChild(el.firstChild);\n emptyChildNodes(el);\n }\n}\n\nexport function replaceChildNodes(el, newChildNodes) {\n emptyChildNodes(el);\n if (newChildNodes instanceof DocumentFragment) {\n el.appendChild(newChildNodes);\n } else if (typeof newChildNodes === 'string') {\n el.appendChild(parseHTML(newChildNodes));\n } else if (typeof newChildNodes.forEach === 'function') {\n newChildNodes.forEach((node) => {\n el.appendChild(node);\n });\n }\n}\n","const listenerRegistry = new WeakMap();\nconst {addEventListener, removeEventListener} = EventTarget.prototype;\n\n// Register event listeners to a key object\n// listeners: array of listener definitions;\n// - each definition must be a flat array of event target and the arguments\n// used to call addEventListener() on the target\nexport function registerListeners(keyObj, listeners) {\n let registered = listenerRegistry.get(keyObj);\n if (!registered) {\n registered = [];\n listenerRegistry.set(keyObj, registered);\n }\n listeners.forEach((listener) => {\n addEventListener.call(...listener);\n registered.push(listener);\n });\n}\n\nexport function unregisterListeners(keyObj) {\n let listeners = listenerRegistry.get(keyObj);\n if (!listeners) {\n return;\n }\n listeners.forEach((listener) => {\n removeEventListener.call(...listener);\n });\n listenerRegistry.delete(keyObj);\n}\n\n// Event.composedPath() polyfill for Edge\n// based on https://gist.github.com/kleinfreund/e9787d73776c0e3750dcfcdc89f100ec\nif (!Event.prototype.composedPath) {\n const getComposedPath = (node, path = []) => {\n path.push(node);\n\n let parent;\n if (node.parentNode) {\n parent = node.parentNode;\n } else if (node.host) { // ShadowRoot\n parent = node.host;\n } else if (node.defaultView) { // Document\n parent = node.defaultView;\n }\n return parent ? getComposedPath(parent, path) : path;\n };\n\n Event.prototype.composedPath = function () {\n return getComposedPath(this.target);\n };\n}\n\nfunction findFromPath(path, criteria, currentTarget) {\n const [node, ...rest] = path;\n if (criteria(node)) {\n return node;\n }\n if (node === currentTarget || node.tagName === 'HTML' || rest.length === 0) {\n // stop when reaching currentTarget or \n return;\n }\n return findFromPath(rest, criteria, currentTarget);\n}\n\n// Search for the actual target of a delegated event\nexport function findElementInEventPath(ev, selector) {\n const criteria = typeof selector === 'function'\n ? selector\n : el => el instanceof Element && el.matches(selector);\n return findFromPath(ev.composedPath(), criteria, ev.currentTarget);\n}\n","// default locales\nexport default {\n en: {\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n daysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n daysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n monthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n today: \"Today\",\n clear: \"Clear\",\n titleFormat: \"MM y\"\n }\n};\n","// config options updatable by setOptions() and their default values\nexport default {\n autohide: false,\n beforeShowDay: null,\n beforeShowDecade: null,\n beforeShowMonth: null,\n beforeShowYear: null,\n clearButton: false,\n dateDelimiter: ',',\n datesDisabled: [],\n daysOfWeekDisabled: [],\n daysOfWeekHighlighted: [],\n defaultViewDate: undefined, // placeholder, defaults to today() by the program\n disableTouchKeyboard: false,\n enableOnReadonly: true,\n format: 'mm/dd/yyyy',\n language: 'en',\n maxDate: null,\n maxNumberOfDates: 1,\n maxView: 3,\n minDate: null,\n nextArrow: '»',\n orientation: 'auto',\n pickLevel: 0,\n prevArrow: '«',\n showDaysOfWeek: true,\n showOnClick: true,\n showOnFocus: true,\n startView: 0,\n title: '',\n todayButton: false,\n todayButtonMode: 0,\n todayHighlight: false,\n updateOnBlur: true,\n weekNumbers: 0,\n weekStart: 0,\n};\n","import {pushUnique} from '../lib/utils.js';\nimport {\n dateValue,\n regularizeDate,\n getIsoWeek,\n getWesternTradWeek,\n getMidEasternWeek,\n} from '../lib/date.js';\nimport {reFormatTokens, parseDate} from '../lib/date-format.js';\nimport {parseHTML} from '../lib/dom.js';\nimport defaultOptions from './defaultOptions.js';\n\nconst {\n language: defaultLang,\n format: defaultFormat,\n weekStart: defaultWeekStart,\n} = defaultOptions;\n\n// Reducer function to filter out invalid day-of-week from the input\nfunction sanitizeDOW(dow, day) {\n return dow.length < 6 && day >= 0 && day < 7\n ? pushUnique(dow, day)\n : dow;\n}\n\nfunction determineGetWeekMethod(numberingMode, weekStart) {\n const methodId = numberingMode === 4\n ? (weekStart === 6 ? 3 : !weekStart + 1)\n : numberingMode;\n switch (methodId) {\n case 1:\n return getIsoWeek;\n case 2:\n return getWesternTradWeek;\n case 3:\n return getMidEasternWeek;\n }\n}\n\nfunction updateWeekStart(newValue, config, weekNumbers) {\n config.weekStart = newValue;\n config.weekEnd = (newValue + 6) % 7;\n if (weekNumbers === 4) {\n config.getWeekNumber = determineGetWeekMethod(4, newValue);\n }\n return newValue;\n}\n\n// validate input date. if invalid, fallback to the original value\nfunction validateDate(value, format, locale, origValue) {\n const date = parseDate(value, format, locale);\n return date !== undefined ? date : origValue;\n}\n\n// Validate viewId. if invalid, fallback to the original value\nfunction validateViewId(value, origValue, max = 3) {\n const viewId = parseInt(value, 10);\n return viewId >= 0 && viewId <= max ? viewId : origValue;\n}\n\nfunction replaceOptions(options, from, to, convert = undefined) {\n if (from in options) {\n if (!(to in options)) {\n options[to] = convert ? convert(options[from]) : options[from];\n }\n delete options[from];\n }\n}\n\n// Create Datepicker configuration to set\nexport default function processOptions(options, datepicker) {\n const inOpts = Object.assign({}, options);\n const config = {};\n const locales = datepicker.constructor.locales;\n const rangeEnd = !!datepicker.rangeSideIndex;\n let {\n datesDisabled,\n format,\n language,\n locale,\n maxDate,\n maxView,\n minDate,\n pickLevel,\n startView,\n weekNumbers,\n weekStart,\n } = datepicker.config || {};\n\n // for backword compatibility\n replaceOptions(inOpts, 'calendarWeeks', 'weekNumbers', val => val ? 1 : 0);\n replaceOptions(inOpts, 'clearBtn', 'clearButton');\n replaceOptions(inOpts, 'todayBtn', 'todayButton');\n replaceOptions(inOpts, 'todayBtnMode', 'todayButtonMode');\n\n if (inOpts.language) {\n let lang;\n if (inOpts.language !== language) {\n if (locales[inOpts.language]) {\n lang = inOpts.language;\n } else {\n // Check if langauge + region tag can fallback to the one without\n // region (e.g. fr-CA → fr)\n lang = inOpts.language.split('-')[0];\n if (!locales[lang]) {\n lang = false;\n }\n }\n }\n delete inOpts.language;\n if (lang) {\n language = config.language = lang;\n\n // update locale as well when updating language\n const origLocale = locale || locales[defaultLang];\n // use default language's properties for the fallback\n locale = Object.assign({\n format: defaultFormat,\n weekStart: defaultWeekStart\n }, locales[defaultLang]);\n if (language !== defaultLang) {\n Object.assign(locale, locales[language]);\n }\n config.locale = locale;\n // if format and/or weekStart are the same as old locale's defaults,\n // update them to new locale's defaults\n if (format === origLocale.format) {\n format = config.format = locale.format;\n }\n if (weekStart === origLocale.weekStart) {\n weekStart = updateWeekStart(locale.weekStart, config, weekNumbers);\n }\n }\n }\n\n if (inOpts.format) {\n const hasToDisplay = typeof inOpts.format.toDisplay === 'function';\n const hasToValue = typeof inOpts.format.toValue === 'function';\n const validFormatString = reFormatTokens.test(inOpts.format);\n if ((hasToDisplay && hasToValue) || validFormatString) {\n format = config.format = inOpts.format;\n }\n delete inOpts.format;\n }\n\n //*** pick level ***//\n let newPickLevel = pickLevel;\n if ('pickLevel' in inOpts) {\n newPickLevel = validateViewId(inOpts.pickLevel, pickLevel, 2);\n delete inOpts.pickLevel;\n }\n if (newPickLevel !== pickLevel) {\n if (newPickLevel > pickLevel) {\n // complement current minDate/madDate so that the existing range will be\n // expanded to fit the new level later\n if (!('minDate' in inOpts)) {\n inOpts.minDate = minDate;\n }\n if (!('maxDate' in inOpts)) {\n inOpts.maxDate = maxDate;\n }\n }\n // complement datesDisabled so that it will be reset later\n if (datesDisabled && !inOpts.datesDisabled) {\n inOpts.datesDisabled = [];\n }\n pickLevel = config.pickLevel = newPickLevel;\n }\n\n //*** dates ***//\n // while min and maxDate for \"no limit\" in the options are better to be null\n // (especially when updating), the ones in the config have to be undefined\n // because null is treated as 0 (= unix epoch) when comparing with time value\n let minDt = minDate;\n let maxDt = maxDate;\n if ('minDate' in inOpts) {\n const defaultMinDt = dateValue(0, 0, 1);\n minDt = inOpts.minDate === null\n ? defaultMinDt // set 0000-01-01 to prevent negative values for year\n : validateDate(inOpts.minDate, format, locale, minDt);\n if (minDt !== defaultMinDt) {\n minDt = regularizeDate(minDt, pickLevel, false);\n }\n delete inOpts.minDate;\n }\n if ('maxDate' in inOpts) {\n maxDt = inOpts.maxDate === null\n ? undefined\n : validateDate(inOpts.maxDate, format, locale, maxDt);\n if (maxDt !== undefined) {\n maxDt = regularizeDate(maxDt, pickLevel, true);\n }\n delete inOpts.maxDate;\n }\n if (maxDt < minDt) {\n minDate = config.minDate = maxDt;\n maxDate = config.maxDate = minDt;\n } else {\n if (minDate !== minDt) {\n minDate = config.minDate = minDt;\n }\n if (maxDate !== maxDt) {\n maxDate = config.maxDate = maxDt;\n }\n }\n\n if (inOpts.datesDisabled) {\n const dtsDisabled = inOpts.datesDisabled;\n if (typeof dtsDisabled === 'function') {\n config.datesDisabled = null;\n config.checkDisabled = (timeValue, viewId) => dtsDisabled(\n new Date(timeValue),\n viewId,\n rangeEnd\n );\n } else {\n const disabled = config.datesDisabled = dtsDisabled.reduce((dates, dt) => {\n const date = parseDate(dt, format, locale);\n return date !== undefined\n ? pushUnique(dates, regularizeDate(date, pickLevel, rangeEnd))\n : dates;\n }, []);\n config.checkDisabled = timeValue => disabled.includes(timeValue);\n }\n delete inOpts.datesDisabled;\n }\n if ('defaultViewDate' in inOpts) {\n const viewDate = parseDate(inOpts.defaultViewDate, format, locale);\n if (viewDate !== undefined) {\n config.defaultViewDate = viewDate;\n }\n delete inOpts.defaultViewDate;\n }\n\n //*** days of week ***//\n if ('weekStart' in inOpts) {\n const wkStart = Number(inOpts.weekStart) % 7;\n if (!isNaN(wkStart)) {\n weekStart = updateWeekStart(wkStart, config, weekNumbers);\n }\n delete inOpts.weekStart;\n }\n if (inOpts.daysOfWeekDisabled) {\n config.daysOfWeekDisabled = inOpts.daysOfWeekDisabled.reduce(sanitizeDOW, []);\n delete inOpts.daysOfWeekDisabled;\n }\n if (inOpts.daysOfWeekHighlighted) {\n config.daysOfWeekHighlighted = inOpts.daysOfWeekHighlighted.reduce(sanitizeDOW, []);\n delete inOpts.daysOfWeekHighlighted;\n }\n\n //*** week numbers ***//\n if ('weekNumbers' in inOpts) {\n let method = inOpts.weekNumbers;\n if (method) {\n const getWeekNumber = typeof method === 'function'\n ? (timeValue, startOfWeek) => method(new Date(timeValue), startOfWeek)\n : determineGetWeekMethod((method = parseInt(method, 10)), weekStart);\n if (getWeekNumber) {\n weekNumbers = config.weekNumbers = method;\n config.getWeekNumber = getWeekNumber;\n }\n } else {\n weekNumbers = config.weekNumbers = 0;\n config.getWeekNumber = null;\n }\n delete inOpts.weekNumbers;\n }\n\n //*** multi date ***//\n if ('maxNumberOfDates' in inOpts) {\n const maxNumberOfDates = parseInt(inOpts.maxNumberOfDates, 10);\n if (maxNumberOfDates >= 0) {\n config.maxNumberOfDates = maxNumberOfDates;\n config.multidate = maxNumberOfDates !== 1;\n }\n delete inOpts.maxNumberOfDates;\n }\n if (inOpts.dateDelimiter) {\n config.dateDelimiter = String(inOpts.dateDelimiter);\n delete inOpts.dateDelimiter;\n }\n\n //*** view ***//\n let newMaxView = maxView;\n if ('maxView' in inOpts) {\n newMaxView = validateViewId(inOpts.maxView, maxView);\n delete inOpts.maxView;\n }\n // ensure max view >= pick level\n newMaxView = pickLevel > newMaxView ? pickLevel : newMaxView;\n if (newMaxView !== maxView) {\n maxView = config.maxView = newMaxView;\n }\n\n let newStartView = startView;\n if ('startView' in inOpts) {\n newStartView = validateViewId(inOpts.startView, newStartView);\n delete inOpts.startView;\n }\n // ensure pick level <= start view <= max view\n if (newStartView < pickLevel) {\n newStartView = pickLevel;\n } else if (newStartView > maxView) {\n newStartView = maxView;\n }\n if (newStartView !== startView) {\n config.startView = newStartView;\n }\n\n //*** template ***//\n if (inOpts.prevArrow) {\n const prevArrow = parseHTML(inOpts.prevArrow);\n if (prevArrow.childNodes.length > 0) {\n config.prevArrow = prevArrow.childNodes;\n }\n delete inOpts.prevArrow;\n }\n if (inOpts.nextArrow) {\n const nextArrow = parseHTML(inOpts.nextArrow);\n if (nextArrow.childNodes.length > 0) {\n config.nextArrow = nextArrow.childNodes;\n }\n delete inOpts.nextArrow;\n }\n\n //*** misc ***//\n if ('disableTouchKeyboard' in inOpts) {\n config.disableTouchKeyboard = 'ontouchstart' in document && !!inOpts.disableTouchKeyboard;\n delete inOpts.disableTouchKeyboard;\n }\n if (inOpts.orientation) {\n const orientation = inOpts.orientation.toLowerCase().split(/\\s+/g);\n config.orientation = {\n x: orientation.find(x => (x === 'left' || x === 'right')) || 'auto',\n y: orientation.find(y => (y === 'top' || y === 'bottom')) || 'auto',\n };\n delete inOpts.orientation;\n }\n if ('todayButtonMode' in inOpts) {\n switch(inOpts.todayButtonMode) {\n case 0:\n case 1:\n config.todayButtonMode = inOpts.todayButtonMode;\n }\n delete inOpts.todayButtonMode;\n }\n\n //*** copy the rest ***//\n Object.entries(inOpts).forEach(([key, value]) => {\n if (value !== undefined && key in defaultOptions) {\n config[key] = value;\n }\n });\n\n return config;\n}\n","const defaultShortcutKeys = {\n show: {key: 'ArrowDown'},\n hide: null,\n toggle: {key: 'Escape'},\n prevButton: {key: 'ArrowLeft', ctrlOrMetaKey: true},\n nextButton: {key: 'ArrowRight', ctrlOrMetaKey: true},\n viewSwitch: {key: 'ArrowUp', ctrlOrMetaKey: true},\n clearButton: {key: 'Backspace', ctrlOrMetaKey: true},\n todayButton: {key: '.', ctrlOrMetaKey: true},\n exitEditMode: {key: 'ArrowDown', ctrlOrMetaKey: true},\n};\n\nexport default function createShortcutKeyConfig(options) {\n return Object.keys(defaultShortcutKeys).reduce((keyDefs, shortcut) => {\n const keyDef = options[shortcut] === undefined\n ? defaultShortcutKeys[shortcut]\n : options[shortcut];\n const key = keyDef && keyDef.key;\n if (!key || typeof key !== 'string') {\n return keyDefs;\n }\n\n const normalizedDef = {\n key,\n ctrlOrMetaKey: !!(keyDef.ctrlOrMetaKey || keyDef.ctrlKey || keyDef.metaKey),\n };\n if (key.length > 1) {\n normalizedDef.altKey = !!keyDef.altKey;\n normalizedDef.shiftKey = !!keyDef.shiftKey;\n }\n keyDefs[shortcut] = normalizedDef;\n return keyDefs;\n }, {});\n}\n","import {optimizeTemplateHTML} from '../../lib/utils.js';\n\nconst getButtons = buttonList => buttonList\n .map(classes => ``)\n .join('');\n\nexport default optimizeTemplateHTML(`
\n
\n
\n
\n
\n ${getButtons([\n 'prev-button prev-btn',\n 'view-switch',\n 'next-button next-btn',\n ])}\n
\n
\n
\n
\n
\n ${getButtons([\n 'today-button today-btn',\n 'clear-button clear-btn',\n ])}\n
\n
\n
\n
`);\n","import {createTagRepeat, optimizeTemplateHTML} from '../../lib/utils.js';\n\nexport default optimizeTemplateHTML(`
\n
${createTagRepeat('span', 7, {class: 'dow'})}
\n
${createTagRepeat('span', 42)}
\n
`);\n","import {createTagRepeat, optimizeTemplateHTML} from '../../lib/utils.js';\n\nexport default optimizeTemplateHTML(`
\n
\n
${createTagRepeat('span', 6, {class: 'week'})}
\n
`);\n\n","import {pushUnique} from '../../lib/utils.js';\nimport {parseHTML, replaceChildNodes} from '../../lib/dom.js';\n\n// Base class of the view classes\nexport default class View {\n constructor(picker, config) {\n Object.assign(this, config, {\n picker,\n element: parseHTML(`
`).firstChild,\n selected: [],\n isRangeEnd: !!picker.datepicker.rangeSideIndex,\n });\n this.init(this.picker.datepicker.config);\n }\n\n init(options) {\n if ('pickLevel' in options) {\n this.isMinView = this.id === options.pickLevel;\n }\n this.setOptions(options);\n this.updateFocus();\n this.updateSelection();\n }\n\n prepareForRender(switchLabel, prevButtonDisabled, nextButtonDisabled) {\n // refresh disabled years on every render in order to clear the ones added\n // by beforeShow hook at previous render\n this.disabled = [];\n\n const picker = this.picker;\n picker.setViewSwitchLabel(switchLabel);\n picker.setPrevButtonDisabled(prevButtonDisabled);\n picker.setNextButtonDisabled(nextButtonDisabled);\n }\n\n setDisabled(date, classList) {\n classList.add('disabled');\n pushUnique(this.disabled, date);\n }\n\n // Execute beforeShow() callback and apply the result to the element\n // args:\n performBeforeHook(el, timeValue) {\n let result = this.beforeShow(new Date(timeValue));\n switch (typeof result) {\n case 'boolean':\n result = {enabled: result};\n break;\n case 'string':\n result = {classes: result};\n }\n\n if (result) {\n const classList = el.classList;\n if (result.enabled === false) {\n this.setDisabled(timeValue, classList);\n }\n if (result.classes) {\n const extraClasses = result.classes.split(/\\s+/);\n classList.add(...extraClasses);\n if (extraClasses.includes('disabled')) {\n this.setDisabled(timeValue, classList);\n }\n }\n if (result.content) {\n replaceChildNodes(el, result.content);\n }\n }\n }\n\n renderCell(el, content, cellVal, date, {selected, range}, outOfScope, extraClasses = []) {\n el.textContent = content;\n if (this.isMinView) {\n el.dataset.date = date;\n }\n\n const classList = el.classList;\n el.className = `datepicker-cell ${this.cellClass}`;\n if (cellVal < this.first) {\n classList.add('prev');\n } else if (cellVal > this.last) {\n classList.add('next');\n }\n classList.add(...extraClasses);\n if (outOfScope || this.checkDisabled(date, this.id)) {\n this.setDisabled(date, classList);\n }\n if (range) {\n const [rangeStart, rangeEnd] = range;\n if (cellVal > rangeStart && cellVal < rangeEnd) {\n classList.add('range');\n }\n if (cellVal === rangeStart) {\n classList.add('range-start');\n }\n if (cellVal === rangeEnd) {\n classList.add('range-end');\n }\n }\n if (selected.includes(cellVal)) {\n classList.add('selected');\n }\n if (cellVal === this.focused) {\n classList.add('focused');\n }\n\n if (this.beforeShow) {\n this.performBeforeHook(el, date);\n }\n }\n\n refreshCell(el, cellVal, selected, [rangeStart, rangeEnd]) {\n const classList = el.classList;\n classList.remove('range', 'range-start', 'range-end', 'selected', 'focused');\n if (cellVal > rangeStart && cellVal < rangeEnd) {\n classList.add('range');\n }\n if (cellVal === rangeStart) {\n classList.add('range-start');\n }\n if (cellVal === rangeEnd) {\n classList.add('range-end');\n }\n if (selected.includes(cellVal)) {\n classList.add('selected');\n }\n if (cellVal === this.focused) {\n classList.add('focused');\n }\n }\n\n changeFocusedCell(cellIndex) {\n this.grid.querySelectorAll('.focused').forEach((el) => {\n el.classList.remove('focused');\n });\n this.grid.children[cellIndex].classList.add('focused');\n }\n}\n","import {today, dateValue, addDays, addWeeks, dayOfTheWeekOf} from '../../lib/date.js';\nimport {formatDate} from '../../lib/date-format.js';\nimport {parseHTML, showElement, hideElement} from '../../lib/dom.js';\nimport daysTemplate from '../templates/daysTemplate.js';\nimport weekNumbersTemplate from '../templates/weekNumbersTemplate.js';\nimport View from './View.js';\n\nexport default class DaysView extends View {\n constructor(picker) {\n super(picker, {\n id: 0,\n name: 'days',\n cellClass: 'day',\n });\n }\n\n init(options, onConstruction = true) {\n if (onConstruction) {\n const inner = parseHTML(daysTemplate).firstChild;\n this.dow = inner.firstChild;\n this.grid = inner.lastChild;\n this.element.appendChild(inner);\n }\n super.init(options);\n }\n\n setOptions(options) {\n let updateDOW;\n\n if ('minDate' in options) {\n this.minDate = options.minDate;\n }\n if ('maxDate' in options) {\n this.maxDate = options.maxDate;\n }\n if (options.checkDisabled) {\n this.checkDisabled = options.checkDisabled;\n }\n if (options.daysOfWeekDisabled) {\n this.daysOfWeekDisabled = options.daysOfWeekDisabled;\n updateDOW = true;\n }\n if (options.daysOfWeekHighlighted) {\n this.daysOfWeekHighlighted = options.daysOfWeekHighlighted;\n }\n if ('todayHighlight' in options) {\n this.todayHighlight = options.todayHighlight;\n }\n if ('weekStart' in options) {\n this.weekStart = options.weekStart;\n this.weekEnd = options.weekEnd;\n updateDOW = true;\n }\n if (options.locale) {\n const locale = this.locale = options.locale;\n this.dayNames = locale.daysMin;\n this.switchLabelFormat = locale.titleFormat;\n updateDOW = true;\n }\n if ('beforeShowDay' in options) {\n this.beforeShow = typeof options.beforeShowDay === 'function'\n ? options.beforeShowDay\n : undefined;\n }\n\n if ('weekNumbers' in options) {\n if (options.weekNumbers && !this.weekNumbers) {\n const weeksElem = parseHTML(weekNumbersTemplate).firstChild;\n this.weekNumbers = {\n element: weeksElem,\n dow: weeksElem.firstChild,\n weeks: weeksElem.lastChild,\n };\n this.element.insertBefore(weeksElem, this.element.firstChild);\n } else if (this.weekNumbers && !options.weekNumbers) {\n this.element.removeChild(this.weekNumbers.element);\n this.weekNumbers = null;\n }\n }\n\n if ('getWeekNumber' in options) {\n this.getWeekNumber = options.getWeekNumber;\n }\n\n if ('showDaysOfWeek' in options) {\n if (options.showDaysOfWeek) {\n showElement(this.dow);\n if (this.weekNumbers) {\n showElement(this.weekNumbers.dow);\n }\n } else {\n hideElement(this.dow);\n if (this.weekNumbers) {\n hideElement(this.weekNumbers.dow);\n }\n }\n }\n\n // update days-of-week when locale, daysOfweekDisabled or weekStart is changed\n if (updateDOW) {\n Array.from(this.dow.children).forEach((el, index) => {\n const dow = (this.weekStart + index) % 7;\n el.textContent = this.dayNames[dow];\n el.className = this.daysOfWeekDisabled.includes(dow) ? 'dow disabled' : 'dow';\n });\n }\n }\n\n // Apply update on the focused date to view's settings\n updateFocus() {\n const viewDate = new Date(this.picker.viewDate);\n const viewYear = viewDate.getFullYear();\n const viewMonth = viewDate.getMonth();\n const firstOfMonth = dateValue(viewYear, viewMonth, 1);\n const start = dayOfTheWeekOf(firstOfMonth, this.weekStart, this.weekStart);\n\n this.first = firstOfMonth;\n this.last = dateValue(viewYear, viewMonth + 1, 0);\n this.start = start;\n this.focused = this.picker.viewDate;\n }\n\n // Apply update on the selected dates to view's settings\n updateSelection() {\n const {dates, rangepicker} = this.picker.datepicker;\n this.selected = dates;\n if (rangepicker) {\n this.range = rangepicker.dates;\n }\n }\n\n // Update the entire view UI\n render() {\n // update today marker on ever render\n this.today = this.todayHighlight ? today() : undefined;\n\n this.prepareForRender(\n formatDate(this.focused, this.switchLabelFormat, this.locale),\n this.first <= this.minDate,\n this.last >= this.maxDate\n );\n\n if (this.weekNumbers) {\n const weekStart = this.weekStart;\n const startOfWeek = dayOfTheWeekOf(this.first, weekStart, weekStart);\n Array.from(this.weekNumbers.weeks.children).forEach((el, index) => {\n const dateOfWeekStart = addWeeks(startOfWeek, index);\n el.textContent = this.getWeekNumber(dateOfWeekStart, weekStart);\n if (index > 3) {\n el.classList[dateOfWeekStart > this.last ? 'add' : 'remove']('next');\n }\n });\n }\n Array.from(this.grid.children).forEach((el, index) => {\n const current = addDays(this.start, index);\n const dateObj = new Date(current);\n const day = dateObj.getDay();\n const extraClasses = [];\n\n if (this.today === current) {\n extraClasses.push('today');\n }\n if (this.daysOfWeekHighlighted.includes(day)) {\n extraClasses.push('highlighted');\n }\n\n this.renderCell(\n el,\n dateObj.getDate(),\n current,\n current,\n this,\n current < this.minDate\n || current > this.maxDate\n || this.daysOfWeekDisabled.includes(day),\n extraClasses\n );\n });\n }\n\n // Update the view UI by applying the changes of selected and focused items\n refresh() {\n const range = this.range || [];\n Array.from(this.grid.children).forEach((el) => {\n this.refreshCell(el, Number(el.dataset.date), this.selected, range);\n });\n }\n\n // Update the view UI by applying the change of focused item\n refreshFocus() {\n this.changeFocusedCell(Math.round((this.focused - this.start) / 86400000));\n }\n}\n","import {pushUnique, createTagRepeat} from '../../lib/utils.js';\nimport {dateValue, regularizeDate} from '../../lib/date.js';\nimport {parseHTML} from '../../lib/dom.js';\nimport View from './View.js';\n\nfunction computeMonthRange(range, thisYear) {\n if (!range || !range[0] || !range[1]) {\n return;\n }\n\n const [[startY, startM], [endY, endM]] = range;\n if (startY > thisYear || endY < thisYear) {\n return;\n }\n return [\n startY === thisYear ? startM : -1,\n endY === thisYear ? endM : 12,\n ];\n}\n\nexport default class MonthsView extends View {\n constructor(picker) {\n super(picker, {\n id: 1,\n name: 'months',\n cellClass: 'month',\n });\n }\n\n init(options, onConstruction = true) {\n if (onConstruction) {\n this.grid = this.element;\n this.element.classList.add('months', 'datepicker-grid');\n this.grid.appendChild(parseHTML(createTagRepeat('span', 12, {'data-month': ix => ix})));\n this.first = 0;\n this.last = 11;\n }\n super.init(options);\n }\n\n setOptions(options) {\n if (options.locale) {\n this.monthNames = options.locale.monthsShort;\n }\n if ('minDate' in options) {\n if (options.minDate === undefined) {\n this.minYear = this.minMonth = this.minDate = undefined;\n } else {\n const minDateObj = new Date(options.minDate);\n this.minYear = minDateObj.getFullYear();\n this.minMonth = minDateObj.getMonth();\n this.minDate = minDateObj.setDate(1);\n }\n }\n if ('maxDate' in options) {\n if (options.maxDate === undefined) {\n this.maxYear = this.maxMonth = this.maxDate = undefined;\n } else {\n const maxDateObj = new Date(options.maxDate);\n this.maxYear = maxDateObj.getFullYear();\n this.maxMonth = maxDateObj.getMonth();\n this.maxDate = dateValue(this.maxYear, this.maxMonth + 1, 0);\n }\n }\n if (options.checkDisabled) {\n this.checkDisabled = this.isMinView || options.datesDisabled === null\n ? options.checkDisabled\n : () => false;\n }\n if ('beforeShowMonth' in options) {\n this.beforeShow = typeof options.beforeShowMonth === 'function'\n ? options.beforeShowMonth\n : undefined;\n }\n }\n\n // Update view's settings to reflect the viewDate set on the picker\n updateFocus() {\n const viewDate = new Date(this.picker.viewDate);\n this.year = viewDate.getFullYear();\n this.focused = viewDate.getMonth();\n }\n\n // Update view's settings to reflect the selected dates\n updateSelection() {\n const {dates, rangepicker} = this.picker.datepicker;\n this.selected = dates.reduce((selected, timeValue) => {\n const date = new Date(timeValue);\n const year = date.getFullYear();\n const month = date.getMonth();\n if (selected[year] === undefined) {\n selected[year] = [month];\n } else {\n pushUnique(selected[year], month);\n }\n return selected;\n }, {});\n if (rangepicker && rangepicker.dates) {\n this.range = rangepicker.dates.map(timeValue => {\n const date = new Date(timeValue);\n return isNaN(date) ? undefined : [date.getFullYear(), date.getMonth()];\n });\n }\n }\n\n // Update the entire view UI\n render() {\n this.prepareForRender(\n this.year,\n this.year <= this.minYear,\n this.year >= this.maxYear\n );\n\n const selected = this.selected[this.year] || [];\n const yrOutOfRange = this.year < this.minYear || this.year > this.maxYear;\n const isMinYear = this.year === this.minYear;\n const isMaxYear = this.year === this.maxYear;\n const range = computeMonthRange(this.range, this.year);\n\n Array.from(this.grid.children).forEach((el, index) => {\n const date = regularizeDate(new Date(this.year, index, 1), 1, this.isRangeEnd);\n\n this.renderCell(\n el,\n this.monthNames[index],\n index,\n date,\n {selected, range},\n yrOutOfRange\n || isMinYear && index < this.minMonth\n || isMaxYear && index > this.maxMonth\n );\n });\n }\n\n // Update the view UI by applying the changes of selected and focused items\n refresh() {\n const selected = this.selected[this.year] || [];\n const range = computeMonthRange(this.range, this.year) || [];\n Array.from(this.grid.children).forEach((el, index) => {\n this.refreshCell(el, index, selected, range);\n });\n }\n\n // Update the view UI by applying the change of focused item\n refreshFocus() {\n this.changeFocusedCell(this.focused);\n }\n}","import {pushUnique, createTagRepeat} from '../../lib/utils.js';\nimport {dateValue, regularizeDate, startOfYearPeriod} from '../../lib/date.js';\nimport {parseHTML} from '../../lib/dom.js';\nimport View from './View.js';\n\nfunction toTitleCase(word) {\n return [...word].reduce((str, ch, ix) => str += ix ? ch : ch.toUpperCase(), '');\n}\n\n// Class representing the years and decades view elements\nexport default class YearsView extends View {\n constructor(picker, config) {\n super(picker, config);\n }\n\n init(options, onConstruction = true) {\n if (onConstruction) {\n this.navStep = this.step * 10;\n this.beforeShowOption = `beforeShow${toTitleCase(this.cellClass)}`;\n this.grid = this.element;\n this.element.classList.add(this.name, 'datepicker-grid');\n this.grid.appendChild(parseHTML(createTagRepeat('span', 12)));\n }\n super.init(options);\n }\n\n setOptions(options) {\n if ('minDate' in options) {\n if (options.minDate === undefined) {\n this.minYear = this.minDate = undefined;\n } else {\n this.minYear = startOfYearPeriod(options.minDate, this.step);\n this.minDate = dateValue(this.minYear, 0, 1);\n }\n }\n if ('maxDate' in options) {\n if (options.maxDate === undefined) {\n this.maxYear = this.maxDate = undefined;\n } else {\n this.maxYear = startOfYearPeriod(options.maxDate, this.step);\n this.maxDate = dateValue(this.maxYear, 11, 31);\n }\n }\n if (options.checkDisabled) {\n this.checkDisabled = this.isMinView || options.datesDisabled === null\n ? options.checkDisabled\n : () => false;\n }\n if (this.beforeShowOption in options) {\n const beforeShow = options[this.beforeShowOption];\n this.beforeShow = typeof beforeShow === 'function' ? beforeShow : undefined;\n }\n }\n\n // Update view's settings to reflect the viewDate set on the picker\n updateFocus() {\n const viewDate = new Date(this.picker.viewDate);\n const first = startOfYearPeriod(viewDate, this.navStep);\n const last = first + 9 * this.step;\n\n this.first = first;\n this.last = last;\n this.start = first - this.step;\n this.focused = startOfYearPeriod(viewDate, this.step);\n }\n\n // Update view's settings to reflect the selected dates\n updateSelection() {\n const {dates, rangepicker} = this.picker.datepicker;\n this.selected = dates.reduce((years, timeValue) => {\n return pushUnique(years, startOfYearPeriod(timeValue, this.step));\n }, []);\n if (rangepicker && rangepicker.dates) {\n this.range = rangepicker.dates.map(timeValue => {\n if (timeValue !== undefined) {\n return startOfYearPeriod(timeValue, this.step);\n }\n });\n }\n }\n\n // Update the entire view UI\n render() {\n this.prepareForRender(\n `${this.first}-${this.last}`,\n this.first <= this.minYear,\n this.last >= this.maxYear\n );\n\n Array.from(this.grid.children).forEach((el, index) => {\n const current = this.start + (index * this.step);\n const date = regularizeDate(new Date(current, 0, 1), 2, this.isRangeEnd);\n\n el.dataset.year = current;\n this.renderCell(\n el,\n current,\n current,\n date,\n this,\n current < this.minYear || current > this.maxYear\n );\n });\n }\n\n // Update the view UI by applying the changes of selected and focused items\n refresh() {\n const range = this.range || [];\n Array.from(this.grid.children).forEach((el) => {\n this.refreshCell(el, Number(el.textContent), this.selected, range);\n });\n }\n\n // Update the view UI by applying the change of focused item\n refreshFocus() {\n this.changeFocusedCell(Math.round((this.focused - this.start) / this.step));\n }\n}\n","import {limitToRange} from '../lib/utils.js';\nimport {today, addMonths, addYears} from '../lib/date.js';\nimport {isActiveElement} from '../lib/dom.js';\n\nexport function triggerDatepickerEvent(datepicker, type) {\n const options = {\n bubbles: true,\n cancelable: true,\n detail: {\n date: datepicker.getDate(),\n viewDate: new Date(datepicker.picker.viewDate),\n viewId: datepicker.picker.currentView.id,\n datepicker,\n },\n };\n datepicker.element.dispatchEvent(new CustomEvent(type, options));\n}\n\n// direction: -1 (to previous), 1 (to next)\nexport function goToPrevOrNext(datepicker, direction) {\n const {config, picker} = datepicker;\n const {currentView, viewDate} = picker;\n let newViewDate;\n switch (currentView.id) {\n case 0:\n newViewDate = addMonths(viewDate, direction);\n break;\n case 1:\n newViewDate = addYears(viewDate, direction);\n break;\n default:\n newViewDate = addYears(viewDate, direction * currentView.navStep);\n }\n newViewDate = limitToRange(newViewDate, config.minDate, config.maxDate);\n picker.changeFocus(newViewDate).render();\n}\n\nexport function switchView(datepicker) {\n const viewId = datepicker.picker.currentView.id;\n if (viewId === datepicker.config.maxView) {\n return;\n }\n datepicker.picker.changeView(viewId + 1).render();\n}\n\nexport function clearSelection(datepicker) {\n datepicker.setDate({clear: true});\n}\n\nexport function goToOrSelectToday(datepicker) {\n const currentDate = today();\n if (datepicker.config.todayButtonMode === 1) {\n datepicker.setDate(currentDate, {forceRefresh: true, viewDate: currentDate});\n } else {\n datepicker.setFocusedDate(currentDate, true);\n }\n}\n\nexport function unfocus(datepicker) {\n const onBlur = () => {\n if (datepicker.config.updateOnBlur) {\n datepicker.update({revert: true});\n } else {\n datepicker.refresh('input');\n }\n datepicker.hide();\n };\n const element = datepicker.element;\n\n if (isActiveElement(element)) {\n element.addEventListener('blur', onBlur, {once: true});\n } else {\n onBlur();\n }\n}\n","import {addMonths, addYears} from '../lib/date.js';\nimport {findElementInEventPath} from '../lib/event.js';\nimport {goToPrevOrNext, switchView} from './functions.js';\n\nfunction goToSelectedMonthOrYear(datepicker, selection) {\n const picker = datepicker.picker;\n const viewDate = new Date(picker.viewDate);\n const viewId = picker.currentView.id;\n const newDate = viewId === 1\n ? addMonths(viewDate, selection - viewDate.getMonth())\n : addYears(viewDate, selection - viewDate.getFullYear());\n\n picker.changeFocus(newDate).changeView(viewId - 1).render();\n}\n\nexport function onClickViewSwitch(datepicker) {\n switchView(datepicker);\n}\n\nexport function onClickPrevButton(datepicker) {\n goToPrevOrNext(datepicker, -1);\n}\n\nexport function onClickNextButton(datepicker) {\n goToPrevOrNext(datepicker, 1);\n}\n\n// For the picker's main block to delegete the events from `datepicker-cell`s\nexport function onClickView(datepicker, ev) {\n const target = findElementInEventPath(ev, '.datepicker-cell');\n if (!target || target.classList.contains('disabled')) {\n return;\n }\n\n const {id, isMinView} = datepicker.picker.currentView;\n const data = target.dataset;\n if (isMinView) {\n datepicker.setDate(Number(data.date));\n } else if (id === 1) {\n goToSelectedMonthOrYear(datepicker, Number(data.month));\n } else {\n goToSelectedMonthOrYear(datepicker, Number(data.year));\n }\n}\n\nexport function onMousedownPicker(ev) {\n ev.preventDefault();\n}\n","import {lastItemOf, isInRange, limitToRange} from '../lib/utils.js';\nimport {today, regularizeDate} from '../lib/date.js';\nimport {\n parseHTML,\n getParent,\n showElement,\n hideElement,\n emptyChildNodes,\n} from '../lib/dom.js';\nimport {registerListeners} from '../lib/event.js';\nimport pickerTemplate from './templates/pickerTemplate.js';\nimport DaysView from './views/DaysView.js';\nimport MonthsView from './views/MonthsView.js';\nimport YearsView from './views/YearsView.js';\nimport {\n triggerDatepickerEvent,\n clearSelection,\n goToOrSelectToday,\n} from '../events/functions.js';\nimport {\n onClickViewSwitch,\n onClickPrevButton,\n onClickNextButton,\n onClickView,\n onMousedownPicker,\n} from '../events/pickerListeners.js';\n\nconst orientClasses = ['left', 'top', 'right', 'bottom'].reduce((obj, key) => {\n obj[key] = `datepicker-orient-${key}`;\n return obj;\n}, {});\nconst toPx = num => num ? `${num}px` : num;\n\nfunction processPickerOptions(picker, options) {\n if ('title' in options) {\n if (options.title) {\n picker.controls.title.textContent = options.title;\n showElement(picker.controls.title);\n } else {\n picker.controls.title.textContent = '';\n hideElement(picker.controls.title);\n }\n }\n if (options.prevArrow) {\n const prevButton = picker.controls.prevButton;\n emptyChildNodes(prevButton);\n options.prevArrow.forEach((node) => {\n prevButton.appendChild(node.cloneNode(true));\n });\n }\n if (options.nextArrow) {\n const nextButton = picker.controls.nextButton;\n emptyChildNodes(nextButton);\n options.nextArrow.forEach((node) => {\n nextButton.appendChild(node.cloneNode(true));\n });\n }\n if (options.locale) {\n picker.controls.todayButton.textContent = options.locale.today;\n picker.controls.clearButton.textContent = options.locale.clear;\n }\n if ('todayButton' in options) {\n if (options.todayButton) {\n showElement(picker.controls.todayButton);\n } else {\n hideElement(picker.controls.todayButton);\n }\n }\n if ('minDate' in options || 'maxDate' in options) {\n const {minDate, maxDate} = picker.datepicker.config;\n picker.controls.todayButton.disabled = !isInRange(today(), minDate, maxDate);\n }\n if ('clearButton' in options) {\n if (options.clearButton) {\n showElement(picker.controls.clearButton);\n } else {\n hideElement(picker.controls.clearButton);\n }\n }\n}\n\n// Compute view date to reset, which will be...\n// - the last item of the selected dates or defaultViewDate if no selection\n// - limitted to minDate or maxDate if it exceeds the range\nfunction computeResetViewDate(datepicker) {\n const {dates, config, rangeSideIndex} = datepicker;\n const viewDate = dates.length > 0\n ? lastItemOf(dates)\n : regularizeDate(config.defaultViewDate, config.pickLevel, rangeSideIndex);\n return limitToRange(viewDate, config.minDate, config.maxDate);\n}\n\n// Change current view's view date\nfunction setViewDate(picker, newDate) {\n if (!('_oldViewDate' in picker) && newDate !== picker.viewDate) {\n picker._oldViewDate = picker.viewDate;\n }\n picker.viewDate = newDate;\n\n // return whether the new date is in different period on time from the one\n // displayed in the current view\n // when true, the view needs to be re-rendered on the next UI refresh.\n const {id, year, first, last} = picker.currentView;\n const viewYear = new Date(newDate).getFullYear();\n switch (id) {\n case 0:\n return newDate < first || newDate > last;\n case 1:\n return viewYear !== year;\n default:\n return viewYear < first || viewYear > last;\n }\n}\n\nfunction getTextDirection(el) {\n return window.getComputedStyle(el).direction;\n}\n\n// find the closet scrollable ancestor elemnt under the body\nfunction findScrollParents(el) {\n const parent = getParent(el);\n if (parent === document.body || !parent) {\n return;\n }\n\n // checking overflow only is enough because computed overflow cannot be\n // visible or a combination of visible and other when either axis is set\n // to other than visible.\n // (Setting one axis to other than 'visible' while the other is 'visible'\n // results in the other axis turning to 'auto')\n return window.getComputedStyle(parent).overflow !== 'visible'\n ? parent\n : findScrollParents(parent);\n}\n\n// Class representing the picker UI\nexport default class Picker {\n constructor(datepicker) {\n const {config, inputField} = this.datepicker = datepicker;\n\n const template = pickerTemplate.replace(/%buttonClass%/g, config.buttonClass);\n const element = this.element = parseHTML(template).firstChild;\n const [header, main, footer] = element.firstChild.children;\n const title = header.firstElementChild;\n const [prevButton, viewSwitch, nextButton] = header.lastElementChild.children;\n const [todayButton, clearButton] = footer.firstChild.children;\n const controls = {\n title,\n prevButton,\n viewSwitch,\n nextButton,\n todayButton,\n clearButton,\n };\n this.main = main;\n this.controls = controls;\n\n const elementClass = inputField ? 'dropdown' : 'inline';\n element.classList.add(`datepicker-${elementClass}`);\n\n processPickerOptions(this, config);\n this.viewDate = computeResetViewDate(datepicker);\n\n // set up event listeners\n registerListeners(datepicker, [\n [element, 'mousedown', onMousedownPicker],\n [main, 'click', onClickView.bind(null, datepicker)],\n [controls.viewSwitch, 'click', onClickViewSwitch.bind(null, datepicker)],\n [controls.prevButton, 'click', onClickPrevButton.bind(null, datepicker)],\n [controls.nextButton, 'click', onClickNextButton.bind(null, datepicker)],\n [controls.todayButton, 'click', goToOrSelectToday.bind(null, datepicker)],\n [controls.clearButton, 'click', clearSelection.bind(null, datepicker)],\n ]);\n\n // set up views\n this.views = [\n new DaysView(this),\n new MonthsView(this),\n new YearsView(this, {id: 2, name: 'years', cellClass: 'year', step: 1}),\n new YearsView(this, {id: 3, name: 'decades', cellClass: 'decade', step: 10}),\n ];\n this.currentView = this.views[config.startView];\n\n this.currentView.render();\n this.main.appendChild(this.currentView.element);\n if (config.container) {\n config.container.appendChild(this.element);\n } else {\n inputField.after(this.element);\n }\n }\n\n setOptions(options) {\n processPickerOptions(this, options);\n this.views.forEach((view) => {\n view.init(options, false);\n });\n this.currentView.render();\n }\n\n detach() {\n this.element.remove();\n }\n\n show() {\n if (this.active) {\n return;\n }\n\n const {datepicker, element} = this;\n const inputField = datepicker.inputField;\n if (inputField) {\n // ensure picker's direction matches input's\n const inputDirection = getTextDirection(inputField);\n if (inputDirection !== getTextDirection(getParent(element))) {\n element.dir = inputDirection;\n } else if (element.dir) {\n element.removeAttribute('dir');\n }\n\n // Determine the picker's position first to prevent `orientation: 'auto'`\n // from being miscalculated to 'bottom' after the picker temporarily\n // shown below the input field expands the document height if the field\n // is at the bottom edge of the document\n this.place();\n element.classList.add('active');\n\n if (datepicker.config.disableTouchKeyboard) {\n inputField.blur();\n }\n } else {\n element.classList.add('active');\n }\n this.active = true;\n triggerDatepickerEvent(datepicker, 'show');\n }\n\n hide() {\n if (!this.active) {\n return;\n }\n this.datepicker.exitEditMode();\n this.element.classList.remove('active');\n this.active = false;\n triggerDatepickerEvent(this.datepicker, 'hide');\n }\n\n place() {\n const {classList, style} = this.element;\n // temporarily display the picker to get its size and offset parent\n style.display = 'block';\n\n const {\n width: calendarWidth,\n height: calendarHeight,\n } = this.element.getBoundingClientRect();\n const offsetParent = this.element.offsetParent;\n // turn the picker back to hidden so that the position is determined with\n // the state before it is shown.\n style.display = '';\n\n const {config, inputField} = this.datepicker;\n const {\n left: inputLeft,\n top: inputTop,\n right: inputRight,\n bottom: inputBottom,\n width: inputWidth,\n height: inputHeight\n } = inputField.getBoundingClientRect();\n let {x: orientX, y: orientY} = config.orientation;\n let left = inputLeft;\n let top = inputTop;\n\n // caliculate offsetLeft/Top of inputField\n if (offsetParent === document.body || !offsetParent) {\n left += window.scrollX;\n top += window.scrollY;\n } else {\n const offsetParentRect = offsetParent.getBoundingClientRect();\n left -= offsetParentRect.left - offsetParent.scrollLeft;\n top -= offsetParentRect.top - offsetParent.scrollTop;\n }\n\n // caliculate the boundaries of the visible area that contains inputField\n const scrollParent = findScrollParents(inputField);\n let scrollAreaLeft = 0;\n let scrollAreaTop = 0;\n let {\n clientWidth: scrollAreaRight,\n clientHeight: scrollAreaBottom,\n } = document.documentElement;\n\n if (scrollParent) {\n const scrollParentRect = scrollParent.getBoundingClientRect();\n if (scrollParentRect.top > 0) {\n scrollAreaTop = scrollParentRect.top;\n }\n if (scrollParentRect.left > 0) {\n scrollAreaLeft = scrollParentRect.left;\n }\n if (scrollParentRect.right < scrollAreaRight) {\n scrollAreaRight = scrollParentRect.right;\n }\n if (scrollParentRect.bottom < scrollAreaBottom) {\n scrollAreaBottom = scrollParentRect.bottom;\n }\n }\n\n // determine the horizontal orientation and left position\n let adjustment = 0;\n if (orientX === 'auto') {\n if (inputLeft < scrollAreaLeft) {\n orientX = 'left';\n adjustment = scrollAreaLeft - inputLeft;\n } else if (inputLeft + calendarWidth > scrollAreaRight) {\n orientX = 'right';\n if (scrollAreaRight < inputRight) {\n adjustment = scrollAreaRight - inputRight;\n }\n } else if (getTextDirection(inputField) === 'rtl') {\n orientX = inputRight - calendarWidth < scrollAreaLeft ? 'left' : 'right';\n } else {\n orientX = 'left';\n }\n }\n if (orientX === 'right') {\n left += inputWidth - calendarWidth;\n }\n left += adjustment;\n\n // determine the vertical orientation and top position\n if (orientY === 'auto') {\n if (inputTop - calendarHeight > scrollAreaTop) {\n orientY = inputBottom + calendarHeight > scrollAreaBottom ? 'top' : 'bottom';\n } else {\n orientY = 'bottom';\n }\n }\n if (orientY === 'top') {\n top -= calendarHeight;\n } else {\n top += inputHeight;\n }\n\n classList.remove(...Object.values(orientClasses));\n classList.add(orientClasses[orientX], orientClasses[orientY]);\n\n style.left = toPx(left);\n style.top = toPx(top);\n }\n\n setViewSwitchLabel(labelText) {\n this.controls.viewSwitch.textContent = labelText;\n }\n\n setPrevButtonDisabled(disabled) {\n this.controls.prevButton.disabled = disabled;\n }\n\n setNextButtonDisabled(disabled) {\n this.controls.nextButton.disabled = disabled;\n }\n\n changeView(viewId) {\n const currentView = this.currentView;\n if (viewId !== currentView.id) {\n if (!this._oldView) {\n this._oldView = currentView;\n }\n this.currentView = this.views[viewId];\n this._renderMethod = 'render';\n }\n return this;\n }\n\n // Change the focused date (view date)\n changeFocus(newViewDate) {\n this._renderMethod = setViewDate(this, newViewDate) ? 'render' : 'refreshFocus';\n this.views.forEach((view) => {\n view.updateFocus();\n });\n return this;\n }\n\n // Apply the change of the selected dates\n update(viewDate = undefined) {\n const newViewDate = viewDate === undefined\n ? computeResetViewDate(this.datepicker)\n : viewDate;\n this._renderMethod = setViewDate(this, newViewDate) ? 'render' : 'refresh';\n this.views.forEach((view) => {\n view.updateFocus();\n view.updateSelection();\n });\n return this;\n }\n\n // Refresh the picker UI\n render(quickRender = true) {\n const {currentView, datepicker, _oldView: oldView} = this;\n const oldViewDate = new Date(this._oldViewDate);\n const renderMethod = (quickRender && this._renderMethod) || 'render';\n delete this._oldView;\n delete this._oldViewDate;\n delete this._renderMethod;\n\n currentView[renderMethod]();\n if (oldView) {\n this.main.replaceChild(currentView.element, oldView.element);\n triggerDatepickerEvent(datepicker, 'changeView');\n }\n if (!isNaN(oldViewDate)) {\n const newViewDate = new Date(this.viewDate);\n if (newViewDate.getFullYear() !== oldViewDate.getFullYear()) {\n triggerDatepickerEvent(datepicker, 'changeYear');\n }\n if (newViewDate.getMonth() !== oldViewDate.getMonth()) {\n triggerDatepickerEvent(datepicker, 'changeMonth');\n }\n }\n }\n}\n","import {isInRange} from '../lib/utils.js';\nimport {isActiveElement} from '../lib/dom.js';\nimport {addDays, addMonths, addYears} from '../lib/date.js';\nimport {\n goToPrevOrNext,\n switchView,\n clearSelection,\n goToOrSelectToday,\n unfocus,\n} from './functions.js';\n\n// Find the closest date that doesn't meet the condition for unavailable date\n// Returns undefined if no available date is found\n// addFn: function to calculate the next date\n// - args: time value, amount\n// increase: amount to pass to addFn\n// testFn: function to test the unavailability of the date\n// - args: time value; return: true if unavailable\nfunction findNextAvailableOne(date, addFn, increase, testFn, min, max) {\n if (!isInRange(date, min, max)) {\n return;\n }\n if (testFn(date)) {\n const newDate = addFn(date, increase);\n return findNextAvailableOne(newDate, addFn, increase, testFn, min, max);\n }\n return date;\n}\n\n// direction: -1 (left/up), 1 (right/down)\n// vertical: true for up/down, false for left/right\nfunction moveByArrowKey(datepicker, direction, vertical) {\n const picker = datepicker.picker;\n const currentView = picker.currentView;\n const step = currentView.step || 1;\n let viewDate = picker.viewDate;\n let addFn;\n switch (currentView.id) {\n case 0:\n viewDate = addDays(viewDate, vertical ? direction * 7 : direction);\n addFn = addDays;\n break;\n case 1:\n viewDate = addMonths(viewDate, vertical ? direction * 4 : direction);\n addFn = addMonths;\n break;\n default:\n viewDate = addYears(viewDate, direction * (vertical ? 4 : 1) * step);\n addFn = addYears;\n }\n viewDate = findNextAvailableOne(\n viewDate,\n addFn,\n direction < 0 ? -step : step,\n (date) => currentView.disabled.includes(date),\n currentView.minDate,\n currentView.maxDate\n );\n if (viewDate !== undefined) {\n picker.changeFocus(viewDate).render();\n }\n}\n\nexport function onKeydown(datepicker, ev) {\n const {config, picker, editMode} = datepicker;\n const active = picker.active;\n const {key, altKey, shiftKey} = ev;\n const ctrlOrMetaKey = ev.ctrlKey || ev.metaKey;\n const cancelEvent = () => {\n ev.preventDefault();\n ev.stopPropagation();\n };\n\n // tab/enter keys should not be taken by shortcut keys\n if (key === 'Tab') {\n unfocus(datepicker);\n return;\n }\n if (key === 'Enter') {\n if (!active) {\n datepicker.update();\n } else if (editMode) {\n datepicker.exitEditMode({update: true, autohide: config.autohide});\n } else {\n const currentView = picker.currentView;\n if (currentView.isMinView) {\n datepicker.setDate(picker.viewDate);\n } else {\n picker.changeView(currentView.id - 1).render();\n cancelEvent();\n }\n }\n return;\n }\n\n const shortcutKeys = config.shortcutKeys;\n const keyInfo = {key, ctrlOrMetaKey, altKey, shiftKey};\n const shortcut = Object.keys(shortcutKeys).find((item) => {\n const keyDef = shortcutKeys[item];\n return !Object.keys(keyDef).find(prop => keyDef[prop] !== keyInfo[prop]);\n });\n if (shortcut) {\n let action;\n if (shortcut === 'toggle') {\n action = shortcut;\n } else if (editMode) {\n if (shortcut === 'exitEditMode') {\n action = shortcut;\n }\n } else if (active) {\n if (shortcut === 'hide') {\n action = shortcut;\n } else if (shortcut === 'prevButton') {\n action = [goToPrevOrNext, [datepicker, -1]];\n } else if (shortcut === 'nextButton') {\n action = [goToPrevOrNext, [datepicker, 1]];\n } else if (shortcut === 'viewSwitch') {\n action = [switchView, [datepicker]];\n } else if (config.clearButton && shortcut === 'clearButton') {\n action = [clearSelection, [datepicker]];\n } else if (config.todayButton && shortcut === 'todayButton') {\n action = [goToOrSelectToday, [datepicker]];\n }\n } else if (shortcut === 'show') {\n action = shortcut;\n }\n if (action) {\n if (Array.isArray(action)) {\n action[0].apply(null, action[1]);\n } else {\n datepicker[action]();\n }\n cancelEvent();\n return;\n }\n }\n\n // perform as a regular when picker in hidden or in edit mode\n if (!active || editMode) {\n return;\n }\n\n const handleArrowKeyPress = (direction, vertical) => {\n if (shiftKey || ctrlOrMetaKey || altKey) {\n datepicker.enterEditMode();\n } else {\n moveByArrowKey(datepicker, direction, vertical);\n ev.preventDefault();\n }\n };\n\n if (key === 'ArrowLeft') {\n handleArrowKeyPress(-1, false);\n } else if (key === 'ArrowRight') {\n handleArrowKeyPress(1, false);\n } else if (key === 'ArrowUp') {\n handleArrowKeyPress(-1, true);\n } else if (key === 'ArrowDown') {\n handleArrowKeyPress(1, true);\n } else if (\n key === 'Backspace'\n || key === 'Delete'\n // When autofill is performed, Chromium-based browsers trigger fake\n // keydown/keyup events that don't have the `key` property (on Edge,\n // keyup only) in addition to the input event. Therefore, we need to\n // check the existence of `key`'s value before checking the length.\n // (issue #144)\n || (key && key.length === 1 && !ctrlOrMetaKey)\n ) {\n datepicker.enterEditMode();\n }\n}\n\nexport function onFocus(datepicker) {\n if (datepicker.config.showOnFocus && !datepicker._showing) {\n datepicker.show();\n }\n}\n\n// for the prevention for entering edit mode while getting focus on click\nexport function onMousedown(datepicker, ev) {\n const el = ev.target;\n if (datepicker.picker.active || datepicker.config.showOnClick) {\n el._active = isActiveElement(el);\n el._clicking = setTimeout(() => {\n delete el._active;\n delete el._clicking;\n }, 2000);\n }\n}\n\nexport function onClickInput(datepicker, ev) {\n const el = ev.target;\n if (!el._clicking) {\n return;\n }\n clearTimeout(el._clicking);\n delete el._clicking;\n\n if (el._active) {\n datepicker.enterEditMode();\n }\n delete el._active;\n\n if (datepicker.config.showOnClick) {\n datepicker.show();\n }\n}\n\nexport function onPaste(datepicker, ev) {\n if (ev.clipboardData.types.includes('text/plain')) {\n datepicker.enterEditMode();\n }\n}\n","import {isActiveElement} from '../lib/dom.js';\nimport {findElementInEventPath} from '../lib/event.js';\nimport {unfocus} from './functions.js';\n\n// for the `document` to delegate the events from outside the picker/input field\nexport function onClickOutside(datepicker, ev) {\n const {element, picker} = datepicker;\n // check both picker's and input's activeness to make updateOnBlur work in\n // the cases where...\n // - picker is hidden by ESC key press → input stays focused\n // - input is unfocused by closing mobile keyboard → piker is kept shown\n if (!picker.active && !isActiveElement(element)) {\n return;\n }\n const pickerElem = picker.element;\n if (findElementInEventPath(ev, el => el === element || el === pickerElem)) {\n return;\n }\n unfocus(datepicker);\n}\n","import {lastItemOf, stringToArray, isInRange} from './lib/utils.js';\nimport {today, regularizeDate} from './lib/date.js';\nimport {parseDate, formatDate} from './lib/date-format.js';\nimport {isActiveElement} from './lib/dom.js';\nimport {registerListeners, unregisterListeners} from './lib/event.js';\nimport locales from './i18n/base-locales.js';\nimport defaultOptions from './options/defaultOptions.js';\nimport processOptions from './options/processOptions.js';\nimport createShortcutKeyConfig from './options/shortcutKeys.js';\nimport Picker from './picker/Picker.js';\nimport {triggerDatepickerEvent} from './events/functions.js';\nimport {\n onKeydown,\n onFocus,\n onMousedown,\n onClickInput,\n onPaste,\n} from './events/elementListeners.js';\nimport {onClickOutside} from './events/otherListeners.js';\n\nfunction stringifyDates(dates, config) {\n return dates\n .map(dt => formatDate(dt, config.format, config.locale))\n .join(config.dateDelimiter);\n}\n\n// parse input dates and create an array of time values for selection\n// returns undefined if there are no valid dates in inputDates\n// when origDates (current selection) is passed, the function works to mix\n// the input dates into the current selection\nfunction processInputDates(datepicker, inputDates, clear = false) {\n if (inputDates.length === 0) {\n // empty input is considered valid unless origiDates is passed\n return clear ? [] : undefined;\n }\n\n const {config, dates: origDates, rangeSideIndex} = datepicker;\n const {pickLevel, maxNumberOfDates} = config;\n let newDates = inputDates.reduce((dates, dt) => {\n let date = parseDate(dt, config.format, config.locale);\n if (date === undefined) {\n return dates;\n }\n // adjust to 1st of the month/Jan 1st of the year\n // or to the last day of the monh/Dec 31st of the year if the datepicker\n // is the range-end picker of a rangepicker\n date = regularizeDate(date, pickLevel, rangeSideIndex);\n if (\n isInRange(date, config.minDate, config.maxDate)\n && !dates.includes(date)\n && !config.checkDisabled(date, pickLevel)\n && (pickLevel > 0 || !config.daysOfWeekDisabled.includes(new Date(date).getDay()))\n ) {\n dates.push(date);\n }\n return dates;\n }, []);\n if (newDates.length === 0) {\n return;\n }\n if (config.multidate && !clear) {\n // get the synmetric difference between origDates and newDates\n newDates = newDates.reduce((dates, date) => {\n if (!origDates.includes(date)) {\n dates.push(date);\n }\n return dates;\n }, origDates.filter(date => !newDates.includes(date)));\n }\n // do length check always because user can input multiple dates regardless of the mode\n return maxNumberOfDates && newDates.length > maxNumberOfDates\n ? newDates.slice(maxNumberOfDates * -1)\n : newDates;\n}\n\n// refresh the UI elements\n// modes: 1: input only, 2, picker only, 3 both\nfunction refreshUI(datepicker, mode = 3, quickRender = true, viewDate = undefined) {\n const {config, picker, inputField} = datepicker;\n if (mode & 2) {\n const newView = picker.active ? config.pickLevel : config.startView;\n picker.update(viewDate).changeView(newView).render(quickRender);\n }\n if (mode & 1 && inputField) {\n inputField.value = stringifyDates(datepicker.dates, config);\n }\n}\n\nfunction setDate(datepicker, inputDates, options) {\n const config = datepicker.config;\n let {clear, render, autohide, revert, forceRefresh, viewDate} = options;\n if (render === undefined) {\n render = true;\n }\n if (!render) {\n autohide = forceRefresh = false;\n } else if (autohide === undefined) {\n autohide = config.autohide;\n }\n viewDate = parseDate(viewDate, config.format, config.locale);\n\n const newDates = processInputDates(datepicker, inputDates, clear);\n if (!newDates && !revert) {\n return;\n }\n if (newDates && newDates.toString() !== datepicker.dates.toString()) {\n datepicker.dates = newDates;\n refreshUI(datepicker, render ? 3 : 1, true, viewDate);\n triggerDatepickerEvent(datepicker, 'changeDate');\n } else {\n refreshUI(datepicker, forceRefresh ? 3 : 1, true, viewDate);\n }\n\n if (autohide) {\n datepicker.hide();\n }\n}\n\nfunction getOutputConverter(datepicker, format) {\n return format\n ? date => formatDate(date, format, datepicker.config.locale)\n : date => new Date(date);\n}\n\n/**\n * Class representing a date picker\n */\nexport default class Datepicker {\n /**\n * Create a date picker\n * @param {Element} element - element to bind a date picker\n * @param {Object} [options] - config options\n * @param {DateRangePicker} [rangepicker] - DateRangePicker instance the\n * date picker belongs to. Use this only when creating date picker as a part\n * of date range picker\n */\n constructor(element, options = {}, rangepicker = undefined) {\n element.datepicker = this;\n this.element = element;\n this.dates = [];\n\n // initialize config\n const config = this.config = Object.assign({\n buttonClass: (options.buttonClass && String(options.buttonClass)) || 'button',\n container: null,\n defaultViewDate: today(),\n maxDate: undefined,\n minDate: undefined,\n }, processOptions(defaultOptions, this));\n\n // configure by type\n let inputField;\n if (element.tagName === 'INPUT') {\n inputField = this.inputField = element;\n inputField.classList.add('datepicker-input');\n if (options.container) {\n // omit string type check because it doesn't guarantee to avoid errors\n // (invalid selector string causes abend with sytax error)\n config.container = options.container instanceof HTMLElement\n ? options.container\n : document.querySelector(options.container);\n }\n } else {\n config.container = element;\n }\n if (rangepicker) {\n // check validiry\n const index = rangepicker.inputs.indexOf(inputField);\n const datepickers = rangepicker.datepickers;\n if (index < 0 || index > 1 || !Array.isArray(datepickers)) {\n throw Error('Invalid rangepicker object.');\n }\n // attach itaelf to the rangepicker here so that processInputDates() can\n // determine if this is the range-end picker of the rangepicker while\n // setting inital values when pickLevel > 0\n datepickers[index] = this;\n this.rangepicker = rangepicker;\n this.rangeSideIndex = index;\n }\n\n // set up config\n this._options = options;\n Object.assign(config, processOptions(options, this));\n config.shortcutKeys = createShortcutKeyConfig(options.shortcutKeys || {});\n\n // process initial value\n const initialDates = stringToArray(\n element.value || element.dataset.date,\n config.dateDelimiter\n );\n delete element.dataset.date;\n const inputDateValues = processInputDates(this, initialDates);\n if (inputDateValues && inputDateValues.length > 0) {\n this.dates = inputDateValues;\n }\n if (inputField) {\n inputField.value = stringifyDates(this.dates, config);\n }\n\n // set up picekr element\n const picker = this.picker = new Picker(this);\n\n const keydownListener = [element, 'keydown', onKeydown.bind(null, this)];\n if (inputField) {\n registerListeners(this, [\n keydownListener,\n [inputField, 'focus', onFocus.bind(null, this)],\n [inputField, 'mousedown', onMousedown.bind(null, this)],\n [inputField, 'click', onClickInput.bind(null, this)],\n [inputField, 'paste', onPaste.bind(null, this)],\n // To detect a click on outside, just listening to mousedown is enough,\n // no need to listen to touchstart.\n // Actually, listening to touchstart can be a problem because, while\n // mousedown is fired only on tapping but not on swiping/pinching,\n // touchstart is fired on swiping/pinching as well.\n // (issue #95)\n [document, 'mousedown', onClickOutside.bind(null, this)],\n [window, 'resize', picker.place.bind(picker)]\n ]);\n } else {\n registerListeners(this, [keydownListener]);\n this.show();\n }\n }\n\n /**\n * Format Date object or time value in given format and language\n * @param {Date|Number} date - date or time value to format\n * @param {String|Object} format - format string or object that contains\n * toDisplay() custom formatter, whose signature is\n * - args:\n * - date: {Date} - Date instance of the date passed to the method\n * - format: {Object} - the format object passed to the method\n * - locale: {Object} - locale for the language specified by `lang`\n * - return:\n * {String} formatted date\n * @param {String} [lang=en] - language code for the locale to use\n * @return {String} formatted date\n */\n static formatDate(date, format, lang) {\n return formatDate(date, format, lang && locales[lang] || locales.en);\n }\n\n /**\n * Parse date string\n * @param {String|Date|Number} dateStr - date string, Date object or time\n * value to parse\n * @param {String|Object} format - format string or object that contains\n * toValue() custom parser, whose signature is\n * - args:\n * - dateStr: {String|Date|Number} - the dateStr passed to the method\n * - format: {Object} - the format object passed to the method\n * - locale: {Object} - locale for the language specified by `lang`\n * - return:\n * {Date|Number} parsed date or its time value\n * @param {String} [lang=en] - language code for the locale to use\n * @return {Number} time value of parsed date\n */\n static parseDate(dateStr, format, lang) {\n return parseDate(dateStr, format, lang && locales[lang] || locales.en);\n }\n\n /**\n * @type {Object} - Installed locales in `[languageCode]: localeObject` format\n * en`:_English (US)_ is pre-installed.\n */\n static get locales() {\n return locales;\n }\n\n /**\n * @type {Boolean} - Whether the picker element is shown. `true` whne shown\n */\n get active() {\n return !!(this.picker && this.picker.active);\n }\n\n /**\n * @type {HTMLDivElement} - DOM object of picker element\n */\n get pickerElement() {\n return this.picker ? this.picker.element : undefined;\n }\n\n /**\n * Set new values to the config options\n * @param {Object} options - config options to update\n */\n setOptions(options) {\n const newOptions = processOptions(options, this);\n Object.assign(this._options, options);\n Object.assign(this.config, newOptions);\n this.picker.setOptions(newOptions);\n\n refreshUI(this, 3);\n }\n\n /**\n * Show the picker element\n */\n show() {\n if (this.inputField) {\n const {config, inputField} = this;\n if (inputField.disabled || (inputField.readOnly && !config.enableOnReadonly)) {\n return;\n }\n if (!isActiveElement(inputField) && !config.disableTouchKeyboard) {\n this._showing = true;\n inputField.focus();\n delete this._showing;\n }\n }\n this.picker.show();\n }\n\n /**\n * Hide the picker element\n * Not available on inline picker\n */\n hide() {\n if (!this.inputField) {\n return;\n }\n this.picker.hide();\n this.picker.update().changeView(this.config.startView).render();\n }\n\n /**\n * Toggle the display of the picker element\n * Not available on inline picker\n *\n * Unlike hide(), the picker does not return to the start view when hiding.\n */\n toggle() {\n if (!this.picker.active) {\n this.show();\n } else if (this.inputField) {\n this.picker.hide();\n }\n }\n\n /**\n * Destroy the Datepicker instance\n * @return {Detepicker} - the instance destroyed\n */\n destroy() {\n this.hide();\n unregisterListeners(this);\n this.picker.detach();\n const element = this.element;\n element.classList.remove('datepicker-input');\n delete element.datepicker;\n return this;\n }\n\n /**\n * Get the selected date(s)\n *\n * The method returns a Date object of selected date by default, and returns\n * an array of selected dates in multidate mode. If format string is passed,\n * it returns date string(s) formatted in given format.\n *\n * @param {String} [format] - format string to stringify the date(s)\n * @return {Date|String|Date[]|String[]} - selected date(s), or if none is\n * selected, empty array in multidate mode and undefined in sigledate mode\n */\n getDate(format = undefined) {\n const callback = getOutputConverter(this, format);\n\n if (this.config.multidate) {\n return this.dates.map(callback);\n }\n if (this.dates.length > 0) {\n return callback(this.dates[0]);\n }\n }\n\n /**\n * Set selected date(s)\n *\n * In multidate mode, you can pass multiple dates as a series of arguments\n * or an array. (Since each date is parsed individually, the type of the\n * dates doesn't have to be the same.)\n * The given dates are used to toggle the select status of each date. The\n * number of selected dates is kept from exceeding the length set to\n * maxNumberOfDates.\n *\n * With clear: true option, the method can be used to clear the selection\n * and to replace the selection instead of toggling in multidate mode.\n * If the option is passed with no date arguments or an empty dates array,\n * it works as \"clear\" (clear the selection then set nothing), and if the\n * option is passed with new dates to select, it works as \"replace\" (clear\n * the selection then set the given dates)\n *\n * When render: false option is used, the method omits re-rendering the\n * picker element. In this case, you need to call refresh() method later in\n * order for the picker element to reflect the changes. The input field is\n * refreshed always regardless of this option.\n *\n * When invalid (unparsable, repeated, disabled or out-of-range) dates are\n * passed, the method ignores them and applies only valid ones. In the case\n * that all the given dates are invalid, which is distinguished from passing\n * no dates, the method considers it as an error and leaves the selection\n * untouched. (The input field also remains untouched unless revert: true\n * option is used.)\n * Replacing the selection with the same date(s) also causes a similar\n * situation. In both cases, the method does not refresh the picker element\n * unless forceRefresh: true option is used.\n *\n * If viewDate option is used, the method changes the focused date to the\n * specified date instead of the last item of the selection.\n *\n * @param {...(Date|Number|String)|Array} [dates] - Date strings, Date\n * objects, time values or mix of those for new selection\n * @param {Object} [options] - function options\n * - clear: {boolean} - Whether to clear the existing selection\n * defualt: false\n * - render: {boolean} - Whether to re-render the picker element\n * default: true\n * - autohide: {boolean} - Whether to hide the picker element after re-render\n * Ignored when used with render: false\n * default: config.autohide\n * - revert: {boolean} - Whether to refresh the input field when all the\n * passed dates are invalid\n * default: false\n * - forceRefresh: {boolean} - Whether to refresh the picker element when\n * passed dates don't change the existing selection\n * default: false\n * - viewDate: {Date|Number|String} - Date to be focused after setiing date(s)\n * default: The last item of the resulting selection, or defaultViewDate\n * config option if none is selected\n */\n setDate(...args) {\n const dates = [...args];\n const opts = {};\n const lastArg = lastItemOf(args);\n if (\n lastArg\n && typeof lastArg === 'object'\n && !Array.isArray(lastArg)\n && !(lastArg instanceof Date)\n ) {\n Object.assign(opts, dates.pop());\n }\n\n const inputDates = Array.isArray(dates[0]) ? dates[0] : dates;\n setDate(this, inputDates, opts);\n }\n\n /**\n * Update the selected date(s) with input field's value\n * Not available on inline picker\n *\n * The input field will be refreshed with properly formatted date string.\n *\n * In the case that all the entered dates are invalid (unparsable, repeated,\n * disabled or out-of-range), which is distinguished from empty input field,\n * the method leaves the input field untouched as well as the selection by\n * default. If revert: true option is used in this case, the input field is\n * refreshed with the existing selection.\n * The method also doesn't refresh the picker element in this case and when\n * the entered dates are the same as the existing selection. If\n * forceRefresh: true option is used, the picker element is refreshed in\n * these cases too.\n *\n * @param {Object} [options] - function options\n * - autohide: {boolean} - whether to hide the picker element after refresh\n * default: false\n * - revert: {boolean} - Whether to refresh the input field when all the\n * passed dates are invalid\n * default: false\n * - forceRefresh: {boolean} - Whether to refresh the picer element when\n * input field's value doesn't change the existing selection\n * default: false\n */\n update(options = undefined) {\n if (!this.inputField) {\n return;\n }\n\n const opts = Object.assign(options || {}, {clear: true, render: true, viewDate: undefined});\n const inputDates = stringToArray(this.inputField.value, this.config.dateDelimiter);\n setDate(this, inputDates, opts);\n }\n\n /**\n * Get the focused date\n *\n * The method returns a Date object of focused date by default. If format\n * string is passed, it returns date string formatted in given format.\n *\n * @param {String} [format] - format string to stringify the date\n * @return {Date|String} - focused date (viewDate)\n */\n getFocusedDate(format = undefined) {\n return getOutputConverter(this, format)(this.picker.viewDate);\n }\n\n /**\n * Set focused date\n *\n * By default, the method updates the focus on the view shown at the time,\n * or the one set to the startView config option if the picker is hidden.\n * When resetView: true is passed, the view displayed is changed to the\n * pickLevel config option's if the picker is shown.\n *\n * @param {Date|Number|String} viewDate - date string, Date object, time\n * values of the date to focus\n * @param {Boolean} [resetView] - whether to change the view to pickLevel\n * config option's when the picker is shown. Ignored when the picker is\n * hidden\n */\n setFocusedDate(viewDate, resetView = false) {\n const {config, picker, active, rangeSideIndex} = this;\n const pickLevel = config.pickLevel;\n const newViewDate = parseDate(viewDate, config.format, config.locale);\n if (newViewDate === undefined) {\n return;\n }\n\n picker.changeFocus(regularizeDate(newViewDate, pickLevel, rangeSideIndex));\n if (active && resetView) {\n picker.changeView(pickLevel);\n }\n picker.render();\n }\n\n /**\n * Refresh the picker element and the associated input field\n * @param {String} [target] - target item when refreshing one item only\n * 'picker' or 'input'\n * @param {Boolean} [forceRender] - whether to re-render the picker element\n * regardless of its state instead of optimized refresh\n */\n refresh(target = undefined, forceRender = false) {\n if (target && typeof target !== 'string') {\n forceRender = target;\n target = undefined;\n }\n\n let mode;\n if (target === 'picker') {\n mode = 2;\n } else if (target === 'input') {\n mode = 1;\n } else {\n mode = 3;\n }\n refreshUI(this, mode, !forceRender);\n }\n\n /**\n * Enter edit mode\n * Not available on inline picker or when the picker element is hidden\n */\n enterEditMode() {\n const inputField = this.inputField;\n if (!inputField || inputField.readOnly || !this.picker.active || this.editMode) {\n return;\n }\n this.editMode = true;\n inputField.classList.add('in-edit');\n }\n\n /**\n * Exit from edit mode\n * Not available on inline picker\n * @param {Object} [options] - function options\n * - update: {boolean} - whether to call update() after exiting\n * If false, input field is revert to the existing selection\n * default: false\n */\n exitEditMode(options = undefined) {\n if (!this.inputField || !this.editMode) {\n return;\n }\n const opts = Object.assign({update: false}, options);\n delete this.editMode;\n this.inputField.classList.remove('in-edit');\n if (opts.update) {\n this.update(opts);\n }\n }\n}\n","import delegate from \"delegate-it\";\nimport ajax from \"@/scripts/common/ajax\";\nimport { generateQueryString } from \"@/scripts/common/util\";\nimport { scrollToIfNeeded } from \"@/scripts/common/scroll-to\";\nimport Datepicker from \"vanillajs-datepicker/Datepicker\";\nimport \"vanillajs-datepicker/css/datepicker.css\";\nimport \"./events.css\";\nimport Swiper from \"swiper\";\nimport { A11y, EffectFade, Navigation, Pagination } from \"swiper/modules\";\nimport \"@/styles/components/slider.css\";\n\nconst pageSection = document.querySelector(\".page-section\");\nconst form = document.querySelector(\".filter-form\");\nconst datepickerEl = document.querySelector(\"[data-datepicker]\");\n\nlet datepicker;\n\nconst setupDatepicker = () => {\n if (!datepickerEl) {\n return;\n }\n\n const selectedDate = datepickerEl.dataset.date;\n const activeDates = JSON.parse(datepickerEl.dataset.dates);\n\n const opts = {\n minDate: new Date(),\n maxView: 0,\n todayHighlight: true,\n prevArrow: `\n \n \n \n `,\n nextArrow: `\n \n \n \n `,\n datesDisabled: (date) => {\n const isActive = activeDates.some(\n (dateStr) => new Date(dateStr).toISOString().split(\"T\")[0] === date.toISOString().split(\"T\")[0],\n );\n\n return !isActive;\n },\n };\n\n datepicker = new Datepicker(datepickerEl, opts);\n\n if (selectedDate) {\n datepicker.setDate(Datepicker.parseDate(selectedDate, \"yyyy-mm-dd\"));\n }\n\n datepickerEl.addEventListener(\"changeDate\", (e) => {\n const date = e.detail.date;\n\n handleDateChange(date);\n });\n};\n\nconst handleDateChange = (date) => {\n const formattedDate = Datepicker.formatDate(date, \"yyyy-mm-dd\");\n const url = `${form.action}?date=${formattedDate}`;\n\n window.history.replaceState({}, \"\", url);\n\n form.querySelectorAll('input[type=\"search\"]').forEach((x) => (x.value = null));\n\n updateResults();\n};\n\nconst handleFilterChange = (e) => {\n e && e.preventDefault();\n\n const params = new FormData(form);\n const queryString = generateQueryString(params);\n const url = queryString.size ? `${form.action}?${queryString}` : form.action;\n\n window.history.replaceState({}, \"\", url);\n\n updateResults();\n};\n\nconst handleFilterLink = (e) => {\n e.preventDefault();\n\n const url = e.delegateTarget.href;\n\n window.history.replaceState({}, \"\", url);\n\n updateResults();\n};\n\nconst handleFilterClear = (e) => {\n e.preventDefault();\n\n form.querySelectorAll('input[type=\"search\"]').forEach((x) => (x.value = null));\n datepicker.setDate({ clear: true });\n\n window.history.replaceState({}, \"\", form.action);\n\n updateResults();\n};\n\nconst updateResults = async () => {\n const pageContent = document.querySelector(\"[data-page-content]\");\n\n pageContent.classList.add(\"is-loading\");\n\n const res = await ajax.get(window.location.href).json();\n\n pageContent.innerHTML = res.page;\n pageContent.classList.remove(\"is-loading\");\n\n if (res.isFiltered) {\n scrollToIfNeeded(pageContent, 24);\n pageSection.classList.add(\"is-filtered\");\n } else {\n pageSection.classList.remove(\"is-filtered\");\n }\n};\n\nconst setupFeaturedSlider = () => {\n const slider = document.querySelector(\".featured-slider\");\n\n if (slider) {\n const container = slider.querySelector(\".swiper\");\n const numSlides = slider.querySelectorAll(\".swiper-slide\").length;\n\n if (numSlides > 1) {\n const opts = {\n modules: [A11y, EffectFade, Navigation, Pagination],\n effect: \"fade\",\n fadeEffect: {\n crossFade: true,\n },\n loop: true,\n speed: 1000,\n pagination: {\n el: slider.querySelector(\".slider-pagination\"),\n clickable: true,\n },\n navigation: {\n nextEl: slider.querySelector(\".slider-button-next\"),\n prevEl: slider.querySelector(\".slider-button-prev\"),\n },\n };\n\n new Swiper(container, opts);\n }\n }\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n if (form) {\n delegate(\".filter-link\", \"click\", handleFilterLink);\n delegate(\".filter-form\", \"submit\", handleFilterChange);\n delegate(\".filter-form-clear\", \"click\", handleFilterClear);\n }\n\n setupFeaturedSlider();\n setupDatepicker();\n});\n"],"names":["lastItemOf","arr","pushUnique","items","item","stringToArray","str","separator","isInRange","testVal","min","max","minOK","maxOK","limitToRange","val","createTagRepeat","tagName","repeat","attributes","index","html","openTagSrc","src","attr","next","optimizeTemplateHTML","stripTime","timeValue","today","dateValue","args","newDate","addDays","date","amount","addWeeks","addMonths","monthsToSet","expectedMonth","time","addYears","dayDiff","day","from","dayOfTheWeekOf","baseDate","dayOfWeek","weekStart","baseDay","calcWeekNum","dayOfTheWeek","sameDayOfFirstWeek","getIsoWeek","thuOfTheWeek","firstThu","calcTraditionalWeekNumber","startOfFirstWeek","startOfTheWeek","weekNum","weekOneOfNextYear","getWesternTradWeek","getMidEasternWeek","startOfYearPeriod","years","year","regularizeDate","timeSpan","useLastDate","reFormatTokens","reNonDateParts","knownFormats","parseFns","month","locale","monthIndex","monthName","compareNames","name","normalizeMonth","formatFns","padZero","num","length","parseFormatString","format","separators","parts","partFormatters","token","partParserKeys","keys","key","part","dateStr","dateParts","dtParts","origDate","fn","parseDate","formatDate","dateObj","range","parseHTML","getParent","el","isActiveElement","hideElement","showElement","emptyChildNodes","replaceChildNodes","newChildNodes","node","listenerRegistry","addEventListener","removeEventListener","registerListeners","keyObj","listeners","registered","listener","unregisterListeners","getComposedPath","path","parent","findFromPath","criteria","currentTarget","rest","findElementInEventPath","ev","selector","locales","defaultOptions","defaultLang","defaultFormat","defaultWeekStart","sanitizeDOW","dow","determineGetWeekMethod","numberingMode","updateWeekStart","newValue","config","weekNumbers","validateDate","value","origValue","validateViewId","viewId","replaceOptions","options","to","convert","processOptions","datepicker","inOpts","rangeEnd","datesDisabled","language","maxDate","maxView","minDate","pickLevel","startView","lang","origLocale","hasToDisplay","hasToValue","validFormatString","newPickLevel","minDt","maxDt","defaultMinDt","dtsDisabled","disabled","dates","dt","viewDate","wkStart","method","getWeekNumber","startOfWeek","maxNumberOfDates","newMaxView","newStartView","prevArrow","nextArrow","orientation","x","y","defaultShortcutKeys","createShortcutKeyConfig","keyDefs","shortcut","keyDef","normalizedDef","getButtons","buttonList","classes","pickerTemplate","daysTemplate","weekNumbersTemplate","View","picker","switchLabel","prevButtonDisabled","nextButtonDisabled","classList","result","extraClasses","content","cellVal","selected","outOfScope","rangeStart","cellIndex","DaysView","onConstruction","inner","updateDOW","weeksElem","viewYear","viewMonth","firstOfMonth","start","rangepicker","dateOfWeekStart","current","computeMonthRange","thisYear","startY","startM","endY","endM","MonthsView","ix","minDateObj","maxDateObj","yrOutOfRange","isMinYear","isMaxYear","toTitleCase","word","ch","YearsView","beforeShow","first","last","triggerDatepickerEvent","type","goToPrevOrNext","direction","currentView","newViewDate","switchView","clearSelection","goToOrSelectToday","currentDate","unfocus","onBlur","element","goToSelectedMonthOrYear","selection","onClickViewSwitch","onClickPrevButton","onClickNextButton","onClickView","target","id","isMinView","data","onMousedownPicker","orientClasses","obj","toPx","processPickerOptions","prevButton","nextButton","computeResetViewDate","rangeSideIndex","setViewDate","getTextDirection","findScrollParents","Picker","inputField","template","header","main","footer","title","viewSwitch","todayButton","clearButton","controls","elementClass","view","inputDirection","style","calendarWidth","calendarHeight","offsetParent","inputLeft","inputTop","inputRight","inputBottom","inputWidth","inputHeight","orientX","orientY","left","top","offsetParentRect","scrollParent","scrollAreaLeft","scrollAreaTop","scrollAreaRight","scrollAreaBottom","scrollParentRect","adjustment","labelText","quickRender","oldView","oldViewDate","renderMethod","findNextAvailableOne","addFn","increase","testFn","moveByArrowKey","vertical","step","onKeydown","editMode","active","altKey","shiftKey","ctrlOrMetaKey","cancelEvent","shortcutKeys","keyInfo","prop","action","handleArrowKeyPress","onFocus","onMousedown","onClickInput","onPaste","onClickOutside","pickerElem","stringifyDates","processInputDates","inputDates","clear","origDates","newDates","refreshUI","mode","newView","setDate","render","autohide","revert","forceRefresh","getOutputConverter","Datepicker","datepickers","initialDates","inputDateValues","keydownListener","newOptions","callback","opts","lastArg","resetView","forceRender","pageSection","form","datepickerEl","setupDatepicker","selectedDate","activeDates","e","handleDateChange","formattedDate","url","updateResults","handleFilterChange","params","queryString","generateQueryString","handleFilterLink","handleFilterClear","pageContent","res","ajax","scrollToIfNeeded","setupFeaturedSlider","slider","container","A11y","EffectFade","Navigation","Pagination","Swiper","delegate"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]}