/** * Kendo UI v2019.2.619 (http://www.telerik.com/kendo-ui) * Copyright 2019 Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function (f, define) { define('kendo.multiviewcalendar', [ 'kendo.core', 'kendo.selectable', 'kendo.calendar' ], f); }(function () { var __meta__ = { id: 'multiviewcalendar', name: 'MultiViewCalendar', category: 'web', description: 'Multi-view calendar.', depends: [ 'core', 'selectable', 'calendar' ] }; (function ($, undefined) { var kendo = window.kendo, calendar = kendo.calendar, support = kendo.support, isInRange = calendar.isInRange, toDateObject = calendar.toDateObject, createDate = calendar.createDate, isEqualDate = calendar.isEqualDate, getToday = calendar.getToday, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, Selectable = ui.Selectable, template = kendo.template, mobileOS = support.mobileOS, ns = '.kendoMultiViewCalendar', CLICK = 'click', KEYDOWN = 'keydown', ID = 'id', MIN = 'min', MONTH = 'month', DOT = '.', CENTURY = 'century', DECADE = 'decade', CHANGE = 'change', NAVIGATE = 'navigate', VALUE = 'value', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', MID = 'k-range-mid', SPLITEND = 'k-range-split-end', SPLITSTART = 'k-range-split-start', START = 'k-range-start', END = 'k-range-end', HOVER = 'k-state-hover', DISABLED = 'k-state-disabled', TODAY = 'k-nav-today', OTHERMONTH = 'k-other-month', OUTOFRANGE = 'k-out-of-range', CELLSELECTOR = 'td:has(.k-link):not(.' + OUTOFRANGE + ')', CELLSELECTORVALID = 'td:has(.k-link):not(.' + DISABLED + '):not(.' + OUTOFRANGE + ')', BLUR = 'blur', FOCUS = 'focus', MOUSEENTER = support.touch ? 'touchstart' : 'mouseenter', MOUSELEAVE_NS = support.touch ? 'touchend' + ns + ' touchmove' + ns : 'mouseleave' + ns, PREVARROW = '_prevArrow', NEXTARROW = '_nextArrow', ARIA_SELECTED = 'aria-selected', INPUTSELECTOR = 'input,a,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', ARIA_DISABLED = 'aria-disabled', ARIA_LABEL = 'aria-label', proxy = $.proxy, DATE = Date, views = { month: 0, year: 1, decade: 2, century: 3 }; var RangeSelectable = Widget.extend({ init: function (element, options) { var that = this; Widget.fn.init.call(that, element, options); that.userEvents = new kendo.UserEvents(that.element, { global: true, allowSelection: true, filter: that.options.filter, tap: proxy(that._tap, that), touchAction: 'none' }); }, events: [CHANGE], options: { name: 'RangeSelectable', filter: '>*', inputSelectors: INPUTSELECTOR, multiple: false, dragToSelect: true, relatedTarget: $.noop }, destroy: function () { var that = this; Widget.fn.destroy.call(that); that.userEvents.destroy(); that._lastActive = that.element = that.userEvents = that._start = that._end = null; }, _allowSelection: function (target) { if ($(target).is(this.options.inputSelectors)) { this.userEvents.cancel(); return false; } return true; }, start: function (element) { if (element === undefined) { return this._start; } element.addClass(START + ' ' + SELECTED); this._start = element; }, end: function (element) { if (element === undefined) { return this._start; } element.addClass(END + ' ' + SELECTED); this._end = element; }, mid: function (elements) { var tables = this.element.find('table.k-month'); elements.addClass(MID); tables.each(function () { var that = $(this); var lastCell = that.find(CELLSELECTORVALID + ':last'); var firstCell = that.find(CELLSELECTORVALID + ':first'); if (lastCell.hasClass(MID)) { lastCell.addClass(SPLITEND); } if (firstCell.hasClass(MID)) { firstCell.addClass(SPLITSTART); } }); }, clear: function (clearVariables) { this.element.find(CELLSELECTOR).removeClass(END + ' ' + SELECTED + ' ' + START + ' ' + MID + ' ' + SPLITEND + ' ' + SPLITSTART); if (clearVariables) { this._start = this._end = null; } }, selectFrom: function (start) { var that = this; var items; var startIdx; items = that.element.find(CELLSELECTOR); startIdx = $.inArray($(start)[0], items); that.clear(); that.start(start); items = items.filter(function (index) { return index > startIdx; }); that.mid(items); }, selectTo: function (end) { var that = this; var items; var endIdx; items = that.element.find(CELLSELECTOR); endIdx = $.inArray($(end)[0], items); that.clear(); items = items.filter(function (index) { return index < endIdx; }); that.mid(items); that.end($(end)); }, range: function (start, end) { var that = this; var items; var startIdx; var endIdx; var temp; if (start === undefined) { return { start: that._start, end: that._end }; } items = that.element.find(CELLSELECTOR); startIdx = $.inArray($(start)[0], items); endIdx = $.inArray($(end)[0], items); if (startIdx > endIdx) { temp = end; end = start; start = temp; temp = startIdx; startIdx = endIdx; endIdx = temp; } that.clear(); start.addClass(START + ' ' + SELECTED); that._start = start; items = items.filter(function (index) { return index > startIdx && index < endIdx; }); that.mid(items); that.end($(end)); }, change: function () { this.trigger(CHANGE); }, _tap: function (e) { var target = $(e.target), that = this, items, startIdx, endIdx; that._lastActive = target; if (!that._start) { that.start(target); that.trigger(CHANGE); return; } if (that._start && !that._end) { items = that.element.find(CELLSELECTOR); startIdx = $.inArray($(that._start)[0], items); endIdx = $.inArray($(target)[0], items); if (+toDateObject($(that._start).find('a')) > +toDateObject($(target).find('a'))) { that.clear(); that.start(target); that.trigger(CHANGE); return; } items = items.filter(function (index) { return index > startIdx && index < endIdx; }); that.mid(items); that.end($(target)); that.trigger(CHANGE); return; } if (that._start && that._end) { if (target.hasClass(MID)) { if (!that._toggling) { that.range(target, that._end); } else { that.range(that._start, target); } that._toggling = !that._toggling; that.trigger(CHANGE); return; } that._toggling = false; that._end = null; that.clear(); that.start(target); that.trigger(CHANGE); } } }); var MultiViewCalendar = Widget.extend({ init: function (element, options) { var that = this; var id; var culture; Widget.fn.init.call(that, element, options); element = that.wrapper = that.element; options = that.options; that.options.disableDates = calendar.disabled(that.options.disableDates); culture = kendo.getCulture(options.culture); options.format = kendo._extractFormat(options.format || culture.calendars.standard.patterns.d); that._templates(); that._header(); that._wrapper(); id = element.addClass('k-widget k-calendar k-calendar-range' + (options.weekNumber ? ' k-week-number' : '')).on(KEYDOWN + ns, 'table.k-content', proxy(that._move, that)).on(BLUR + ns, 'table', proxy(that._blur, that)).on(CLICK + ns, CELLSELECTORVALID, function (e) { var link = e.currentTarget.firstChild; if (link.href.indexOf('#') != -1) { e.preventDefault(); } that._click($(link)); }).on(MOUSEENTER + ns, CELLSELECTORVALID, proxy(that._mouseEnter, that)).on(MOUSELEAVE_NS, CELLSELECTORVALID, function () { $(this).removeClass(HOVER); }).attr(ID); if (id) { that._cellID = id + '_cell_selected'; } that._calendarWidth = that.element.width(); that._range = options.range; that._initViews({ viewName: options.start, value: options.value }); that._selectable(); that._footer(that.footer); that._selectDates = []; that.value(options.value); if (options.selectable == 'multiple') { that._selectDates = options.selectDates.length ? options.selectDates : that._selectDates; that._restoreSelection(); } if (options.selectable == 'range') { that.selectRange(that._range); } kendo.notify(that); }, options: { name: 'MultiViewCalendar', value: null, min: new DATE(1900, 0, 1), max: new DATE(2099, 11, 31), dates: [], disableDates: null, culture: '', footer: '', format: '', month: {}, range: { start: null, end: null }, weekNumber: false, views: 2, showViewHeader: false, selectable: 'single', selectDates: [], start: MONTH, depth: MONTH, messages: { weekColumnHeader: '' } }, events: [ CHANGE, NAVIGATE ], setOptions: function (options) { var that = this; calendar.normalize(options); options.disableDates = calendar.disabled(options.disableDates); Widget.fn.setOptions.call(that, options); that._selectable(); that._templates(); that._footer(that.footer); for (var i = 0; i < that._views.length; i++) { that._views[i].off(ns).remove(); } that._initViews({ viewName: options.start, value: options.value }); that._range = options.range || { start: null, end: null }; that._restoreSelection(); }, destroy: function () { var that = this; that._cell = null; that._currentView = null; that._current = null; if (that._views) { for (var i = 0; i < that._views.length; i++) { that._views[i].off(ns).remove(); } } that.element.off(ns); if (that.header) { that.header.off(ns); that._title = null; that.header = null; } if (that.selectable) { that.selectable.destroy(); that.selectable = null; } if (that.rangeSelectable) { that.rangeSelectable.destroy(); that.rangeSelectable = null; } if (that._today) { kendo.destroy(that._today.off(ns)); } that._views = null; Widget.fn.destroy.call(that); }, current: function () { return this._current; }, focus: function () { var table; if (this._cell) { this._cell.closest('table').trigger('focus'); } else if (this._current && this._dateInViews(this._current)) { this._cell = this._cellByDate(this._current); this._cell.closest('table').trigger('focus'); } else { table = this.element.find('table').first().trigger('focus'); this._cell = table.find(CELLSELECTORVALID + ':first'); this._current = toDateObject(this._cell.find('a')); } this._cell.addClass(FOCUSED); }, min: function (value) { return this._option(MIN, value); }, max: function (value) { return this._option('max', value); }, view: function () { return this._currentView; }, navigateToPast: function () { this._navigate(PREVARROW, -1); }, navigateToFuture: function () { this._navigate(NEXTARROW, 1); }, navigateUp: function () { var that = this, index = that._index; if (that._title.hasClass(DISABLED)) { return; } that.navigate(that._current, ++index); }, navigateDown: function (value) { var that = this, index = that._index, depth = that.options.depth; if (!value) { return; } if (index === views[depth]) { if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) { that.value(value); that.trigger(CHANGE); } return; } that.navigate(value, --index); }, navigate: function (value, view) { view = isNaN(view) ? calendar.views[calendar.viewsEnum[view]] : calendar.views[view]; var that = this; var options = that.options; var min = options.min; var max = options.max; if (!value) { that._current = value = new DATE(+calendar.restrictValue(value, min, max)); } else { that._current = value; } if (view === undefined) { view = that._currentView; } that._currentView = view; for (var i = 0; i < that._views.length; i++) { that._views[i].off(ns).remove(); } that._initViews({ viewName: view.name, value: value }); that._restoreSelection(); }, _updateHeader: function () { var that = this; var view = that._currentView; var title = that._title; var value = that._firstViewValue; var options = that.options; var visibleRange = that._visibleRange(); var culture = options.culture; var min = options.min; var max = options.max; var lastDate; var disabled; var prevDisabled; var nextDisabled; if (view.name === DECADE || view.name === CENTURY) { lastDate = shiftDate(value, view.name, options.views - 1); if (!isInRange(lastDate, min, max)) { lastDate = max; } title.html(view.first(value).getFullYear() + ' - ' + view.last(lastDate).getFullYear()); } else { title.html(view.title(value, min, max, culture) + ' - ' + view.title(shiftDate(value, view.name, options.views - 1), min, max, culture)); } disabled = view.name === CENTURY; title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled); prevDisabled = view.compare(visibleRange.start, that.options.min) < 1; nextDisabled = view.compare(visibleRange.end, that.options.max) > -1; if (prevDisabled && nextDisabled) { if (that._navContainer) { that._navContainer.remove(); that._navContainer = null; } } else { if (!that._navContainer) { that._navContainer = $('' + '' + '' + '').appendTo(that.header); that[PREVARROW] = that._navContainer.find('.k-prev-view'); that[NEXTARROW] = that._navContainer.find('.k-next-view'); } that[PREVARROW].toggleClass(DISABLED, prevDisabled).attr(ARIA_DISABLED, prevDisabled); if (that[PREVARROW].hasClass(DISABLED)) { that[PREVARROW].removeClass(HOVER); } that[NEXTARROW].toggleClass(DISABLED, nextDisabled).attr(ARIA_DISABLED, nextDisabled); if (that[NEXTARROW].hasClass(DISABLED)) { that[NEXTARROW].removeClass(HOVER); } } }, _mouseEnter: function (e) { var that = this; var cell = $(e.currentTarget); var range; var items; var startIdx; var endIdx; cell.addClass(HOVER); if (that.rangeSelectable && that._currentView.name === 'month') { range = that.selectRange(); if (range.start && !range.end) { if (that._dateInViews(that.selectRange().start)) { items = that.element.find(that.rangeSelectable.options.filter); startIdx = $.inArray($(that.rangeSelectable._start)[0], items); endIdx = $.inArray($(cell)[0], items); if (startIdx > endIdx) { return; } that.rangeSelectable.range(that.rangeSelectable._start, cell); } else if (+toDateObject(that.element.find(CELLSELECTOR + ':first').find('a')) > +range.start) { that.rangeSelectable.selectTo(cell); } that.rangeSelectable._end = null; } } }, _move: function (e, preventFocus) { var that = this; var options = that.options; var key = e.keyCode; var index = that._index; var min = options.min; var max = options.max; var focusedCell = that.element.find(DOT + FOCUSED); var table = focusedCell.closest('table'); var currentValue = new DATE(+(that._current || toDateObject(focusedCell.find('a')))); var isRtl = kendo.support.isRtl(that.wrapper); var navigate = false; var value, prevent, method, cell, lastActive, cellIndex; if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) { value = 1; prevent = true; } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) { value = -1; prevent = true; } else if (key == keys.UP) { value = index === 0 ? -7 : -4; prevent = true; } else if (key == keys.DOWN) { value = index === 0 ? 7 : 4; prevent = true; } else if (key == keys.SPACEBAR) { value = 0; prevent = true; } else if (key == keys.HOME) { prevent = true; cell = table.find(CELLSELECTORVALID).eq(0); if (cell.hasClass(FOCUSED)) { table = table.prev(); if (table.length) { that._focusCell(table.find(CELLSELECTORVALID).eq(0)); } else { navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED); that._navigate(PREVARROW, -1, preventFocus); that._focusCell(that.element.find('table:first ' + CELLSELECTORVALID + ':first')); } } else { that._focusCell(cell); } } else if (key == keys.END) { prevent = true; cell = table.find(CELLSELECTORVALID).last(); if (cell.hasClass(FOCUSED)) { table = table.next(); if (table.length) { that._focusCell(table.find(CELLSELECTORVALID).last()); } else { navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED); that._navigate(NEXTARROW, 1, preventFocus); that._focusCell(that.element.find('table:last ' + CELLSELECTORVALID + ':last')); } } else { that._focusCell(cell); } } if (e.ctrlKey || e.metaKey) { if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) { navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED); that._navigate(NEXTARROW, 1, preventFocus); prevent = true; } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) { navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED); that._navigate(PREVARROW, -1, preventFocus); prevent = true; } else if (key == keys.UP) { navigate = !that._title.hasClass(DISABLED); that.navigateUp(); that._focusCell(that._cellByDate(that._current), !preventFocus); prevent = true; } else if (key == keys.DOWN) { if (that._currentView.name === 'month') { that.value(currentValue); } else { that.navigateDown(currentValue); that._focusCell(that._cellByDate(that._current), !preventFocus); navigate = true; } prevent = true; } else if (key == keys.ENTER || key == keys.SPACEBAR) { if (options.selectable === 'multiple') { that._toggleSelection(e); } } } else if (e.shiftKey && options.selectable !== 'single') { if (value !== undefined || method) { if (!method) { that._currentView.setDate(currentValue, value); } if (that._currentView.name !== 'month') { return; } if (options.disableDates(currentValue)) { currentValue = that._nextNavigatable(currentValue, value); } min = createDate(min.getFullYear(), min.getMonth(), min.getDate()); if (isInRange(currentValue, min, max)) { if (!that._dateInViews(currentValue)) { if (value > 0) { navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED); that._navigate(NEXTARROW, 1, preventFocus); } else { navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED); that._navigate(PREVARROW, -1, preventFocus); } } cell = that._cellByDate(currentValue); that._current = currentValue; if (that.selectable) { that._selectRange(toDateObject((that.selectable._lastActive || focusedCell).find('a')), currentValue); if (!that.selectable._lastActive) { that.selectable._lastActive = focusedCell; } that.trigger(CHANGE); that._focusCell(cell); } if (that.rangeSelectable) { lastActive = toDateObject((that.rangeSelectable._lastActive || focusedCell).find('a')); if (!that._dateInViews(lastActive)) { if (+lastActive > +currentValue) { that.rangeSelectable._end = that.rangeSelectable._lastActive; that.rangeSelectable.selectFrom(cell); } else { that.rangeSelectable.selectTo(cell); } } else { if (that.rangeSelectable._end && that.rangeSelectable._end.is(DOT + FOCUSED)) { that.rangeSelectable._lastActive = that.rangeSelectable._start; } else { that.rangeSelectable._lastActive = that._cellByDate(lastActive); } that.rangeSelectable.range(that.rangeSelectable._lastActive, cell); } that.rangeSelectable.change(); that._focusCell(cell); } } } } else { if (key == keys.ENTER || key == keys.SPACEBAR) { if (that._currentView.name === 'month') { if (that.selectable) { that.selectable._lastActive = that._cellByDate(currentValue); } that.value(currentValue); if (that.rangeSelectable) { that.rangeSelectable.change(); } } else { that._click($(that._cell[0].firstChild), preventFocus); } prevent = true; } else if (key == keys.PAGEUP || key == keys.PAGEDOWN) { prevent = true; cellIndex = table.find(CELLSELECTORVALID).index(focusedCell); table = key == keys.PAGEUP ? table.prev() : table.next(); if (!table.length) { if (key == keys.PAGEUP) { navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED); that.navigateToPast(); table = that.element.find('table:first'); } else { navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED); that.navigateToFuture(); table = that.element.find('table:last'); } } cell = table.find(CELLSELECTORVALID).eq(cellIndex); if (cell.length) { that._focusCell(cell); } else { that._focusCell(table.find(CELLSELECTORVALID).last()); } } if (value || method) { if (!method) { that._currentView.setDate(currentValue, value); } min = createDate(min.getFullYear(), min.getMonth(), min.getDate()); if (isInRange(currentValue, min, max)) { if (that.selectable && options.disableDates(currentValue)) { currentValue = that._nextNavigatable(currentValue, value); } if (!that._dateInViews(currentValue)) { if (value > 0) { navigate = that[NEXTARROW] && !that[NEXTARROW].hasClass(DISABLED); that._navigate(NEXTARROW, 1, preventFocus); } else { navigate = that[PREVARROW] && !that[PREVARROW].hasClass(DISABLED); that._navigate(NEXTARROW, -1, preventFocus); } } cell = that._cellByDate(currentValue); that._current = currentValue; that._focusCell(cell, !preventFocus); } } } if (navigate) { that.trigger(NAVIGATE); } if (prevent) { e.preventDefault(); } return that._current; }, _visualizeSelectedDatesInView: function () { var that = this; var selectedDates = {}; var cells; $.each(that._selectDates, function (index, value) { selectedDates[kendo.calendar.views[0].toDateString(value)] = value; }); that.selectable.clear(); cells = that.element.find('table').find(CELLSELECTOR).filter(function (index, element) { return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))]; }); if (cells.length > 0) { that.selectable._selectElement(cells, true); } }, _nextNavigatable: function (currentValue, value) { var that = this; var disabled = true; var view = that._currentView; var min = that.options.min; var max = that.options.max; var isDisabled = that.options.disableDates; var navigatableDate = new Date(currentValue.getTime()); view.setDate(navigatableDate, -value); while (disabled) { view.setDate(currentValue, value); if (!isInRange(currentValue, min, max)) { currentValue = navigatableDate; break; } disabled = isDisabled(currentValue); } return currentValue; }, _toggleSelection: function (event) { var that = this; that.selectable._lastActive = $(that._cell[0]); if ($(that._cell[0]).hasClass(SELECTED)) { that.selectable._unselect($(that._cell[0])); that.selectable.trigger(CHANGE, { event: event }); } else { that.selectable.value($(that._cell[0]), { event: event }); } }, _option: function (option, value) { var that = this; var options = that.options; var currentValue = that._value || that._current; var isBigger; if (value === undefined) { return options[option]; } value = kendo.parseDate(value, options.format, options.culture); if (!value) { return; } options[option] = new DATE(+value); if (option === MIN) { isBigger = value > currentValue; } else { isBigger = currentValue > value; } if (isBigger) { that._value = null; } that.navigate(that._value); that._toggle(); }, _cellByDate: function (value) { if (value instanceof Date) { value = this._currentView.toDateString(value); } return this.element.find('table').find('td:not(.' + OTHERMONTH + ')').filter(function () { return $(this.firstChild).attr(kendo.attr(VALUE)) === value; }); }, _selectable: function () { var that = this; var selectable = that.options.selectable; if (that.selectable) { that.selectable.destroy(); that.selectable = null; } if (that.rangeSelectable) { that.rangeSelectable.destroy(); that.rangeSelectable = null; } if (selectable.toLowerCase() === 'range') { that.rangeSelectable = new RangeSelectable(that.wrapper, { filter: 'table.k-month ' + CELLSELECTORVALID, change: proxy(that._rangeSelection, that) }); } else { that.selectable = new Selectable(that.wrapper, { aria: true, dragToSelect: false, 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', multiple: Selectable.parseOptions(selectable).multiple, filter: 'table.k-content ' + CELLSELECTORVALID, change: proxy(that._selection, that), relatedTarget: proxy(that._onRelatedTarget, that), unselect: proxy(that._unselecting, that) }); } }, _onRelatedTarget: function (target) { var that = this; if (that.selectable.options.multiple && target.is(CELLSELECTORVALID) && target.length > 1) { that._focusCell(target.first(), true); } }, _getFirstViewDate: function (currentView) { var that = this; var options = that.options; var ranges = []; var start; var end; var current = new Date(+that._current); var i; for (i = 0; i < options.views; i++) { start = currentView.first(current); end = currentView.last(current); if (+end > +options.max) { if (+start <= +options.max) { ranges.push({ start: start, end: new Date(+options.max) }); } break; } ranges.push({ start: start, end: end }); current = new Date(+shiftDate(end, currentView.name, 1)); } current = new Date(+that._current); for (i = 0; i < options.views; i++) { start = currentView.first(current); end = currentView.last(current); if (+start < +options.min) { if (+end >= +options.min) { ranges.push({ start: new Date(+options.min), end: end }); } break; } ranges.push({ start: start, end: end }); current = new Date(+shiftDate(start, currentView.name, -1)); } start = ranges[0].start; for (i = 0; i < options.views + 1; i++) { if (!ranges[i]) { break; } if (+start > +ranges[i].start) { start = ranges[i].start; } } return new Date(+start); }, _canRenderNextView: function (viewDate) { var fullYear = viewDate.getFullYear(); var month = viewDate.getMonth(); var date = viewDate.getDate(); var max = this.options.max; var maxYear = max.getFullYear(); var maxMonth = max.getMonth(); if (fullYear < maxYear) { return true; } if (fullYear === maxYear && month < maxMonth) { return true; } if (fullYear === maxYear && month === maxMonth && date < max.getDate()) { return true; } if (fullYear === maxYear && month === maxMonth && date === max.getDate()) { return true; } return false; }, _initViews: function (viewOptions) { var that = this; var options = that.options; var index = calendar.viewsEnum[viewOptions.viewName]; var currentView = calendar.views[index]; var viewDate; that._current = new DATE(+calendar.restrictValue(viewOptions.value, options.min, options.max)); that._views = []; that._index = index; viewDate = that._getFirstViewDate(currentView); viewDate.setDate(1); that._firstViewValue = new Date(+viewDate); for (var i = 0; i < options.views; i++) { viewDate = i ? shiftDate(viewDate, currentView.name, 1) : viewDate; viewDate.setDate(1); if (!that._canRenderNextView(viewDate)) { break; } that._table = $(currentView.content($.extend({ min: options.min, max: options.max, date: viewDate, url: options.url, dates: options.dates, format: options.format, culture: options.culture, disableDates: options.disableDates, showHeader: options.showViewHeader, isWeekColumnVisible: options.weekNumber, otherMonth: options.otherMonth, messages: options.messages }, that[currentView.name]))); that._table.appendTo(that.tablesWrapper).addClass('k-' + currentView.name); that._views.push(that._table); } that._currentView = currentView; that.tablesWrapper.attr('class', 'k-calendar-view k-calendar-' + currentView.name + 'view'); that._updateHeader(); }, _rangeSelection: function (e) { var that = this; var range = e.sender.range(); var start; var end; if (range.start) { start = toDateObject(range.start.find('a')); } if (range.end) { end = toDateObject(range.end.find('a')); } that._range = { start: start, end: end }; if (!that._preventChange) { that.trigger(CHANGE); } }, _selection: function (e) { var that = this; var selectElements = e.sender.value(); var domEvent = e.event; var currentTarget = $(domEvent && domEvent.currentTarget); var isCell = currentTarget.is('td'); var currentValue; if (that.options.selectable === 'single') { that._validateValue(selectElements[0] ? toDateObject(selectElements.first().find('a')) : e.sender._lastActive ? toDateObject(e.sender._lastActive.find('a')) : that.value()); } if (that.options.selectable == 'multiple') { if (isCell) { currentValue = toDateObject(currentTarget.find('a')); } if (domEvent && domEvent.ctrlKey) { if (isCell) { if (currentTarget.hasClass(SELECTED)) { that._selectDates.push(currentValue); } else { that._deselect(currentValue); } } else { that.element.find('table ' + CELLSELECTORVALID).each(function (index, element) { var value = toDateObject($(element).find('a')); that._deselect(value); }); that._addSelectedCellsToArray(); } } else if (domEvent && domEvent.shiftKey) { that._selectRange(toDateObject(e.sender._lastActive ? e.sender._lastActive.find('a') : selectElements.first().find('a')), currentValue); } else if (isCell) { that._selectDates = []; that._selectDates.push(currentValue); } else { that._selectDates = []; that._addSelectedCellsToArray(); } } if (!that._preventChange) { that.trigger(CHANGE); } }, _addSelectedCellsToArray: function () { var that = this; that.selectable.value().each(function (index, item) { var date = toDateObject($(item.firstChild)); if (!that.options.disableDates(date)) { that._selectDates.push(date); } }); }, _deselect: function (date) { var that = this; var currentDateIndex = that._selectDates.map(Number).indexOf(+date); if (currentDateIndex != -1) { that._selectDates.splice(currentDateIndex, 1); } }, _unselecting: function (e) { var that = this; var element = e.element; if (that.options.selectable === 'single' && !mobileOS && element.hasClass(FOCUSED)) { e.preventDefault(); } }, _visibleRange: function () { var tables = this.element.find('.k-calendar-view table'); var firstDateInView = toDateObject(tables.first().find(CELLSELECTOR + ':first').find('a')); var lastDateInView = toDateObject(tables.last().find(CELLSELECTOR + ':last').find('a')); return { start: firstDateInView, end: lastDateInView }; }, _dateInViews: function (date) { var that = this; var tables = that.element.find('.k-calendar-view table'); var firstDateInView = toDateObject(tables.first().find(CELLSELECTOR + ':first').find('a')); var lastDateInView = toDateObject(tables.last().find(CELLSELECTOR + ':last').find('a')); return +date <= +lastDateInView && +date >= +firstDateInView; }, _fillRange: function (start, end) { var that = this; var daysDifference; that._selectDates = []; daysDifference = daysBetweenTwoDates(start, end); addDaysToArray(that._selectDates, daysDifference, start, that.options.disableDates); }, _selectRange: function (start, end) { var that = this; var current; if (+end < +start) { current = end; end = start; start = current; } that._fillRange(start, end); that._visualizeSelectedDatesInView(); }, _header: function () { var that = this; var element = that.element; var buttons; var header = element.find('.k-calendar-header'); if (!header.length) { header = $('
').prependTo(element); } that.header = header; header.on(MOUSEENTER + ns + ' ' + MOUSELEAVE_NS + ' ' + FOCUS + ns + ' ' + BLUR + ns, '.k-button', mousetoggle).on('click', function () { return false; }).on(CLICK + ns, '.k-button.k-title', function () { that.navigateUp(); that._focusCell(that._cellByDate(that._current), true); that.trigger(NAVIGATE); }).on(CLICK + ns, '.k-button.k-prev-view', function (e) { e.preventDefault(); that.navigateToPast(); that.trigger(NAVIGATE); }).on(CLICK + ns, '.k-button.k-next-view', function (e) { e.preventDefault(); that.navigateToFuture(); that.trigger(NAVIGATE); }); buttons = header.find('.k-button'); that._title = buttons.filter('.k-title'); that._navContainer = header.find('.k-calendar-nav'); that[PREVARROW] = buttons.filter('.k-prev-view'); that[NEXTARROW] = buttons.filter('.k-next-view'); }, _wrapper: function () { this.tablesWrapper = $('').insertAfter(this.element[0].firstChild); }, _templates: function () { var that = this; var options = that.options; var month = options.month; var content = month.content; var weekNumber = month.weekNumber; var empty = month.empty; that.month = { content: template('