{"version":3,"file":"slx.dateselector.min.js","sources":["dist/js/slx.dateselector.js"],"sourcesContent":["/**\r\n * SlxControls 1.2.36 ({@link https://www.selerix.com})\r\n * This is unpublished proprietary source code of Selerix Systems, Inc. The\r\n * copyright notice above is not evidence any actual or intended\r\n * publication of such source code.\r\n * @copyright Copyright 2024 Selerix Systems, Inc. All Rights Reserved.\r\n */\r\n/**\r\n * SlxDateSelector class.\r\n * @requires slx.core\r\n * @requires slx.calendar\r\n * @class\r\n */\r\nvar SlxDateSelector = (function (global) {\r\n\t'use strict';\r\n\tvar x = global.SlxControl;\r\n\r\n\t/**\r\n\t * slx.dateSelector\r\n\t * @constructs\r\n\t */\r\n\tx.slx.dateSelector = function () {\r\n\t\tvar that = this;\r\n\t\tx.slx.base.apply(that, arguments);\r\n\r\n\t\t// reference current element\r\n\t\tvar el = that._element;\r\n\t\tif (el === void 0) { return this; }\r\n\t\telse if (el.length === 0) { return el; }\r\n\r\n\t\t// get date locale and language\r\n\t\tvar _getLocale = function(lang) {\r\n\t\t\tif (!Date['locale']) {\r\n\t\t\t\treturn {};\r\n\t\t\t} else if (!lang) {\r\n\t\t\t\treturn Date['locale'];\r\n\t\t\t}\r\n\r\n\t\t\treturn Date['locale'][lang] || {};\r\n\t\t};\r\n\r\n\t\t// set custom settings from data props and attributes\r\n\t\tthat.id = that.id || el.slxUniqueId();\r\n\t\tthat.selector = '#' + that.id;\r\n\t\tthat.container = x(that.selector + '_container');\r\n\t\tthat.showIcon = that.showIcon || el.data('showicon');\r\n\t\tthat.icon = that.icon || 'glyphicons glyphicons-calendar';\r\n\t\tthat.onChange = that.onChange || el.attr('onchange') !== void 0 ? x.eval.call(el[0], el.attr('onchange'), 'event') : void 0;\r\n\t\tthat.view = that.view || el.data('view') || 'month';\r\n\t\tthat.lang = that.lang && that.lang in _getLocale() ? that.lang : 'en';\r\n\t\tthat.format = that.format || el.data('format') || _getLocale(that.lang).format;\r\n\t\tthat.calendar = null;\r\n\t\tthat.mask = that.mask || el.data('mask') || '__/__/____';\r\n\t\tthat.mobileMaxWidth = that.mobileMaxWidth || el.data('mobile-maxwidth') || 767;\r\n\t\tthat.html5 = that.html5 === false || el.data('html5') === false ? false : true;\r\n\t\tthat.readonly = el.prop('readonly');\r\n\t\tthat.disabled = el.prop('disabled');\r\n\r\n\t\t// local flags and references\r\n\t\tvar _isMobile = false, _dateSupported = null;\r\n\t\tvar _btn = this.container.find('.slx-dateselector-icon');\r\n\r\n\t\t// fill the element with remaining chars in mask\r\n\t\tvar _fillMask = function (char) {\r\n\t\t\tvar v = el.val().replace(/[\\D]/g, ''), val;\r\n\t\t\tv += char || '', val = '';\r\n\t\t\t// loop through mask chars\r\n\t\t\tfor (var i = 0, n = 0; i < that.mask.length; i++) {\r\n\t\t\t\tvar j = that.mask.charAt(i);\r\n\t\t\t\tif (/[\\/-]/.test(j)) { val += j; continue; }\r\n\t\t\t\tval += n < v.length ? v.charAt(n) : j;\r\n\t\t\t\tn++;\r\n\t\t\t}\r\n\t\t\treturn val;\r\n\t\t};\r\n\r\n\t\t// feature detection for HTML5 date inputs\r\n\t\tvar _testDateSupport = function () {\r\n\t\t\tif (!that.html5) { return false; }\r\n\t\t\ttry {\r\n\t\t\t\t// test support for date inputs\r\n\t\t\t\tvar input = document.createElement('INPUT');\r\n\t\t\t\tinput.type = 'date';\r\n\t\t\t\treturn input.type === 'date';\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// date inputs not supported\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// get date format based on mobile, HTML5 enabled, and date input support\r\n\t\tvar _getFormat = function () {\r\n\t\t\treturn that.html5 && _isMobile && _dateSupported ? 'yyyy-MM-dd' : that.format;\r\n\t\t};\r\n\r\n\t\t// set input type based on HTML5 enabled and date input support\r\n\t\tvar _previousType = null;\r\n\t\tvar _setInputType = function () {\r\n\t\t\tif (_dateSupported === null) { _dateSupported = _testDateSupport(); }\r\n\t\t\tvar t = that.dateValue();\r\n\t\t\tif (_isMobile && _dateSupported) {\r\n\t\t\t\tif (el.prop('type') !== 'date') {\r\n\t\t\t\t\tif (_previousType !== null) {\r\n\t\t\t\t\t\t_previousType = el.prop('type');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthat.changeFormat();\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// set type when in mobile mode if date input supported\r\n\t\t\t\tif (el.slxVal().length) {\r\n\t\t\t\t\tel.slxVal(t.toString(_getFormat()));\r\n\t\t\t\t}\r\n\t\t\t\tel.prop('type', 'date');\r\n\t\t\t\t_showHideButton(false);\r\n\t\t\t\tel.trigger('viewport.slx.dateselector');\r\n\t\t\t} else {\r\n\t\t\t\tif (el.prop('type') === 'date') {\r\n\t\t\t\t\tthat.changeFormat();\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t// maintain default input type\r\n\t\t\t\tel.prop('type', _previousType || 'text');\r\n\t\t\t\tif (el.slxVal().length) { el.slxVal(t.toString(_getFormat())); }\r\n\t\t\t\t_showHideButton(true);\r\n\t\t\t\tel.trigger('viewport.slx.dateselector');\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar _formatParts;\r\n\t\t/** Change format of date value required for input type change. */\r\n\t\t(that.changeFormat = function() {\r\n\t\t\tvar format = _getFormat();\r\n\r\n\t\t\t// get a part of the format\r\n\t\t\tvar getPart = function(i, part) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tindex: i,\r\n\t\t\t\t\tlength: part.length,\r\n\t\t\t\t\tvalue: part\r\n\t\t\t\t};\r\n\t\t\t};\r\n\r\n\t\t\t// get a delimeter object\r\n\t\t\tvar getDelimeter = function(i, c) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tindex: i,\r\n\t\t\t\t\tchar: c\r\n\t\t\t\t};\r\n\t\t\t};\r\n\r\n\t\t\t// get each format part\r\n\t\t\tvar year, month, day;\r\n\t\t\tvar formatParts = format.split(/[\\/-]/);\r\n\t\t\tfor (var i = 0; i < formatParts.length; i++) {\r\n\t\t\t\tvar p = formatParts[i];\r\n\t\t\t\tif (p.indexOf('M') > -1) {\r\n\t\t\t\t\tmonth = getPart(i, p);\r\n\t\t\t\t} else if (p.indexOf('d') > -1) {\r\n\t\t\t\t\tday = getPart(i, p);\r\n\t\t\t\t} else if (p.indexOf('y') > -1) {\r\n\t\t\t\t\tyear = getPart(i, p);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// get delimeters\r\n\t\t\tvar delimeters = [];\r\n\t\t\tfor (var i = 0; i < format.length; i++) {\r\n\t\t\t\tvar c = format[i];\r\n\t\t\t\tvar isDelimeter = /[\\/-]/.test(c);\r\n\t\t\t\tif (isDelimeter) {\r\n\t\t\t\t\tdelimeters.push(getDelimeter(i, c));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// set internal variable\r\n\t\t\t_formatParts = {\r\n\t\t\t\tmonth: month,\r\n\t\t\t\tday: day,\r\n\t\t\t\tyear: year,\r\n\t\t\t\tdelimeters: delimeters,\r\n\t\t\t\tlength: formatParts.length\r\n\t\t\t};\r\n\t\t})();\r\n\r\n\t\t// validate date value and format\r\n\t\tvar _validate = function (val, format) {\r\n\t\t\t// check for valid value\r\n\t\t\tif (!val || typeof val !== 'string') {\r\n\t\t\t\treturn val;\r\n\t\t\t}\r\n\r\n\t\t\t// split date parts by delimeters\r\n\t\t\tvar parts = val.split(/[\\/-]/);\r\n\t\t\tif (parts.length < _formatParts.length && val || val.length < that.format.length) {\r\n\t\t\t\treturn '';\r\n\t\t\t} else if (val.length) {\r\n\t\t\t\t// date parts\r\n\t\t\t\tvar yy = _formatParts.year ? parts[_formatParts.year.index] : null;\r\n\t\t\t\tvar mm = _formatParts.month ? parts[_formatParts.month.index] : null;\r\n\t\t\t\tvar dd = _formatParts.day ? parts[_formatParts.day.index] : null;\r\n\r\n\t\t\t\t// validate date parts\r\n\t\t\t\tvar m = mm ? parseInt(mm, 10) : 0;\r\n\t\t\t\tvar d = dd ? parseInt(dd, 10) : 1;\r\n\t\t\t\tvar y = yy ? parseInt(yy, 10) : 0;\r\n\t\t\t\tm = (m === 0 ? 1 : m > 12 ? 12 : m) - 1;\r\n\t\t\t\tvar days = new Date(y, m + 1, 0).getDate();\r\n\t\t\t\td = d === 0 ? 1 : d > days ? days : d;\r\n\t\t\t\treturn new Date(y, m, d).toString(format || _getFormat());\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// show hide calendar button\r\n\t\tvar _showHideButton = function (val) {\r\n\t\t\tvar grp = el.closest('.input-group, .slx-input-group, .input-group-readonly, .slx-input-group-readonly');\r\n\t\t\tvar hasGrpChildren = grp.find('.input-group-addon, .input-group-prepend').length > 0;\r\n\t\t\tif (val === true && that.showIcon !== false && !that.readonly) {\r\n\t\t\t\t// show calendar button if enabled and editable\r\n\t\t\t\t_btn.parent().show();\r\n\t\t\t\tif (!hasGrpChildren && grp.hasClass('input-group-readonly')) {\r\n\t\t\t\t\tgrp.removeClass('input-group-readonly').addClass('input-group');\r\n\t\t\t\t} else if (grp.hasClass('slx-input-group-readonly')) {\r\n\t\t\t\t\tgrp.removeClass('slx-input-group-readonly').addClass('slx-input-group');\r\n\t\t\t\t}\r\n\t\t\t} else if (val === false) {\r\n\t\t\t\t// hide calendar button\r\n\t\t\t\t_btn.parent().hide();\r\n\t\t\t\tif (!hasGrpChildren && grp.hasClass('input-group')) {\r\n\t\t\t\t\tgrp.removeClass('input-group').addClass('input-group-readonly');\r\n\t\t\t\t} else if (grp.hasClass('slx-input-group')) {\r\n\t\t\t\t\tgrp.removeClass('slx-input-group').addClass('slx-input-group-readonly');\r\n\t\t\t\t}\r\n\t\t\t} else if (val === void 0 && (that.showIcon === false || that.readonly)) {\r\n\t\t\t\t// hide calendar button\r\n\t\t\t\t_showHideButton(false);\r\n\t\t\t}\r\n\t\t};\r\n\t\t\r\n\t\t/**\r\n\t\t * Gets or sets the date value.\r\n\t\t * @param {string} [v] Optional value to set.\r\n\t\t * @param {boolean} [triggerChange=true] Trigger change event flag.\r\n\t\t * @returns The element value.\r\n\t\t */\r\n\t\tthat.value = function (v, triggerChange) {\r\n\t\t\tif (v === void 0) {\r\n\t\t\t\t// get value\r\n\t\t\t\treturn el.slxVal().replace(/[^\\d\\/-]/g, '');\r\n\t\t\t} else {\r\n\t\t\t\t// set value\r\n\t\t\t\tvar old = el.slxVal();\r\n\t\t\t\tvar ischange = v !== old;\r\n\t\t\t\tvar h = el.slxVal(v);\r\n\t\t\t\t// register previous and current values on change\r\n\t\t\t\tif (ischange) {\r\n\t\t\t\t\tel.data('original-val', that.toDateString(old));\r\n\t\t\t\t\tel.data('current-val', that.toDateString(v));\r\n\t\t\t\t\t// trigger change event if not being bypassed\r\n\t\t\t\t\tif (triggerChange !== false) {\r\n\t\t\t\t\t\tel.trigger('change');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse that.close();\r\n\t\t\t\treturn h;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Gets or sets the display text.\r\n\t\t * @param {string} [v] The text value to set. \r\n\t\t * @returns The display text.\r\n\t\t */\r\n\t\tthat.text = function (v) {\r\n\t\t\tif (v === void 0) {\r\n\t\t\t\t// get text\r\n\t\t\t\treturn el.slxVal();\r\n\t\t\t} else {\r\n\t\t\t\t// set text\r\n\t\t\t\tif (v === '') { that.value(''); }\r\n\t\t\t\treturn el.slxVal(v);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Gets or sets the value as a {@link Date}.\r\n\t\t * @param {Date} [v] The optional date to set.\r\n\t\t * @returns The date.\r\n\t\t */\r\n\t\tthat.dateValue = function (v) {\r\n\t\t\t// get date value\r\n\t\t\tif (v === void 0) {\r\n\t\t\t\tvar parts = el.slxVal().split(/[\\D]/);\r\n\t\t\t\tvar m = _formatParts.month ? parts[_formatParts.month.index] : '01';\r\n\t\t\t\tvar d = _formatParts.day ? parts[_formatParts.day.index] : '01';\r\n\t\t\t\tvar y = _formatParts.year ? parts[_formatParts.year.index] : '0000';\r\n\r\n\t\t\t\treturn new Date(y, m - 1, d);\r\n\t\t\t}\r\n\t\t\t// set date value\r\n\t\t\telse if (v instanceof Date) { that.value(v.toString(that.format)); }\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Converts the date into a string of the current format.\r\n\t\t * @param {string} [v] The optional date format.\r\n\t\t * @returns The formatted date string.\r\n\t\t */\r\n\t\tthat.toDateString = function (v) {\r\n\t\t\tvar val = v || el.slxVal();\r\n\t\t\t// first validate value\r\n\t\t\tvar dt = _validate(val, that.format);\r\n\t\t\tif (typeof dt === 'string') {\r\n\t\t\t\t// return if already string\r\n\t\t\t\treturn dt;\r\n\t\t\t} else if (dt instanceof Date) {\r\n\t\t\t\t// convert Date to string by specified format\r\n\t\t\t\treturn dt.toString(that.format);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Gets the current format based on the viewport mode.\r\n\t\t * @returns The current format for the control.\r\n\t\t */\r\n\t\tthat.currentFormat = function () {\r\n\t\t\treturn _getFormat();\r\n\t\t}\r\n\r\n\t\tvar _blurTimeout = null;\r\n\t\t/** Close calendar window. */\r\n\t\tthat.close = function () {\r\n\t\t\tif (that.html5 && _isMobile && _dateSupported) { return; }\r\n\t\t\tthat.container.removeClass('open');\r\n\t\t\t// trigger closed event and remove click listener\r\n\t\t\tel.off('click.slx').trigger('closed');\r\n\t\t\tx(document).off('click.slx');\r\n\t\t\tif (_blurTimeout !== null) { clearTimeout(_blurTimeout); }\r\n\t\t\tif (that.calendar !== null) { that.calendar._element.remove(); that.calendar = null; }\r\n\t\t};\r\n\t\t/** Open calendar window. */\r\n\t\tthat.open = function () {\r\n\t\t\tif (that.html5 && _isMobile && _dateSupported) { return; }\r\n\r\n\t\t\t// close any already open window\r\n\t\t\tx('.slx-dateselector-calendar').each(function () {\r\n\t\t\t\tvar c = x(this).slxControl('slxCalendar');\r\n\t\t\t\tif (c._parent && (that.calendar === null || that.calendar.prop('id') !== x(this).prop('id'))) { c._parent.close(); }\r\n\t\t\t});\r\n\t\t\t// open current control's window w/ current control's set date value\r\n\t\t\tthat.container.addClass('open');\r\n\t\t\tvar d = that.dateValue().isValid() ? that.value() : null;\r\n\t\t\t// build calendar\r\n\t\t\tthat.calendar = new x.slx.calendar(x('
').data('value', d), { id: that.id + '_calendar', _parent: that, view: that.view, lang: that.lang, format: that.format }).slxControl('slxCalendar');\r\n\t\t\tthat.calendar._element.addClass('slx-dateselector-calendar');\r\n\t\t\tthat.container.append(that.calendar._element);\r\n\t\t\t// adjust width\r\n\t\t\tvar t = that.calendar._element.find('table.slx-calendar-calendar');\r\n\t\t\tif (t.length) {\r\n\t\t\t\tthat.calendar._element.width(t.outerWidth() + 20);\r\n\t\t\t}\r\n\t\t\t// add events for returning value from the calendar back to dateSelector\r\n\t\t\tthat.calendar._element.on('click.slx.dateselector', function (event) { x(this).stopBubble(event); });\r\n\t\t\tthat.calendar._element.on('keyup.slx.dateselector', function (event) {\r\n\t\t\t\tvar k = event.keyCode || event.which;\r\n\t\t\t\tif (k === 27) { that.close(); }\r\n\t\t\t});\r\n\t\t\tthat.calendar._element.on('change', function (event) {\r\n\t\t\t\tthat.value(that.calendar.value());\r\n\t\t\t\tel.focus();\r\n\t\t\t});\r\n\t\t\tx(document).off('click.slx.dateselector').on('click.slx.dateselector', function () { that.close(); });\r\n\t\t\tel.off('click.slx.dateselector').on('click.slx.dateselector', function (event) { x(this).stopBubble(event); }).trigger('open');\r\n\t\t};\r\n\r\n\t\t/* initialization */\r\n\t\t(function () {\r\n\t\t\t_isMobile = global.innerWidth <= that.mobileMaxWidth;\r\n\t\t\tel.attr({ onchange: void 0, maxlength: 10, placeholder: that.mask, 'data-current-val': el.val() });\r\n\r\n\t\t\t// wrap in container div, if not already wrapped\r\n\t\t\tif (!that.container.length) {\r\n\t\t\t\tvar grp = el.closest('.input-group, .slx-input-group');\r\n\t\t\t\tif (!grp.length) {\r\n\t\t\t\t\tgrp = x('');\r\n\t\t\t\t\t// add class by bootstrap version\r\n\t\t\t\t\tif (x.slx.config.bootstrap) {\r\n\t\t\t\t\t\tgrp.addClass('input-group');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tgrp.addClass('slx-input-group');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.wrap(grp);\r\n\t\t\t\t\tgrp = el.parent();\r\n\t\t\t\t}\r\n\t\t\t\tgrp.wrap(x('').attr('id', that.id + '_container').attr('data-target', that.selector).addClass('slx-dateselector-container'));\r\n\t\t\t\tthat.container = grp.parent();\r\n\t\t\t}\r\n\r\n\t\t\t// add control CSS class and original value, if not already applied\r\n\t\t\tif (!el.hasClass('slx-dateselector')) { el.addClass('slx-dateselector'); }\r\n\t\t\tif (!el.data('original-val')) el.data('original-val', that.toDateString(el.slxVal()));\r\n\r\n\t\t\t// add calendar button, if not already added\r\n\t\t\tif (_btn.length === 0) {\r\n\t\t\t\tvar grpBtn = x('');\r\n\t\t\t\t// add class to button group by bootstrap version\r\n\t\t\t\tif (x.slx.config.bootstrap === 3) {\r\n\t\t\t\t\tgrpBtn.addClass('input-group-btn');\r\n\t\t\t\t} else if (x.slx.config.bootstrap === 4) {\r\n\t\t\t\t\tgrpBtn.addClass('input-group-append');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tgrpBtn.addClass('slx-input-group-append');\r\n\t\t\t\t}\r\n\t\t\t\t// add button\r\n\t\t\t\tel.after(grpBtn.append(_btn = x('').attr({\r\n\t\t\t\t\ttype: 'button', 'aria-haspopup': 'true', 'aria-expanded': 'false' }).addClass('slx-dateselector-icon')));\r\n\t\t\t\t_btn.prop('disabled', that.disabled);\r\n\t\t\t\t_btn.append(x('').addClass(that.icon).attr('aria-hidden', 'true'));\r\n\t\t\t\t// add button class by bootstrap\r\n\t\t\t\tif (x.slx.config.bootstrap) {\r\n\t\t\t\t\t_btn.addClass('btn btn-control');\r\n\t\t\t\t} else {\r\n\t\t\t\t\t_btn.addClass('slx-btn slx-btn-control');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// add aria\r\n\t\t\tif (!_btn.attr('aria-label')) {\r\n\t\t\t\t_btn.attr('aria-label', 'Choose date');\r\n\t\t\t}\r\n\r\n\t\t\t// show/hide and set input type by config settings\r\n\t\t\t_showHideButton();\r\n\t\t\t_setInputType();\r\n\r\n\t\t\t// encode value in case of HTML and trigger render event\r\n\t\t\tel.slxVal(x.htmlEncode(el.slxVal()));\r\n\t\t\tsetTimeout(function () { el.trigger('render'); });\r\n\t\t})();\r\n\r\n\t\t/* events */\r\n\t\t(function () {\r\n\t\t\t// window/device resize event\r\n\t\t\tx(global).on('resize.slx.dateselector', function () {\r\n\t\t\t\t_previousType = el.prop('type') !== 'date' ? el.prop('type') : 'text';\r\n\t\t\t\t_isMobile = global.innerWidth <= that.mobileMaxWidth;\r\n\t\t\t\t_setInputType();\r\n\t\t\t});\r\n\t\t\tel.off('change.slx.dateselector').on('change.slx.dateselector', function (event) {\r\n\t\t\t\tif (el.data('original-val') === that.toDateString()) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tel.data('current-val', that.toDateString());\r\n\t\t\t\tif (typeof that.onChange === 'function') {\r\n\t\t\t\t\tthat.onChange.call(el[0], event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t// calendar button click event\r\n\t\t\t_btn.off('click.slx.dateselector').on('click.slx.dateselector', function (event) {\r\n\t\t\t\tx(this).stopBubble(event);\r\n\t\t\t\tif (that.container.hasClass('open')) { that.close(); }\r\n\t\t\t\telse { that.open(); }\r\n\t\t\t});\r\n\t\t\t// input field onblur unfocus event\r\n\t\t\tel.off('focusout.slx.dateselector').on('focusout.slx.dateselector', function () {\r\n\t\t\t\tif (el.data('current-val') !== that.toDateString(that.value())) {\r\n\t\t\t\t\tvar val = _validate(that.value());\r\n\t\t\t\t\t// update changed value\r\n\t\t\t\t\tif (val !== that.value()) {\r\n\t\t\t\t\t\tthat.value(val, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// register current value\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tel.data('current-val', that.toDateString(val));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// trigger change event\r\n\t\t\t\t\tel.trigger('change');\r\n\t\t\t\t}\r\n\t\t\t\t// close calendar after date selected\r\n\t\t\t\tthat.close();\r\n\t\t\t});\r\n\t\t\t// input field onfocus event\r\n\t\t\tel.off('focusin.slx.dateselector').on('focusin.slx.dateselector', function () {\r\n\t\t\t\tel.data('original-val', that.toDateString(el.slxVal()));\r\n\r\n\t\t\t\t// close any open calendars\r\n\t\t\t\tthat.close();\r\n\t\t\t\tx('.slx-dateselector-calendar').each(function () {\r\n\t\t\t\t\tvar c = x(this).slxControl('slxCalendar');\r\n\t\t\t\t\tif (c._parent) { c._parent.close(); }\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\t// input field onkeydown event\r\n\t\t\tel.off('keydown.slx.dateselector').on('keydown.slx.dateselector', function (event) {\r\n\t\t\t\t// ignore if mobile and using HTML5\r\n\t\t\t\tif (_isMobile && that.html5) { return; }\r\n\r\n\t\t\t\t// capture input key and char\r\n\t\t\t\tvar k = event.keyCode || event.which, char = String.fromCharCode(k);\r\n\t\t\t\tvar v = el.val().replace(/[\\D]/g, ''), val, enter = k === 13;\r\n\t\t\t\tif (enter) { return; }\r\n\r\n\t\t\t\t// get cursor position\r\n\t\t\t\tvar cursor = el.getSelectionRange(), p = 0, delimeter;\r\n\t\t\t\tif (cursor !== null) {\r\n\t\t\t\t\tp = cursor.start;\r\n\t\t\t\t\tif (!event.shiftKey && !event.ctrlKey) {\r\n\t\t\t\t\t\t// prevent default behavior when outside value/cursor at maxlength\r\n\t\t\t\t\t\tif (k === 39 && p >= v.length + _formatParts.length) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// update cursor position\r\n\t\t\t\t\t\tfor (var d = 0; d < _formatParts.delimeters.length; d++) {\r\n\t\t\t\t\t\t\tdelimeter = _formatParts.delimeters[d];\r\n\t\t\t\t\t\t\tif (p === delimeter.index - 1 && k === 39) {\r\n\t\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t} else if (p === delimeter.index + 1 && k === 37) {\r\n\t\t\t\t\t\t\t\tp--;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tel.setSelectionRange(p, p);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// input keys to ignore\r\n\t\t\t\tvar ignore = [9, 16, 17, 35, 36, 37, 38, 39, 40];\r\n\t\t\t\tif (ignore.contains(k)) { return; }\r\n\r\n\t\t\t\t// determine delete, cut/copy, paste behavior\r\n\t\t\t\tvar del = [8, 46], cut = event.ctrlKey && k === 88, copy = event.ctrlKey && k === 67 || event.ctrlKey && k === 45, paste = event.ctrlKey && k === 86 || event.shiftKey && k === 45;\r\n\t\t\t\tif (!del.contains(k) && !copy && !paste && !cut) { event.preventDefault(); }\r\n\t\t\t\telse if (copy) { return; }\r\n\t\t\t\telse if (del.contains(k)) {\r\n\t\t\t\t\tif (k === 8) {\r\n\t\t\t\t\t\t// update cursor position\r\n\t\t\t\t\t\tvar isDelimeter = _formatParts.delimeters.any(function (d) { return d.index === p - 1; });\r\n\t\t\t\t\t\tp -= isDelimeter ? 2 : 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (cursor !== null) {\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\tel.slxVal(el.slxVal().substring(0, p) + el.slxVal().substring(cursor.end > p ? cursor.end : p + 1));\r\n\t\t\t\t\t\t// set cursor position after delete and fill w/ mask\r\n\t\t\t\t\t\tif (el.slxVal().length > 0) {\r\n\t\t\t\t\t\t\tel.slxVal(_fillMask());\r\n\t\t\t\t\t\t\tel.setSelectionRange(p, p);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// validate numeric value or slash\r\n\t\t\t\tvar slash = k === 111 || !event.shiftKey && k === 191;\r\n\t\t\t\tif (k >= 96 && k <= 105) { k -= 48; char = String.fromCharCode(k); }\r\n\r\n\t\t\t\t// check for cursor at slash\r\n\t\t\t\tif (cursor !== null) {\r\n\t\t\t\t\tfor (var d = 0; d < _formatParts.delimeters.length; d++) {\r\n\t\t\t\t\t\tdelimeter = _formatParts.delimeters[d];\r\n\t\t\t\t\t\tif (p === delimeter.index) {\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t\tel.setSelectionRange(p, p);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// ignore non-numeric characters\r\n\t\t\t\tif ((slash && that.format.indexOf('/') === -1) || (!slash && isNaN(char)) || (slash && cursor === null)) { return; }\r\n\r\n\t\t\t\t// allow slash to advance cursor when within 1 index prior, otherwise, do nothing\r\n\t\t\t\tif (slash && _formatParts.delimeters.length) {\r\n\t\t\t\t\tvar prev = 0;\r\n\t\t\t\t\tfor (var d = 0; d < _formatParts.delimeters.length; d++) {\r\n\t\t\t\t\t\tdelimeter = _formatParts.delimeters[d];\r\n\t\t\t\t\t\tif (delimeter.char === '/' && p >= prev && p < delimeter.index && p !== delimeter.index - 1) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tprev = delimeter.index;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// reject slash after last occurrence\r\n\t\t\t\t\tif (p > prev) return;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (cursor === null) {\r\n\t\t\t\t\t// set value w/ mask for empty cursor\r\n\t\t\t\t\tel.slxVal(_fillMask(char));\r\n\t\t\t\t\tp = el.slxVal().indexOf('_');\r\n\t\t\t\t\tp = p === -1 ? el.slxVal().length : p;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// determine cursor w/ mask\r\n\t\t\t\t\tif (p >= that.mask.length) { return; }\r\n\t\t\t\t\tvar s = cursor.start;\r\n\t\t\t\t\tfor (var d = 0; d < _formatParts.delimeters.length; d++) {\r\n\t\t\t\t\t\tdelimeter = _formatParts.delimeters[d];\r\n\t\t\t\t\t\tif (p > delimeter.index) {\r\n\t\t\t\t\t\t\ts--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// check for slash input\r\n\t\t\t\t\tvar len = that.format.replace(/[\\W]/g,'').length;\r\n\t\t\t\t\tif (slash && v.length <= len) {\r\n\t\t\t\t\t\tif (v.length <= s) {\r\n\t\t\t\t\t\t\t// when entering a new value\r\n\t\t\t\t\t\t\tv = v.splice(s-1, 0, '0');\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t} else if (v.charAt(s-1) !== '0') {\r\n\t\t\t\t\t\t\t// when overwriting an existing value\r\n\t\t\t\t\t\t\tv = v.splice(s, 1, '').splice(s-1, 0, '0');\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// if preceding number is a zero, just skip to next number group\r\n\t\t\t\t\t\t\tp += 2;\r\n\t\t\t\t\t\t\tel.setSelectionRange(p, p);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (v.length < len) {\r\n\t\t\t\t\t\t// default digit entry\r\n\t\t\t\t\t\tv = v.splice(s, 0, char);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// build new value from splicing mask with value\r\n\t\t\t\t\tval = that.mask;\r\n\t\t\t\t\tfor (var i = 0, n = 0; i < val.length; i++, n++) {\r\n\t\t\t\t\t\tvar atSlash = val.charAt(i) === '/';\r\n\t\t\t\t\t\tif (atSlash) { n--; }\r\n\t\t\t\t\t\tvar c = i === p ? char : !atSlash && v.charAt(n) || val.charAt(i);\r\n\t\t\t\t\t\tval = val.splice(i, 1, c);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tp++;\r\n\t\t\t\t\t// update cursor position and update value\r\n\t\t\t\t\tfor (var d = 0; d < _formatParts.delimeters.length; d++) {\r\n\t\t\t\t\t\tdelimeter = _formatParts.delimeters[d];\r\n\t\t\t\t\t\tif (p === delimeter.index) {\r\n\t\t\t\t\t\t\tp++;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.slxVal(val);\r\n\t\t\t\t\tel.slxVal(_fillMask());\r\n\t\t\t\t}\r\n\t\t\t\tel.setSelectionRange(p, p);\r\n\t\t\t});\r\n\r\n\t\t\t// create observer to listen for disabled and readonly property changes\r\n\t\t\tvar observer = new MutationObserver(function (mutations) {\r\n\t\t\t\tmutations.forEach(function (mutation) {\r\n\t\t\t\t\tif (mutation.attributeName === 'disabled') {\r\n\t\t\t\t\t\t// disabled prop change\r\n\t\t\t\t\t\tthat.disabled = el.prop('disabled');\r\n\t\t\t\t\t\t_btn.prop('disabled', that.disabled);\r\n\t\t\t\t\t} else if (mutation.attributeName === 'readonly') {\r\n\t\t\t\t\t\t// readonly prop change\r\n\t\t\t\t\t\tthat.readonly = el.prop('readonly');\r\n\t\t\t\t\t\t// test for date input support and mobile mode\r\n\t\t\t\t\t\tif (_dateSupported === null) { _dateSupported = _testDateSupport(); }\r\n\t\t\t\t\t\tif (!_isMobile || !_dateSupported) {\r\n\t\t\t\t\t\t\t_showHideButton(!that.readonly);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tobserver.observe(el[0], { attributes: true });\r\n\t\t})();\r\n\r\n\t\t// register control w/ element\r\n\t\tel[0].slxDateSelector = this;\r\n\t\tel[0].isSlxControl = true;\r\n\r\n\t\treturn el;\r\n\t};\r\n\t// update constructor\r\n\tx.slx.dateSelector.prototype = Object.create(x.slx.base.prototype);\r\n\tx.slx.dateSelector.prototype.constructor = x.slx.dateSelector;\r\n\r\n\t/* extenders */\r\n\tx.slx.extend({\r\n\t\t// add control init extension\r\n\t\tslxDateSelector: function () {\r\n\t\t\tvar slx = this.slxControl('slxDateSelector', arguments) || new x.slx.dateSelector(this, arguments);\r\n\t\t\tif (arguments.length > 0) {\r\n\t\t\t\tvar arg = arguments[0], args = Array.prototype.slice.call(arguments, 1);\r\n\t\t\t\tif (typeof arg === 'string' && slx.hasOwnProperty(arg)) { return typeof slx[arg] === 'function' ? slx[arg].apply(slx, args) : slx[arg]; }\r\n\t\t\t\telse if (typeof arg !== 'string') { x.extend(slx, arg); }\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\t});\r\n\t\r\n\t// register control\r\n\tx.slx.register('slxDateSelector', x.slx.slxDateSelector);\r\n\r\n\t// initialize all controls by CSS class\r\n\tx(function () { x('.slx-dateselector').each(function () { x(this).slxDateSelector(); }); });\r\n\r\n\treturn x;\r\n})(window || this);"],"names":["SlxDateSelector","global","x","SlxControl","slx","dateSelector","_getLocale","_isMobile","_dateSupported","_btn","_fillMask","_testDateSupport","_getFormat","_previousType","_setInputType","_formatParts","_validate","_showHideButton","grpBtn","that","this","el","base","apply","arguments","_element","length","lang","Date","id","slxUniqueId","selector","container","showIcon","data","icon","onChange","attr","eval","call","view","format","calendar","mask","mobileMaxWidth","html5","readonly","prop","disabled","find","char","v","val","replace","i","n","j","charAt","test","input","document","createElement","type","e","t","dateValue","changeFormat","slxVal","toString","trigger","year","month","day","getPart","part","index","value","formatParts","split","p","indexOf","delimeters","c","push","y","m","days","d","parts","yy","mm","dd","parseInt","getDate","grp","closest","hasGrpChildren","parent","hide","hasClass","removeClass","addClass","show","triggerChange","old","ischange","h","toDateString","close","text","dt","currentFormat","off","remove","open","each","slxControl","_parent","isValid","append","width","outerWidth","on","event","stopBubble","keyCode","which","focus","innerWidth","onchange","maxlength","placeholder","data-current-val","config","bootstrap","wrap","after","aria-haspopup","aria-expanded","htmlEncode","setTimeout","preventDefault","k","String","fromCharCode","enter","delimeter","cursor","getSelectionRange","start","shiftKey","ctrlKey","setSelectionRange","ignore","contains","del","cut","copy","paste","isDelimeter","any","substring","end","slash","isNaN","prev","s","len","splice","atSlash","MutationObserver","mutations","forEach","mutation","attributeName","observe","attributes","slxDateSelector","isSlxControl","prototype","Object","create","constructor","extend","arg","args","Array","slice","hasOwnProperty","register","window"],"mappings":"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"}