/** * Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui) * Copyright 2016 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function (f, define) { define('kendo.datetimepicker', [ 'kendo.datepicker', 'kendo.timepicker' ], f); }(function () { var __meta__ = { id: 'datetimepicker', name: 'DateTimePicker', category: 'web', description: 'The DateTimePicker allows the end user to select a value from a calendar or a time drop-down list.', depends: [ 'datepicker', 'timepicker' ] }; (function ($, undefined) { var kendo = window.kendo, TimeView = kendo.TimeView, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, getMilliseconds = TimeView.getMilliseconds, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoDateTimePicker', CLICK = 'click' + ns, DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', STATEDISABLED = 'k-state-disabled', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MONTH = 'month', SPAN = '', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_OWNS = 'aria-owns', ARIA_DISABLED = 'aria-disabled', ARIA_READONLY = 'aria-readonly', DATE = Date, MIN = new DATE(1800, 0, 1), MAX = new DATE(2099, 11, 31), dateViewParams = { view: 'date' }, timeViewParams = { view: 'time' }, extend = $.extend; var DateTimePicker = Widget.extend({ init: function (element, options) { var that = this, disabled; Widget.fn.init.call(that, element, options); element = that.element; options = that.options; options.disableDates = kendo.calendar.disabled(options.disableDates); options.min = parse(element.attr('min')) || parse(options.min); options.max = parse(element.attr('max')) || parse(options.max); normalize(options); that._initialOptions = extend({}, options); that._wrapper(); that._views(); that._icons(); that._reset(); that._template(); try { element[0].setAttribute('type', 'text'); } catch (e) { element[0].type = 'text'; } element.addClass('k-input').attr({ 'role': 'combobox', 'aria-expanded': false }); that._midnight = that._calculateMidnight(options.min, options.max); disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled'); if (disabled) { that.enable(false); } else { that.readonly(element.is('[readonly]')); } that._old = that._update(options.value || that.element.val()); that._oldText = element.val(); kendo.notify(that); }, options: { name: 'DateTimePicker', value: null, format: '', timeFormat: '', culture: '', parseFormats: [], dates: [], min: new DATE(MIN), max: new DATE(MAX), interval: 30, height: 200, footer: '', start: MONTH, depth: MONTH, animation: {}, month: {}, ARIATemplate: 'Current focused date is #=kendo.toString(data.current, "d")#' }, events: [ OPEN, CLOSE, CHANGE ], setOptions: function (options) { var that = this, value = that._value, min, max, currentValue; Widget.fn.setOptions.call(that, options); options = that.options; options.min = min = parse(options.min); options.max = max = parse(options.max); normalize(options); that._midnight = that._calculateMidnight(options.min, options.max); currentValue = options.value || that._value || that.dateView._current; if (min && !isEqualDatePart(min, currentValue)) { min = new DATE(MIN); } if (max && !isEqualDatePart(max, currentValue)) { max = new DATE(MAX); } that.dateView.setOptions(options); that.timeView.setOptions(extend({}, options, { format: options.timeFormat, min: min, max: max })); if (value) { that.element.val(kendo.toString(value, options.format, options.culture)); that._updateARIA(value); } }, _editable: function (options) { var that = this, element = that.element.off(ns), dateIcon = that._dateIcon.off(ns), timeIcon = that._timeIcon.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable; if (!readonly && !disable) { wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover); element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).attr(ARIA_READONLY, false).on('keydown' + ns, $.proxy(that._keydown, that)).on('focus' + ns, function () { that._inputWrapper.addClass(FOCUSED); }).on('focusout' + ns, function () { that._inputWrapper.removeClass(FOCUSED); if (element.val() !== that._oldText) { that._change(element.val()); } that.close('date'); that.close('time'); }); dateIcon.on(MOUSEDOWN, preventDefault).on(CLICK, function () { that.toggle('date'); if (!kendo.support.touch && element[0] !== activeElement()) { element.focus(); } }); timeIcon.on(MOUSEDOWN, preventDefault).on(CLICK, function () { that.toggle('time'); if (!kendo.support.touch && element[0] !== activeElement()) { element.focus(); } }); } else { wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED); element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable).attr(ARIA_READONLY, readonly); } }, readonly: function (readonly) { this._editable({ readonly: readonly === undefined ? true : readonly, disable: false }); }, enable: function (enable) { this._editable({ readonly: false, disable: !(enable = enable === undefined ? true : enable) }); }, destroy: function () { var that = this; Widget.fn.destroy.call(that); that.dateView.destroy(); that.timeView.destroy(); that.element.off(ns); that._dateIcon.off(ns); that._timeIcon.off(ns); that._inputWrapper.off(ns); if (that._form) { that._form.off('reset', that._resetHandler); } }, close: function (view) { if (view !== 'time') { view = 'date'; } this[view + 'View'].close(); }, open: function (view) { if (view !== 'time') { view = 'date'; } this[view + 'View'].open(); }, min: function (value) { return this._option('min', value); }, max: function (value) { return this._option('max', value); }, toggle: function (view) { var secondView = 'timeView'; if (view !== 'time') { view = 'date'; } else { secondView = 'dateView'; } this[view + 'View'].toggle(); this[secondView].close(); }, value: function (value) { var that = this; if (value === undefined) { return that._value; } that._old = that._update(value); if (that._old === null) { that.element.val(''); } that._oldText = that.element.val(); }, _change: function (value) { var that = this, oldValue = that.element.val(), dateChanged; value = that._update(value); dateChanged = +that._old != +value; var valueUpdated = dateChanged && !that._typing; var textFormatted = oldValue !== that.element.val(); if (valueUpdated || textFormatted) { that.element.trigger(CHANGE); } if (dateChanged) { that._old = value; that._oldText = that.element.val(); that.trigger(CHANGE); } that._typing = false; }, _option: function (option, value) { var that = this; var options = that.options; var timeView = that.timeView; var timeViewOptions = timeView.options; var current = that._value || that._old; var minDateEqual; var maxDateEqual; if (value === undefined) { return options[option]; } value = parse(value, options.parseFormats, options.culture); if (!value) { return; } if (options.min.getTime() === options.max.getTime()) { timeViewOptions.dates = []; } options[option] = new DATE(value.getTime()); that.dateView[option](value); that._midnight = that._calculateMidnight(options.min, options.max); if (current) { minDateEqual = isEqualDatePart(options.min, current); maxDateEqual = isEqualDatePart(options.max, current); } if (minDateEqual || maxDateEqual) { timeViewOptions[option] = value; if (minDateEqual && !maxDateEqual) { timeViewOptions.max = lastTimeOption(options.interval); } if (maxDateEqual) { if (that._midnight) { timeView.dataBind([MAX]); return; } else if (!minDateEqual) { timeViewOptions.min = MIN; } } } else { timeViewOptions.max = MAX; timeViewOptions.min = MIN; } timeView.bind(); }, _toggleHover: function (e) { $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter'); }, _update: function (value) { var that = this, options = that.options, min = options.min, max = options.max, dates = options.dates, timeView = that.timeView, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, rebind, timeViewOptions, old, skip, formattedValue; if (options.disableDates && options.disableDates(date)) { date = null; if (!that._old) { value = null; } } if (+date === +current && isSameType) { formattedValue = kendo.toString(date, options.format, options.culture); if (formattedValue !== value) { that.element.val(date === null ? value : formattedValue); that.element.trigger(CHANGE); } return date; } if (date !== null && isEqualDatePart(date, min)) { date = restrictValue(date, min, max); } else if (!isInRange(date, min, max)) { date = null; } that._value = date; timeView.value(date); that.dateView.value(date); if (date) { old = that._old; timeViewOptions = timeView.options; if (dates[0]) { dates = $.grep(dates, function (d) { return isEqualDatePart(date, d); }); if (dates[0]) { timeView.dataBind(dates); skip = true; } } if (!skip) { if (isEqualDatePart(date, min)) { timeViewOptions.min = min; timeViewOptions.max = lastTimeOption(options.interval); rebind = true; } if (isEqualDatePart(date, max)) { if (that._midnight) { timeView.dataBind([MAX]); skip = true; } else { timeViewOptions.max = max; if (!rebind) { timeViewOptions.min = MIN; } rebind = true; } } } if (!skip && (!old && rebind || old && !isEqualDatePart(old, date))) { if (!rebind) { timeViewOptions.max = MAX; timeViewOptions.min = MIN; } timeView.bind(); } } that.element.val(date ? kendo.toString(date, options.format, options.culture) : value); that._updateARIA(date); return date; }, _keydown: function (e) { var that = this, dateView = that.dateView, timeView = that.timeView, value = that.element.val(), isDateViewVisible = dateView.popup.visible(); if (e.altKey && e.keyCode === kendo.keys.DOWN) { that.toggle(isDateViewVisible ? 'time' : 'date'); } else if (isDateViewVisible) { dateView.move(e); that._updateARIA(dateView._current); } else if (timeView.popup.visible()) { timeView.move(e); } else if (e.keyCode === kendo.keys.ENTER && value !== that._oldText) { that._change(value); } else { that._typing = true; } }, _views: function () { var that = this, element = that.element, options = that.options, id = element.attr('id'), dateView, timeView, div, ul, msMin, date; that.dateView = dateView = new kendo.DateView(extend({}, options, { id: id, anchor: that.wrapper, change: function () { var value = dateView.calendar.value(), msValue = +value, msMin = +options.min, msMax = +options.max, current; if (msValue === msMin || msValue === msMax) { current = new DATE(+that._value); current.setFullYear(value.getFullYear(), value.getMonth(), value.getDate()); if (isInRange(current, msMin, msMax)) { value = current; } } if (that._value) { value = kendo.date.setHours(new Date(value), that._value); } that._change(value); that.close('date'); }, close: function (e) { if (that.trigger(CLOSE, dateViewParams)) { e.preventDefault(); } else { element.attr(ARIA_EXPANDED, false); div.attr(ARIA_HIDDEN, true); if (!timeView.popup.visible()) { element.removeAttr(ARIA_OWNS); } } }, open: function (e) { if (that.trigger(OPEN, dateViewParams)) { e.preventDefault(); } else { if (element.val() !== that._oldText) { date = parse(element.val(), options.parseFormats, options.culture); that.dateView[date ? 'current' : 'value'](date); } div.attr(ARIA_HIDDEN, false); element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, dateView._dateViewID); that._updateARIA(date); } } })); div = dateView.div; msMin = options.min.getTime(); that.timeView = timeView = new TimeView({ id: id, value: options.value, anchor: that.wrapper, animation: options.animation, format: options.timeFormat, culture: options.culture, height: options.height, interval: options.interval, min: new DATE(MIN), max: new DATE(MAX), dates: msMin === options.max.getTime() ? [new Date(msMin)] : [], parseFormats: options.parseFormats, change: function (value, trigger) { value = timeView._parse(value); if (value < options.min) { value = new DATE(+options.min); timeView.options.min = value; } else if (value > options.max) { value = new DATE(+options.max); timeView.options.max = value; } if (trigger) { that._timeSelected = true; that._change(value); } else { element.val(kendo.toString(value, options.format, options.culture)); dateView.value(value); that._updateARIA(value); } }, close: function (e) { if (that.trigger(CLOSE, timeViewParams)) { e.preventDefault(); } else { ul.attr(ARIA_HIDDEN, true); element.attr(ARIA_EXPANDED, false); if (!dateView.popup.visible()) { element.removeAttr(ARIA_OWNS); } } }, open: function (e) { timeView._adjustListWidth(); if (that.trigger(OPEN, timeViewParams)) { e.preventDefault(); } else { if (element.val() !== that._oldText) { date = parse(element.val(), options.parseFormats, options.culture); that.timeView.value(date); } ul.attr(ARIA_HIDDEN, false); element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, timeView._timeViewID); timeView.options.active(timeView.current()); } }, active: function (current) { element.removeAttr(ARIA_ACTIVEDESCENDANT); if (current) { element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID); } } }); ul = timeView.ul; }, _icons: function () { var that = this, element = that.element, icons; icons = element.next('span.k-select'); if (!icons[0]) { icons = $('selectselect').insertAfter(element); } icons = icons.children(); that._dateIcon = icons.eq(0).attr({ 'role': 'button', 'aria-controls': that.dateView._dateViewID }); that._timeIcon = icons.eq(1).attr({ 'role': 'button', 'aria-controls': that.timeView._timeViewID }); }, _wrapper: function () { var that = this, element = that.element, wrapper; wrapper = element.parents('.k-datetimepicker'); if (!wrapper[0]) { wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default'); wrapper = wrapper.wrap(SPAN).parent(); } wrapper[0].style.cssText = element[0].style.cssText; element.css({ width: '100%', height: element[0].style.height }); that.wrapper = wrapper.addClass('k-widget k-datetimepicker k-header').addClass(element[0].className); that._inputWrapper = $(wrapper[0].firstChild); }, _reset: function () { var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form'); if (form[0]) { that._resetHandler = function () { that.value(element[0].defaultValue); that.max(that._initialOptions.max); that.min(that._initialOptions.min); }; that._form = form.on('reset', that._resetHandler); } }, _template: function () { this._ariaTemplate = kendo.template(this.options.ARIATemplate); }, _calculateMidnight: function (min, max) { return getMilliseconds(min) + getMilliseconds(max) === 0; }, _updateARIA: function (date) { var cell; var that = this; var calendar = that.dateView.calendar; that.element.removeAttr(ARIA_ACTIVEDESCENDANT); if (calendar) { cell = calendar._cell; cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() })); that.element.attr(ARIA_ACTIVEDESCENDANT, cell.attr('id')); } } }); function lastTimeOption(interval) { var date = new Date(2100, 0, 1); date.setMinutes(-interval); return date; } function preventDefault(e) { e.preventDefault(); } function normalize(options) { var patterns = kendo.getCulture(options.culture).calendars.standard.patterns, parseFormats = !options.parseFormats.length, timeFormat; options.format = extractFormat(options.format || patterns.g); options.timeFormat = timeFormat = extractFormat(options.timeFormat || patterns.t); kendo.DateView.normalize(options); if (parseFormats) { options.parseFormats.unshift('yyyy-MM-ddTHH:mm:ss'); } if ($.inArray(timeFormat, options.parseFormats) === -1) { options.parseFormats.splice(1, 0, timeFormat); } } ui.plugin(DateTimePicker); }(window.kendo.jQuery)); return window.kendo; }, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) { (a3 || a2)(); }));