PageSourceSearch

https://www.saint-medard-en-jalles.fr/wp-content/cache/min/1/wp-co…/dist/js/datepicker.js?ver=1790169802

js saint-medard-en-jalles.fr collected 2026-09-24 09:57:47 UTC 51,250 bytes, 365 lines download raw bytes

1var Datepicker=(function(){'use strict';function hasProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}
2function lastItemOf(arr){return arr[arr.length-1]}
3function pushUnique(arr,...items){items.forEach((item)=>{if(arr.includes(item)){return}
4arr.push(item)});return arr}
5function stringToArray(str,separator){return str?str.split(separator):[]}
6function isInRange(testVal,min,max){const minOK=min===undefined||testVal>=min;const maxOK=max===undefined||testVal<=max;return minOK&&maxOK}
7function limitToRange(val,min,max){if(val<min){return min}
8if(val>max){return max}
9return val}
10function createTagRepeat(tagName,repeat,attributes={},index=0,html=''){const openTagSrc=Object.keys(attributes).reduce((src,attr)=>{let val=attributes[attr];if(typeof val==='function'){val=val(index)}
11return `${src} ${attr}="${val}"`},tagName);html+=`<${openTagSrc}></${tagName}>`;const next=index+1;return next<repeat?createTagRepeat(tagName,repeat,attributes,next,html):html}
12function optimizeTemplateHTML(html){return html.replace(/>\s+/g,'>').replace(/\s+</,'<')}
13function stripTime(timeValue){return new Date(timeValue).setHours(0,0,0,0)}
14function today(){return new Date().setHours(0,0,0,0)}
15function dateValue(...args){switch(args.length){case 0:return today();case 1:return stripTime(args[0])}
16const newDate=new Date(0);newDate.setFullYear(...args);return newDate.setHours(0,0,0,0)}
17function addDays(date,amount){const newDate=new Date(date);return newDate.setDate(newDate.getDate()+amount)}
18function addWeeks(date,amount){return addDays(date,amount*7)}
19function addMonths(date,amount){const newDate=new Date(date);const monthsToSet=newDate.getMonth()+amount;let expectedMonth=monthsToSet%12;if(expectedMonth<0){expectedMonth+=12}
20const time=newDate.setMonth(monthsToSet);return newDate.getMonth()!==expectedMonth?newDate.setDate(0):time}
21function addYears(date,amount){const newDate=new Date(date);const expectedMonth=newDate.getMonth();const time=newDate.setFullYear(newDate.getFullYear()+amount);return expectedMonth===1&&newDate.getMonth()===2?newDate.setDate(0):time}
22function dayDiff(day,from){return(day-from+7)%7}
23function dayOfTheWeekOf(baseDate,dayOfWeek,weekStart=0){const baseDay=new Date(baseDate).getDay();return addDays(baseDate,dayDiff(dayOfWeek,weekStart)-dayDiff(baseDay,weekStart))}
24function getWeek(date){const thuOfTheWeek=dayOfTheWeekOf(date,4,1);const firstThu=dayOfTheWeekOf(new Date(thuOfTheWeek).setMonth(0,4),4,1);return Math.round((thuOfTheWeek-firstThu)/604800000)+1}
25function startOfYearPeriod(date,years){const year=new Date(date).getFullYear();return Math.floor(year/years)*years}
26function regularizeDate(date,timeSpan,useLastDate){if(timeSpan!==1&&timeSpan!==2){return date}
27const newDate=new Date(date);if(timeSpan===1){useLastDate?newDate.setMonth(newDate.getMonth()+1,0):newDate.setDate(1)}else{useLastDate?newDate.setFullYear(newDate.getFullYear()+1,0,0):newDate.setMonth(0,1)}
28return newDate.setHours(0,0,0,0)}
29const reFormatTokens=/dd?|DD?|mm?|MM?|yy?(?:yy)?/;const reNonDateParts=/[\s!-/:-@[-`{-~年月日]+/;let knownFormats={};const parseFns={y(date,year){return new Date(date).setFullYear(parseInt(year,10))},m(date,month,locale){const newDate=new Date(date);let monthIndex=parseInt(month,10)-1;if(isNaN(monthIndex)){if(!month){return NaN}
30const monthName=month.toLowerCase();const compareNames=name=>name.toLowerCase().startsWith(monthName);monthIndex=locale.monthsShort.findIndex(compareNames);if(monthIndex<0){monthIndex=locale.months.findIndex(compareNames)}
31if(monthIndex<0){return NaN}}
32newDate.setMonth(monthIndex);return newDate.getMonth()!==normalizeMonth(monthIndex)?newDate.setDate(0):newDate.getTime()},d(date,day){return new Date(date).setDate(parseInt(day,10))},};const formatFns={d(date){return date.getDate()},dd(date){return padZero(date.getDate(),2)},D(date,locale){return locale.daysShort[date.getDay()]},DD(date,locale){return locale.days[date.getDay()]},m(date){return date.getMonth()+1},mm(date){return padZero(date.getMonth()+1,2)},M(date,locale){return locale.monthsShort[date.getMonth()]},MM(date,locale){return locale.months[date.getMonth()]},y(date){return date.getFullYear()},yy(date){return padZero(date.getFullYear(),2).slice(-2)},yyyy(date){return padZero(date.getFullYear(),4)},};function normalizeMonth(monthIndex){return monthIndex>-1?monthIndex%12:normalizeMonth(monthIndex+12)}
33function padZero(num,length){return num.toString().padStart(length,'0')}
34function parseFormatString(format){if(typeof format!=='string'){throw new Error("Invalid date format.")}
35if(format in knownFormats){return knownFormats[format]}
36const separators=format.split(reFormatTokens);const parts=format.match(new RegExp(reFormatTokens,'g'));if(separators.length===0||!parts){throw new Error("Invalid date format.")}
37const partFormatters=parts.map(token=>formatFns[token]);const partParserKeys=Object.keys(parseFns).reduce((keys,key)=>{const token=parts.find(part=>part[0]!=='D'&&part[0].toLowerCase()===key);if(token){keys.push(key)}
38return keys},[]);return knownFormats[format]={parser(dateStr,locale){const dateParts=dateStr.split(reNonDateParts).reduce((dtParts,part,index)=>{if(part.length>0&&parts[index]){const token=parts[index][0];if(token==='M'){dtParts.m=part}else if(token!=='D'){dtParts[token]=part}}
38
39return dtParts},{});return partParserKeys.reduce((origDate,key)=>{const newDate=parseFns[key](origDate,dateParts[key],locale);return isNaN(newDate)?origDate:newDate},today())},formatter(date,locale){let dateStr=partFormatters.reduce((str,fn,index)=>{return str+=`${separators[index]}${fn(date, locale)}`},'');return dateStr+=lastItemOf(separators)},}}
40function parseDate(dateStr,format,locale){if(dateStr instanceof Date||typeof dateStr==='number'){const date=stripTime(dateStr);return isNaN(date)?undefined:date}
41if(!dateStr){return undefined}
42if(dateStr==='today'){return today()}
43if(format&&format.toValue){const date=format.toValue(dateStr,format,locale);return isNaN(date)?undefined:stripTime(date)}
44return parseFormatString(format).parser(dateStr,locale)}
45function formatDate(date,format,locale){if(isNaN(date)||(!date&&date!==0)){return''}
46const dateObj=typeof date==='number'?new Date(date):date;if(format.toDisplay){return format.toDisplay(dateObj,format,locale)}
47return parseFormatString(format).formatter(dateObj,locale)}
48const range=document.createRange();function parseHTML(html){return range.createContextualFragment(html)}
49function getParent(el){return el.parentElement||(el.parentNode instanceof ShadowRoot?el.parentNode.host:undefined)}
50function isActiveElement(el){return el.getRootNode().activeElement===el}
51function hideElement(el){if(el.style.display==='none'){return}
52if(el.style.display){el.dataset.styleDisplay=el.style.display}
53el.style.display='none'}
54function showElement(el){if(el.style.display!=='none'){return}
55if(el.dataset.styleDisplay){el.style.display=el.dataset.styleDisplay;delete el.dataset.styleDisplay}else{el.style.display=''}}
56function emptyChildNodes(el){if(el.firstChild){el.removeChild(el.firstChild);emptyChildNodes(el)}}
57function replaceChildNodes(el,newChildNodes){emptyChildNodes(el);if(newChildNodes instanceof DocumentFragment){el.appendChild(newChildNodes)}else if(typeof newChildNodes==='string'){el.appendChild(parseHTML(newChildNodes))}else if(typeof newChildNodes.forEach==='function'){newChildNodes.forEach((node)=>{el.appendChild(node)})}}
58const listenerRegistry=new WeakMap();const{addEventListener,removeEventListener}=EventTarget.prototype;function registerListeners(keyObj,listeners){let registered=listenerRegistry.get(keyObj);if(!registered){registered=[];listenerRegistry.set(keyObj,registered)}
59listeners.forEach((listener)=>{addEventListener.call(...listener);registered.push(listener)})}
60function unregisterListeners(keyObj){let listeners=listenerRegistry.get(keyObj);if(!listeners){return}
61listeners.forEach((listener)=>{removeEventListener.call(...listener)});listenerRegistry.delete(keyObj)}
62if(!Event.prototype.composedPath){const getComposedPath=(node,path=[])=>{path.push(node);let parent;if(node.parentNode){parent=node.parentNode}else if(node.host){parent=node.host}else if(node.defaultView){parent=node.defaultView}
63return parent?getComposedPath(parent,path):path};Event.prototype.composedPath=function(){return getComposedPath(this.target)}}
64function findFromPath(path,criteria,currentTarget){const[node,...rest]=path;if(criteria(node)){return node}
65if(node===currentTarget||node.tagName==='HTML'||rest.length===0){return}
66return findFromPath(rest,criteria,currentTarget)}
67function findElementInEventPath(ev,selector){const criteria=typeof selector==='function'?selector:el=>el instanceof Element&&el.matches(selector);return findFromPath(ev.composedPath(),criteria,ev.currentTarget)}
68const locales={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear",titleFormat:"MM y"}};const defaultOptions={autohide:!1,beforeShowDay:null,beforeShowDecade:null,beforeShowMonth:null,beforeShowYear:null,calendarWeeks:!1,clearBtn:!1,dateDelimiter:',',datesDisabled:[],daysOfWeekDisabled:[],daysOfWeekHighlighted:[],defaultViewDate:undefined,disableTouchKeyboard:!1,format:'mm/dd/yyyy',language:'en',maxDate:null,maxNumberOfDates:1,maxView:3,minDate:null,nextArrow:'» <span class="visually-hidden">Mois suivant</span>
68',orientation:'auto',pickLevel:0,prevArrow:'« <span class="visually-hidden">Mois précedent</span>',showDaysOfWeek:!0,showOnClick:!0,showOnFocus:!0,startView:0,title:'',todayBtn:!1,todayBtnMode:0,todayHighlight:!1,updateOnBlur:!0,weekStart:0,};const{language:defaultLang,format:defaultFormat,weekStart:defaultWeekStart,}=defaultOptions;function sanitizeDOW(dow,day){return dow.length<6&&day>=0&&day<7?pushUnique(dow,day):dow}
69function calcEndOfWeek(startOfWeek){return(startOfWeek+6)%7}
70function validateDate(value,format,locale,origValue){const date=parseDate(value,format,locale);return date!==undefined?date:origValue}
71function validateViewId(value,origValue,max=3){const viewId=parseInt(value,10);return viewId>=0&&viewId<=max?viewId:origValue}
72function processOptions(options,datepicker){const inOpts=Object.assign({},options);const config={};const locales=datepicker.constructor.locales;const rangeSideIndex=datepicker.rangeSideIndex;let{format,language,locale,maxDate,maxView,minDate,pickLevel,startView,weekStart,}=datepicker.config||{};if(inOpts.language){let lang;if(inOpts.language!==language){if(locales[inOpts.language]){lang=inOpts.language}else{lang=inOpts.language.split('-')[0];if(locales[lang]===undefined){lang=!1}}}
73delete inOpts.language;if(lang){language=config.language=lang;const origLocale=locale||locales[defaultLang];locale=Object.assign({format:defaultFormat,weekStart:defaultWeekStart},locales[defaultLang]);if(language!==defaultLang){Object.assign(locale,locales[language])}
74config.locale=locale;if(format===origLocale.format){format=config.format=locale.format}
75if(weekStart===origLocale.weekStart){weekStart=config.weekStart=locale.weekStart;config.weekEnd=calcEndOfWeek(locale.weekStart)}}}
76if(inOpts.format){const hasToDisplay=typeof inOpts.format.toDisplay==='function';const hasToValue=typeof inOpts.format.toValue==='function';const validFormatString=reFormatTokens.test(inOpts.format);if((hasToDisplay&&hasToValue)||validFormatString){format=config.format=inOpts.format}
77delete inOpts.format}
78let newPickLevel=pickLevel;if(inOpts.pickLevel!==undefined){newPickLevel=validateViewId(inOpts.pickLevel,2);delete inOpts.pickLevel}
79if(newPickLevel!==pickLevel){if(newPickLevel>pickLevel){if(inOpts.minDate===undefined){inOpts.minDate=minDate}
80if(inOpts.maxDate===undefined){inOpts.maxDate=maxDate}}
81if(!inOpts.datesDisabled){inOpts.datesDisabled=[]}
82pickLevel=config.pickLevel=newPickLevel}
83let minDt=minDate;let maxDt=maxDate;if(inOpts.minDate!==undefined){const defaultMinDt=dateValue(0,0,1);minDt=inOpts.minDate===null?defaultMinDt:validateDate(inOpts.minDate,format,locale,minDt);if(minDt!==defaultMinDt){minDt=regularizeDate(minDt,pickLevel,!1)}
84delete inOpts.minDate}
85if(inOpts.maxDate!==undefined){maxDt=inOpts.maxDate===null?undefined:validateDate(inOpts.maxDate,format,locale,maxDt);if(maxDt!==undefined){maxDt=regularizeDate(maxDt,pickLevel,!0)}
86delete inOpts.maxDate}
87if(maxDt<minDt){minDate=config.minDate=maxDt;maxDate=config.maxDate=minDt}else{if(minDate!==minDt){minDate=config.minDate=minDt}
88if(maxDate!==maxDt){maxDate=config.maxDate=maxDt}}
89if(inOpts.datesDisabled){config.datesDisabled=inOpts.datesDisabled.reduce((dates,dt)=>{const date=parseDate(dt,format,locale);return date!==undefined?pushUnique(dates,regularizeDate(date,pickLevel,rangeSideIndex)):dates},[]);delete inOpts.datesDisabled}
90if(inOpts.defaultViewDate!==undefined){const viewDate=parseDate(inOpts.defaultViewDate,format,locale);if(viewDate!==undefined){config.defaultViewDate=viewDate}
91delete inOpts.defaultViewDate}
92if(inOpts.weekStart!==undefined){const wkStart=Number(inOpts.weekStart)%7;if(!isNaN(wkStart)){weekStart=config.weekStart=wkStart;config.weekEnd=calcEndOfWeek(wkStart)}
93delete inOpts.weekStart}
94if(inOpts.daysOfWeekDisabled){config.daysOfWeekDisabled=inOpts.daysOfWeekDisabled.reduce(sanitizeDOW,[]);delete inOpts.daysOfWeekDisabled}
95if(inOpts.daysOfWeekHighlighted){config.daysOfWeekHighlighted=inOpts.daysOfWeekHighlighted.reduce(sanitizeDOW,[]);delete inOpts.daysOfWeekHighlighted}
96if(inOpts.maxNumberOfDates!==undefined){const maxNumberOfDates=parseInt(inOpts.maxNumberOfDates,10);if(maxNumberOfDates>=0){config.maxNumberOfDates=maxNumberOfDates;config.multidate=maxNumberOfDates!==1}
97delete inOpts.maxNumberOfDates}
98if(inOpts.dateDelimiter){config.dateDelimiter=String(inOpts.dateDelimiter);delete inOpts.dateDelimiter}
99let newMaxView=maxView;
99if(inOpts.maxView!==undefined){newMaxView=validateViewId(inOpts.maxView,maxView);delete inOpts.maxView}
100newMaxView=pickLevel>newMaxView?pickLevel:newMaxView;if(newMaxView!==maxView){maxView=config.maxView=newMaxView}
101let newStartView=startView;if(inOpts.startView!==undefined){newStartView=validateViewId(inOpts.startView,newStartView);delete inOpts.startView}
102if(newStartView<pickLevel){newStartView=pickLevel}else if(newStartView>maxView){newStartView=maxView}
103if(newStartView!==startView){config.startView=newStartView}
104if(inOpts.prevArrow){const prevArrow=parseHTML(inOpts.prevArrow);if(prevArrow.childNodes.length>0){config.prevArrow=prevArrow.childNodes}
105delete inOpts.prevArrow}
106if(inOpts.nextArrow){const nextArrow=parseHTML(inOpts.nextArrow);if(nextArrow.childNodes.length>0){config.nextArrow=nextArrow.childNodes}
107delete inOpts.nextArrow}
108if(inOpts.disableTouchKeyboard!==undefined){config.disableTouchKeyboard='ontouchstart' in document&&!!inOpts.disableTouchKeyboard;delete inOpts.disableTouchKeyboard}
109if(inOpts.orientation){const orientation=inOpts.orientation.toLowerCase().split(/\s+/g);config.orientation={x:orientation.find(x=>(x==='left'||x==='right'))||'auto',y:orientation.find(y=>(y==='top'||y==='bottom'))||'auto',};delete inOpts.orientation}
110if(inOpts.todayBtnMode!==undefined){switch(inOpts.todayBtnMode){case 0:case 1:config.todayBtnMode=inOpts.todayBtnMode}
111delete inOpts.todayBtnMode}
112Object.keys(inOpts).forEach((key)=>{if(inOpts[key]!==undefined&&hasProperty(defaultOptions,key)){config[key]=inOpts[key]}});return config}
113const pickerTemplate=optimizeTemplateHTML(`<div class="datepicker">
114  <div class="datepicker-picker">
115    <div class="datepicker-header">
116      <div class="datepicker-title"></div>
117      <div class="datepicker-controls">
118        <button type="button" class="%buttonClass% prev-btn"></button>
119        <button type="button" class="%buttonClass% view-switch"></button>
120        <button type="button" class="%buttonClass% next-btn"></button>
121      </div>
122    </div>
123    <div class="datepicker-main"></div>
124    <div class="datepicker-footer">
125      <div class="datepicker-controls">
126        <button type="button" class="%buttonClass% today-btn"></button>
127        <button type="button" class="%buttonClass% clear-btn"></button>
128      </div>
129    </div>
130  </div>
131</div>`);const daysTemplate=optimizeTemplateHTML(`<div class="days">
132  <div class="days-of-week">${createTagRepeat('button', 7, {class: 'dow'})}</div>
133  <div class="datepicker-grid">${createTagRepeat('button', 42)}</div>
134</div>`);const calendarWeeksTemplate=optimizeTemplateHTML(`<div class="calendar-weeks">
135  <div class="days-of-week"><button class="dow"></button></div>
136  <div class="weeks">${createTagRepeat('button', 6, {class: 'week'})}</div>
137</div>`);class View{constructor(picker,config){Object.assign(this,config,{picker,element:parseHTML(`<div class="datepicker-view"></div>`).firstChild,selected:[],});this.init(this.picker.datepicker.config)}
138init(options){if(options.pickLevel!==undefined){this.isMinView=this.id===options.pickLevel}
139this.setOptions(options);this.updateFocus();this.updateSelection()}
140performBeforeHook(el,current,timeValue){let result=this.beforeShow(new Date(timeValue));switch(typeof result){case 'boolean':result={enabled:result};break;case 'string':result={classes:result}}
141if(result){if(result.enabled===!1){el.classList.add('disabled');pushUnique(this.disabled,current)}
142if(result.classes){const extraClasses=result.classes.split(/\s+/);el.classList.add(...extraClasses);if(extraClasses.includes('disabled')){pushUnique(this.disabled,current)}}
143if(result.content){replaceChildNodes(el,result.content)}}}}
144class DaysView extends View{constructor(picker){super(picker,{id:0,name:'days',cellClass:'day',})}
145init(options,onConstruction=!0){if(onConstruction){const inner=parseHTML(daysTemplate).firstChild;this.dow=inner.firstChild;this.grid=inner.lastChild;this.element.appendChild(inner)}
146super.init(options)}
147setOptions(options){let updateDOW;if(hasProperty(options,'minDate')){this.minDate=options.minDate}
148if(hasProperty(options,'maxDate')){this.maxDate=options.maxDate}
149if(options.datesDisabled){this.datesDisabled=options.datesDisabled}
150if(options.daysOfWeekDisabled){this.daysOfWeekDisabled=options.daysOfWeekDisabled;updateDOW=!0}
151if(options.daysOfWeekHighlighted){this.daysOfWeekHighlighted=options.daysOfWeekHighlighted}
152if(options.todayHighlight!==undefined){this.todayHighlight=options.todayHighlight}
153if(options.weekStart!==undefined){this.weekStart=options.weekStart;this.weekEnd=options.weekEnd;updateDOW=!0}
154if(options.locale){const locale=this.locale=options.locale;this.dayNames=locale.daysMin;this.switchLabelFormat=locale.titleFormat;updateDOW=!0}
155if(options.beforeShowDay!==undefined){this.beforeShow=typeof options.beforeShowDay==='function'?options.beforeShowDay:undefined}
156if(options.calendarWeeks!==undefined){if(options.calendarWeeks&&!this.calendarWeeks){const weeksElem=parseHTML(calendarWeeksTemplate).firstChild;this.calendarWeeks={element:weeksElem,dow:weeksElem.firstChild,weeks:weeksElem.lastChild,};this.element.insertBefore(weeksElem,this.element.firstChild)}else if(this.calendarWeeks&&!options.calendarWeeks){this.element.removeChild(this.calendarWeeks.element);this.calendarWeeks=null}}
157if(options.showDaysOfWeek!==undefined){if(options.showDaysOfWeek){showElement(this.dow);if(this.calendarWeeks){showElement(this.calendarWeeks.dow)}}else{hideElement(this.dow);if(this.calendarWeeks){hideElement(this.calendarWeeks.dow)}}}
158if(updateDOW){Array.from(this.dow.children).forEach((el,index)=>{const dow=(this.weekStart+index)%7;el.textContent=this.dayNames[dow];el.className=this.daysOfWeekDisabled.includes(dow)?'dow disabled':'dow'})}}
159updateFocus(){const viewDate=new Date(this.picker.viewDate);const viewYear=viewDate.getFullYear();const viewMonth=viewDate.getMonth();const firstOfMonth=dateValue(viewYear,viewMonth,1);const start=dayOfTheWeekOf(firstOfMonth,this.weekStart,this.weekStart);this.first=firstOfMonth;this.last=dateValue(viewYear,viewMonth+1,0);this.start=start;this.focused=this.picker.viewDate}
160updateSelection(){const{dates,rangepicker}=this.picker.datepicker;this.selected=dates;if(rangepicker){this.range=rangepicker.dates}}
161render(){this.today=this.todayHighlight?today():undefined;this.disabled=[...this.datesDisabled];const switchLabel=formatDate(this.focused,this.switchLabelFormat,this.locale);this.picker.setViewSwitchLabel(switchLabel);this.picker.setPrevBtnDisabled(this.first<=this.minDate);this.picker.setNextBtnDisabled(this.last>=this.maxDate);if(this.calendarWeeks){const startOfWeek=dayOfTheWeekOf(this.first,1,1);Array.from(this.calendarWeeks.weeks.children).forEach((el,index)=>{el.textContent=getWeek(addWeeks(startOfWeek,index))})}
162Array.from(this.grid.children).forEach((el,index)=>{const classList=el.classList;const current=addDays(this.start,index);const date=new Date(current);const day=date.getDay();el.className=`datepicker-cell ${this.cellClass}`;el.dataset.date=current;el.textContent=date.getDate();if(current<this.first){classList.add('prev')}else if(current>this.last){classList.add('next')}
163if(this.today===current){classList.add('today')}
164if(current<this.minDate||current>this.maxDate||this.disabled.includes(current)){classList.add('disabled')}
165if(this.daysOfWeekDisabled.includes(day)){classList.add('disabled');pushUnique(this.disabled,current)}
166if(this.daysOfWeekHighlighted.includes(day)){classList.add('highlighted')}
167if(this.range){const[rangeStart,rangeEnd]=this.range;if(current>rangeStart&&current<rangeEnd){classList.add('range')}
168if(current===rangeStart){classList.add('range-start')}
169if(current===rangeEnd){classList.add('range-end')}}
170if(this.selected.includes(current)){classList.add('selected')}
171if(current===this.focused){classList.add('focused')}
172if(this.beforeShow){this.performBeforeHook(el,current,current)}})}
173refresh(){const[rangeStart,rangeEnd]=this.range||[];this.grid.querySelectorAll('.range, .range-start, .range-end, .selected, .focused').forEach((el)=>{el.classList.remove('range','range-start','range-end','selected','focused')});Array.from(this.grid.children).forEach((el)=>{const current=Number(el.dataset.date);const classList=el.classList;if(current>rangeStart&&current<rangeEnd){classList.add('range')}
174if(current===rangeStart){classList.add('range-start')}
175if(current===rangeEnd){classList.add('range-end')}
176if(this.selected.includes(current)){classList.add('selected')}
177if(current===this.focused){classList.add('focused')}})}
178refreshFocus(){const index=Math.round((this.focused-this.start)/86400000);this.grid.querySelectorAll('.focused').forEach((el)=>{el.classList.remove('focused')});this.grid.children[index].classList.add('focused')}}
179function computeMonthRange(range,thisYear){if(!range||!range[0]||!range[1]){return}
180const[[startY,startM],[endY,endM]]=range;if(startY>thisYear||endY<thisYear){return}
181return[startY===thisYear?startM:-1,endY===thisYear?endM:12,]}
182class MonthsView extends View{constructor(picker){super(picker,{id:1,name:'months',cellClass:'month',})}
183init(options,onConstruction=!0){if(onConstruction){this.grid=this.element;this.element.classList.add('months','datepicker-grid');this.grid.appendChild(parseHTML(createTagRepeat('button',12,{'data-month':ix=>ix})))}
184super.init(options)}
185setOptions(options){if(options.locale){this.monthNames=options.locale.monthsShort}
186if(hasProperty(options,'minDate')){if(options.minDate===undefined){this.minYear=this.minMonth=this.minDate=undefined}else{const minDateObj=new Date(options.minDate);this.minYear=minDateObj.getFullYear();this.minMonth=minDateObj.getMonth();this.minDate=minDateObj.setDate(1)}}
187if(hasProperty(options,'maxDate')){if(options.maxDate===undefined){this.maxYear=this.maxMonth=this.maxDate=undefined}else{const maxDateObj=new Date(options.maxDate);this.maxYear=maxDateObj.getFullYear();this.maxMonth=maxDateObj.getMonth();this.maxDate=dateValue(this.maxYear,this.maxMonth+1,0)}}
188if(this.isMinView){if(options.datesDisabled){this.datesDisabled=options.datesDisabled}}else{this.datesDisabled=[]}
189if(options.beforeShowMonth!==undefined){this.beforeShow=typeof options.beforeShowMonth==='function'?options.beforeShowMonth:undefined}}
190updateFocus(){const viewDate=new Date(this.picker.viewDate);this.year=viewDate.getFullYear();this.focused=viewDate.getMonth()}
191updateSelection(){const{dates,rangepicker}=this.picker.datepicker;this.selected=dates.reduce((selected,timeValue)=>{const date=new Date(timeValue);const year=date.getFullYear();const month=date.getMonth();if(selected[year]===undefined){selected[year]=[month]}else{pushUnique(selected[year],month)}
192return selected},{});if(rangepicker&&rangepicker.dates){this.range=rangepicker.dates.map(timeValue=>{const date=new Date(timeValue);return isNaN(date)?undefined:[date.getFullYear(),date.getMonth()]})}}
193render(){this.disabled=this.datesDisabled.reduce((arr,disabled)=>{const dt=new Date(disabled);if(this.year===dt.getFullYear()){arr.push(dt.getMonth())}
194return arr},[]);this.picker.setViewSwitchLabel(this.year);this.picker.setPrevBtnDisabled(this.year<=this.minYear);this.picker.setNextBtnDisabled(this.year>=this.maxYear);const selected=this.selected[this.year]||[];const yrOutOfRange=this.year<this.minYear||this.year>this.maxYear;const isMinYear=this.year===this.minYear;const isMaxYear=this.year===this.maxYear;const range=computeMonthRange(this.range,this.year);
194Array.from(this.grid.children).forEach((el,index)=>{const classList=el.classList;const date=dateValue(this.year,index,1);el.className=`datepicker-cell ${this.cellClass}`;if(this.isMinView){el.dataset.date=date}
195el.textContent=this.monthNames[index];if(yrOutOfRange||isMinYear&&index<this.minMonth||isMaxYear&&index>this.maxMonth||this.disabled.includes(index)){classList.add('disabled')}
196if(range){const[rangeStart,rangeEnd]=range;if(index>rangeStart&&index<rangeEnd){classList.add('range')}
197if(index===rangeStart){classList.add('range-start')}
198if(index===rangeEnd){classList.add('range-end')}}
199if(selected.includes(index)){classList.add('selected')}
200if(index===this.focused){classList.add('focused')}
201if(this.beforeShow){this.performBeforeHook(el,index,date)}})}
202refresh(){const selected=this.selected[this.year]||[];const[rangeStart,rangeEnd]=computeMonthRange(this.range,this.year)||[];this.grid.querySelectorAll('.range, .range-start, .range-end, .selected, .focused').forEach((el)=>{el.classList.remove('range','range-start','range-end','selected','focused')});Array.from(this.grid.children).forEach((el,index)=>{const classList=el.classList;if(index>rangeStart&&index<rangeEnd){classList.add('range')}
203if(index===rangeStart){classList.add('range-start')}
204if(index===rangeEnd){classList.add('range-end')}
205if(selected.includes(index)){classList.add('selected')}
206if(index===this.focused){classList.add('focused')}})}
207refreshFocus(){this.grid.querySelectorAll('.focused').forEach((el)=>{el.classList.remove('focused')});this.grid.children[this.focused].classList.add('focused')}}
208function toTitleCase(word){return[...word].reduce((str,ch,ix)=>str+=ix?ch:ch.toUpperCase(),'')}
209class YearsView extends View{constructor(picker,config){super(picker,config)}
210init(options,onConstruction=!0){if(onConstruction){this.navStep=this.step*10;this.beforeShowOption=`beforeShow${toTitleCase(this.cellClass)}`;this.grid=this.element;this.element.classList.add(this.name,'datepicker-grid');this.grid.appendChild(parseHTML(createTagRepeat('button',12)))}
211super.init(options)}
212setOptions(options){if(hasProperty(options,'minDate')){if(options.minDate===undefined){this.minYear=this.minDate=undefined}else{this.minYear=startOfYearPeriod(options.minDate,this.step);this.minDate=dateValue(this.minYear,0,1)}}
213if(hasProperty(options,'maxDate')){if(options.maxDate===undefined){this.maxYear=this.maxDate=undefined}else{this.maxYear=startOfYearPeriod(options.maxDate,this.step);this.maxDate=dateValue(this.maxYear,11,31)}}
214if(this.isMinView){if(options.datesDisabled){this.datesDisabled=options.datesDisabled}}else{this.datesDisabled=[]}
215if(options[this.beforeShowOption]!==undefined){const beforeShow=options[this.beforeShowOption];this.beforeShow=typeof beforeShow==='function'?beforeShow:undefined}}
216updateFocus(){const viewDate=new Date(this.picker.viewDate);const first=startOfYearPeriod(viewDate,this.navStep);const last=first+9*this.step;this.first=first;this.last=last;this.start=first-this.step;this.focused=startOfYearPeriod(viewDate,this.step)}
217updateSelection(){const{dates,rangepicker}=this.picker.datepicker;this.selected=dates.reduce((years,timeValue)=>{return pushUnique(years,startOfYearPeriod(timeValue,this.step))},[]);if(rangepicker&&rangepicker.dates){this.range=rangepicker.dates.map(timeValue=>{if(timeValue!==undefined){return startOfYearPeriod(timeValue,this.step)}})}}
218render(){this.disabled=this.datesDisabled.map(disabled=>new Date(disabled).getFullYear());this.picker.setViewSwitchLabel(`${this.first}-${this.last}`);this.picker.setPrevBtnDisabled(this.first<=this.minYear);this.picker.setNextBtnDisabled(this.last>=this.maxYear);Array.from(this.grid.children).forEach((el,index)=>{const classList=el.classList;const current=this.start+(index*this.step);const date=dateValue(current,0,1);el.className=`datepicker-cell ${this.cellClass}`;if(this.isMinView){el.dataset.date=date}
219el.textContent=el.dataset.year=current;if(index===0){classList.add('prev')}else if(index===11){classList.add('next')}
220if(current<this.minYear||current>this.maxYear||this.disabled.includes(current)){classList.add('disabled')}
221if(this.range){const[rangeStart,rangeEnd]=this.range;if(current>rangeStart&&current<rangeEnd){classList.add('range')}
222if(current===rangeStart){classList.add('range-start')}
223if(current===rangeEnd){classList.add('range-end')}}
224if(this.selected.includes(current)){classList.add('selected')}
225if(current===this.focused){classList.add('focused')}
226if(this.beforeShow){this.performBeforeHook(el,current,date)}})}
227refresh(){const[rangeStart,rangeEnd]=this.range||[];this.grid.querySelectorAll('.range, .range-start, .range-end, .selected, .focused').forEach((el)=>{el.classList.remove('range','range-start','range-end','selected','focused')});
227Array.from(this.grid.children).forEach((el)=>{const current=Number(el.textContent);const classList=el.classList;if(current>rangeStart&&current<rangeEnd){classList.add('range')}
228if(current===rangeStart){classList.add('range-start')}
229if(current===rangeEnd){classList.add('range-end')}
230if(this.selected.includes(current)){classList.add('selected')}
231if(current===this.focused){classList.add('focused')}})}
232refreshFocus(){const index=Math.round((this.focused-this.start)/this.step);this.grid.querySelectorAll('.focused').forEach((el)=>{el.classList.remove('focused')});this.grid.children[index].classList.add('focused')}}
233function triggerDatepickerEvent(datepicker,type){const detail={date:datepicker.getDate(),viewDate:new Date(datepicker.picker.viewDate),viewId:datepicker.picker.currentView.id,datepicker,};datepicker.element.dispatchEvent(new CustomEvent(type,{detail}))}
234function goToPrevOrNext(datepicker,direction){const{minDate,maxDate}=datepicker.config;const{currentView,viewDate}=datepicker.picker;let newViewDate;switch(currentView.id){case 0:newViewDate=addMonths(viewDate,direction);break;case 1:newViewDate=addYears(viewDate,direction);break;default:newViewDate=addYears(viewDate,direction*currentView.navStep)}
235newViewDate=limitToRange(newViewDate,minDate,maxDate);datepicker.picker.changeFocus(newViewDate).render()}
236function switchView(datepicker){const viewId=datepicker.picker.currentView.id;if(viewId===datepicker.config.maxView){return}
237datepicker.picker.changeView(viewId+1).render()}
238function unfocus(datepicker){if(datepicker.config.updateOnBlur){datepicker.update({revert:!0})}else{datepicker.refresh('input')}
239datepicker.hide()}
240function goToSelectedMonthOrYear(datepicker,selection){const picker=datepicker.picker;const viewDate=new Date(picker.viewDate);const viewId=picker.currentView.id;const newDate=viewId===1?addMonths(viewDate,selection-viewDate.getMonth()):addYears(viewDate,selection-viewDate.getFullYear());picker.changeFocus(newDate).changeView(viewId-1).render()}
241function onClickTodayBtn(datepicker){const picker=datepicker.picker;const currentDate=today();if(datepicker.config.todayBtnMode===1){if(datepicker.config.autohide){datepicker.setDate(currentDate);return}
242datepicker.setDate(currentDate,{render:!1});picker.update()}
243if(picker.viewDate!==currentDate){picker.changeFocus(currentDate)}
244picker.changeView(0).render()}
245function onClickClearBtn(datepicker){datepicker.setDate({clear:!0})}
246function onClickViewSwitch(datepicker){switchView(datepicker)}
247function onClickPrevBtn(datepicker){goToPrevOrNext(datepicker,-1)}
248function onClickNextBtn(datepicker){goToPrevOrNext(datepicker,1)}
249function onClickView(datepicker,ev){const target=findElementInEventPath(ev,'.datepicker-cell');if(!target||target.classList.contains('disabled')){return}
250const{id,isMinView}=datepicker.picker.currentView;if(isMinView){datepicker.setDate(Number(target.dataset.date))}else if(id===1){goToSelectedMonthOrYear(datepicker,Number(target.dataset.month))}else{goToSelectedMonthOrYear(datepicker,Number(target.dataset.year))}}
251function onMousedownPicker(ev){ev.preventDefault()}
252const orientClasses=['left','top','right','bottom'].reduce((obj,key)=>{obj[key]=`datepicker-orient-${key}`;return obj},{});const toPx=num=>num?`${num}px`:num;function processPickerOptions(picker,options){if(options.title!==undefined){if(options.title){picker.controls.title.textContent=options.title;showElement(picker.controls.title)}else{picker.controls.title.textContent='';hideElement(picker.controls.title)}}
253if(options.prevArrow){const prevBtn=picker.controls.prevBtn;emptyChildNodes(prevBtn);options.prevArrow.forEach((node)=>{prevBtn.appendChild(node.cloneNode(!0))})}
254if(options.nextArrow){const nextBtn=picker.controls.nextBtn;emptyChildNodes(nextBtn);options.nextArrow.forEach((node)=>{nextBtn.appendChild(node.cloneNode(!0))})}
255if(options.locale){picker.controls.todayBtn.textContent=options.locale.today;picker.controls.clearBtn.textContent=options.locale.clear}
256if(options.todayBtn!==undefined){if(options.todayBtn){showElement(picker.controls.todayBtn)}else{hideElement(picker.controls.todayBtn)}}
257if(hasProperty(options,'minDate')||hasProperty(options,'maxDate')){const{minDate,maxDate}=picker.datepicker.config;picker.controls.todayBtn.disabled=!isInRange(today(),minDate,maxDate)}
258if(options.clearBtn!==undefined){if(options.clearBtn){showElement(picker.controls.clearBtn)}else{hideElement(picker.controls.clearBtn)}}}
259function computeResetViewDate(datepicker){const{dates,config}=datepicker;const viewDate=dates.length>0?lastItemOf(dates):config.defaultViewDate;return limitToRange(viewDate,config.minDate,config.maxDate)}
260function setViewDate(picker,newDate){const oldViewDate=new Date(picker.viewDate);const newViewDate=new Date(newDate);const{id,year,first,last}=picker.currentView;const viewYear=newViewDate.getFullYear();picker.viewDate=newDate;if(viewYear!==oldViewDate.getFullYear()){triggerDatepickerEvent(picker.datepicker,'changeYear')}
261if(newViewDate.getMonth()!==oldViewDate.getMonth()){triggerDatepickerEvent(picker.datepicker,'changeMonth')}
262switch(id){case 0:return newDate<first||newDate>last;case 1:return viewYear!==year;default:return viewYear<first||viewYear>last}}
263function getTextDirection(el){return window.getComputedStyle(el).direction}
264function findScrollParents(el){const parent=getParent(el);if(parent===document.body||!parent){return}
265return window.getComputedStyle(parent).overflow!=='visible'?parent:findScrollParents(parent)}
266class Picker{constructor(datepicker){const{config}=this.datepicker=datepicker;const template=pickerTemplate.replace(/%buttonClass%/g,config.buttonClass);const element=this.element=parseHTML(template).firstChild;const[header,main,footer]=element.firstChild.children;const title=header.firstElementChild;const[prevBtn,viewSwitch,nextBtn]=header.lastElementChild.children;const[todayBtn,clearBtn]=footer.firstChild.children;const controls={title,prevBtn,viewSwitch,nextBtn,todayBtn,clearBtn,};this.main=main;this.controls=controls;const elementClass=datepicker.inline?'inline':'dropdown';element.classList.add(`datepicker-${elementClass}`);processPickerOptions(this,config);this.viewDate=computeResetViewDate(datepicker);registerListeners(datepicker,[[element,'mousedown',onMousedownPicker],[main,'click',onClickView.bind(null,datepicker)],[controls.viewSwitch,'click',onClickViewSwitch.bind(null,datepicker)],[controls.prevBtn,'click',onClickPrevBtn.bind(null,datepicker)],[controls.nextBtn,'click',onClickNextBtn.bind(null,datepicker)],[controls.todayBtn,'click',onClickTodayBtn.bind(null,datepicker)],[controls.clearBtn,'click',onClickClearBtn.bind(null,datepicker)],]);this.views=[new DaysView(this),new MonthsView(this),new YearsView(this,{id:2,name:'years',cellClass:'year',step:1}),new YearsView(this,{id:3,name:'decades',cellClass:'decade',step:10}),];this.currentView=this.views[config.startView];this.currentView.render();this.main.appendChild(this.currentView.element);if(config.container){config.container.appendChild(this.element)}else{datepicker.inputField.after(this.element)}}
267setOptions(options){processPickerOptions(this,options);this.views.forEach((view)=>{view.init(options,!1)});this.currentView.render()}
268detach(){this.element.remove()}
269show(){if(this.active){return}
270const{datepicker,element}=this;if(datepicker.inline){element.classList.add('active')}else{const inputDirection=getTextDirection(datepicker.inputField);if(inputDirection!==getTextDirection(getParent(element))){element.dir=inputDirection}else if(element.dir){element.removeAttribute('dir')}
271element.style.visiblity='hidden';element.classList.add('active');this.place();element.style.visiblity='';if(datepicker.config.disableTouchKeyboard){datepicker.inputField.blur()}}
272this.active=!0;triggerDatepickerEvent(datepicker,'show')}
273hide(){if(!this.active){return}
274this.datepicker.exitEditMode();this.element.classList.remove('active');this.active=!1;triggerDatepickerEvent(this.datepicker,'hide')}
275place(){const{classList,offsetParent,style}=this.element;const{config,inputField}=this.datepicker;const{width:calendarWidth,height:calendarHeight,}=this.element.getBoundingClientRect();const{left:inputLeft,top:inputTop,right:inputRight,bottom:inputBottom,width:inputWidth,height:inputHeight}=inputField.getBoundingClientRect();let{x:orientX,y:orientY}=config.orientation;let left=inputLeft;let top=inputTop;if(offsetParent===document.body||!offsetParent){left+=window.scrollX;top+=window.scrollY}else{const offsetParentRect=offsetParent.getBoundingClientRect();left-=offsetParentRect.left-offsetParent.scrollLeft;top-=offsetParentRect.top-offsetParent.scrollTop}
276const scrollParent=findScrollParents(inputField);let scrollAreaLeft=0;let scrollAreaTop=0;let{clientWidth:scrollAreaRight,clientHeight:scrollAreaBottom,}=document.documentElement;if(scrollParent){const scrollParentRect=scrollParent.getBoundingClientRect();if(scrollParentRect.top>0){scrollAreaTop=scrollParentRect.top}
277if(scrollParentRect.left>0){scrollAreaLeft=scrollParentRect.left}
278if(scrollParentRect.right<scrollAreaRight){scrollAreaRight=scrollParentRect.right}
279if(scrollParentRect.bottom<scrollAreaBottom){scrollAreaBottom=scrollParentRect.bottom}}
280let adjustment=0;if(orientX==='auto'){if(inputLeft<scrollAreaLeft){orientX='left';adjustment=scrollAreaLeft-inputLeft}else if(inputLeft+calendarWidth>scrollAreaRight){orientX='right';if(scrollAreaRight<inputRight){adjustment=scrollAreaRight-inputRight}}else if(getTextDirection(inputField)==='rtl'){orientX=inputRight-calendarWidth<scrollAreaLeft?'left':'right'}else{orientX='left'}}
281if(orientX==='right'){left+=inputWidth-calendarWidth}
282left+=adjustment;if(orientY==='auto'){if(inputTop-calendarHeight>scrollAreaTop){orientY=inputBottom+calendarHeight>scrollAreaBottom?'top':'bottom'}else{orientY='bottom'}}
283if(orientY==='top'){top-=calendarHeight}else{top+=inputHeight}
284classList.remove(...Object.values(orientClasses));classList.add(orientClasses[orientX],orientClasses[orientY]);style.left=toPx(left);style.top=toPx(top)}
285setViewSwitchLabel(labelText){this.controls.viewSwitch.textContent=labelText}
286setPrevBtnDisabled(disabled){this.controls.prevBtn.disabled=disabled}
287setNextBtnDisabled(disabled){this.controls.nextBtn.disabled=disabled}
288changeView(viewId){const oldView=this.currentView;const newView=this.views[viewId];if(newView.id!==oldView.id){this.currentView=newView;this._renderMethod='render';triggerDatepickerEvent(this.datepicker,'changeView');this.main.replaceChild(newView.element,oldView.element)}
289return this}
290changeFocus(newViewDate){this._renderMethod=setViewDate(this,newViewDate)?'render':'refreshFocus';this.views.forEach((view)=>{view.updateFocus()});return this}
291update(){const newViewDate=computeResetViewDate(this.datepicker);this._renderMethod=setViewDate(this,newViewDate)?'render':'refresh';this.views.forEach((view)=>{view.updateFocus();view.updateSelection()});return this}
292render(quickRender=!0){const renderMethod=(quickRender&&this._renderMethod)||'render';delete this._renderMethod;this.currentView[renderMethod]()}}
293function findNextAvailableOne(date,addFn,increase,testFn,min,max){if(!isInRange(date,min,max)){return}
294if(testFn(date)){const newDate=addFn(date,increase);return findNextAvailableOne(newDate,addFn,increase,testFn,min,max)}
295return date}
296function moveByArrowKey(datepicker,ev,direction,vertical){const picker=datepicker.picker;const currentView=picker.currentView;const step=currentView.step||1;let viewDate=picker.viewDate;let addFn;let testFn;switch(currentView.id){case 0:if(vertical){viewDate=addDays(viewDate,direction*7)}else if(ev.ctrlKey||ev.metaKey){viewDate=addYears(viewDate,direction)}else{viewDate=addDays(viewDate,direction)}
297addFn=addDays;testFn=(date)=>currentView.disabled.includes(date);break;case 1:viewDate=addMonths(viewDate,vertical?direction*4:direction);addFn=addMonths;testFn=(date)=>{const dt=new Date(date);const{year,disabled}=currentView;return dt.getFullYear()===year&&disabled.includes(dt.getMonth())};break;default:viewDate=addYears(viewDate,direction*(vertical?4:1)*step);addFn=addYears;testFn=date=>currentView.disabled.includes(startOfYearPeriod(date,step))}
298viewDate=findNextAvailableOne(viewDate,addFn,direction<0?-step:step,testFn,currentView.minDate,currentView.maxDate);if(viewDate!==undefined){picker.changeFocus(viewDate).render()}}
299function onKeydown(datepicker,ev){const key=ev.key;if(key==='Tab'){unfocus(datepicker);return}
300const picker=datepicker.picker;const{id,isMinView}=picker.currentView;if(!picker.active){if(key==='ArrowDown'){picker.show()}
300else{if(key==='Enter'){datepicker.update()}else if(key==='Escape'){picker.show()}
301return}}else if(datepicker.editMode){if(key==='Enter'){datepicker.exitEditMode({update:!0,autohide:datepicker.config.autohide})}else if(key==='Escape'){picker.hide()}
302return}else{if(key==='ArrowLeft'){if(ev.ctrlKey||ev.metaKey){goToPrevOrNext(datepicker,-1)}else if(ev.shiftKey){datepicker.enterEditMode();return}else{moveByArrowKey(datepicker,ev,-1,!1)}}else if(key==='ArrowRight'){if(ev.ctrlKey||ev.metaKey){goToPrevOrNext(datepicker,1)}else if(ev.shiftKey){datepicker.enterEditMode();return}else{moveByArrowKey(datepicker,ev,1,!1)}}else if(key==='ArrowUp'){if(ev.ctrlKey||ev.metaKey){switchView(datepicker)}else if(ev.shiftKey){datepicker.enterEditMode();return}else{moveByArrowKey(datepicker,ev,-1,!0)}}else if(key==='ArrowDown'){if(ev.shiftKey&&!ev.ctrlKey&&!ev.metaKey){datepicker.enterEditMode();return}
303moveByArrowKey(datepicker,ev,1,!0)}else if(key==='Enter'){if(isMinView){datepicker.setDate(picker.viewDate);return}
304picker.changeView(id-1).render()}else{if(key==='Escape'){picker.hide()}else if(key==='Backspace'||key==='Delete'||(key.length===1&&!ev.ctrlKey&&!ev.metaKey)){datepicker.enterEditMode()}
305return}}
306ev.preventDefault()}
307function onFocus(datepicker){if(datepicker.config.showOnFocus&&!datepicker._showing){datepicker.show()}}
308function onMousedown(datepicker,ev){const el=ev.target;if(datepicker.picker.active||datepicker.config.showOnClick){el._active=isActiveElement(el);el._clicking=setTimeout(()=>{delete el._active;delete el._clicking},2000)}}
309function onClickInput(datepicker,ev){const el=ev.target;if(!el._clicking){return}
310clearTimeout(el._clicking);delete el._clicking;if(el._active){datepicker.enterEditMode()}
311delete el._active;if(datepicker.config.showOnClick){datepicker.show()}}
312function onPaste(datepicker,ev){if(ev.clipboardData.types.includes('text/plain')){datepicker.enterEditMode()}}
313function onClickOutside(datepicker,ev){const{element,picker}=datepicker;if(!picker.active&&!isActiveElement(element)){return}
314const pickerElem=picker.element;if(findElementInEventPath(ev,el=>el===element||el===pickerElem)){return}
315unfocus(datepicker)}
316function stringifyDates(dates,config){return dates.map(dt=>formatDate(dt,config.format,config.locale)).join(config.dateDelimiter)}
317function processInputDates(datepicker,inputDates,clear=!1){const{config,dates:origDates,rangeSideIndex}=datepicker;if(inputDates.length===0){return clear?[]:undefined}
318let newDates=inputDates.reduce((dates,dt)=>{let date=parseDate(dt,config.format,config.locale);if(date===undefined){return dates}
319date=regularizeDate(date,config.pickLevel,rangeSideIndex);if(isInRange(date,config.minDate,config.maxDate)&&!dates.includes(date)&&!config.datesDisabled.includes(date)&&(config.pickLevel>0||!config.daysOfWeekDisabled.includes(new Date(date).getDay()))){dates.push(date)}
320return dates},[]);if(newDates.length===0){return}
321if(config.multidate&&!clear){newDates=newDates.reduce((dates,date)=>{if(!origDates.includes(date)){dates.push(date)}
322return dates},origDates.filter(date=>!newDates.includes(date)))}
323return config.maxNumberOfDates&&newDates.length>config.maxNumberOfDates?newDates.slice(config.maxNumberOfDates*-1):newDates}
324function refreshUI(datepicker,mode=3,quickRender=!0){const{config,picker,inputField}=datepicker;if(mode&2){const newView=picker.active?config.pickLevel:config.startView;picker.update().changeView(newView).render(quickRender)}
325if(mode&1&&inputField){inputField.value=stringifyDates(datepicker.dates,config)}}
326function setDate(datepicker,inputDates,options){let{clear,render,autohide,revert}=options;if(render===undefined){render=!0}
327if(!render){autohide=!1}else if(autohide===undefined){autohide=datepicker.config.autohide}
328const newDates=processInputDates(datepicker,inputDates,clear);if(!newDates&&!revert){return}
329if(newDates&&newDates.toString()!==datepicker.dates.toString()){datepicker.dates=newDates;refreshUI(datepicker,render?3:1);triggerDatepickerEvent(datepicker,'changeDate')}else{refreshUI(datepicker,1)}
330if(autohide){datepicker.hide()}}
331class Datepicker{constructor(element,options={},rangepicker=undefined){element.datepicker=this;this.element=element;const config=this.config=Object.assign({buttonClass:(options.buttonClass&&Str
331ing(options.buttonClass))||'button',container:null,defaultViewDate:today(),maxDate:undefined,minDate:undefined,},processOptions(defaultOptions,this));const inline=this.inline=element.tagName!=='INPUT';let inputField;if(inline){config.container=element}else{if(options.container){config.container=options.container instanceof HTMLElement?options.container:document.querySelector(options.container)}
332inputField=this.inputField=element;inputField.classList.add('datepicker-input')}
333if(rangepicker){const index=rangepicker.inputs.indexOf(inputField);const datepickers=rangepicker.datepickers;if(index<0||index>1||!Array.isArray(datepickers)){throw Error('Invalid rangepicker object.')}
334datepickers[index]=this;Object.defineProperty(this,'rangepicker',{get(){return rangepicker},});Object.defineProperty(this,'rangeSideIndex',{get(){return index},})}
335this._options=options;Object.assign(config,processOptions(options,this));let initialDates;if(inline){initialDates=stringToArray(element.dataset.date,config.dateDelimiter);delete element.dataset.date}else{initialDates=stringToArray(inputField.value,config.dateDelimiter)}
336this.dates=[];const inputDateValues=processInputDates(this,initialDates);if(inputDateValues&&inputDateValues.length>0){this.dates=inputDateValues}
337if(inputField){inputField.value=stringifyDates(this.dates,config)}
338const picker=this.picker=new Picker(this);if(inline){this.show()}else{const onMousedownDocument=onClickOutside.bind(null,this);const listeners=[[inputField,'keydown',onKeydown.bind(null,this)],[inputField,'focus',onFocus.bind(null,this)],[inputField,'mousedown',onMousedown.bind(null,this)],[inputField,'click',onClickInput.bind(null,this)],[inputField,'paste',onPaste.bind(null,this)],[document,'mousedown',onMousedownDocument],[document,'touchstart',onMousedownDocument],[window,'resize',picker.place.bind(picker)]];registerListeners(this,listeners)}}
339static formatDate(date,format,lang){return formatDate(date,format,lang&&locales[lang]||locales.en)}
340static parseDate(dateStr,format,lang){return parseDate(dateStr,format,lang&&locales[lang]||locales.en)}
341static get locales(){return locales}
342get active(){return!!(this.picker&&this.picker.active)}
343get pickerElement(){return this.picker?this.picker.element:undefined}
344setOptions(options){const picker=this.picker;const newOptions=processOptions(options,this);Object.assign(this._options,options);Object.assign(this.config,newOptions);picker.setOptions(newOptions);refreshUI(this,3)}
345show(){if(this.inputField){if(this.inputField.disabled){return}
346if(!isActiveElement(this.inputField)&&!this.config.disableTouchKeyboard){this._showing=!0;this.inputField.focus();delete this._showing}}
347this.picker.show()}
348hide(){if(this.inline){return}
349this.picker.hide();this.picker.update().changeView(this.config.startView).render()}
350destroy(){this.hide();unregisterListeners(this);this.picker.detach();if(!this.inline){this.inputField.classList.remove('datepicker-input')}
351delete this.element.datepicker;return this}
352getDate(format=undefined){const callback=format?date=>formatDate(date,format,this.config.locale):date=>new Date(date);if(this.config.multidate){return this.dates.map(callback)}
353if(this.dates.length>0){return callback(this.dates[0])}}
354setDate(...args){const dates=[...args];const opts={};const lastArg=lastItemOf(args);if(typeof lastArg==='object'&&!Array.isArray(lastArg)&&!(lastArg instanceof Date)&&lastArg){Object.assign(opts,dates.pop())}
355const inputDates=Array.isArray(dates[0])?dates[0]:dates;setDate(this,inputDates,opts)}
356update(options=undefined){if(this.inline){return}
357const opts=Object.assign(options||{},{clear:!0,render:!0});const inputDates=stringToArray(this.inputField.value,this.config.dateDelimiter);setDate(this,inputDates,opts)}
358refresh(target=undefined,forceRender=!1){if(target&&typeof target!=='string'){forceRender=target;target=undefined}
359let mode;if(target==='picker'){mode=2}else if(target==='input'){mode=1}else{mode=3}
360refreshUI(this,mode,!forceRender)}
361enterEditMode(){if(this.inline||!this.picker.active||this.editMode){return}
362this.editMode=!0;this.inputField.classList.add('in-edit')}
363exitEditMode(options=undefined){if(this.inline||!this.editMode){return}
364const opts=Object.assign({update:!1},options);delete this.editMode;this.inputField.classList.remove('in-edit');if(opts.update){this.update(opts)}}}
365return Datepicker})()

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.