1309 lines
37 KiB
JavaScript
1309 lines
37 KiB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
|
||
if(typeof exports === 'object' && typeof module === 'object')
|
||
module.exports = factory();
|
||
else if(typeof define === 'function' && define.amd)
|
||
define([], factory);
|
||
else if(typeof exports === 'object')
|
||
exports["Datepickk"] = factory();
|
||
else
|
||
root["Datepickk"] = factory();
|
||
})(this, function() {
|
||
return /******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId]) {
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ i: moduleId,
|
||
/******/ l: false,
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.l = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // define getter function for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||
/******/ Object.defineProperty(exports, name, {
|
||
/******/ configurable: false,
|
||
/******/ enumerable: true,
|
||
/******/ get: getter
|
||
/******/ });
|
||
/******/ }
|
||
/******/ };
|
||
/******/
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function getDefault() { return module['default']; } :
|
||
/******/ function getModuleExports() { return module; };
|
||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/
|
||
/******/ // Object.prototype.hasOwnProperty.call
|
||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(__webpack_require__.s = 0);
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ([
|
||
/* 0 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
__webpack_require__(1);
|
||
|
||
function Datepickk(args) {
|
||
Datepickk.numInstances = (Datepickk.numInstances || 0) + 1;
|
||
var that = this;
|
||
var eventName = 'click';
|
||
var selectedDates = [];
|
||
|
||
var currentYear = new Date().getFullYear();
|
||
var currentMonth = new Date().getMonth() + 1;
|
||
|
||
var languages = {
|
||
no: {
|
||
monthNames: ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
|
||
dayNames: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],
|
||
weekStart: 1
|
||
},
|
||
se: {
|
||
monthNames: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],
|
||
dayNames: ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'],
|
||
weekStart: 1
|
||
},
|
||
ru: {
|
||
monthNames: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
|
||
dayNames: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
|
||
weekStart: 1
|
||
},
|
||
en: {
|
||
monthNames: ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'],
|
||
dayNames: ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'],
|
||
weekStart: 0
|
||
},
|
||
de: {
|
||
monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
|
||
dayNames: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
|
||
weekStart: 1
|
||
}
|
||
};
|
||
|
||
/*Language aliases*/
|
||
languages.nb = languages.no;
|
||
languages.nn = languages.no;
|
||
|
||
var range = false;
|
||
var maxSelections = null;
|
||
var container = document.body;
|
||
var opened = false;
|
||
var months = 1;
|
||
var closeOnSelect = false;
|
||
var button = null;
|
||
var title = null;
|
||
var onNavigation = null;
|
||
var onClose = null;
|
||
var onConfirm = null;
|
||
var closeOnClick = true;
|
||
var inline = false;
|
||
var lang = 'en';
|
||
var onSelect = null;
|
||
var disabledDates = [];
|
||
var disabledDays = [];
|
||
var highlight = [];
|
||
var tooltips = {};
|
||
var daynames = true;
|
||
var today = true;
|
||
var startDate = null;
|
||
var minDate = null;
|
||
var maxDate = null;
|
||
var weekStart = null;
|
||
var locked = false;
|
||
|
||
function generateDaynames() {
|
||
that.el.days.innerHTML = '';
|
||
var ws = weekStart !== null ? weekStart : languages[lang].weekStart;
|
||
if (daynames) {
|
||
for (var x = 0; x < months && x < 3; x++) {
|
||
var weekEl = document.createElement('div');
|
||
weekEl.setAttribute('class', 'd-week');
|
||
for (var i = 0; i < 7; i++) {
|
||
var dayNameIndex = i + ws > languages[lang].dayNames.length - 1 ? i + ws - languages[lang].dayNames.length : i + ws;
|
||
|
||
var dayEl = document.createElement('div');
|
||
var dayTextEl = document.createElement('p');
|
||
dayTextEl.innerHTML = languages[lang].dayNames[dayNameIndex];
|
||
|
||
dayEl.appendChild(dayTextEl);
|
||
weekEl.appendChild(dayEl);
|
||
}
|
||
|
||
that.el.days.appendChild(weekEl);
|
||
}
|
||
}
|
||
}
|
||
|
||
function generateYears() {
|
||
[].slice.call(that.el.yearPicker.childNodes).forEach(function (node, index) {
|
||
node.innerHTML = "'" + (currentYear + parseInt(node.getAttribute('data-year'))).toString().substring(2, 4);
|
||
});
|
||
}
|
||
|
||
function generateInputs() {
|
||
that.el.tables.innerHTML = '';
|
||
for (var x = 0; x < months; x++) {
|
||
var container = document.createElement('div');
|
||
container.setAttribute('class', 'd-table');
|
||
for (var i = 0; i < 42; i++) {
|
||
var input = document.createElement('input');
|
||
input.type = 'checkbox';
|
||
input.id = Datepickk.numInstances + '-' + x + '-d-day-' + i;
|
||
var label = document.createElement('label');
|
||
label.setAttribute("for", Datepickk.numInstances + '-' + x + '-d-day-' + i);
|
||
|
||
var text = document.createElement('text');
|
||
|
||
var tooltip = document.createElement('span');
|
||
tooltip.setAttribute('class', 'd-tooltip');
|
||
|
||
container.appendChild(input);
|
||
container.appendChild(label);
|
||
|
||
label.appendChild(text);
|
||
label.appendChild(tooltip);
|
||
|
||
input.addEventListener(eventName, function (event) {
|
||
if (locked) {
|
||
event.preventDefault();
|
||
}
|
||
});
|
||
input.addEventListener('change', inputChange);
|
||
}
|
||
|
||
that.el.tables.appendChild(container);
|
||
}
|
||
|
||
that.el.tables.addEventListener('mouseover', highlightLegend);
|
||
that.el.tables.addEventListener('mouseout', highlightLegend);
|
||
|
||
function highlightLegend(e) {
|
||
if (e.target.nodeName !== 'LABEL') return;
|
||
|
||
var legendIds = e.target.getAttribute('data-legend-id') ? e.target.getAttribute('data-legend-id').split(' ') : [];
|
||
if (!legendIds.length) return;
|
||
|
||
legendIds.forEach(function (legendId) {
|
||
var element = that.el.legend.querySelector('[data-legend-id="' + legendId + '"]');
|
||
if (e.type == 'mouseover' && element) {
|
||
var color = element.getAttribute('data-color') ? hexToRgb(element.getAttribute('data-color')) : null;
|
||
element.setAttribute('style', 'background-color:rgba(' + color.r + ',' + color.g + ',' + color.b + ',0.35);');
|
||
} else if (element) {
|
||
element.removeAttribute('style');
|
||
}
|
||
});
|
||
|
||
function hexToRgb(hex) {
|
||
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
||
return result ? {
|
||
r: parseInt(result[1], 16),
|
||
g: parseInt(result[2], 16),
|
||
b: parseInt(result[3], 16)
|
||
} : null;
|
||
}
|
||
}
|
||
}
|
||
|
||
function generateLegends() {
|
||
var start = new Date(that.el.tables.childNodes[0].childNodes[0].getAttribute('data-date'));
|
||
var end = new Date(that.el.tables.childNodes[months - 1].childNodes[82].getAttribute('data-date'));
|
||
var _highlights = highlight.filter(function (x) {
|
||
for (var m = 0; m < x.dates.length; m++) {
|
||
if (x.dates[m].start < end && x.dates[m].end > start) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
});
|
||
var legends = [];
|
||
for (var l = 0; l < _highlights.length; l++) {
|
||
if ('legend' in _highlights[l] && _highlights[l].legend) {
|
||
var oldLegend = container.querySelector('.d-legend-item[data-legend="' + _highlights[l].legend + '"][data-color="' + _highlights[l].backgroundColor + '"]');
|
||
if (oldLegend == null) {
|
||
var legendItem = document.createElement('p');
|
||
legendItem.setAttribute('class', 'd-legend-item');
|
||
legendItem.setAttribute('data-legend', _highlights[l].legend);
|
||
legendItem.setAttribute('data-legend-id', highlight.indexOf(_highlights[l]));
|
||
legendItem.setAttribute('data-color', _highlights[l].backgroundColor);
|
||
var legendItemPoint = document.createElement('span');
|
||
legendItemPoint.setAttribute('style', 'background-color:' + _highlights[l].backgroundColor);
|
||
|
||
legendItem.appendChild(legendItemPoint);
|
||
|
||
that.el.legend.appendChild(legendItem);
|
||
legendItem.addEventListener('mouseover', hoverLegend);
|
||
legendItem.addEventListener('mouseout', hoverLegend);
|
||
legends.push(legendItem);
|
||
} else {
|
||
legends.push(oldLegend);
|
||
}
|
||
}
|
||
}
|
||
|
||
[].slice.call(that.el.legend.querySelectorAll('.d-legend-item')).forEach(function (item) {
|
||
if (legends.indexOf(item) < 0) {
|
||
item.removeEventListener('mouseover', hoverLegend);
|
||
item.removeEventListener('mouseout', hoverLegend);
|
||
that.el.legend.removeChild(item);
|
||
}
|
||
});
|
||
|
||
function hoverLegend(e) {
|
||
[].slice.call(that.el.tables.querySelectorAll('[data-legend-id*="' + this.getAttribute('data-legend-id') + '"]')).forEach(function (element) {
|
||
if (e.type == 'mouseover') element.classList.add('legend-hover');else element.classList.remove('legend-hover');
|
||
});
|
||
}
|
||
}
|
||
|
||
function parseMonth(month) {
|
||
if (month > 11) month -= 12;else if (month < 0) month += 12;
|
||
return month;
|
||
}
|
||
|
||
function generateDates(year, month) {
|
||
var monthElements = that.el.querySelectorAll('.d-table');
|
||
var ws = weekStart !== null ? weekStart : languages[lang].weekStart;
|
||
|
||
[].slice.call(that.el.querySelectorAll('.d-table')).forEach(function (element, index) {
|
||
var days = new Date(year, month + index, 0).getDate();
|
||
var daysLast = new Date(year, month + index - 1, 0).getDate();
|
||
var startDay = new Date(year, month + index - 1, 1).getDay();
|
||
var startDate = null;
|
||
var endDate = null;
|
||
if (startDay - ws < 0) {
|
||
startDay = 7 - ws;
|
||
} else {
|
||
startDay -= ws;
|
||
}
|
||
var monthText = languages[lang].monthNames[parseMonth(month - 1 + index)];
|
||
element.setAttribute('data-month', monthText);
|
||
|
||
[].slice.call(element.querySelectorAll('.d-table input')).forEach(function (inputEl, i) {
|
||
var labelEl = inputEl.nextSibling;
|
||
|
||
inputEl.checked = false;
|
||
inputEl.removeAttribute('disabled');
|
||
labelEl.removeAttribute('style');
|
||
labelEl.removeAttribute('data-legend-id');
|
||
labelEl.className = '';
|
||
|
||
var date = null;
|
||
if (i < startDay) {
|
||
labelEl.childNodes[0].innerHTML = daysLast - (startDay - i - 1);
|
||
if (index == 0) {
|
||
date = new Date(year, month + index - 2, daysLast - (startDay - i - 1));
|
||
labelEl.className = 'prev';
|
||
} else {
|
||
date = '';
|
||
labelEl.className = 'd-hidden';
|
||
inputEl.setAttribute('disabled', true);
|
||
}
|
||
} else if (i < days + startDay) {
|
||
date = new Date(year, month + index - 1, i - startDay + 1);
|
||
labelEl.childNodes[0].innerHTML = i - startDay + 1;
|
||
labelEl.className = '';
|
||
} else {
|
||
labelEl.childNodes[0].innerHTML = i - days - startDay + 1;
|
||
if (index == monthElements.length - 1) {
|
||
date = new Date(year, month + index, i - days - startDay + 1);
|
||
labelEl.className = 'next';
|
||
} else {
|
||
date = '';
|
||
labelEl.className = 'd-hidden';
|
||
inputEl.setAttribute('disabled', true);
|
||
}
|
||
}
|
||
|
||
if (date instanceof Date) {
|
||
inputEl.setAttribute('data-date', date.toJSON());
|
||
|
||
if (disabledDates.indexOf(date.getTime()) != -1 || disabledDays.indexOf(date.getDay()) != -1) {
|
||
inputEl.setAttribute('disabled', true);
|
||
}
|
||
|
||
if (minDate && date < minDate || maxDate && date > maxDate) {
|
||
inputEl.setAttribute('disabled', true);
|
||
labelEl.className = 'd-hidden';
|
||
}
|
||
|
||
if (today && date.getTime() == new Date().setHours(0, 0, 0, 0)) {
|
||
labelEl.classList.add('today');
|
||
} else {
|
||
labelEl.classList.remove('today');
|
||
}
|
||
|
||
if (tooltips[date.getTime()]) {
|
||
labelEl.childNodes[0].setAttribute('data-tooltip', true);
|
||
labelEl.childNodes[1].innerHTML = tooltips[date.getTime()];
|
||
} else {
|
||
labelEl.childNodes[0].removeAttribute('data-tooltip');
|
||
labelEl.childNodes[1].innerHTML = '';
|
||
}
|
||
|
||
var _highlights = highlight.filter(function (x) {
|
||
for (var m = 0; m < x.dates.length; m++) {
|
||
if (date.getTime() >= x.dates[m].start.getTime() && date.getTime() <= x.dates[m].end.getTime()) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
});
|
||
|
||
if (_highlights.length > 0) {
|
||
var bgColor = '';
|
||
var legendIds = '';
|
||
|
||
if (_highlights.length > 1) {
|
||
var percent = Math.round(100 / _highlights.length);
|
||
bgColor = 'background: linear-gradient(-45deg,';
|
||
for (var z = 0; z < _highlights.length; z++) {
|
||
legendIds += highlight.indexOf(_highlights[z]);
|
||
if (z !== _highlights.length - 1) {
|
||
legendIds += ' ';
|
||
}
|
||
bgColor += _highlights[z].backgroundColor + ' ' + percent * z + '%';
|
||
if (z != _highlights.length - 1) {
|
||
bgColor += ',';
|
||
bgColor += _highlights[z].backgroundColor + ' ' + percent * (z + 1) + '%,';
|
||
}
|
||
}
|
||
bgColor += ');';
|
||
} else {
|
||
bgColor = _highlights[0].backgroundColor ? 'background:' + _highlights[0].backgroundColor + ';' : '';
|
||
legendIds += highlight.indexOf(_highlights[0]);
|
||
}
|
||
var Color = _highlights[0].color ? 'color:' + _highlights[0].color + ';' : '';
|
||
labelEl.setAttribute('style', bgColor + Color);
|
||
labelEl.setAttribute('data-legend-id', legendIds);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
|
||
generateLegends();
|
||
};
|
||
|
||
function setDate() {
|
||
if (!that.el.tables.childNodes.length || !that.el.tables.childNodes[0].childNodes.length) return;
|
||
|
||
resetCalendar();
|
||
|
||
if (currentMonth > 12 || currentMonth < 1) {
|
||
if (currentMonth > 12) {
|
||
currentYear += 1;
|
||
currentMonth -= 12;
|
||
} else {
|
||
currentYear -= 1;
|
||
currentMonth += 12;
|
||
}
|
||
}
|
||
|
||
if (maxDate && new Date(currentYear, currentMonth - 1 + months - 1, 1) >= new Date(maxDate).setDate(1)) {
|
||
currentYear = maxDate.getFullYear();
|
||
currentMonth = maxDate.getMonth() + 1 - months + 1;
|
||
that.el.header.childNodes[2].setAttribute('style', 'visibility:hidden');
|
||
} else {
|
||
that.el.header.childNodes[2].removeAttribute('style');
|
||
}
|
||
if (minDate && new Date(currentYear, currentMonth - 1, 1) <= new Date(minDate).setDate(1)) {
|
||
currentYear = minDate.getFullYear();
|
||
currentMonth = minDate.getMonth() + 1;
|
||
that.el.header.childNodes[0].setAttribute('style', 'visibility:hidden');
|
||
} else {
|
||
that.el.header.childNodes[0].removeAttribute('style');
|
||
}
|
||
|
||
for (var c = 0; c < months; c++) {
|
||
var index = currentMonth - 1 + c;
|
||
if (index > 11) {
|
||
index -= 12;
|
||
} else if (index < 0) {
|
||
index += 12;
|
||
}
|
||
|
||
that.el.monthPicker.childNodes[index].classList.add('current');
|
||
}
|
||
|
||
generateDates(currentYear, currentMonth);
|
||
generateYears();
|
||
var startmonth = languages[lang].monthNames[currentMonth - 1];
|
||
var endmonth = '';
|
||
if (months > 1) {
|
||
endmonth += ' - ';
|
||
var monthint = currentMonth - 1 + months - 1;
|
||
if (monthint > 11) {
|
||
monthint -= 12;
|
||
} else if (monthint < 0) {
|
||
monthint += 12;
|
||
}
|
||
endmonth += languages[lang].monthNames[monthint];
|
||
}
|
||
var yearname = currentMonth - 1 + months - 1 > 11 ? currentYear.toString().substring(2, 4) + '/' + (currentYear + 1).toString().substring(2, 4) : currentYear.toString().substring(2, 4);
|
||
that.el.header.childNodes[1].childNodes[0].innerHTML = startmonth + endmonth;
|
||
that.el.header.childNodes[1].childNodes[1].innerHTML = yearname;
|
||
|
||
that.el.yearPicker.querySelector('[data-year="0"]').classList.add('current');
|
||
if (currentMonth - 1 + months - 1 > 11) {
|
||
that.el.yearPicker.querySelector('[data-year="1"]').classList.add('current');
|
||
}
|
||
|
||
renderSelectedDates();
|
||
if (onNavigation) onNavigation.call(that);
|
||
};
|
||
|
||
function renderSelectedDates() {
|
||
selectedDates.forEach(function (date) {
|
||
var el = that.el.querySelector('[data-date="' + date.toJSON() + '"]');
|
||
if (el) {
|
||
el.checked = true;
|
||
}
|
||
});
|
||
|
||
that.el.tables.classList.remove('before');
|
||
if (range && selectedDates.length > 1) {
|
||
var currentDate = new Date(currentYear, currentMonth - 1, 1);
|
||
var sorted = selectedDates.sort(function (a, b) {
|
||
return a.getTime() - b.getTime();
|
||
});
|
||
var first = that.el.querySelector('[data-date="' + sorted[0].toJSON() + '"]');
|
||
if (!first && currentDate >= new Date(sorted[0].getFullYear(), sorted[0].getMonth(), 1) && currentDate <= new Date(sorted[1].getFullYear(), sorted[1].getMonth(), 1)) {
|
||
that.el.tables.classList.add('before');
|
||
}
|
||
}
|
||
};
|
||
|
||
function resetCalendar() {
|
||
[].slice.call(that.el.querySelectorAll('.d-table input')).forEach(function (inputEl) {
|
||
inputEl.checked = false;
|
||
});
|
||
|
||
[].slice.call(that.el.monthPicker.querySelectorAll('.current')).forEach(function (monthPickEl) {
|
||
monthPickEl.classList.remove('current');
|
||
});
|
||
|
||
[].slice.call(that.el.yearPicker.querySelectorAll('.current')).forEach(function (yearPickEl) {
|
||
yearPickEl.classList.remove('current');
|
||
});
|
||
};
|
||
|
||
function nextMonth() {
|
||
currentMonth += months;
|
||
setDate();
|
||
};
|
||
|
||
function prevMonth() {
|
||
currentMonth -= months;
|
||
setDate();
|
||
};
|
||
|
||
function selectDate(date, ignoreOnSelect) {
|
||
date = new Date(date);
|
||
date.setHours(0, 0, 0, 0);
|
||
var el = that.el.querySelector('[data-date="' + date.toJSON() + '"]');
|
||
|
||
if (range && el && el.checked) {
|
||
el.classList.add('single');
|
||
}
|
||
|
||
if (el && !el.checked) {
|
||
el.checked = true;
|
||
}
|
||
|
||
selectedDates.push(date);
|
||
|
||
if (onSelect && !ignoreOnSelect) {
|
||
onSelect.apply(date, [true]);
|
||
}
|
||
};
|
||
|
||
function unselectDate(date, ignoreOnSelect) {
|
||
date = new Date(date);
|
||
date.setHours(0, 0, 0, 0);
|
||
var el = that.el.querySelector('[data-date="' + date.toJSON() + '"]');
|
||
if (el) {
|
||
el.classList.remove('single');
|
||
if (el.checked) {
|
||
el.checked = false;
|
||
}
|
||
}
|
||
|
||
selectedDates = selectedDates.filter(function (x) {
|
||
return x.getTime() != date.getTime();
|
||
});
|
||
|
||
if (onSelect && !ignoreOnSelect) {
|
||
onSelect.call(date, false);
|
||
}
|
||
};
|
||
|
||
function unselectAll(ignoreOnSelect) {
|
||
selectedDates.forEach(function (date) {
|
||
unselectDate(date, ignoreOnSelect);
|
||
});
|
||
};
|
||
|
||
function inputChange(e) {
|
||
var input = this;
|
||
var date = new Date(input.getAttribute('data-date'));
|
||
input.classList.remove('single');
|
||
if (locked) {
|
||
return;
|
||
}
|
||
if (range) {
|
||
that.el.tables.classList.remove('before');
|
||
}
|
||
if (input.checked) {
|
||
if (maxSelections && selectedDates.length > maxSelections - 1) {
|
||
var length = selectedDates.length;
|
||
for (length; length > maxSelections - 1; length--) {
|
||
unselectDate(selectedDates[0]);
|
||
}
|
||
}
|
||
|
||
if (range && selectedDates.length) {
|
||
var first = that.el.querySelector('[data-date="' + selectedDates[0].toJSON() + '"]');
|
||
if (!first && date > selectedDates[0]) {
|
||
that.el.tables.classList.add('before');
|
||
}
|
||
}
|
||
|
||
selectedDates.push(date);
|
||
|
||
if (closeOnSelect) {
|
||
that.hide();
|
||
}
|
||
} else {
|
||
if (range && selectedDates.length == 1 && selectedDates[0].getTime() == date.getTime()) {
|
||
selectDate(date);
|
||
input.classList.add('single');
|
||
} else {
|
||
selectedDates = selectedDates.filter(function (x) {
|
||
return x.getTime() != date.getTime();
|
||
});
|
||
}
|
||
}
|
||
|
||
if (onSelect) {
|
||
onSelect.call(date, input.checked);
|
||
}
|
||
};
|
||
|
||
function setRange(val) {
|
||
if (val) {
|
||
range = true;
|
||
that.el.tables.classList.add('range');
|
||
} else {
|
||
range = false;
|
||
that.el.tables.classList.remove('range');
|
||
}
|
||
};
|
||
|
||
function show(properties) {
|
||
if (!that.inline && that.container === document.body) {
|
||
document.body.classList.add('d-noscroll');
|
||
}
|
||
setArgs(properties);
|
||
var handler = function handler() {
|
||
that.el.classList.remove('d-show');
|
||
that.el.calendar.removeEventListener(whichAnimationEvent(), handler);
|
||
};
|
||
that.el.calendar.addEventListener(whichAnimationEvent(), handler);
|
||
that.el.classList.add('d-show');
|
||
container.appendChild(that.el);
|
||
opened = true;
|
||
if (startDate) {
|
||
currentMonth = startDate.getMonth() + 1;
|
||
currentYear = startDate.getFullYear();
|
||
}
|
||
setDate();
|
||
};
|
||
|
||
function hide() {
|
||
document.body.classList.remove('d-noscroll');
|
||
var handler = function handler() {
|
||
that.el.parentNode.removeChild(that.el);
|
||
opened = false;
|
||
that.el.classList.remove('d-hide');
|
||
if (typeof onClose == 'function') {
|
||
onClose.apply(that);
|
||
}
|
||
that.el.removeEventListener(whichAnimationEvent(), handler);
|
||
};
|
||
that.el.addEventListener(whichAnimationEvent(), handler);
|
||
that.el.classList.add('d-hide');
|
||
};
|
||
|
||
function bindEvents() {
|
||
that.el.header.childNodes[0].addEventListener(eventName, prevMonth);
|
||
that.el.header.childNodes[2].addEventListener(eventName, nextMonth);
|
||
that.el.header.childNodes[1].childNodes[0].addEventListener(eventName, function () {
|
||
if (that.el.monthPicker.classList.contains('d-show')) {
|
||
that.el.monthPicker.classList.remove('d-show');
|
||
} else {
|
||
that.el.monthPicker.classList.add('d-show');
|
||
}
|
||
that.el.yearPicker.classList.remove('d-show');
|
||
});
|
||
that.el.header.childNodes[1].childNodes[1].addEventListener(eventName, function () {
|
||
generateYears();
|
||
if (that.el.yearPicker.classList.contains('d-show')) {
|
||
that.el.yearPicker.classList.remove('d-show');
|
||
} else {
|
||
that.el.yearPicker.classList.add('d-show');
|
||
}
|
||
that.el.monthPicker.classList.remove('d-show');
|
||
});
|
||
that.el.button.addEventListener(eventName, hide);
|
||
|
||
that.el.overlay.addEventListener(eventName, function () {
|
||
if (closeOnClick) {
|
||
that.hide();
|
||
}
|
||
});
|
||
|
||
[].slice.call(that.el.monthPicker.childNodes).forEach(function (monthPicker) {
|
||
monthPicker.addEventListener(eventName, function () {
|
||
currentMonth = parseInt(this.getAttribute('data-month'));
|
||
setDate();
|
||
that.el.monthPicker.classList.remove('d-show');
|
||
});
|
||
});
|
||
|
||
[].slice.call(that.el.yearPicker.childNodes).forEach(function (yearPicker) {
|
||
yearPicker.addEventListener(eventName, function () {
|
||
currentYear += parseInt(this.getAttribute('data-year'));
|
||
setDate();
|
||
that.el.yearPicker.classList.remove('d-show');
|
||
});
|
||
});
|
||
|
||
var startX = 0;
|
||
var distance = 0;
|
||
that.el.calendar.addEventListener('touchstart', function (e) {
|
||
startX = e.changedTouches[0].clientX || e.originalEvent.changedTouches[0].clientX;
|
||
//e.preventDefault();
|
||
});
|
||
|
||
that.el.calendar.addEventListener('touchmove', function (e) {
|
||
distance = e.changedTouches[0].clientX - startX || e.originalEvent.changedTouches[0].clientX - startX;
|
||
e.preventDefault();
|
||
});
|
||
|
||
that.el.calendar.addEventListener('touchend', function (e) {
|
||
if (distance > 50) {
|
||
prevMonth();
|
||
} else if (distance < -50) {
|
||
nextMonth();
|
||
}
|
||
distance = 0;
|
||
});
|
||
};
|
||
|
||
function setArgs(x) {
|
||
for (var key in x) {
|
||
if (key in that) {
|
||
that[key] = x[key];
|
||
}
|
||
};
|
||
};
|
||
|
||
function init() {
|
||
that.el = document.createElement('div');
|
||
that.el.id = 'Datepickk';
|
||
that.el.classList.add(getBrowserVersion().type);
|
||
that.el.innerHTML = template;
|
||
that.el.calendar = that.el.childNodes[1];
|
||
that.el.titleBox = that.el.childNodes[0];
|
||
that.el.button = that.el.childNodes[3];
|
||
that.el.header = that.el.calendar.childNodes[0];
|
||
that.el.monthPicker = that.el.calendar.childNodes[1];
|
||
that.el.yearPicker = that.el.calendar.childNodes[2];
|
||
that.el.tables = that.el.calendar.childNodes[4];
|
||
that.el.days = that.el.calendar.childNodes[3];
|
||
that.el.overlay = that.el.childNodes[4];
|
||
that.el.legend = that.el.childNodes[2];
|
||
|
||
setArgs(args);
|
||
|
||
generateInputs();
|
||
generateDaynames();
|
||
bindEvents();
|
||
|
||
if (inline) {
|
||
show();
|
||
}
|
||
}
|
||
|
||
that.show = show;
|
||
that.hide = hide;
|
||
that.selectDate = selectDate;
|
||
that.unselectAll = unselectAll;
|
||
that.unselectDate = unselectDate;
|
||
|
||
function currentDateGetter() {
|
||
return new Date(currentYear, currentMonth - 1, 1);
|
||
}
|
||
function currentDateSetter(x) {
|
||
x = new Date(x);
|
||
currentMonth = x.getMonth() + 1;
|
||
currentYear = x.getFullYear();
|
||
setDate();
|
||
}
|
||
|
||
Object.defineProperties(that, {
|
||
"selectedDates": {
|
||
get: function get() {
|
||
return selectedDates.sort(function (a, b) {
|
||
return a.getTime() - b.getTime();
|
||
});
|
||
}
|
||
},
|
||
"range": {
|
||
get: function get() {
|
||
return range;
|
||
},
|
||
set: function set(x) {
|
||
setRange(x);
|
||
if (x) {
|
||
maxSelections = 2;
|
||
}
|
||
}
|
||
},
|
||
"button": {
|
||
get: function get() {
|
||
return button;
|
||
},
|
||
set: function set(x) {
|
||
if (typeof x == 'string') {
|
||
button = x;
|
||
} else {
|
||
button = null;
|
||
}
|
||
that.el.button.innerHTML = button ? button : '';
|
||
}
|
||
},
|
||
"title": {
|
||
get: function get() {
|
||
return title;
|
||
},
|
||
set: function set(x) {
|
||
if (typeof x == 'string') {
|
||
title = x;
|
||
} else {
|
||
title = null;
|
||
}
|
||
that.el.titleBox.innerText = title ? title : '';
|
||
}
|
||
},
|
||
"lang": {
|
||
get: function get() {
|
||
return lang;
|
||
},
|
||
set: function set(x) {
|
||
if (x in languages) {
|
||
lang = x;
|
||
generateDaynames();
|
||
setDate();
|
||
} else {
|
||
console.error('Language not found');
|
||
}
|
||
}
|
||
},
|
||
"weekStart": {
|
||
get: function get() {
|
||
return weekStart !== null ? weekStart : languages[lang].weekStart;
|
||
},
|
||
set: function set(x) {
|
||
if (typeof x == 'number' && x > -1 && x < 7) {
|
||
weekStart = x;
|
||
generateDaynames();
|
||
setDate();
|
||
} else {
|
||
console.error('weekStart must be a number between 0 and 6');
|
||
}
|
||
}
|
||
},
|
||
"months": {
|
||
get: function get() {
|
||
return months;
|
||
},
|
||
set: function set(x) {
|
||
if (typeof x == 'number' && x > 0) {
|
||
months = x;
|
||
generateDaynames();
|
||
generateInputs();
|
||
setDate();
|
||
|
||
if (months == 1) {
|
||
that.el.classList.remove('multi');
|
||
} else {
|
||
that.el.classList.add('multi');
|
||
}
|
||
} else {
|
||
console.error('months must be a number > 0');
|
||
}
|
||
}
|
||
},
|
||
"isOpen": {
|
||
get: function get() {
|
||
return opened;
|
||
}
|
||
},
|
||
"closeOnSelect": {
|
||
get: function get() {
|
||
return closeOnSelect;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
closeOnSelect = true;
|
||
} else {
|
||
closeOnSelect = false;
|
||
}
|
||
}
|
||
},
|
||
"disabledDays": {
|
||
get: function get() {
|
||
return disabledDays;
|
||
},
|
||
set: function set(x) {
|
||
if (x instanceof Array) {
|
||
for (var i = 0; i < x.length; i++) {
|
||
if (typeof x[i] == 'number') {
|
||
disabledDays.push(x[i]);
|
||
}
|
||
}
|
||
} else if (typeof x == 'number') {
|
||
disabledDays = [x];
|
||
} else if (!x) {
|
||
disabledDays = [];
|
||
}
|
||
setDate();
|
||
}
|
||
},
|
||
"disabledDates": {
|
||
get: function get() {
|
||
return disabledDates.map(function (x) {
|
||
return new Date(x);
|
||
});
|
||
},
|
||
set: function set(x) {
|
||
if (x instanceof Array) {
|
||
x.forEach(function (date) {
|
||
if (date instanceof Date) {
|
||
disabledDates.push(new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime());
|
||
}
|
||
});
|
||
} else if (x instanceof Date) {
|
||
disabledDates = [new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime()];
|
||
} else if (!x) {
|
||
disabledDates = [];
|
||
}
|
||
setDate();
|
||
}
|
||
},
|
||
"highlight": {
|
||
get: function get() {
|
||
return highlight;
|
||
},
|
||
set: function set(x) {
|
||
if (x instanceof Array) {
|
||
x.forEach(function (hl) {
|
||
if (hl instanceof Object) {
|
||
var highlightObj = {};
|
||
highlightObj.dates = [];
|
||
|
||
if ('start' in hl) {
|
||
highlightObj.dates.push({
|
||
start: new Date(hl.start.getFullYear(), hl.start.getMonth(), hl.start.getDate()),
|
||
end: 'end' in hl ? new Date(hl.end.getFullYear(), hl.end.getMonth(), hl.end.getDate()) : new Date(hl.start.getFullYear(), hl.start.getMonth(), hl.start.getDate())
|
||
});
|
||
} else if ('dates' in hl && hl.dates instanceof Array) {
|
||
hl.dates.forEach(function (hlDate) {
|
||
highlightObj.dates.push({
|
||
start: new Date(hlDate.start.getFullYear(), hlDate.start.getMonth(), hlDate.start.getDate()),
|
||
end: 'end' in hlDate ? new Date(hlDate.end.getFullYear(), hlDate.end.getMonth(), hlDate.end.getDate()) : new Date(hlDate.start.getFullYear(), hlDate.start.getMonth(), hlDate.start.getDate())
|
||
});
|
||
});
|
||
}
|
||
|
||
highlightObj.color = hl.color;
|
||
highlightObj.backgroundColor = hl.backgroundColor;
|
||
highlightObj.legend = 'legend' in hl ? hl.legend : null;
|
||
|
||
highlight.push(highlightObj);
|
||
}
|
||
});
|
||
} else if (x instanceof Object) {
|
||
var highlightObj = {};
|
||
highlightObj.dates = [];
|
||
|
||
if ('start' in x) {
|
||
highlightObj.dates.push({
|
||
start: new Date(x.start.getFullYear(), x.start.getMonth(), x.start.getDate()),
|
||
end: 'end' in x ? new Date(x.end.getFullYear(), x.end.getMonth(), x.end.getDate()) : new Date(x.start.getFullYear(), x.start.getMonth(), x.start.getDate())
|
||
});
|
||
} else if ('dates' in x && x.dates instanceof Array) {
|
||
x.dates.forEach(function (hlDate) {
|
||
highlightObj.dates.push({
|
||
start: new Date(hlDate.start.getFullYear(), hlDate.start.getMonth(), hlDate.start.getDate()),
|
||
end: 'end' in hlDate ? new Date(hlDate.end.getFullYear(), hlDate.end.getMonth(), hlDate.end.getDate()) : new Date(hlDate.start.getFullYear(), hlDate.start.getMonth(), hlDate.start.getDate())
|
||
});
|
||
});
|
||
}
|
||
|
||
highlightObj.color = x.color;
|
||
highlightObj.backgroundColor = x.backgroundColor;
|
||
highlightObj.legend = 'legend' in x ? x.legend : null;
|
||
|
||
highlight.push(highlightObj);
|
||
} else if (!x) {
|
||
highlight = [];
|
||
}
|
||
|
||
setDate();
|
||
}
|
||
},
|
||
"onClose": {
|
||
set: function set(callback) {
|
||
onClose = callback;
|
||
}
|
||
},
|
||
"onSelect": {
|
||
set: function set(callback) {
|
||
onSelect = callback;
|
||
}
|
||
},
|
||
"today": {
|
||
get: function get() {
|
||
return today;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
today = true;
|
||
} else {
|
||
today = false;
|
||
}
|
||
}
|
||
},
|
||
"daynames": {
|
||
get: function get() {
|
||
return daynames;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
daynames = true;
|
||
} else {
|
||
daynames = false;
|
||
}
|
||
generateDaynames();
|
||
}
|
||
},
|
||
"fullscreen": {
|
||
get: function get() {
|
||
return that.el.classList.contains('fullscreen');
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
that.el.classList.add('fullscreen');
|
||
} else {
|
||
that.el.classList.remove('fullscreen');
|
||
}
|
||
}
|
||
},
|
||
"locked": {
|
||
get: function get() {
|
||
return locked;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
locked = true;
|
||
that.el.tables.classList.add('locked');
|
||
} else {
|
||
locked = false;
|
||
that.el.tables.classList.remove('locked');
|
||
}
|
||
}
|
||
},
|
||
"maxSelections": {
|
||
get: function get() {
|
||
return maxSelections;
|
||
},
|
||
set: function set(x) {
|
||
if (typeof x == 'number' && !range) {
|
||
maxSelections = x;
|
||
} else {
|
||
if (range) {
|
||
maxSelections = 2;
|
||
} else {
|
||
maxSelections = null;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"onConfirm": {
|
||
set: function set(callback) {
|
||
if (typeof callback == 'function') {
|
||
onConfirm = callback.bind(that);
|
||
that.el.button.addEventListener(eventName, onConfirm);
|
||
} else if (!callback) {
|
||
that.el.button.removeEventListener(eventName, onConfirm);
|
||
onConfirm = null;
|
||
}
|
||
}
|
||
},
|
||
"onNavigation": {
|
||
set: function set(callback) {
|
||
if (typeof callback == 'function') {
|
||
onNavigation = callback.bind(that);
|
||
} else if (!callback) {
|
||
onNavigation = null;
|
||
}
|
||
}
|
||
},
|
||
"closeOnClick": {
|
||
get: function get() {
|
||
return closeOnClick;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
closeOnClick = true;
|
||
} else {
|
||
closeOnClick = false;
|
||
}
|
||
}
|
||
},
|
||
"tooltips": {
|
||
get: function get() {
|
||
var ret = [];
|
||
for (key in tooltips) {
|
||
ret.push({
|
||
date: new Date(parseInt(key)),
|
||
text: tooltips[key]
|
||
});
|
||
}
|
||
return ret;
|
||
},
|
||
set: function set(x) {
|
||
if (x instanceof Array) {
|
||
x.forEach(function (item) {
|
||
if (item.date && item.text && item.date instanceof Date) {
|
||
tooltips[new Date(item.date.getFullYear(), item.date.getMonth(), item.date.getDate()).getTime()] = item.text;
|
||
}
|
||
});
|
||
} else if (x instanceof Object) {
|
||
if (x.date && x.text && x.date instanceof Date) {
|
||
tooltips[new Date(x.date.getFullYear(), x.date.getMonth(), x.date.getDate()).getTime()] = x.text;
|
||
}
|
||
} else if (!x) {
|
||
tooltips = [];
|
||
}
|
||
setDate();
|
||
}
|
||
},
|
||
"currentDate": {
|
||
get: currentDateGetter,
|
||
set: currentDateSetter
|
||
},
|
||
"setDate": {
|
||
set: currentDateSetter
|
||
},
|
||
"startDate": {
|
||
get: function get() {
|
||
return startDate;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
startDate = new Date(x);
|
||
} else {
|
||
startDate = null;
|
||
currentYear = new Date().getFullYear();
|
||
currentMonth = new Date().getMonth() + 1;
|
||
}
|
||
setDate();
|
||
}
|
||
},
|
||
"minDate": {
|
||
get: function get() {
|
||
return minDate;
|
||
},
|
||
set: function set(x) {
|
||
minDate = x ? new Date(x) : null;
|
||
setDate();
|
||
}
|
||
},
|
||
"maxDate": {
|
||
get: function get() {
|
||
return maxDate;
|
||
},
|
||
set: function set(x) {
|
||
maxDate = x ? new Date(x) : null;
|
||
setDate();
|
||
}
|
||
},
|
||
"container": {
|
||
get: function get() {
|
||
return container;
|
||
},
|
||
set: function set(x) {
|
||
if (x instanceof String) {
|
||
var y = document.querySelector(x);
|
||
if (y) {
|
||
container = y;
|
||
if (container != document.body) {
|
||
that.el.classList.add('wrapped');
|
||
} else {
|
||
that.el.classList.remove('wrapped');
|
||
}
|
||
} else {
|
||
console.error("Container doesn't exist");
|
||
}
|
||
} else if (x instanceof HTMLElement) {
|
||
container = x;
|
||
if (container != document.body) {
|
||
that.el.classList.add('wrapped');
|
||
} else {
|
||
that.el.classList.remove('wrapped');
|
||
}
|
||
} else {
|
||
console.error("Invalid type");
|
||
}
|
||
}
|
||
},
|
||
"inline": {
|
||
get: function get() {
|
||
return inline;
|
||
},
|
||
set: function set(x) {
|
||
if (x) {
|
||
inline = true;
|
||
that.el.classList.add('inline');
|
||
} else {
|
||
inline = false;
|
||
that.el.classList.remove('inline');
|
||
}
|
||
}
|
||
}
|
||
|
||
});
|
||
|
||
init();
|
||
setDate();
|
||
|
||
return Object.freeze(that);
|
||
} /*!
|
||
* Datepickk
|
||
* Docs & License: https://crsten.github.com/datepickk
|
||
* (c) 2017 Carsten Jacobsen
|
||
*/
|
||
|
||
;
|
||
|
||
function whichAnimationEvent() {
|
||
var t;
|
||
var el = document.createElement('fakeelement');
|
||
var transitions = {
|
||
'animation': 'animationend',
|
||
'OAnimation': 'oanimationend',
|
||
'MozAnimation': 'animationend',
|
||
'WebkitAnimation': 'webkitAnimationEnd',
|
||
'': 'MSAnimationEnd'
|
||
};
|
||
|
||
for (t in transitions) {
|
||
if (el.style[t] !== undefined) {
|
||
return transitions[t];
|
||
}
|
||
}
|
||
}
|
||
|
||
var template = '<div class="d-title"></div>' + '<div class="d-calendar">' + '<div class="d-header">' + '<i id="d-previous"></i>' + '<p><span class="d-month"></span><span class="d-year"></span></p>' + '<i id="d-next"></i>' + '</div>' + '<div class="d-month-picker">' + '<div data-month="1">1</div>' + '<div data-month="2">2</div>' + '<div data-month="3">3</div>' + '<div data-month="4">4</div>' + '<div data-month="5">5</div>' + '<div data-month="6">6</div>' + '<div data-month="7">7</div>' + '<div data-month="8">8</div>' + '<div data-month="9">9</div>' + '<div data-month="10">10</div>' + '<div data-month="11">11</div>' + '<div data-month="12">12</div>' + '</div>' + '<div class="d-year-picker">' + '<div data-year="-5"></div>' + '<div data-year="-4"></div>' + '<div data-year="-3"></div>' + '<div data-year="-2"></div>' + '<div data-year="-1"></div>' + '<div data-year="0"></div>' + '<div data-year="1"></div>' + '<div data-year="2"></div>' + '<div data-year="3"></div>' + '<div data-year="4"></div>' + '<div data-year="5"></div>' + '</div>' + '<div class="d-weekdays"></div>' + '<div class="d-tables"></div>' + '</div>' + '<div class="d-legend"></div>' + '<button class="d-confirm"></button>' + '<div class="d-overlay"></div>';
|
||
|
||
var getBrowserVersion = function getBrowserVersion() {
|
||
var browser = {
|
||
type: null,
|
||
version: null
|
||
};
|
||
|
||
var ua = navigator.userAgent,
|
||
tem,
|
||
ios,
|
||
M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
|
||
ios = ua.match(/(iphone|ipad)\s+OS\s+([\d+_]+\d+)/i) || [];
|
||
if (/trident/i.test(M[1])) {
|
||
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
|
||
browser.type = 'MSIE';
|
||
browser.version = parseInt(tem[1]);
|
||
return browser;
|
||
}
|
||
if (M[1] === 'Chrome') {
|
||
tem = ua.match(/\bOPR\/(\d+)/);
|
||
if (tem != null) return 'Opera ' + tem[1];
|
||
}
|
||
if (ios[1]) {
|
||
return browser = {
|
||
type: 'iOS',
|
||
version: ios[2]
|
||
};
|
||
}
|
||
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
|
||
if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
|
||
browser.type = M[0];
|
||
browser.version = parseInt(M[1]);
|
||
|
||
return browser;
|
||
};
|
||
|
||
exports.default = Datepickk;
|
||
|
||
/***/ }),
|
||
/* 1 */
|
||
/***/ (function(module, exports) {
|
||
|
||
// removed by extract-text-webpack-plugin
|
||
|
||
/***/ })
|
||
/******/ ])["default"];
|
||
}); |