{"version":3,"sources":["datepicker-full.js","vanilla-datepicker.js"],"names":["lastItemOf","arr","length","pushUnique","items","forEach","item","includes","push","stringToArray","str","separator","split","isInRange","testVal","min","max","undefined","limitToRange","val","createTagRepeat","tagName","repeat","attributes","index","html","Object","keys","reduce","src","attr","next","optimizeTemplateHTML","replace","stripTime","timeValue","Date","setHours","today","dateValue","args","newDate","setFullYear","addDays","date","amount","setDate","getDate","addMonths","monthsToSet","getMonth","expectedMonth","time","setMonth","addYears","getFullYear","dayDiff","day","from","dayOfTheWeekOf","baseDate","dayOfWeek","weekStart","baseDay","getDay","calcWeekNum","dayOfTheWeek","sameDayOfFirstWeek","Math","round","getIsoWeek","thuOfTheWeek","calcTraditionalWeekNumber","startOfFirstWeek","startOfTheWeek","weekNum","getWesternTradWeek","getMidEasternWeek","startOfYearPeriod","years","year","floor","regularizeDate","timeSpan","useLastDate","reFormatTokens","reNonDateParts","knownFormats","parseFns","y","parseInt","m","month","locale","monthIndex","isNaN","NaN","monthName","toLowerCase","compareNames","name","startsWith","monthsShort","findIndex","months","normalizeMonth","getTime","d","formatFns","dd","padZero","D","daysShort","DD","days","mm","M","MM","yy","slice","yyyy","num","toString","padStart","parseFormatString","format","Error","separators","parts","match","RegExp","partFormatters","map","token","partParserKeys","key","find","part","parser","dateStr","dateParts","dtParts","origDate","formatter","fn","parseDate","toValue","formatDate","dateObj","toDisplay","range","document","createRange","parseHTML","createContextualFragment","getParent","el","parentElement","parentNode","ShadowRoot","host","isActiveElement","getRootNode","activeElement","hideElement","style","display","dataset","styleDisplay","showElement","emptyChildNodes","firstChild","removeChild","listenerRegistry","WeakMap","addEventListener","removeEventListener","EventTarget","prototype","registerListeners","keyObj","listeners","registered","get","set","listener","call","unregisterListeners","delete","Event","composedPath","getComposedPath","node","path","parent","defaultView","this","target","findFromPath","criteria","currentTarget","rest","findElementInEventPath","ev","selector","Element","matches","locales","en","daysMin","clear","titleFormat","defaultOptions","autohide","beforeShowDay","beforeShowDecade","beforeShowMonth","beforeShowYear","clearButton","dateDelimiter","datesDisabled","daysOfWeekDisabled","daysOfWeekHighlighted","defaultViewDate","disableTouchKeyboard","enableOnReadonly","language","maxDate","maxNumberOfDates","maxView","minDate","nextArrow","orientation","pickLevel","prevArrow","showDaysOfWeek","showOnClick","showOnFocus","startView","title","todayButton","todayButtonMode","todayHighlight","updateOnBlur","weekNumbers","defaultLang","defaultFormat","defaultWeekStart","sanitizeDOW","dow","determineGetWeekMethod","numberingMode","updateWeekStart","newValue","config","weekEnd","getWeekNumber","validateDate","value","origValue","validateViewId","viewId","replaceOptions","options","to","convert","processOptions","datepicker","inOpts","assign","constructor","rangeEnd","rangeSideIndex","lang","origLocale","hasToDisplay","hasToValue","validFormatString","test","newPickLevel","minDt","maxDt","defaultMinDt","dtsDisabled","checkDisabled","disabled","dates","dt","viewDate","wkStart","Number","method","startOfWeek","multidate","String","newMaxView","newStartView","childNodes","x","entries","defaultShortcutKeys","show","hide","toggle","prevButton","ctrlOrMetaKey","nextButton","viewSwitch","exitEditMode","getButtons","buttonList","classes","join","pickerTemplate","daysTemplate","class","weekNumbersTemplate","View","picker","element","selected","isRangeEnd","init","isMinView","id","setOptions","updateFocus","updateSelection","prepareForRender","switchLabel","prevButtonDisabled","nextButtonDisabled","setViewSwitchLabel","setPrevButtonDisabled","setNextButtonDisabled","setDisabled","classList","add","performBeforeHook","result","beforeShow","enabled","extraClasses","content","newChildNodes","DocumentFragment","appendChild","replaceChildNodes","renderCell","cellVal","outOfScope","textContent","className","cellClass","first","last","rangeStart","focused","refreshCell","remove","changeFocusedCell","cellIndex","grid","querySelectorAll","children","DaysView","super","onConstruction","inner","lastChild","updateDOW","dayNames","switchLabelFormat","weeksElem","weeks","insertBefore","Array","viewYear","viewMonth","firstOfMonth","start","rangepicker","render","dateOfWeekStart","current","refresh","refreshFocus","computeMonthRange","thisYear","startY","startM","endY","endM","MonthsView","ix","monthNames","minYear","minMonth","minDateObj","maxYear","maxMonth","maxDateObj","yrOutOfRange","isMinYear","isMaxYear","YearsView","word","navStep","step","beforeShowOption","ch","toUpperCase","triggerDatepickerEvent","type","bubbles","cancelable","detail","currentView","dispatchEvent","CustomEvent","goToPrevOrNext","direction","newViewDate","changeFocus","switchView","changeView","clearSelection","goToOrSelectToday","currentDate","forceRefresh","setFocusedDate","unfocus","onBlur","update","revert","once","goToSelectedMonthOrYear","selection","onClickViewSwitch","onClickPrevButton","onClickNextButton","onClickView","contains","data","onMousedownPicker","preventDefault","orientClasses","obj","toPx","processPickerOptions","controls","cloneNode","computeResetViewDate","setViewDate","_oldViewDate","getTextDirection","window","getComputedStyle","findScrollParents","body","overflow","Picker","inputField","template","buttonClass","header","main","footer","firstElementChild","lastElementChild","elementClass","bind","views","container","after","view","detach","active","inputDirection","dir","removeAttribute","place","blur","width","calendarWidth","height","calendarHeight","getBoundingClientRect","offsetParent","left","inputLeft","top","inputTop","right","inputRight","bottom","inputBottom","inputWidth","inputHeight","orientX","orientY","offsetParentRect","scrollLeft","scrollTop","scrollX","scrollY","scrollParent","scrollAreaLeft","scrollAreaTop","clientWidth","scrollAreaRight","clientHeight","scrollAreaBottom","documentElement","scrollParentRect","adjustment","values","labelText","_oldView","_renderMethod","quickRender","oldView","oldViewDate","renderMethod","replaceChild","findNextAvailableOne","addFn","increase","testFn","moveByArrowKey","vertical","onKeydown","editMode","altKey","shiftKey","ctrlKey","metaKey","cancelEvent","stopPropagation","shortcutKeys","keyInfo","shortcut","keyDef","prop","action","isArray","apply","handleArrowKeyPress","enterEditMode","onFocus","_showing","onMousedown","_active","_clicking","setTimeout","onClickInput","clearTimeout","onPaste","clipboardData","types","onClickOutside","pickerElem","stringifyDates","processInputDates","inputDates","origDates","newDates","filter","refreshUI","mode","newView","getOutputConverter","Datepicker","HTMLElement","querySelector","inputs","indexOf","datepickers","_options","keyDefs","normalizedDef","createShortcutKeyConfig","initialDates","inputDateValues","keydownListener","pickerElement","newOptions","readOnly","focus","destroy","callback","opts","lastArg","pop","getFocusedDate","resetView","forceRender","filterOptions","newOpts","allowOneSidedRange","onChangeDate","_updating","datepicker0","datepicker1","setDateOptions","changedSide","otherSide","changedDate","otherDate","DateRangePicker","freeze","changeDateListener","cleanOptions","input","setupDatepicker","defineProperty","getDates","setDates","input0","input1","origDate0","origDate1","getMaterialSymbolSVG","materialSymbolsUrl","initDateInput","inputWrapper","cancelIcon","calendarIconSVG","calendarIcon","createElement","innerHTML","dateResetBtn","vanilla_datepicker_i18n","initVanillaDatepickerDropdown","dropdownElement","getElementById","dropdownId","filterReset","datepickerInput","datepickerRadio","dateCheckbox","targetId","chooseDateCheckboxes","checkbox","event","checked","getAttribute","now","cmsNativeLanguage","click","parsed","dateString","regex","exec","monthParser","radio","$","trigger","e"],"mappings":"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","file":"../datepicker-bundle.min.js","sourcesContent":["(function () {\n 'use strict';\n\n function lastItemOf(arr) {\n return arr[arr.length - 1];\n }\n\n // push only the items not included in the array\n 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\n function stringToArray(str, separator) {\n // convert empty string to an empty array\n return str ? str.split(separator) : [];\n }\n\n 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\n 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\n 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\n 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\n const 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\n function normalizeMonth(monthIndex) {\n return monthIndex > -1 ? monthIndex % 12 : normalizeMonth(monthIndex + 12);\n }\n\n function padZero(num, length) {\n return num.toString().padStart(length, '0');\n }\n\n function 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\n 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\n 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\n const range = document.createRange();\n\n function parseHTML(html) {\n return range.createContextualFragment(html);\n }\n\n function getParent(el) {\n return el.parentElement\n || (el.parentNode instanceof ShadowRoot ? el.parentNode.host : undefined);\n }\n\n function isActiveElement(el) {\n return el.getRootNode().activeElement === el;\n }\n\n 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\n 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\n function emptyChildNodes(el) {\n if (el.firstChild) {\n el.removeChild(el.firstChild);\n emptyChildNodes(el);\n }\n }\n\n 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\n const listenerRegistry = new WeakMap();\n const {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\n 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\n 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\n if (!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\n function 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\n 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\n // default locales\n const locales = {\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\n // config options updatable by setOptions() and their default values\n const defaultOptions = {\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\n const {\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\n function sanitizeDOW(dow, day) {\n return dow.length < 6 && day >= 0 && day < 7\n ? pushUnique(dow, day)\n : dow;\n }\n\n function 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\n function 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\n function 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\n function validateViewId(value, origValue, max = 3) {\n const viewId = parseInt(value, 10);\n return viewId >= 0 && viewId <= max ? viewId : origValue;\n }\n\n function 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\n 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\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\n 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\n const getButtons = buttonList => buttonList\n .map(classes => ``)\n .join('');\n\n const pickerTemplate = 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\n const daysTemplate = optimizeTemplateHTML(`
\n
${createTagRepeat('span', 7, {class: 'dow'})}
\n
${createTagRepeat('span', 42)}
\n
`);\n\n const weekNumbersTemplate = optimizeTemplateHTML(`
\n
\n
${createTagRepeat('span', 6, {class: 'week'})}
\n
`);\n\n // Base class of the view classes\n 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\n 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\n function 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\n 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 }\n\n function 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\n 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\n 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)\n 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\n 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\n function clearSelection(datepicker) {\n datepicker.setDate({clear: true});\n }\n\n 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\n 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\n function 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\n function onClickViewSwitch(datepicker) {\n switchView(datepicker);\n }\n\n function onClickPrevButton(datepicker) {\n goToPrevOrNext(datepicker, -1);\n }\n\n function onClickNextButton(datepicker) {\n goToPrevOrNext(datepicker, 1);\n }\n\n // For the picker's main block to delegete the events from `datepicker-cell`s\n 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\n function onMousedownPicker(ev) {\n ev.preventDefault();\n }\n\n const orientClasses = ['left', 'top', 'right', 'bottom'].reduce((obj, key) => {\n obj[key] = `datepicker-orient-${key}`;\n return obj;\n }, {});\n const toPx = num => num ? `${num}px` : num;\n\n function 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\n function 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\n function 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\n function getTextDirection(el) {\n return window.getComputedStyle(el).direction;\n }\n\n // find the closet scrollable ancestor elemnt under the body\n function 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\n 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\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\n function 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\n function 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\n 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\n 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\n 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\n 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\n function onPaste(datepicker, ev) {\n if (ev.clipboardData.types.includes('text/plain')) {\n datepicker.enterEditMode();\n }\n }\n\n // for the `document` to delegate the events from outside the picker/input field\n 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\n function 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\n function 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\n function 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\n function 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\n function 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 */\n 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\n // filter out the config options inapproprite to pass to Datepicker\n function filterOptions(options) {\n const newOpts = Object.assign({}, options);\n\n delete newOpts.inputs;\n delete newOpts.allowOneSidedRange;\n delete newOpts.maxNumberOfDates; // to ensure each datepicker handles a single date\n\n return newOpts;\n }\n\n function setupDatepicker(rangepicker, changeDateListener, el, options) {\n registerListeners(rangepicker, [\n [el, 'changeDate', changeDateListener],\n ]);\n new Datepicker(el, options, rangepicker);\n }\n\n function onChangeDate(rangepicker, ev) {\n // to prevent both datepickers trigger the other side's update each other\n if (rangepicker._updating) {\n return;\n }\n rangepicker._updating = true;\n\n const target = ev.target;\n if (target.datepicker === undefined) {\n return;\n }\n\n const datepickers = rangepicker.datepickers;\n const [datepicker0, datepicker1] = datepickers;\n const setDateOptions = {render: false};\n const changedSide = rangepicker.inputs.indexOf(target);\n const otherSide = changedSide === 0 ? 1 : 0;\n const changedDate = datepickers[changedSide].dates[0];\n const otherDate = datepickers[otherSide].dates[0];\n\n if (changedDate !== undefined && otherDate !== undefined) {\n // if the start of the range > the end, swap them\n if (changedSide === 0 && changedDate > otherDate) {\n datepicker0.setDate(otherDate, setDateOptions);\n datepicker1.setDate(changedDate, setDateOptions);\n } else if (changedSide === 1 && changedDate < otherDate) {\n datepicker0.setDate(changedDate, setDateOptions);\n datepicker1.setDate(otherDate, setDateOptions);\n }\n } else if (!rangepicker.allowOneSidedRange) {\n // to prevent the range from becoming one-sided, copy changed side's\n // selection (no matter if it's empty) to the other side\n if (changedDate !== undefined || otherDate !== undefined) {\n setDateOptions.clear = true;\n datepickers[otherSide].setDate(datepickers[changedSide].dates, setDateOptions);\n }\n }\n datepickers.forEach((datepicker) => {\n datepicker.picker.update().render();\n });\n delete rangepicker._updating;\n }\n\n /**\n * Class representing a date range picker\n */\n class DateRangePicker {\n /**\n * Create a date range picker\n * @param {Element} element - element to bind a date range picker\n * @param {Object} [options] - config options\n */\n constructor(element, options = {}) {\n let inputs = Array.isArray(options.inputs)\n ? options.inputs\n : Array.from(element.querySelectorAll('input'));\n if (inputs.length < 2) {\n return;\n }\n\n element.rangepicker = this;\n this.element = element;\n this.inputs = inputs = inputs.slice(0, 2);\n Object.freeze(inputs);\n this.allowOneSidedRange = !!options.allowOneSidedRange;\n\n const changeDateListener = onChangeDate.bind(null, this);\n const cleanOptions = filterOptions(options);\n // in order for initial date setup to work right when pcicLvel > 0,\n // let Datepicker constructor add the instance to the rangepicker\n const datepickers = this.datepickers = [];\n inputs.forEach((input) => {\n setupDatepicker(this, changeDateListener, input, cleanOptions);\n });\n Object.freeze(datepickers);\n Object.defineProperty(this, 'dates', {\n get() {\n return datepickers.map(datepicker => datepicker.dates[0]);\n },\n });\n // normalize the range if inital dates are given\n if (datepickers[0].dates.length > 0) {\n onChangeDate(this, {target: inputs[0]});\n } else if (datepickers[1].dates.length > 0) {\n onChangeDate(this, {target: inputs[1]});\n }\n }\n\n /**\n * Set new values to the config options\n * @param {Object} options - config options to update\n */\n setOptions(options) {\n this.allowOneSidedRange = !!options.allowOneSidedRange;\n\n const cleanOptions = filterOptions(options);\n this.datepickers.forEach((datepicker) => {\n datepicker.setOptions(cleanOptions);\n });\n }\n\n /**\n * Destroy the DateRangePicker instance\n * @return {DateRangePicker} - the instance destroyed\n */\n destroy() {\n this.datepickers.forEach((datepicker) => {\n datepicker.destroy();\n });\n unregisterListeners(this);\n delete this.element.rangepicker;\n }\n\n /**\n * Get the start and end dates of the date range\n *\n * The method returns Date objects by default. If format string is passed,\n * it returns date strings formatted in given format.\n * The result array always contains 2 items (start date/end date) and\n * undefined is used for unselected side. (e.g. If none is selected,\n * the result will be [undefined, undefined]. If only the end date is set\n * when allowOneSidedRange config option is true, [undefined, endDate] will\n * be returned.)\n *\n * @param {String} [format] - Format string to stringify the dates\n * @return {Array} - Start and end dates\n */\n getDates(format = undefined) {\n const callback = format\n ? date => formatDate(date, format, this.datepickers[0].config.locale)\n : date => new Date(date);\n\n return this.dates.map(date => date === undefined ? date : callback(date));\n }\n\n /**\n * Set the start and end dates of the date range\n *\n * The method calls datepicker.setDate() internally using each of the\n * arguments in start→end order.\n *\n * When a clear: true option object is passed instead of a date, the method\n * clears the date.\n *\n * If an invalid date, the same date as the current one or an option object\n * without clear: true is passed, the method considers that argument as an\n * \"ineffective\" argument because calling datepicker.setDate() with those\n * values makes no changes to the date selection.\n *\n * When the allowOneSidedRange config option is false, passing {clear: true}\n * to clear the range works only when it is done to the last effective\n * argument (in other words, passed to rangeEnd or to rangeStart along with\n * ineffective rangeEnd). This is because when the date range is changed,\n * it gets normalized based on the last change at the end of the changing\n * process.\n *\n * @param {Date|Number|String|Object} rangeStart - Start date of the range\n * or {clear: true} to clear the date\n * @param {Date|Number|String|Object} rangeEnd - End date of the range\n * or {clear: true} to clear the date\n */\n setDates(rangeStart, rangeEnd) {\n const {\n datepickers: [datepicker0, datepicker1],\n inputs: [input0, input1],\n dates: [origDate0, origDate1],\n } = this;\n\n // If range normalization runs on every change, we can't set a new range\n // that starts after the end of the current range correctly because the\n // normalization process swaps start↔︎end right after setting the new start\n // date. To prevent this, the normalization process needs to run once after\n // both of the new dates are set.\n this._updating = true;\n datepicker0.setDate(rangeStart);\n datepicker1.setDate(rangeEnd);\n delete this._updating;\n\n if (datepicker1.dates[0] !== origDate1) {\n onChangeDate(this, {target: input1});\n } else if (datepicker0.dates[0] !== origDate0) {\n onChangeDate(this, {target: input0});\n }\n }\n }\n\n window.Datepicker = Datepicker;\n window.DateRangePicker = DateRangePicker;\n\n})();\n","/* global materialSymbolsUrl vanilla_datepicker_i18n Datepicker cmsNativeLanguage */\nconst getMaterialSymbolSVG = (id) => {\n return ``;\n};\n\nfunction initDateInput(inputWrapper, clearButton = true) {\n const cancelIcon = getMaterialSymbolSVG('cancel_400');\n const calendarIconSVG = getMaterialSymbolSVG('calendar_month_400');\n\n const calendarIcon = document.createElement('div');\n calendarIcon.classList.add('calendar-icon');\n calendarIcon.innerHTML = calendarIconSVG;\n inputWrapper.appendChild(calendarIcon);\n\n if (clearButton) {\n const dateResetBtn = document.createElement('div');\n dateResetBtn.classList.add('date-reset');\n dateResetBtn.innerHTML = cancelIcon;\n inputWrapper.appendChild(dateResetBtn);\n\n return dateResetBtn;\n }\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n Object.assign(Datepicker.locales, vanilla_datepicker_i18n);\n const nextArrow = getMaterialSymbolSVG('keyboard_double_arrow_right_400');\n const prevArrow = getMaterialSymbolSVG('keyboard_double_arrow_left_400');\n\n const monthParser = (dateString) => {\n const regex = /([0-9]{2})(\\/|-|.)([0-9]{4})/;\n if (regex.test(dateString)) {\n const [, month, , year] = regex.exec(dateString);\n return new Date(Number(year), Number(month) - 1, 1);\n } else {\n return dateString;\n }\n };\n\n function initVanillaDatepickerDropdown(element) {\n if (element && !element.datepicker) {\n const dropdownElement = document.getElementById(element.dataset.dropdownId);\n const filterReset = dropdownElement.parentElement.querySelector('.filter-compact__dropdown-reset');\n const inputWrapper = dropdownElement.parentElement.querySelector('.filter-compact__dropdown-input');\n const datepickerInput = element.parentElement.querySelector('input');\n const datepickerRadio = dropdownElement.parentElement.querySelectorAll('input[type=\"radio\"]');\n const dateCheckbox = document.getElementById(datepickerInput.dataset.targetId);\n const chooseDateCheckboxes = document.querySelectorAll('[name=' + dateCheckbox.name + ']');\n const dateResetBtn = initDateInput(inputWrapper);\n\n chooseDateCheckboxes.forEach((checkbox) => {\n checkbox.addEventListener('change', function (event) {\n if (event.target.checked && event.target.id === datepickerInput.dataset.targetId) {\n const viewDate = checkbox.getAttribute('data-init-timestamp')\n ? new Date(parseInt(checkbox.getAttribute('data-init-timestamp')))\n : Date.now();\n new window.Datepicker(element, {\n buttonClass: 'btn',\n language: cmsNativeLanguage,\n maxView: 2,\n pickLevel: 1,\n startView: 1,\n nextArrow,\n prevArrow,\n defaultViewDate: viewDate,\n });\n } else if (element.datepicker) {\n element.datepicker.destroy();\n datepickerInput.value = '';\n }\n });\n });\n\n dateResetBtn.addEventListener('click', function () {\n if (element.datepicker) element.datepicker.setDate({ clear: true });\n datepickerInput.value = '';\n });\n\n datepickerInput.addEventListener('focus', function () {\n if (!dateCheckbox.checked) {\n dateCheckbox.click();\n }\n });\n\n datepickerInput.addEventListener('change', () => {\n const parsed = monthParser(datepickerInput.value);\n element.datepicker.setDate(parsed);\n });\n\n filterReset.addEventListener('click', function (event) {\n event.preventDefault();\n\n datepickerRadio.forEach((radio) => {\n if (radio.checked === true) {\n radio.checked = false;\n radio.dispatchEvent(new Event('change'));\n // event trigger for jquery based event listener (f.e. jquery.listing.js)\n $(radio).trigger('change');\n }\n });\n });\n\n element.addEventListener('changeDate', function () {\n datepickerInput.value = element.datepicker.getDate('mm/yyyy');\n });\n }\n }\n\n document.querySelectorAll('.vanilla-datepicker[data-dropdown-id]').forEach((element) => {\n initVanillaDatepickerDropdown(element);\n });\n\n document.addEventListener('initVanillaDatepickerDropdown', (event) => {\n initVanillaDatepickerDropdown(event.target);\n });\n\n document.querySelectorAll('input.vanilla-datepicker').forEach((element) => {\n const datepickerInput = element.parentElement.querySelector('input');\n const minDate = datepickerInput.min ? { minDate: new Date(datepickerInput.min) } : {};\n const maxDate = datepickerInput.max ? { maxDate: new Date(datepickerInput.max) } : {};\n\n new window.Datepicker(datepickerInput, {\n buttonClass: 'btn',\n clearButton: true,\n language: cmsNativeLanguage,\n todayButton: true,\n todayButtonMode: 1,\n todayHighlight: true,\n nextArrow,\n prevArrow,\n ...minDate,\n ...maxDate,\n });\n\n datepickerInput.blur();\n\n const dateResetBtn = initDateInput(element.parentElement);\n\n dateResetBtn.addEventListener('click', function (e) {\n e.preventDefault();\n if (element.datepicker) {\n element.datepicker.setDate({ clear: true });\n }\n\n datepickerInput.value = '';\n datepickerInput.focus();\n });\n });\n\n document.querySelectorAll('.vanilla-range-datepicker').forEach((element) => {\n const minDate = element.dataset.min ? { minDate: new Date(element.dataset.min) } : {};\n const maxDate = element.dataset.max ? { maxDate: new Date(element.dataset.max) } : {};\n\n const inputs = element.querySelectorAll('input');\n\n inputs.forEach((input) => {\n initDateInput(input.parentElement, false);\n\n input.addEventListener('changeDate', (event) => {\n if (event.target.value) {\n input.parentElement.classList.add('active');\n }\n\n if (!event.target.value && input !== document.activeElement) {\n input.parentElement.classList.remove('active');\n }\n });\n });\n\n new window.DateRangePicker(element, {\n buttonClass: 'btn',\n clearButton: true,\n language: cmsNativeLanguage,\n todayButton: true,\n todayButtonMode: 1,\n nextArrow,\n prevArrow,\n ...minDate,\n ...maxDate,\n });\n });\n});\n"]}