{"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__ = { // jshint ignore:line\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-state-hover\",\n DISABLED = \"k-state-disabled\",\n FOCUSED = \"k-state-focused\",\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-state-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, { 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 },\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 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 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 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 _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 if (selectableOptions.multiple) {\n that.element.attr(\"aria-multiselectable\", \"true\");\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-state-selected\")) {\n $(eventArgs.event.currentTarget).addClass(\"k-state-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-state-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 }\n else if (key == keys.SPACEBAR) {\n value = 0;\n prevent = true;\n }\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 }\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 that.selectable.trigger(CHANGE, { event: event});\n }\n else {\n that.selectable.value($(that._cell[0]), { event: event});\n }\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\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,\n \"float\": LEFT,\n \"margin-left\": future ? 0 : -viewWidth\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, {actionAttr: kendo.attr(\"action\"), size: kendo.getValidCssClass(\"k-button-\", \"size\", that.options.size)})));\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 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 namesAbbr = getCalendarInfo(options.culture).months.namesAbbr,\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 build: function(date) {\n var cssClass = [ \"k-calendar-td\" ];\n\n return {\n value: namesAbbr[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-state-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); //jshint ignore:line\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","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","events","componentTypes","classic","header","linksSelector","contentClasses","modern","setOptions","_destroySelectable","hide","navigate","destroy","off","_title","_table","current","view","focus","table","_bindTable","trigger","_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","content","otherMonth","isWeekColumnVisible","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","multiple","aria","inputSelectors","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","ENTER","_keyboardToggleSelection","focusedDate","setDate","_nextNavigatable","_keyboardRangeSelection","PAGEUP","PAGEDOWN","_unselect","navigatableDate","active","append","parent","remove","insertAfter","_horizontal","viewWidth","add","width","wrap","float","margin-left","complete","unwrap","kendoAnimate","_vertical","insertBefore","left","parseInt","top","height","_selectedCell","removeAttribute","guid","appendTo","show","toString","actionAttr","getValidCssClass","_todayClick","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","namesAbbr","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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"}