{"version":3,"file":"kendo.calendar.min.js","sources":["kendo.calendar.js"],"sourcesContent":["(function(f, define) {\n define('kendo.calendar',[ \"kendo.core\", \"kendo.selectable\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"calendar\",\n name: \"Calendar\",\n category: \"web\",\n description: \"The Calendar widget renders a graphical calendar that supports navigation and selection.\",\n depends: [ \"core\", \"selectable\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n ui = kendo.ui,\n Widget = ui.Widget,\n keys = kendo.keys,\n parse = kendo.parseDate,\n adjustDST = kendo.date.adjustDST,\n weekInYear = kendo.date.weekInYear,\n Selectable = kendo.ui.Selectable,\n extractFormat = kendo._extractFormat,\n template = kendo.template,\n getCulture = kendo.getCulture,\n transitions = kendo.support.transitions,\n transitionOrigin = transitions ? transitions.css + \"transform-origin\" : \"\",\n cellTemplate = template('#=data.value#', { useWithBlock: false }),\n emptyCellTemplate = template('', { useWithBlock: false }),\n otherMonthCellTemplate = template(' ', { useWithBlock: false }),\n weekNumberTemplate = template('#= data.weekNumber #', { useWithBlock: false }),\n outerWidth = kendo._outerWidth,\n ns = \".kendoCalendar\",\n CLICK = \"click\" + ns,\n KEYDOWN_NS = \"keydown\" + ns,\n ID = \"id\",\n MIN = \"min\",\n LEFT = \"left\",\n SLIDE = \"slideIn\",\n MONTH = \"month\",\n CENTURY = \"century\",\n CHANGE = \"change\",\n NAVIGATE = \"navigate\",\n VALUE = \"value\",\n HOVER = \"k-hover\",\n DISABLED = \"k-disabled\",\n FOCUSED = \"k-focus\",\n OTHERMONTH = \"k-other-month\",\n OUTOFRANGE = \"k-out-of-range\",\n TODAY = \"k-nav-today\",\n CELLSELECTOR = \"td:has(.k-link)\",\n CELLSELECTORVALID = \"td:has(.k-link):not(.\" + DISABLED + \"):not(.\" + OUTOFRANGE + \")\",\n WEEKCOLUMNSELECTOR = \"td:not(:has(.k-link))\",\n SELECTED = \"k-selected\",\n BLUR = \"blur\" + ns,\n FOCUS = \"focus\",\n FOCUS_WITH_NS = FOCUS + ns,\n MOUSEENTER = support.touch ? \"touchstart\" : \"mouseenter\",\n MOUSEENTER_WITH_NS = support.touch ? \"touchstart\" + ns : \"mouseenter\" + ns,\n MOUSELEAVE = support.touch ? \"touchend\" + ns + \" touchmove\" + ns : \"mouseleave\" + ns,\n MS_PER_MINUTE = 60000,\n MS_PER_DAY = 86400000,\n PREVARROW = \"_prevArrow\",\n NEXTARROW = \"_nextArrow\",\n ARIA_DISABLED = \"aria-disabled\",\n ARIA_SELECTED = \"aria-selected\",\n ARIA_LABEL = \"aria-label\",\n extend = $.extend,\n DATE = Date,\n views = {\n month: 0,\n year: 1,\n decade: 2,\n century: 3\n },\n HEADERSELECTOR = '.k-header, .k-calendar-header',\n CLASSIC_HEADER_TEMPLATE = '
' +\n '' +\n '' +\n '' +\n '
',\n MODERN_HEADER_TEMPLATE = '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '#=messages.today#' +\n '' +\n '' +\n '' +\n '' +\n '
';\n\n var Calendar = Widget.extend({\n init: function(element, options) {\n var that = this, value, id;\n options = options || {};\n options.componentType = options.componentType || \"classic\";\n Widget.fn.init.call(that, element, options);\n\n element = that.wrapper = that.element;\n options = that.options;\n\n options.url = kendo.unescape(options.url);\n\n that.options.disableDates = getDisabledExpr(that.options.disableDates);\n\n that._templates();\n\n that._selectable();\n\n that._header();\n\n that._viewWrapper();\n\n if (that.options.hasFooter) {\n that._footer(that.footer);\n } else {\n that._today = that.element.find('a.k-nav-today');\n that._toggle();\n }\n\n id = element\n .addClass(\"k-widget k-calendar \" + (options.weekNumber ? \" k-week-number\" : \"\"))\n .on(MOUSEENTER_WITH_NS + \" \" + MOUSELEAVE, CELLSELECTOR, mousetoggle)\n .on(KEYDOWN_NS, \"table.k-content\", that._move.bind(that))\n .on(CLICK + \" touchend\", CELLSELECTOR, function(e) {\n var link = e.currentTarget.firstChild,\n value = toDateObject(link);\n\n if (link.href.indexOf(\"#\") != -1) {\n e.preventDefault();\n }\n\n if (that._view.name == \"month\" && that.options.disableDates(value)) {\n return;\n }\n if (that._view.name != \"month\" || options.selectable == \"single\") {\n that._click($(link));\n }\n })\n .on(\"mouseup\" + ns, \"table.k-content, .k-footer\", function() {\n that._focusView(that.options.focusOnNav !== false);\n })\n .attr(ID);\n\n if (that._isMultipleSelection() && that.options.weekNumber) {\n element.on(CLICK, WEEKCOLUMNSELECTOR, function(e) {\n var first = $(e.currentTarget).closest(\"tr\").find(CELLSELECTORVALID).first(),\n last = that.selectable._lastActive = $(e.currentTarget).closest(\"tr\").find(CELLSELECTORVALID).last();\n that.selectable.selectRange(first, last);\n that.selectable.trigger(CHANGE, { event: e });\n that._current = that._value = toDateObject(last.find(\"a\"));\n that._setCurrent(that._current);\n });\n }\n\n normalize(options);\n value = parse(options.value, options.format, options.culture);\n that._selectDates = [];\n\n that._index = views[options.start];\n\n that._current = new DATE(+restrictValue(value, options.min, options.max));\n\n that._addClassProxy = function() {\n that._active = true;\n\n if (that._cell.hasClass(DISABLED)) {\n var todayString = that._view.toDateString(getToday());\n that._cell = that._cellByDate(todayString);\n }\n\n that._cell.addClass(FOCUSED);\n };\n\n that._removeClassProxy = function() {\n that._active = false;\n if (that._cell) {\n that._cell.removeClass(FOCUSED);\n }\n };\n\n that.value(value);\n\n if (that._isMultipleSelection() && options.selectDates.length > 0) {\n that.selectDates(options.selectDates);\n }\n kendo.notify(that);\n },\n\n options: {\n name: \"Calendar\",\n value: null,\n min: new DATE(1900, 0, 1),\n max: new DATE(2099, 11, 31),\n dates: [],\n disableDates: null,\n url: \"\",\n culture: \"\",\n footer: \"\",\n format: \"\",\n month: {},\n weekNumber: false,\n selectable: \"single\",\n selectDates: [],\n start: MONTH,\n depth: MONTH,\n size: \"medium\",\n animation: {\n horizontal: {\n effects: SLIDE,\n reverse: true,\n duration: 500,\n divisor: 2\n },\n vertical: {\n effects: \"zoomIn\",\n duration: 400\n }\n },\n messages: {\n weekColumnHeader: \"\",\n today: \"Today\",\n navigateTo: \"Navigate to \",\n parentViews: {\n month: \"year view\",\n year: \"decade view\",\n decade: \"century view\"\n }\n },\n componentType: \"classic\"\n },\n\n events: [\n CHANGE,\n NAVIGATE\n ],\n\n componentTypes: {\n \"classic\": {\n header: {\n template: CLASSIC_HEADER_TEMPLATE\n },\n hasFooter: true,\n linksSelector: \".k-button\",\n contentClasses: \"k-calendar-table k-content\"\n },\n \"modern\": {\n header: {\n template: MODERN_HEADER_TEMPLATE\n },\n hasFooter: false,\n linksSelector: \".k-button\",\n contentClasses: \"k-calendar-table k-content k-calendar-content\"\n }\n },\n\n setOptions: function(options) {\n var that = this;\n\n normalize(options);\n\n options.disableDates = getDisabledExpr(options.disableDates);\n that._destroySelectable();\n\n if (options.messages) {\n options.messages = $.extend({}, true, that.options.messages, options.messages);\n }\n\n Widget.fn.setOptions.call(that, options);\n\n that._templates();\n\n that._selectable();\n\n that._viewWrapper();\n\n if (that.options.hasFooter) {\n that._footer(that.footer);\n } else {\n that.element.find(\".k-footer\").hide();\n that._toggle();\n }\n that._index = views[that.options.start];\n\n that.navigate();\n\n if (options.weekNumber) {\n that.element.addClass('k-week-number');\n }\n },\n\n destroy: function() {\n var that = this,\n today = that._today;\n\n that.element.off(ns);\n that._title.off(ns);\n that[PREVARROW].off(ns);\n that[NEXTARROW].off(ns);\n that._destroySelectable();\n kendo.destroy(that._table);\n\n if (today) {\n kendo.destroy(today.off(ns));\n }\n\n Widget.fn.destroy.call(that);\n },\n\n current: function() {\n return this._current;\n },\n\n view: function() {\n return this._view;\n },\n\n focus: function(table) {\n table = table || this._table;\n this._bindTable(table);\n table.trigger(\"focus\");\n },\n\n min: function(value) {\n return this._option(MIN, value);\n },\n\n max: function(value) {\n return this._option(\"max\", value);\n },\n\n navigateToPast: function() {\n this._navigate(PREVARROW, -1);\n },\n\n navigateToFuture: function() {\n this._navigate(NEXTARROW, 1);\n },\n\n navigateUp: function() {\n var that = this,\n index = that._index;\n\n if (that._title.hasClass(DISABLED)) {\n return;\n }\n\n that.navigate(that._current, ++index);\n },\n\n navigateDown: function(value) {\n var that = this,\n index = that._index,\n depth = that.options.depth;\n\n if (!value) {\n return;\n }\n\n if (index === views[depth]) {\n if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\n that.value(value);\n that.trigger(CHANGE);\n }\n return;\n }\n\n that.navigate(value, --index);\n },\n\n navigate: function(value, view) {\n view = isNaN(view) ? views[view] : view;\n\n var that = this,\n options = that.options,\n culture = options.culture,\n min = options.min,\n max = options.max,\n title = that._title,\n from = that._table,\n old = that._oldTable,\n currentValue = that._current,\n future = value && +value > +currentValue,\n vertical = view !== undefined && view !== that._index,\n to, currentView, compare,\n disabled,\n viewWrapper = that.element.children(\".k-calendar-view\");\n\n if (!value) {\n value = currentValue;\n }\n\n that._current = value = new DATE(+restrictValue(value, min, max));\n\n if (view === undefined) {\n view = that._index;\n } else {\n that._index = view;\n }\n\n that._view = currentView = calendar.views[view];\n compare = currentView.compare;\n\n disabled = view === views[CENTURY];\n title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n\n disabled = compare(value, min) < 1;\n that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n\n disabled = compare(value, max) > -1;\n that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n\n if (from && old && old.data(\"animating\")) {\n old.kendoStop(true, true);\n from.kendoStop(true, true);\n }\n\n that._oldTable = from;\n\n if (!from || that._changeView) {\n title.html(currentView.title(value, min, max, culture));\n\n if (that.options.messages.parentViews && that._view.name !== CENTURY) {\n title.attr(\"title\", that.options.messages.navigateTo + that.options.messages.parentViews[that._view.name]);\n } else {\n title.removeAttr(\"title\");\n }\n\n that._table = to = $(currentView.content(extend({\n min: min,\n max: max,\n date: value,\n url: options.url,\n dates: options.dates,\n format: options.format,\n otherMonth: true,\n culture: culture,\n disableDates: options.disableDates,\n isWeekColumnVisible: options.weekNumber,\n messages: options.messages,\n contentClasses: that.options.contentClasses\n }, that[currentView.name])));\n\n that._aria();\n\n addClassToViewContainer(to, currentView.name);\n var replace = from && from.data(\"start\") === to.data(\"start\");\n that._animate({\n from: from,\n to: to,\n vertical: vertical,\n future: future,\n replace: replace\n });\n\n viewWrapper.removeClass(\"k-calendar-monthview k-calendar-yearview k-calendar-decadeview k-calendar-centuryview\");\n viewWrapper.addClass(\"k-calendar-\" + currentView.name + \"view\");\n\n that.trigger(NAVIGATE);\n\n that._focus(value);\n }\n\n if (view === views[options.depth] && that._selectDates.length > 0) {\n that._visualizeSelectedDatesInView();\n }\n\n if (that.options.selectable === \"single\") {\n if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) {\n that._selectCell(that._value);\n }\n }\n\n that._setCurrent(value);\n\n if (!from && that._cell) {\n that._cell.removeClass(FOCUSED);\n }\n\n that._changeView = true;\n },\n\n selectDates: function(dates) {\n var that = this,\n validSelectedDates,\n datesUnique;\n\n if (dates === undefined) {\n return that._selectDates;\n }\n\n datesUnique = dates\n .map(function(date) { return date.getTime(); })\n .filter(function(date, position, array) {\n return array.indexOf(date) === position;\n })\n .map(function(time) { return new Date(time); });\n\n validSelectedDates = $.grep(datesUnique, function(value) {\n if (value) {\n return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\n }\n });\n that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : (datesUnique.length === 0 ? datesUnique : that._selectDates);\n that._visualizeSelectedDatesInView();\n },\n\n value: function(value) {\n var that = this,\n old = that._view,\n view = that._view;\n\n if (value === undefined) {\n return that._value;\n }\n\n value = that._validateValue(value);\n if (value && that._isMultipleSelection()) {\n var date = new Date(+value);\n date.setHours(0, 0, 0, 0);\n that._selectDates = [date];\n that.selectable._lastActive = null;\n }\n if (old && value === null && that._cell) {\n that._cell.removeClass(SELECTED);\n } else {\n that._changeView = !value || view && view.compare(value, that._current) !== 0;\n that.navigate(value);\n }\n },\n\n _aria: function() {\n var table = this._table;\n\n table.attr(\"aria-labelledby\", this._title.attr(\"id\"));\n\n if (this._view.name === \"month\" && this.options.selectable === \"multiple\") {\n table.attr(\"aria-multiselectable\", \"true\");\n }\n },\n\n _validateValue: function(value) {\n var that = this,\n options = that.options,\n min = options.min,\n max = options.max;\n\n if (value === null) {\n that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\n }\n\n value = parse(value, options.format, options.culture);\n\n if (value !== null) {\n value = new DATE(+value);\n\n if (!isInRange(value, min, max)) {\n value = null;\n }\n }\n\n if (value === null || !that.options.disableDates(new Date(+value))) {\n that._value = value;\n } else if (that._value === undefined) {\n that._value = null;\n }\n\n return that._value;\n },\n\n _visualizeSelectedDatesInView: function() {\n var that = this;\n var selectedDates = {};\n $.each(that._selectDates, function(index, value) {\n selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\n });\n that.selectable.clear();\n var cells = that._table\n .find(CELLSELECTOR)\n .filter(function(index, element) {\n return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\n });\n if (cells.length > 0) {\n that.selectable._selectElement(cells, true);\n }\n },\n\n _isMultipleSelection: function() {\n var that = this;\n return that.options.selectable === \"multiple\";\n },\n\n _selectable: function() {\n var that = this;\n if (!that._isMultipleSelection()) {\n return;\n }\n\n var selectable = that.options.selectable,\n selectableOptions = Selectable.parseOptions(selectable);\n\n that.selectable = new Selectable(that.wrapper, {\n aria: true,\n //excludes the anchor element\n inputSelectors: \"input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up\",\n multiple: selectableOptions.multiple,\n filter: \"table.k-month:eq(0) \" + CELLSELECTORVALID,\n change: that._onSelect.bind(that),\n relatedTarget: that._onRelatedTarget.bind(that)\n });\n },\n\n _onRelatedTarget: function(target) {\n var that = this;\n\n if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {\n that._current = toDateObject(target.find(\"a\"));\n that._setCurrent(that._current);\n }\n\n },\n\n _onSelect: function(e) {\n var that = this,\n eventArgs = e,\n selectableOptions = Selectable.parseOptions(that.options.selectable);\n\n if (!selectableOptions.multiple) {\n if ($(eventArgs.event.currentTarget).is(\"td\") && !$(eventArgs.event.currentTarget).hasClass(\"k-selected\")) {\n $(eventArgs.event.currentTarget).addClass(\"k-selected\");\n }\n else {\n that._click($(eventArgs.event.currentTarget).find(\"a\"));\n }\n return;\n }\n\n if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) {\n if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) {\n that._toggleSelection($(eventArgs.event.currentTarget));\n }\n else {\n that._cellsBySelector(CELLSELECTORVALID).each(function(index, element) {\n var value = toDateObject($(element).find(\"a\"));\n that._deselect(value);\n });\n that._addSelectedCellsToArray();\n }\n }\n else if (eventArgs.event.shiftKey) {\n that._rangeSelection(that._cell);\n }\n else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) {\n that.value(toDateObject($(eventArgs.event.currentTarget).find(\"a\")));\n }\n else {\n that._selectDates = [];\n that._addSelectedCellsToArray();\n }\n that.trigger(CHANGE);\n },\n\n _destroySelectable: function() {\n var that = this;\n\n if (that.selectable) {\n that.selectable.destroy();\n that.selectable = null;\n }\n },\n\n //when ctrl key is clicked\n _toggleSelection: function(currentCell) {\n var that = this,\n date = toDateObject(currentCell.find(\"a\"));\n if (currentCell.hasClass(\"k-selected\")) {\n that._selectDates.push(date);\n }\n else {\n that._deselect(date);\n }\n },\n\n //shift selection\n _rangeSelection: function(toDateCell, startDate) {\n var that = this,\n fromDate = startDate || toDateObject(that.selectable.value().first().find(\"a\")),\n toDate = toDateObject(toDateCell.find(\"a\")),\n daysDifference;\n\n if (that.selectable._lastActive || that._value) {\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find(\"a\")) : new Date(+that._value);\n } else {\n that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();\n }\n\n that._selectDates = [];\n daysDifference = daysBetweenTwoDates(fromDate, toDate);\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n\n that._visualizeSelectedDatesInView();\n },\n\n _cellsBySelector: function(selector) {\n var that = this;\n return that._table.find(selector);\n },\n\n _addSelectedCellsToArray: function() {\n var that = this;\n that.selectable.value().each(function(index, item) {\n var date = toDateObject($(item.firstChild));\n if (!that.options.disableDates(date)) {\n that._selectDates.push(date);\n }\n });\n },\n\n _deselect: function(date) {\n var that = this;\n var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\n if (currentDateIndex != -1) {\n that._selectDates.splice(currentDateIndex, 1);\n }\n },\n\n _dateInView: function(date) {\n var that = this,\n firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).first().find(\"a\")),\n lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID).last().find(\"a\"));\n\n return +date <= +lastDateInView && +date >= +firstDateInView;\n },\n\n _isNavigatable: function(currentValue, cellIndex) {\n var that = this;\n var isDisabled = that.options.disableDates;\n var cell;\n var index;\n\n if (that._view.name == \"month\") {\n return !isDisabled(currentValue);\n } else {\n index = that.wrapper.find(\".\" + FOCUSED).index();\n cell = that.wrapper.find(\".k-content td\").eq(index + cellIndex);\n return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);\n }\n },\n\n _move: function(e) {\n var that = this,\n options = that.options,\n key = e.keyCode,\n view = that._view,\n index = that._index,\n min = that.options.min,\n max = that.options.max,\n currentValue = new DATE(+that._current),\n isRtl = kendo.support.isRtl(that.wrapper),\n isDisabled = that.options.disableDates,\n value, prevent, method, temp;\n\n if (e.target === that._table[0]) {\n that._active = true;\n }\n\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n value = 1;\n prevent = true;\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n value = -1;\n prevent = true;\n } else if (key == keys.UP) {\n value = index === 0 ? -7 : -4;\n prevent = true;\n } else if (key == keys.DOWN) {\n value = index === 0 ? 7 : 4;\n prevent = true;\n } else if (key == keys.SPACEBAR) {\n value = 0;\n prevent = true;\n } else if (key == keys.HOME || key == keys.END) {\n method = key == keys.HOME ? \"first\" : \"last\";\n temp = view[method](currentValue);\n currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\n currentValue.setFullYear(temp.getFullYear());\n prevent = true;\n } else if (key === 84) {\n that._todayClick(e);\n prevent = true;\n }\n\n if (e.ctrlKey || e.metaKey) {\n if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n that.navigateToFuture();\n prevent = true;\n } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n that.navigateToPast();\n prevent = true;\n } else if (key == keys.UP) {\n that.navigateUp();\n prevent = true;\n } else if (key == keys.DOWN) {\n that._click($(that._cell[0].firstChild));\n prevent = true;\n }\n else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {\n that._keyboardToggleSelection(e);\n\n var focusedDate = toDateObject($(that._cell[0]).find(\"a\"));\n that._setCurrent(focusedDate);\n\n }\n } else if (e.shiftKey) {\n if (value !== undefined || method) {\n if (!method) {\n view.setDate(currentValue, value);\n }\n\n if (!isInRange(currentValue, min, max)) {\n currentValue = restrictValue(currentValue, options.min, options.max);\n }\n\n if (isDisabled(currentValue)) {\n currentValue = that._nextNavigatable(currentValue, value);\n }\n\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n if (that._isMultipleSelection()) {\n that._keyboardRangeSelection(e, currentValue);\n }\n else {\n that._focus(currentValue);\n }\n }\n } else {\n if (key == keys.ENTER || key == keys.SPACEBAR) {\n if (view.name == \"month\" && that._isMultipleSelection()) {\n that.value(toDateObject($(that._cell.find(\"a\"))));\n that.selectable._lastActive = $(that._cell[0]);\n that.trigger(CHANGE);\n }\n else {\n that._click($(that._cell[0].firstChild));\n }\n prevent = true;\n } else if (key == keys.PAGEUP) {\n prevent = true;\n that.navigateToPast();\n } else if (key == keys.PAGEDOWN) {\n prevent = true;\n that.navigateToFuture();\n }\n\n if (value || method) {\n if (!method) {\n view.setDate(currentValue, value);\n }\n\n min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n\n if (!isInRange(currentValue, min, max)) {\n currentValue = restrictValue(currentValue, options.min, options.max);\n }\n\n if (!that._isNavigatable(currentValue, value)) {\n currentValue = that._nextNavigatable(currentValue, value);\n }\n\n if (that._isMultipleSelection()) {\n if (!that._dateInView(currentValue)) {\n that.navigate(currentValue);\n }\n else {\n that._current = currentValue;\n that._setCurrent(currentValue);\n }\n }\n else {\n that._focus(currentValue);\n }\n }\n }\n\n if (prevent) {\n e.preventDefault();\n }\n\n return that._current;\n },\n\n _keyboardRangeSelection: function(event, currentValue) {\n var that = this,\n fromDate,\n daysDifference;\n\n if (!that._dateInView(currentValue)) {\n that._selectDates = [];\n\n fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find(\"a\")) : currentValue;\n daysDifference = daysBetweenTwoDates(fromDate, new Date(+currentValue));\n\n addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n\n that.navigate(currentValue);\n that._current = currentValue;\n that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);\n that.trigger(CHANGE);\n return;\n }\n that.selectable.options.filter = that.wrapper.find(\"table\").length > 1 && +currentValue > +that._current ? \"table.k-month:eq(1) \" + CELLSELECTORVALID : \"table.k-month:eq(0) \" + CELLSELECTORVALID;\n that._setCurrent(currentValue);\n that._current = currentValue;\n\n that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);\n\n that.trigger(CHANGE);\n\n that.selectable.options.filter = \"table.k-month:eq(0) \" + CELLSELECTORVALID;\n },\n\n _keyboardToggleSelection: function(event) {\n var that = this;\n\n event.currentTarget = that._cell[0];\n that.selectable._lastActive = $(that._cell[0]);\n\n if ($(that._cell[0]).hasClass(SELECTED)) {\n that.selectable._unselect($(that._cell[0]));\n }\n else {\n that.selectable.value($(that._cell[0]));\n }\n that.selectable.trigger(CHANGE, { event: event });\n },\n\n _nextNavigatable: function(currentValue, value) {\n var that = this,\n disabled = true,\n view = that._view,\n min = that.options.min,\n max = that.options.max,\n isDisabled = that.options.disableDates,\n navigatableDate = new Date(currentValue.getTime());\n\n view.setDate(navigatableDate, -value);\n\n while (disabled) {\n view.setDate(currentValue, value);\n\n if (!isInRange(currentValue, min, max)) {\n currentValue = navigatableDate;\n break;\n }\n disabled = isDisabled(currentValue);\n }\n return currentValue;\n },\n\n _animate: function(options) {\n var that = this;\n var from = options.from;\n var to = options.to;\n var active = that._active;\n var viewWrapper = that.element.children(\".k-calendar-view\");\n\n if (!from) {\n viewWrapper.append(to);\n that._bindTable(to);\n } else if (from.parent().data(\"animating\")) {\n from.off(ns);\n from.parent().kendoStop(true, true).remove();\n from.remove();\n\n viewWrapper.append(to);\n that._focusView(active);\n } else if (!from.is(\":visible\") || that.options.animation === false || options.replace) {\n to.insertAfter(from);\n from.off(ns).remove();\n\n that._focusView(active);\n } else {\n that[options.vertical ? \"_vertical\" : \"_horizontal\"](from, to, options.future);\n }\n },\n\n _horizontal: function(from, to, future) {\n var that = this,\n active = that._active,\n horizontal = that.options.animation.horizontal,\n effects = horizontal.effects,\n viewWidth = outerWidth(from),\n margin = (outerWidth(from, true) - viewWidth);\n\n if (effects && effects.indexOf(SLIDE) != -1) {\n from.add(to).css({ width: viewWidth });\n\n from.wrap(\"
\");\n\n that._focusView(active, from);\n\n from.parent()\n .css({\n position: \"relative\",\n width: (viewWidth * 2) + (2 * margin),\n display: \"flex\",\n \"margin-left\": future ? 0 : (-viewWidth - margin)\n });\n\n to[future ? \"insertAfter\" : \"insertBefore\"](from);\n\n extend(horizontal, {\n effects: SLIDE + \":\" + (future ? \"right\" : LEFT),\n complete: function() {\n from.off(ns).remove();\n that._oldTable = null;\n\n to.unwrap();\n\n that._focusView(active);\n\n }\n });\n\n from.parent().kendoStop(true, true).kendoAnimate(horizontal);\n }\n },\n\n _vertical: function(from, to) {\n var that = this,\n vertical = that.options.animation.vertical,\n effects = vertical.effects,\n active = that._active, //active state before from's blur\n cell, position;\n\n if (effects && effects.indexOf(\"zoom\") != -1) {\n to.insertBefore(from);\n\n from.css({\n position: \"absolute\",\n width: to.width()\n });\n\n if (transitionOrigin) {\n cell = that._cellByDate(that._view.toDateString(that._current));\n position = cell.position();\n position = (position.left + parseInt(cell.width() / 2, 10)) + \"px\" + \" \" + (position.top + parseInt(cell.height() / 2, 10) + \"px\");\n to.css(transitionOrigin, position);\n }\n\n from.kendoStop(true, true).kendoAnimate({\n effects: \"fadeOut\",\n duration: 600,\n complete: function() {\n from.off(ns).remove();\n that._oldTable = null;\n\n that._focusView(active);\n }\n });\n\n to.kendoStop(true, true).kendoAnimate(vertical);\n }\n },\n\n _cellByDate: function(value, selector) {\n return this._table.find(selector ? selector : \"td:not(.\" + OTHERMONTH + \")\")\n .filter(function() {\n return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n });\n },\n\n _selectCell: function(date) {\n var that = this,\n cell = that._selectedCell,\n value = that._view.toDateString(date);\n\n if (cell && cell[0]) {\n cell[0].removeAttribute(ARIA_SELECTED);\n cell.removeClass(SELECTED);\n }\n\n cell = that._cellByDate(value, that.options.selectable == \"multiple\" ? CELLSELECTOR : \"td:not(.\" + OTHERMONTH + \")\");\n\n that._selectedCell = cell;\n cell.addClass(SELECTED)\n .attr(ARIA_SELECTED, true);\n },\n\n _setCurrent: function(date) {\n var that = this,\n id = kendo.guid(),\n cell = that._cell,\n value = that._view.toDateString(date);\n\n if (cell && cell[0]) {\n cell.removeClass(FOCUSED);\n cell[0].removeAttribute(ARIA_LABEL);\n cell[0].removeAttribute(ID);\n }\n\n cell = that._cellByDate(value, that.options.selectable == \"multiple\" ? CELLSELECTOR : \"td:not(.\" + OTHERMONTH + \")\");\n\n that._cell = cell;\n\n cell.attr(ID, id)\n .addClass(FOCUSED);\n\n if (that._table[0]) {\n that._table[0].removeAttribute(\"aria-activedescendant\");\n that._table.attr(\"aria-activedescendant\", id);\n }\n },\n\n _bindTable: function(table) {\n table\n .on(FOCUS_WITH_NS, this._addClassProxy)\n .on(BLUR, this._removeClassProxy);\n },\n\n _click: function(link) {\n var that = this,\n options = that.options,\n currentValue = new Date(+that._current),\n value = toDateObject(link);\n\n adjustDST(value, 0);\n\n if (that._view.name == \"month\" && that.options.disableDates(value)) {\n value = that._value;\n }\n\n that._view.setDate(currentValue, value);\n\n that.navigateDown(restrictValue(currentValue, options.min, options.max));\n },\n\n _focus: function(value) {\n var that = this,\n view = that._view;\n\n if (view.compare(value, that._current) !== 0) {\n that.navigate(value);\n } else {\n that._current = value;\n that._setCurrent(value);\n }\n },\n\n _focusView: function(active, table) {\n if (active) {\n this.focus(table);\n }\n },\n\n _viewWrapper: function() {\n var that = this;\n var element = that.element;\n var viewWrapper = element.children(\".k-calendar-view\");\n\n if (!viewWrapper[0]) {\n viewWrapper = $(\"
\").insertAfter(element.find(HEADERSELECTOR));\n }\n },\n\n _footer: function(template) {\n var that = this,\n today = getToday(),\n element = that.element,\n footer = element.find(\".k-footer\");\n\n if (!template) {\n that._toggle(false);\n footer.hide();\n return;\n }\n\n if (!footer[0]) {\n footer = $('
').appendTo(element);\n }\n\n that._today = footer.show()\n .find(\".k-link\")\n .html(template(today))\n .attr(\"title\", kendo.toString(today, \"D\", that.options.culture));\n\n that._toggle();\n },\n\n _header: function() {\n var that = this,\n element = that.element,\n linksSelector = that.options.linksSelector;\n\n if (!element.find(HEADERSELECTOR)[0]) {\n element.html(kendo.template(that.options.header.template)($.extend(true,{}, that.options, {\n actionAttr: kendo.attr(\"action\"),\n size: kendo.getValidCssClass(\"k-button-\", \"size\", that.options.size)\n })));\n }\n\n element.find(linksSelector)\n .on(CLICK + \" touchend\" + ns, function() { return false; } );\n\n that._title = element.find('[' + kendo.attr(\"action\") + '=\"nav-up\"]').on(CLICK + \" touchend\" + ns, function() {\n that._active = that.options.focusOnNav !== false;\n that.navigateUp();\n });\n that[PREVARROW] = element.find('[' + kendo.attr(\"action\") + '=\"prev\"]').on(CLICK + \" touchend\" + ns, function() {\n that._active = that.options.focusOnNav !== false;\n that.navigateToPast();\n });\n that[NEXTARROW] = element.find('[' + kendo.attr(\"action\") + '=\"next\"]').on(CLICK + \" touchend\" + ns, function() {\n that._active = that.options.focusOnNav !== false;\n that.navigateToFuture();\n });\n element.find('[' + kendo.attr(\"action\") + '=\"today\"]').on(CLICK + \" touchend\" + ns, that._todayClick.bind(that));\n\n },\n\n _navigate: function(arrow, modifier) {\n var that = this,\n index = that._index + 1,\n currentValue = new DATE(+that._current);\n\n if (that._isMultipleSelection()) {\n var firstDayCurrentMonth = that._table.find(\"td:not(.k-other-month):not(.k-out-of-range)\").has(\".k-link\").first();\n currentValue = toDateObject(firstDayCurrentMonth.find(\"a\"));\n that._current = new Date(+currentValue);\n }\n\n arrow = that[arrow];\n\n if (!arrow.hasClass(DISABLED)) {\n if (index > 3) {\n currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\n } else {\n calendar.views[index].setDate(currentValue, modifier);\n }\n\n that.navigate(currentValue);\n }\n },\n\n _option: function(option, value) {\n var that = this,\n options = that.options,\n currentValue = that._value || that._current,\n isBigger;\n\n if (value === undefined) {\n return options[option];\n }\n\n value = parse(value, options.format, options.culture);\n\n if (!value) {\n return;\n }\n\n options[option] = new DATE(+value);\n\n if (option === MIN) {\n isBigger = value > currentValue;\n } else {\n isBigger = currentValue > value;\n }\n\n if (isBigger || isEqualMonth(currentValue, value)) {\n if (isBigger) {\n that._value = null;\n }\n that._changeView = true;\n }\n\n if (!that._changeView) {\n that._changeView = !!(options.month.content || options.month.empty);\n }\n\n that.navigate(that._value);\n\n that._toggle();\n },\n\n _toggle: function(toggle) {\n var that = this,\n options = that.options,\n isTodayDisabled = that.options.disableDates(getToday()),\n link = that._today,\n todayClass = that._todayClass();\n\n if (toggle === undefined) {\n toggle = isInRange(getToday(), options.min, options.max);\n }\n\n if (link) {\n link.off(CLICK);\n\n if (toggle && !isTodayDisabled) {\n link.addClass(todayClass)\n .removeClass(DISABLED)\n .on(CLICK, that._todayClick.bind(that));\n } else {\n link.removeClass(todayClass)\n .addClass(DISABLED)\n .on(CLICK, prevent);\n }\n }\n },\n\n _todayClass: function() {\n return TODAY;\n },\n\n _todayClick: function(e) {\n var that = this,\n depth = views[that.options.depth],\n disabled = that.options.disableDates,\n today = getToday();\n\n e.preventDefault();\n\n if (disabled(today)) {\n return;\n }\n\n if (that._view.compare(that._current, today) === 0 && that._index == depth) {\n that._changeView = false;\n }\n\n if (that._isMultipleSelection()) {\n that._selectDates = [today];\n that.selectable._lastActive = null;\n }\n\n that._value = today;\n that.navigate(today, depth);\n\n that.trigger(CHANGE);\n },\n\n _templates: function() {\n var that = this,\n options = that.options,\n footer = options.footer,\n month = options.month,\n content = month.content,\n weekNumber = month.weekNumber,\n empty = month.empty,\n footerTemplate = '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #';\n\n that.month = {\n content: template('' + (content || \"#=data.value#\") + '', { useWithBlock: !!content }),\n empty: template('' + (empty || \" \") + \"\", { useWithBlock: !!empty }),\n weekNumber: template('' + (weekNumber || \"#= data.weekNumber #\") + \"\", { useWithBlock: !!weekNumber })\n };\n\n that.year = {\n content: template('#=data.value#', { useWithBlock: false })\n };\n\n if (footer && footer !== true) {\n footerTemplate = footer;\n }\n\n that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;\n },\n\n _updateAria: function(ariaTemplate, date) {\n var that = this;\n var cell = that._cell;\n var valueType = that.view().valueType();\n var current = date || that.current();\n var text;\n\n if (valueType === \"month\") {\n text = kendo.toString(current, \"MMMM\");\n } else if (valueType === \"date\") {\n text = kendo.toString(current, \"D\");\n } else {\n text = cell.text();\n }\n\n cell.attr(\"aria-label\", ariaTemplate({ current: current, valueType: valueType, text: text }));\n\n return cell.attr(\"id\");\n }\n });\n\n ui.plugin(Calendar);\n\n var calendar = {\n firstDayOfMonth: function(date) {\n return createDate(\n date.getFullYear(),\n date.getMonth(),\n 1\n );\n },\n\n firstVisibleDay: function(date, calendarInfo) {\n calendarInfo = calendarInfo || kendo.culture().calendar;\n\n var firstDay = calendarInfo.firstDay,\n firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n firstVisibleDay.setFullYear(date.getFullYear());\n\n while (firstVisibleDay.getDay() != firstDay) {\n calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n }\n\n return firstVisibleDay;\n },\n\n setTime: function(date, time) {\n var tzOffsetBefore = date.getTimezoneOffset(),\n resultDATE = new DATE(date.getTime() + time),\n tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\n\n date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\n },\n views: [{\n name: MONTH,\n title: function(date, min, max, culture) {\n return getCalendarInfo(culture).months.names[date.getMonth()] + \" \" + date.getFullYear();\n },\n content: function(options) {\n var that = this,\n idx = 0,\n min = options.min,\n max = options.max,\n date = options.date,\n dates = options.dates,\n format = options.format,\n culture = options.culture,\n navigateUrl = options.url,\n showHeader = options.showHeader,\n otherMonth = options.otherMonth,\n isWeekColumnVisible = options.isWeekColumnVisible,\n hasUrl = navigateUrl && dates[0],\n currentCalendar = getCalendarInfo(culture),\n firstDayIdx = currentCalendar.firstDay,\n days = currentCalendar.days,\n names = shiftArray(days.names, firstDayIdx),\n shortNames = shiftArray(days.namesShort, firstDayIdx),\n start = calendar.firstVisibleDay(date, currentCalendar),\n firstDayOfMonth = that.first(date),\n lastDayOfMonth = that.last(date),\n toDateString = that.toDateString,\n today = getToday(),\n contentClasses = options.contentClasses,\n html = '';\n\n if (showHeader) {\n html += '';\n }\n\n html += '';\n\n if (isWeekColumnVisible) {\n html += '';\n }\n\n for (; idx < 7; idx++) {\n html += '';\n }\n\n adjustDST(today, 0);\n today = +today;\n\n return view({\n cells: 42,\n perRow: 7,\n html: html += '',\n start: start,\n isWeekColumnVisible: isWeekColumnVisible,\n weekNumber: options.weekNumber,\n min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),\n max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),\n otherMonth: otherMonth,\n content: options.content,\n lastDayOfMonth: lastDayOfMonth,\n empty: options.empty,\n setter: that.setDate,\n disableDates: options.disableDates,\n build: function(date, idx, disableDates) {\n var cssClass = [ \"k-calendar-td\" ],\n day = date.getDay(),\n linkClass = \"\",\n url = \"#\";\n\n if (date < firstDayOfMonth || date > lastDayOfMonth) {\n cssClass.push(OTHERMONTH);\n }\n\n if (disableDates(date)) {\n cssClass.push(DISABLED);\n }\n\n if (+date === today) {\n cssClass.push(\"k-today\");\n }\n\n if (day === 0 || day === 6) {\n cssClass.push(\"k-weekend\");\n }\n\n if (hasUrl && inArray(+date, dates)) {\n url = navigateUrl.replace(\"{0}\", kendo.toString(date, format, culture));\n linkClass = \" k-action-link\";\n }\n\n return {\n date: date,\n dates: dates,\n ns: kendo.ns,\n title: kendo.toString(date, \"D\", culture),\n value: date.getDate(),\n dateString: toDateString(date),\n cssClass: cssClass.join(\" \"),\n linkClass: linkClass,\n url: url\n };\n },\n weekNumberBuild: function(date) {\n return {\n weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\n currentDate: date\n };\n }\n });\n },\n first: function(date) {\n return calendar.firstDayOfMonth(date);\n },\n last: function(date) {\n var last = createDate(date.getFullYear(), date.getMonth() + 1, 0),\n first = calendar.firstDayOfMonth(date),\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n\n if (timeOffset) {\n last.setHours(first.getHours() + (timeOffset / 60));\n }\n\n return last;\n },\n compare: function(date1, date2) {\n var result,\n month1 = date1.getMonth(),\n year1 = date1.getFullYear(),\n month2 = date2.getMonth(),\n year2 = date2.getFullYear();\n\n if (year1 > year2) {\n result = 1;\n } else if (year1 < year2) {\n result = -1;\n } else {\n result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\n }\n\n return result;\n },\n setDate: function(date, value) {\n var hours = date.getHours();\n if (value instanceof DATE) {\n date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n } else {\n calendar.setTime(date, value * MS_PER_DAY);\n }\n adjustDST(date, hours);\n },\n toDateString: function(date) {\n return date.getFullYear() + \"/\" + date.getMonth() + \"/\" + date.getDate();\n },\n valueType: function() {\n return \"date\";\n }\n },\n {\n name: \"year\",\n title: function(date) {\n return date.getFullYear();\n },\n content: function(options) {\n var calendarMonths = getCalendarInfo(options.culture).months,\n namesAbbr = calendarMonths.namesAbbr,\n namesFull = calendarMonths.names,\n toDateString = this.toDateString,\n min = options.min,\n max = options.max,\n html = \"\";\n\n if (options.showHeader) {\n html += '
' + this.title(date, min, max, culture) + '
' + options.messages.weekColumnHeader + '' + shortNames[idx] + '
';\n html += '';\n html += '';\n html += '';\n }\n\n return view({\n min: createDate(min.getFullYear(), min.getMonth(), 1),\n max: createDate(max.getFullYear(), max.getMonth(), 1),\n start: createDate(options.date.getFullYear(), 0, 1),\n html: html,\n setter: this.setDate,\n content: options.content,\n build: function(date) {\n var cssClass = [ \"k-calendar-td\" ];\n\n return {\n value: namesAbbr[date.getMonth()],\n label: namesFull[date.getMonth()],\n ns: kendo.ns,\n dateString: toDateString(date),\n cssClass: cssClass.join(\" \")\n };\n }\n });\n },\n first: function(date) {\n return createDate(date.getFullYear(), 0, date.getDate());\n },\n last: function(date) {\n return createDate(date.getFullYear(), 11, date.getDate());\n },\n compare: function(date1, date2) {\n return compare(date1, date2);\n },\n setDate: function(date, value) {\n var month,\n hours = date.getHours();\n\n if (value instanceof DATE) {\n month = value.getMonth();\n\n date.setFullYear(value.getFullYear(), month, date.getDate());\n\n if (month !== date.getMonth()) {\n date.setDate(0);\n }\n } else {\n month = date.getMonth() + value;\n\n date.setMonth(month);\n\n if (month > 11) {\n month -= 12;\n }\n\n if (month > 0 && date.getMonth() != month) {\n date.setDate(0);\n }\n }\n\n adjustDST(date, hours);\n },\n toDateString: function(date) {\n return date.getFullYear() + \"/\" + date.getMonth() + \"/1\";\n },\n valueType: function() {\n return \"month\";\n }\n },\n {\n name: \"decade\",\n title: function(date, min, max) {\n return title(date, min, max, 10);\n },\n content: function(options) {\n var year = options.date.getFullYear(),\n toDateString = this.toDateString,\n html = \"\";\n\n if (options.showHeader) {\n html += '
';\n html += this.title(options.date);\n html += '
';\n html += '';\n html += '';\n html += '';\n }\n\n return view({\n start: createDate(year - year % 10 - 1, 0, 1),\n min: createDate(options.min.getFullYear(), 0, 1),\n max: createDate(options.max.getFullYear(), 0, 1),\n otherMonth: options.otherMonth,\n html: html,\n setter: this.setDate,\n build: function(date, idx) {\n var cssClass = [ \"k-calendar-td\" ];\n\n if (idx === 0 || idx === 11) {\n cssClass.push(OTHERMONTH);\n }\n\n return {\n value: date.getFullYear(),\n ns: kendo.ns,\n dateString: toDateString(date),\n cssClass: cssClass.join(\" \")\n };\n }\n });\n },\n first: function(date) {\n var year = date.getFullYear();\n return createDate(year - year % 10, date.getMonth(), date.getDate());\n },\n last: function(date) {\n var year = date.getFullYear();\n return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());\n },\n compare: function(date1, date2) {\n return compare(date1, date2, 10);\n },\n setDate: function(date, value) {\n setDate(date, value, 1);\n },\n toDateString: function(date) {\n return date.getFullYear() + \"/0/1\";\n },\n valueType: function() {\n return \"year\";\n }\n },\n {\n name: CENTURY,\n title: function(date, min, max) {\n return title(date, min, max, 100);\n },\n content: function(options) {\n var year = options.date.getFullYear(),\n min = options.min.getFullYear(),\n max = options.max.getFullYear(),\n toDateString = this.toDateString,\n minYear = min,\n maxYear = max,\n html = \"\";\n\n minYear = minYear - minYear % 10;\n maxYear = maxYear - maxYear % 10;\n\n if (maxYear - minYear < 10) {\n maxYear = minYear + 9;\n }\n\n if (options.showHeader) {\n html += '
';\n html += this.title(options.date, options.min, options.max);\n html += '
';\n html += '';\n html += '';\n html += '';\n }\n\n return view({\n start: createDate(year - year % 100 - 10, 0, 1),\n min: createDate(minYear, 0, 1),\n max: createDate(maxYear, 0, 1),\n otherMonth: options.otherMonth,\n html: html,\n setter: this.setDate,\n build: function(date, idx) {\n var cssClass = [ \"k-calendar-td\" ];\n var start = date.getFullYear(),\n end = start + 9;\n\n if (idx === 0 || idx === 11) {\n cssClass.push(OTHERMONTH);\n }\n\n if (start < min) {\n start = min;\n }\n\n if (end > max) {\n end = max;\n }\n\n return {\n ns: kendo.ns,\n value: start + \" - \" + end,\n dateString: toDateString(date),\n cssClass: cssClass.join(\" \")\n };\n }\n });\n },\n first: function(date) {\n var year = date.getFullYear();\n return createDate(year - year % 100, date.getMonth(), date.getDate());\n },\n last: function(date) {\n var year = date.getFullYear();\n return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());\n },\n compare: function(date1, date2) {\n return compare(date1, date2, 100);\n },\n setDate: function(date, value) {\n setDate(date, value, 10);\n },\n toDateString: function(date) {\n var year = date.getFullYear();\n return (year - year % 10) + \"/0/1\";\n },\n valueType: function() {\n return \"decade\";\n }\n }]\n };\n\n function title(date, min, max, modular) {\n var start = date.getFullYear(),\n minYear = min.getFullYear(),\n maxYear = max.getFullYear(),\n end;\n\n start = start - start % modular;\n end = start + (modular - 1);\n\n if (start < minYear) {\n start = minYear;\n }\n if (end > maxYear) {\n end = maxYear;\n }\n\n return start + \"-\" + end;\n }\n\n function view(options) {\n var idx = 0,\n data,\n min = options.min,\n max = options.max,\n start = options.start,\n setter = options.setter,\n build = options.build,\n weekNumberBuild = options.weekNumberBuild,\n length = options.cells || 12,\n isWeekColumnVisible = options.isWeekColumnVisible,\n cellsPerRow = options.perRow || 4,\n otherMonth = options.otherMonth,\n lastDayOfMonth = options.lastDayOfMonth,\n weekNumber = options.weekNumber || weekNumberTemplate,\n content = options.content || cellTemplate,\n empty = options.empty || emptyCellTemplate,\n otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate,\n html = options.html || '
';\n html += this.title(options.date, options.min, options.max);\n html += '
';\n\n if (isWeekColumnVisible) {\n html += weekNumber(weekNumberBuild(start));\n }\n\n\n for (; idx < length; idx++) {\n if (idx > 0 && idx % cellsPerRow === 0) {\n html += '';\n if (isWeekColumnVisible) {\n html += otherMonth || (+start <= +lastDayOfMonth) ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: \" \" });\n }\n }\n\n start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\n adjustDST(start, 0);\n\n data = build(start, idx, options.disableDates);\n\n html += (data.cssClass.indexOf(OTHERMONTH) !== -1 && !otherMonth) ? otherMonthTemplate(data) : isInRange(start, min, max) ? content(data) : empty(data);\n\n setter(start, 1);\n }\n\n return html + \"
\";\n }\n\n function compare(date1, date2, modifier) {\n var year1 = date1.getFullYear(),\n start = date2.getFullYear(),\n end = start,\n result = 0;\n\n if (modifier) {\n start = start - start % modifier;\n end = start - start % modifier + modifier - 1;\n }\n\n if (year1 > end) {\n result = 1;\n } else if (year1 < start) {\n result = -1;\n }\n\n return result;\n }\n\n function getToday() {\n var today = new DATE();\n return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n }\n\n function restrictValue(value, min, max) {\n var today = getToday();\n\n if (value) {\n today = new DATE(+value);\n }\n\n if (min > today) {\n today = new DATE(+min);\n } else if (max < today) {\n today = new DATE(+max);\n }\n return today;\n }\n\n function isInRange(date, min, max) {\n return +date >= +min && +date <= +max;\n }\n\n function shiftArray(array, idx) {\n return array.slice(idx).concat(array.slice(0, idx));\n }\n\n function setDate(date, value, multiplier) {\n value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\n date.setFullYear(value);\n }\n\n function daysBetweenTwoDates(startDate, endDate) {\n if (+endDate < +startDate) {\n var temp = +startDate;\n calendar.views[0].setDate(startDate, endDate);\n calendar.views[0].setDate(endDate, new Date(temp));\n }\n var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\n var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\n\n return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\n }\n\n function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\n for (var i = 0; i <= numberOfDays; i++) {\n var nextDay = new Date(fromDate.getTime());\n nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\n if (!disableDates(nextDay)) {\n array.push(nextDay);\n }\n }\n }\n\n function mousetoggle(e) {\n var disabled = $(this).hasClass(\"k-disabled\");\n\n if (!disabled) {\n $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\n }\n }\n\n function prevent(e) {\n e.preventDefault();\n }\n\n // creates date with full year\n function createDate(year, month, date) {\n var dateObject = new DATE(year, month, date);\n dateObject.setFullYear(year, month, date);\n return dateObject;\n }\n\n function getCalendarInfo(culture) {\n return getCulture(culture).calendars.standard;\n }\n\n function normalize(options) {\n var start = views[options.start],\n depth = views[options.depth],\n culture = getCulture(options.culture);\n\n options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\n\n if (isNaN(start)) {\n start = 0;\n options.start = MONTH;\n }\n\n if (depth === undefined || depth > start) {\n options.depth = MONTH;\n }\n\n if (options.dates === null) {\n options.dates = [];\n }\n }\n\n function addClassToViewContainer(element, currentView) {\n element.addClass(\"k-\" + currentView);\n }\n\n function inArray(date, dates) {\n for (var i = 0, length = dates.length; i < length; i++) {\n if (date === +dates[i]) {\n return true;\n }\n }\n return false;\n }\n\n function isEqualDatePart(value1, value2) {\n if (value1) {\n return value1.getFullYear() === value2.getFullYear() &&\n value1.getMonth() === value2.getMonth() &&\n value1.getDate() === value2.getDate();\n }\n\n return false;\n }\n\n function isEqualMonth(value1, value2) {\n if (value1) {\n return value1.getFullYear() === value2.getFullYear() &&\n value1.getMonth() === value2.getMonth();\n }\n\n return false;\n }\n\n\n function getDisabledExpr(option) {\n if (kendo.isFunction(option)) {\n return option;\n }\n\n if (Array.isArray(option)) {\n return createDisabledExpr(option);\n }\n return $.noop;\n }\n\n function convertDatesArray(dates) {\n var result = [];\n for (var i = 0; i < dates.length; i++) {\n result.push(dates[i].setHours(0, 0, 0, 0));\n }\n return result;\n }\n\n function createDisabledExpr(dates) {\n var body, callback,\n disabledDates = [],\n days = [\"su\", \"mo\", \"tu\", \"we\", \"th\", \"fr\", \"sa\"],\n searchExpression = \"if (found) {\" +\n \" return true \" +\n \"} else {\" +\n \"return false\" +\n \"}\";\n\n if (dates[0] instanceof DATE) {\n disabledDates = convertDatesArray(dates);\n body = \"var clonedDate = new Date(date); var found = date && window.kendo.jQuery.inArray(clonedDate.setHours(0, 0, 0, 0),[\" + disabledDates + \"]) > -1;\" + searchExpression;\n } else {\n for (var i = 0; i < dates.length; i++) {\n var day = dates[i].slice(0,2).toLowerCase();\n var index = $.inArray(day, days);\n if (index > -1) {\n disabledDates.push(index);\n }\n }\n body = \"var clonedDate = new Date(date); var found = date && window.kendo.jQuery.inArray(clonedDate.getDay(),[\" + disabledDates + \"]) > -1;\" + searchExpression;\n }\n\n callback = new Function(\"date\", body);\n\n return callback;\n }\n\n function isEqualDate(oldValue, newValue) {\n if (oldValue instanceof Date && newValue instanceof Date) {\n oldValue = oldValue.getTime();\n newValue = newValue.getTime();\n }\n\n return oldValue === newValue;\n }\n\n function toDateObject(link) {\n var value = $(link).attr(kendo.attr(VALUE)).split(\"/\");\n //Safari cannot create correctly date from \"1/1/2090\"\n value = createDate(value[0], value[1], value[2]);\n\n return value;\n }\n\n calendar.isEqualDatePart = isEqualDatePart;\n calendar.isEqualDate = isEqualDate;\n calendar.restrictValue = restrictValue;\n calendar.isInRange = isInRange;\n calendar.addClassToViewContainer = addClassToViewContainer;\n calendar.normalize = normalize;\n calendar.viewsEnum = views;\n calendar.disabled = getDisabledExpr;\n calendar.toDateObject = toDateObject;\n calendar.getToday = getToday;\n calendar.createDate = createDate;\n\n kendo.calendar = calendar;\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","$","window","kendo","jQuery","undefined","support","ui","Widget","keys","parse","parseDate","adjustDST","date","weekInYear","Selectable","extractFormat","_extractFormat","template","getCulture","transitions","transitionOrigin","css","cellTemplate","useWithBlock","emptyCellTemplate","otherMonthCellTemplate","weekNumberTemplate","outerWidth","_outerWidth","ns","CLICK","KEYDOWN_NS","ID","MIN","LEFT","SLIDE","MONTH","CENTURY","CHANGE","NAVIGATE","VALUE","HOVER","DISABLED","FOCUSED","OTHERMONTH","OUTOFRANGE","TODAY","CELLSELECTOR","CELLSELECTORVALID","WEEKCOLUMNSELECTOR","SELECTED","BLUR","FOCUS","FOCUS_WITH_NS","MOUSEENTER","touch","MOUSEENTER_WITH_NS","MOUSELEAVE","MS_PER_MINUTE","MS_PER_DAY","PREVARROW","NEXTARROW","ARIA_DISABLED","ARIA_SELECTED","ARIA_LABEL","extend","DATE","Date","views","month","year","decade","century","HEADERSELECTOR","CLASSIC_HEADER_TEMPLATE","MODERN_HEADER_TEMPLATE","Calendar","init","element","options","that","this","value","componentType","fn","call","wrapper","url","unescape","disableDates","getDisabledExpr","_templates","_selectable","_header","_viewWrapper","hasFooter","_footer","footer","_today","find","_toggle","addClass","weekNumber","on","mousetoggle","_move","bind","e","link","currentTarget","firstChild","toDateObject","href","indexOf","preventDefault","_view","selectable","_click","_focusView","focusOnNav","attr","_isMultipleSelection","first","closest","last","_lastActive","selectRange","trigger","event","_current","_value","_setCurrent","normalize","format","culture","_selectDates","_index","start","restrictValue","min","max","_addClassProxy","_active","_cell","hasClass","todayString","toDateString","getToday","_cellByDate","_removeClassProxy","removeClass","selectDates","length","notify","dates","depth","size","animation","horizontal","effects","reverse","duration","divisor","vertical","messages","weekColumnHeader","today","navigateTo","parentViews","events","componentTypes","classic","header","linksSelector","contentClasses","modern","setOptions","_destroySelectable","hide","navigate","destroy","off","_title","_table","current","view","focus","table","_bindTable","_option","navigateToPast","_navigate","navigateToFuture","navigateUp","index","navigateDown","isEqualDate","isNaN","title","from","old","_oldTable","currentValue","future","to","currentView","compare","disabled","viewWrapper","children","calendar","toggleClass","data","kendoStop","_changeView","html","removeAttr","content","otherMonth","isWeekColumnVisible","_aria","addClassToViewContainer","replace","_animate","_focus","_visualizeSelectedDatesInView","_selectCell","validSelectedDates","datesUnique","map","getTime","filter","position","array","time","grep","_validateValue","setHours","createDate","getFullYear","getMonth","getDate","isInRange","selectedDates","each","clear","cells","_selectElement","selectableOptions","parseOptions","aria","inputSelectors","multiple","change","_onSelect","relatedTarget","_onRelatedTarget","target","is","eventArgs","ctrlKey","metaKey","_toggleSelection","_cellsBySelector","_deselect","_addSelectedCellsToArray","shiftKey","_rangeSelection","currentCell","push","toDateCell","startDate","fromDate","toDate","daysDifference","daysBetweenTwoDates","addDaysToArray","selector","item","currentDateIndex","Number","splice","_dateInView","firstDateInView","lastDateInView","_isNavigatable","cellIndex","isDisabled","cell","eq","key","keyCode","isRtl","prevent","method","temp","RIGHT","UP","DOWN","SPACEBAR","HOME","END","getHours","getMinutes","getSeconds","getMilliseconds","setFullYear","_todayClick","ENTER","_keyboardToggleSelection","focusedDate","setDate","_nextNavigatable","_keyboardRangeSelection","PAGEUP","PAGEDOWN","_unselect","navigatableDate","active","append","parent","remove","insertAfter","_horizontal","viewWidth","margin","add","width","wrap","display","margin-left","complete","unwrap","kendoAnimate","_vertical","insertBefore","left","parseInt","top","height","_selectedCell","removeAttribute","guid","appendTo","show","toString","actionAttr","getValidCssClass","arrow","modifier","firstDayCurrentMonth","has","option","isBigger","isEqualMonth","empty","toggle","isTodayDisabled","todayClass","_todayClass","footerTemplate","_updateAria","ariaTemplate","valueType","text","plugin","firstDayOfMonth","firstVisibleDay","calendarInfo","firstDay","getDay","setTime","tzOffsetBefore","getTimezoneOffset","resultDATE","tzOffsetDiff","getCalendarInfo","months","names","idx","navigateUrl","showHeader","hasUrl","currentCalendar","firstDayIdx","days","shiftArray","shortNames","namesShort","lastDayOfMonth","perRow","setter","build","cssClass","day","linkClass","inArray","dateString","join","weekNumberBuild","currentDate","timeOffset","Math","abs","date1","date2","result","month1","year1","month2","year2","hours","calendarMonths","namesAbbr","namesFull","label","setMonth","minYear","maxYear","end","modular","cellsPerRow","otherMonthTemplate","slice","concat","multiplier","endDate","fromDateUTC","UTC","endDateUTC","ceil","numberOfDays","i","nextDay","type","dateObject","calendars","standard","patterns","d","isEqualDatePart","value1","value2","isFunction","Array","isArray","createDisabledExpr","noop","convertDatesArray","body","callback","disabledDates","searchExpression","toLowerCase","Function","oldValue","newValue","split","viewsEnum","amd","a1","a2","a3"],"mappings":"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"}