{"version":3,"file":"kendo.scheduler.timelineview.min.js","names":["factory","define","amd","$","undefined$1","kendo","window","ui","setTime","date","SchedulerView","outerWidth","_outerWidth","outerHeight","_outerHeight","extend","getDate","getMilliseconds","MS_PER_DAY","MS_PER_MINUTE","INVERSE_COLOR_CLASS","BORDER_SIZE_COEFF","NS","EVENT_TEMPLATE","template","DATA_HEADER_TEMPLATE","toInvariantTime","staticDate","Date","setColspan","columnLevel","count","columns","i","length","colspan","TimelineGroupedView","Class","init","view","this","_view","_getTimeSlotByPosition","x","y","groupIndex","groups","timeSlotByPosition","_hideHeaders","timesHeader","find","last","hide","datesHeader","_setColspan","timeColumn","_createRowsLayout","resources","rows","groupHeaderTemplate","_createVerticalColumnsLayout","_createColumnsLayout","_getRowCount","_groupCount","_getGroupsCount","_addContent","dates","columnCount","groupsCount","rowCount","start","end","slotTemplate","isVerticalGrouped","html","options","appendRow","tmplDate","content","classes","isToday","idx","workDayStart","workDayEnd","_isWorkDay","rowIdx","groupIdx","_resourceBySlot","_forTimeRange","_addTimeSlotsCollections","groupCount","datesCount","tableRows","interval","isVerticallyGrouped","Math","floor","time","rowMultiplier","group","cellMultiplier","cells","children","cellsPerGroup","cellsPerDay","dateIndex","cellOffset","startTime","cellIndex","_addTimeSlotToCollection","_getVerticalGroupCount","_getVerticalRowCount","eventGroups","maxRowCount","_isVerticallyGrouped","_renderEvent","eventGroup","event","adjustedEvent","range","container","element","_createEventElement","occurrence","head","tail","appendTo","css","top","height","eventHeight","eventObject","_startTime","_endTime","uid","slotRange","rowIndex","offsetTop","events","_inverseEventColor","addContinuousEvent","isAllDay","_arrangeRows","_verticalCountForLevel","level","_rowCountForLevel","_horizontalCountForLevel","_columnCountForLevel","_updateCurrentVerticalTimeMarker","ranges","currentTime","elementHtml","headerWrap","left","round","innerRect","getTime","timesTableMarker","prependTo","addClass","CURRENT_TIME_MARKER_ARROW_CLASS","_adjustLeftPosition","prev","position","width","scrollHeight","_changeGroup","_prevGroupSlot","slot","isDay","_collection","_nextGroupSlot","first","_verticalSlots","selection","reverse","_verticalMethod","_normalizeVerticalSelection","_horizontalSlots","method","startSlot","endSlot","multiple","result","_isHorizontallyGrouped","_changeVerticalViewPeriod","_changeHorizontalViewPeriod","slots","shift","_changeViewPeriod","_updateDirection","_createMoveHint","hint","rect","snap","right","offsetHeight","inverseColor","_appendMoveHint","_isRtl","scrollWidth","clientWidth","TimelineGroupedByDateView","times","eq","_createDateLayout","subColumns","isMajorTickColumn","isMiddleColumn","isLastSlotColumn","minorTickColumns","workDateIndex","tempStart","minorTickCount","msInterval","majorTick","_dates","startIndex","endIndex","eventObjects","index","currentSlot","_timeSlotCollections","_slots","dateRange","timeSlotRanges","push","firstTimesCell","lastTimesCell","markerTopPosition","timesTableMarkerCss","previous","_changeDate","collections","_getCollections","tempSlot","startEnd","slotIdx","collection","offsetLeft","offsetWidth","scheduler","TimelineView","that","fn","call","_groupedView","_getGroupedView","title","name","_workDays","workDays","dayIndex","workWeekStart","workWeekEnd","abs","getWorkDays","_templates","_editable","calculateDateRange","_groups","_currentTime","_isVirtualized","_isGroupedByDate","_getNextEventIndexBySlot","sortedEvents","tempIndex","startDate","_getSelectedSlot","pad","_getSortedEvents","uniqueAllEvents","sort","second","isDaySlot","_currentTimeMarkerUpdater","_updateCurrentTimeMarker","_scrollTo","elementOffset","elementOffsetDir","containerScroll","scrollLeft","containerOffsetDir","rightDistance","remove","_isInDateSlot","currentTimeMarker","useLocalTimezone","timezone","dataSource","schema","timezoneOffset","offset","convert","getTimezoneOffset","orientation","currentGroup","utcCurrentTime","toUtcTime","slotByStartDate","setUpdateTimer","markerOptions","updateInterval","_currentTimeUpdateTimer","setInterval","bind","editable","_isMobile","_touchEditable","_mouseEditable","on","e","trigger","closest","attr","preventDefault","create","_slotByPosition","pageX","pageY","resourceInfo","eventInfo","endDate","update","threshold","support","mobileOS","android","_addUserEvents","UserEvents","useClickAsTap","browser","edge","filter","tap","_scrolling","location","_editUserEvents","eventElement","target","touch","initialTouch","hasClass","mozilla","webkit","version","msie","scrollTop","ceil","selectedDateFormat","selectedShortDateFormat","selectedMobileDateFormat","today","endTime","showWorkHours","eventMinWidth","columnWidth","majorTimeHeaderTemplate","eventTemplate","dateHeaderTemplate","footer","command","messages","defaultRowText","showFullDay","showWorkDay","settings","Template","templateSettings","_eventTmpl","_render","_startDate","_endDate","_calculateSlotRanges","createLayout","_layout","_content","_footer","_setContentWidth","refreshLayout","th","currentTarget","contentWidth","contentTable","minWidth","calculatedWidth","add","slotStartTime","slotEndTime","slotRanges","rangeStart","rangeEnd","_slotRanges","min","max","action","verticalByDate","msMin","msMax","msMajorInterval","majorTickDivider","timeColumns","text","groupedView","minorTickSlots","minorTickIndex","className","minorTicks","middleColumn","lastSlotColumn","minorSlotsCount","slice","groupedResources","_groupOrientation","toggleFullDay","currentDate","isWorkDay","columnLevels","rowLevel","rowLevels","day","getDay","append","_addResourceView","addTimeSlotCollection","addDays","_timeSlotGroups","_timeSlotInterval","cell","getTimeSlotCollection","UTC","getFullYear","getMonth","addTimeSlot","visibleEndDate","nextDate","nextDay","previousDate","previousDay","render","_headerColumnCount","data","Query","field","dir","toArray","eventsByResource","_eventsByResource","_renderEvents","_setRowsHeight","_positionEvents","eventsForGroup","eventUid","Array","isArray","eventIndex","_positionEvent","eventBottomOffset","_getBottomRowOffset","verticalGroupCount","rowsCount","rowHeight","timesRow","row","_refreshSlots","minOffset","maxOffset","slotsCollection","lastSlot","offsetRight","refresh","parentValue","resource","item","itemParentValue","getter","dataParentValueField","itemIdx","value","_resourceValue","eventsFilteredByResource","operator","groupEqFilter","_isInTimeSlot","slotIndex","_adjustEvent","eventStartTime","_time","eventEndTime","adjustedStartDate","adjustedEndDate","clone","isMultiDayEvent","duration","_continuousEvents","isMobile","showDelete","destroy","resizable","resize","eventStartDate","eventEndDate","eventResources","apply","ns","singleDay","ariaLabel","_formatEventAriaLabel","angular","elements","dataItem","rectRight","startPosition","endPosition","rectLeft","eventsForSlot","collidingEvents","addEvent","createRows","rowEvents","j","eventLength","_updateEventForSelection","_eventOptionsForMove","_updateEventForResize","set","_updateMoveHint","distance","clonedEvent","eventDuraton","_removeMoveHint","rangeIndex","_moveHint","_updateResizeHint","_removeResizeHint","startRect","_createResizeHint","_resizeHint","toString","toLocalDate","selectionByElement","vertical","collectionIndex","backward","prevGroupSlot","nextGroupSlot","newStart","newEnd","_isInRange","move","key","handled","keys","DOWN","UP","LEFT","RIGHT","off","clearInterval","groupOptions","passedChildren","numberOfChildren","resourceIndex","levels","groupLevel","groupLevelMember","_setResourceValue","TimelineWeekView","selectedDate","dayOfWeek","calendarInfo","firstDay","TimelineWorkWeekView","weekStart","map","indexOf","TimelineMonthView","firstDayOfMonth","lastDayOfMonth","jQuery"],"sources":["kendo.scheduler.timelineview.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.scheduler.view'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"scheduler.timelineview\",\n name: \"Scheduler Timeline View\",\n category: \"web\",\n description: \"The Scheduler Timeline View\",\n depends: [ \"scheduler.view\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n setTime = kendo.date.setTime,\n SchedulerView = ui.SchedulerView,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n extend = $.extend,\n getDate = kendo.date.getDate,\n getMilliseconds = kendo.date.getMilliseconds,\n MS_PER_DAY = kendo.date.MS_PER_DAY,\n MS_PER_MINUTE = kendo.date.MS_PER_MINUTE,\n CURRENT_TIME_MARKER_CLASS = \"k-current-time\",\n CURRENT_TIME_MARKER_ARROW_CLASS = \"k-current-time-arrow\",\n SCHEDULER_HEADER_WRAP_CLASS = \"k-scheduler-header-wrap\",\n INVERSE_COLOR_CLASS = \"k-event-inverse\",\n BORDER_SIZE_COEFF = 0.8666,\n NS = \".kendoTimelineView\";\n\n var EVENT_TEMPLATE = kendo.template('
' +\n '
#:kendo.format(\"{0:t} - {1:t}\", start, end)#
' +\n '
${title}
'),\n DATA_HEADER_TEMPLATE = kendo.template(\"#=kendo.format('{0:m}', date)#\"),\n EVENT_WRAPPER_STRING = '
' +\n '' +\n '# if(data.tail) {#' +\n '' +\n '#}#' +\n '# if(data.isException()) {#' +\n '' +\n '# } else if(data.isRecurring()) {#' +\n '' +\n '# } #' +\n '' +\n '{0}' +\n '' +\n '#if (showDelete) {#' +\n '' +\n '#}#' +\n '# if(data.head) {#' +\n '' +\n '#}#' +\n '' +\n '#if(resizable && !data.tail){#' +\n '' +\n '#}#' +\n '#if(resizable && !data.head){#' +\n '' +\n '#}#' +\n '
';\n\n function toInvariantTime(date) {\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n setTime(staticDate, getMilliseconds(date));\n return staticDate;\n }\n\n function getWorkDays(options) {\n if (options.workDays && options.workDays.length) {\n return options.workDays;\n }\n\n var workDays = [];\n var dayIndex = options.workWeekStart % 7;\n var workWeekEnd = Math.abs(options.workWeekEnd % 7);\n\n workDays.push(dayIndex);\n\n while (workWeekEnd != dayIndex) {\n if (dayIndex > 6 ) {\n dayIndex -= 7;\n } else {\n dayIndex++;\n }\n workDays.push(dayIndex);\n }\n return workDays;\n }\n\n function setColspan(columnLevel) {\n var count = 0;\n if (columnLevel.columns) {\n for (var i = 0; i < columnLevel.columns.length; i++) {\n count += setColspan(columnLevel.columns[i]);\n }\n columnLevel.colspan = count;\n return count;\n } else {\n columnLevel.colspan = 1;\n return 1;\n }\n }\n\n function collidingEvents(elements, left, right) {\n var idx,\n startPosition,\n overlaps,\n endPosition;\n\n for (idx = elements.length - 1; idx >= 0; idx--) {\n startPosition = elements[idx].rectLeft;\n endPosition = elements[idx].rectRight;\n\n overlaps = startPosition <= left && endPosition >= left;\n\n if (overlaps || (startPosition >= left && endPosition <= right) || (left <= startPosition && right >= startPosition)) {\n if (startPosition < left) {\n left = startPosition;\n }\n\n if (endPosition > right) {\n right = endPosition;\n }\n }\n }\n\n return eventsForSlot(elements, left, right);\n }\n\n function eventsForSlot(elements, left, right) {\n var events = [];\n\n for (var idx = 0; idx < elements.length; idx++) {\n var event = {\n rectLeft: elements[idx].rectLeft,\n rectRight: elements[idx].rectRight\n };\n\n if ((event.rectLeft < left && event.rectRight > left) || (event.rectLeft >= left && event.rectRight <= right)) {\n events.push(elements[idx]);\n }\n }\n\n return events;\n }\n\n var TimelineGroupedView = kendo.Class.extend({\n init: function(view) {\n this._view = view;\n },\n\n _getTimeSlotByPosition: function(x, y, groupIndex) {\n var group = this._view.groups[groupIndex];\n\n return group.timeSlotByPosition(x, y);\n },\n\n _hideHeaders: function() {\n var view = this._view;\n\n view.timesHeader.find(\"table tr\").last().hide(); /*Chrome fix, use CSS selector*/\n view.datesHeader.find(\"table tr\").last().hide();\n },\n\n _setColspan: function(timeColumn) {\n setColspan(timeColumn);\n },\n\n _createRowsLayout: function(resources, rows, groupHeaderTemplate) {\n var view = this._view;\n\n return view._createRowsLayout(resources, rows, groupHeaderTemplate);\n },\n\n _createVerticalColumnsLayout: function(resources, rows, groupHeaderTemplate, columns) {\n\n return columns;\n },\n\n _createColumnsLayout: function(resources, columns, groupHeaderTemplate) {\n var view = this._view;\n\n return view._createColumnsLayout(resources, columns, groupHeaderTemplate);\n },\n\n _getRowCount: function() {\n var view = this._view;\n\n return view._groupCount();\n },\n\n _getGroupsCount: function() {\n return 1;\n },\n\n _addContent: function(dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped) {\n var view = this._view;\n var html = '';\n var options = view.options;\n\n var appendRow = function(date) {\n var content = \"\";\n var classes = \"\";\n var tmplDate;\n\n var resources = function(groupIndex) {\n return function() {\n return view._resourceBySlot({ groupIndex: groupIndex });\n };\n };\n\n if (kendo.date.isToday(dates[idx])) {\n classes += \"k-today\";\n }\n\n if (kendo.date.getMilliseconds(date) < kendo.date.getMilliseconds(options.workDayStart) ||\n kendo.date.getMilliseconds(date) >= kendo.date.getMilliseconds(options.workDayEnd) ||\n !view._isWorkDay(dates[idx])) {\n classes += \" k-nonwork-hour\";\n }\n\n content += '\";\n tmplDate = kendo.date.getDate(dates[idx]);\n kendo.date.setTime(tmplDate, kendo.date.getMilliseconds(date));\n\n content += slotTemplate({ date: tmplDate, resources: resources(isVerticalGrouped ? rowIdx : groupIdx) });\n content += \"\";\n\n return content;\n };\n\n for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n html += '';\n for (var groupIdx = 0; groupIdx < groupsCount; groupIdx++) {\n for (var idx = 0, length = columnCount; idx < length; idx++) {\n html += view._forTimeRange(start, end, appendRow);\n }\n }\n html += \"\";\n }\n return html;\n },\n\n _addTimeSlotsCollections: function(groupCount, datesCount, tableRows, interval, isVerticallyGrouped) {\n var view = this._view;\n var rowCount = tableRows.length;\n\n if (isVerticallyGrouped) {\n rowCount = Math.floor(rowCount / groupCount);\n }\n\n for (var groupIndex = 0; groupIndex < groupCount; groupIndex++) {\n var rowMultiplier = 0;\n var group = view.groups[groupIndex];\n var time;\n\n if (isVerticallyGrouped) {\n rowMultiplier = groupIndex;\n }\n\n var rowIndex = rowMultiplier * rowCount;\n var cellMultiplier = 0;\n\n if (!isVerticallyGrouped) {\n cellMultiplier = groupIndex;\n }\n\n var cells = tableRows[rowIndex].children;\n var cellsPerGroup = cells.length / (!isVerticallyGrouped ? groupCount : 1);\n var cellsPerDay = cellsPerGroup / datesCount;\n\n for (var dateIndex = 0; dateIndex < datesCount; dateIndex++) {\n var cellOffset = dateIndex * cellsPerDay + (cellsPerGroup * cellMultiplier);\n time = getMilliseconds(new Date(+view.startTime()));\n\n for (var cellIndex = 0; cellIndex < cellsPerDay; cellIndex++) {\n\n view._addTimeSlotToCollection(group, cells, cellIndex, cellOffset, dateIndex, time, interval);\n time += interval;\n }\n }\n }\n },\n\n _getVerticalGroupCount: function(groupsCount) {\n\n return groupsCount;\n },\n\n _getVerticalRowCount: function(eventGroups, groupIndex, maxRowCount) {\n var view = this._view;\n\n return view._isVerticallyGrouped() ? eventGroups[groupIndex].maxRowCount : maxRowCount;\n },\n\n _renderEvent: function(eventGroup, event, adjustedEvent, group, range, container) {\n var view = this._view;\n var element;\n\n element = view._createEventElement(adjustedEvent.occurrence, event, range.head || adjustedEvent.head, range.tail || adjustedEvent.tail);\n element.appendTo(container).css({ top: 0, height: view.options.eventHeight });\n\n var eventObject = {\n start: adjustedEvent.occurrence._startTime || adjustedEvent.occurrence.start,\n end: adjustedEvent.occurrence._endTime || adjustedEvent.occurrence.end,\n element: element,\n uid: event.uid,\n slotRange: range,\n rowIndex: 0,\n offsetTop: 0\n };\n\n eventGroup.events[event.uid] = eventObject;\n\n view._inverseEventColor(element);\n view.addContinuousEvent(group, range, element, event.isAllDay);\n view._arrangeRows(eventObject, range, eventGroup);\n },\n\n _verticalCountForLevel: function(level) {\n var view = this._view;\n\n return view._rowCountForLevel(level);\n },\n\n _horizontalCountForLevel: function(level) {\n var view = this._view;\n\n return view._columnCountForLevel(level);\n },\n\n _updateCurrentVerticalTimeMarker: function(ranges, currentTime) {\n var view = this._view;\n var elementHtml = \"
\";\n var headerWrap = view.datesHeader.find(\".\" + SCHEDULER_HEADER_WRAP_CLASS);\n var left = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).left);\n var timesTableMarker = $(elementHtml)\n .prependTo(headerWrap)\n .addClass(CURRENT_TIME_MARKER_ARROW_CLASS + \"-down\");\n\n timesTableMarker.css({\n left: view._adjustLeftPosition(left - (outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2)),\n top: headerWrap.find(\"tr\").last().prev().position().top\n });\n\n $(elementHtml).prependTo(view.content).css({\n left: view._adjustLeftPosition(left),\n width: \"1px\",\n height: view.content[0].scrollHeight - 1,\n top: 0\n });\n },\n\n _changeGroup: function() {\n return undefined$1;\n },\n\n _prevGroupSlot: function(slot, group, isDay) {\n var view = this._view;\n\n if (view._isVerticallyGrouped()) {\n return slot;\n } else {\n var collection = group._collection(0, isDay);\n return collection.last();\n }\n },\n\n _nextGroupSlot: function(slot, group, isDay) {\n var view = this._view;\n\n if (view._isVerticallyGrouped()) {\n return slot;\n } else {\n var collection = group._collection(0, isDay);\n return collection.first();\n }\n },\n\n _verticalSlots: function(selection, reverse) {\n var view = this._view;\n\n return view._changeGroup(selection, reverse);\n },\n\n _verticalMethod: function(reverse) {\n\n return reverse ? \"leftSlot\" : \"rightSlot\";\n },\n\n _normalizeVerticalSelection: function() {\n return undefined$1;\n },\n\n _horizontalSlots: function(selection, group, method, startSlot, endSlot, multiple, reverse) {\n var view = this._view;\n var result = {};\n\n result.startSlot = group[method](startSlot);\n result.endSlot = group[method](endSlot);\n\n if (!multiple && view._isHorizontallyGrouped() && (!result.startSlot || !result.endSlot)) {\n result.startSlot = result.endSlot = view._changeGroup(selection, reverse);\n }\n\n return result;\n },\n\n _changeVerticalViewPeriod: function() {\n return false;\n },\n\n _changeHorizontalViewPeriod: function(slots, shift, selection, reverse) {\n var view = this._view;\n\n if ((!slots.startSlot || !slots.endSlot ) && !shift && view._changeViewPeriod(selection, reverse, false)) {\n return true;\n }\n return false;\n },\n\n _updateDirection: function(selection, ranges, shift, reverse) {\n var view = this._view;\n\n view._updateDirection(selection, ranges, shift, reverse, true);\n },\n\n _createMoveHint: function(range, adjustedEvent) {\n var view = this._view;\n var startSlot = range.start;\n\n var hint = view._createEventElement(adjustedEvent.occurrence ,adjustedEvent.occurrence, false, false);\n\n hint.addClass(\"k-event-drag-hint\");\n\n var rect = range.innerRect(adjustedEvent.occurrence.start, adjustedEvent.occurrence.end, view.options.snap);\n var width = rect.right - rect.left;\n\n if (width < 0) {\n width = 0;\n }\n\n var left = view._adjustLeftPosition(rect.left);\n\n var css = {\n left: left,\n top: startSlot.offsetTop,\n height: startSlot.offsetHeight,\n width: width\n };\n\n hint.css(css);\n\n if (adjustedEvent.occurrence.inverseColor) {\n hint.addClass(INVERSE_COLOR_CLASS);\n }\n\n view._appendMoveHint(hint);\n },\n\n _adjustLeftPosition: function(left) {\n var view = this._view;\n\n if (view._isRtl) {\n left -= (view.content[0].scrollWidth - view.content[0].clientWidth);\n }\n\n return left;\n }\n });\n\n var TimelineGroupedByDateView = kendo.Class.extend({\n init: function(view) {\n this._view = view;\n },\n\n _getTimeSlotByPosition: function(x, y, groupIndex) {\n var group = this._view.groups[groupIndex];\n\n return group.timeSlotByPosition(x, y, true);\n },\n\n _hideHeaders: function() {\n var view = this._view;\n\n if (!view._isVerticallyGrouped()) {\n view.timesHeader.find(\"table tr\").eq(2).hide();\n view.datesHeader.find(\"table tr\").eq(2).hide();\n } else {\n view.times.find(\".k-last\").hide();\n }\n },\n _setColspan: function() {},\n\n _createRowsLayout: function(resources, rows, groupHeaderTemplate, columns) {\n var view = this._view;\n\n return view._createDateLayout(columns, null, true);\n },\n\n _createVerticalColumnsLayout: function(resources, rows, groupHeaderTemplate) {\n var view = this._view;\n\n return view._createColumnsLayout(resources, null, groupHeaderTemplate);\n },\n\n _createColumnsLayout: function(resources, columns, groupHeaderTemplate, subColumns) {\n var view = this._view;\n\n return view._createColumnsLayout(resources, columns, groupHeaderTemplate, subColumns, true);\n },\n\n _getRowCount: function(level) {\n var view = this._view;\n\n return view._rowCountForLevel(level);\n },\n\n _getGroupsCount: function() {\n var view = this._view;\n\n return view._groupCount();\n },\n\n _addContent: function(dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped) {\n var view = this._view;\n var html = '';\n var options = view.options;\n\n var appendRow = function(date, isMajorTickColumn, isMiddleColumn, isLastSlotColumn, minorTickColumns, groupIdx) {\n var content = \"\";\n var classes = \"\";\n var tmplDate;\n var workDateIndex = view._isVerticallyGrouped() ? dateIndex : idx;\n\n var resources = function(groupIndex) {\n return function() {\n return view._resourceBySlot({ groupIndex: groupIndex });\n };\n };\n\n if (kendo.date.isToday(dates[idx])) {\n classes += \"k-today\";\n }\n\n if (kendo.date.getMilliseconds(date) < kendo.date.getMilliseconds(options.workDayStart) ||\n kendo.date.getMilliseconds(date) >= kendo.date.getMilliseconds(options.workDayEnd) ||\n !view._isWorkDay(dates[workDateIndex])) {\n classes += \" k-nonwork-hour\";\n }\n\n content += '\";\n tmplDate = kendo.date.getDate(dates[idx]);\n kendo.date.setTime(tmplDate, kendo.date.getMilliseconds(date));\n\n content += slotTemplate({ date: tmplDate, resources: resources(groupIdx) });\n content += \"\";\n\n return content;\n };\n\n var tempStart = new Date(start),\n minorTickCount = view.options.minorTickCount,\n msMajorInterval = view.options.majorTick * MS_PER_MINUTE,\n msInterval = msMajorInterval / minorTickCount || 1,\n dateIndex;\n\n for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n html += '';\n\n if ((rowIdx % (rowCount / view._dates.length)) === 0) {\n dateIndex = (rowIdx / (rowCount / view._dates.length));\n tempStart = new Date(view._dates[dateIndex]);\n kendo.date.setTime(tempStart, kendo.date.getMilliseconds(start));\n }\n\n for (var idx = 0, length = columnCount; idx < length; idx++) {\n\n html += view._forTimeRange(tempStart, end, appendRow, isVerticalGrouped, groupsCount);\n\n if (isVerticalGrouped) {\n setTime(tempStart, msInterval, false);\n break;\n }\n }\n html += \"\";\n }\n\n return html;\n },\n\n _addTimeSlotsCollections: function(groupCount, datesCount, tableRows, interval, isVerticallyGrouped) {\n var view = this._view;\n var rowCount = tableRows.length;\n\n if (isVerticallyGrouped) {\n rowCount = rowCount / datesCount;\n }\n\n for (var dateIndex = 0; dateIndex < datesCount; dateIndex++) {\n var rowMultiplier = 0;\n var time;\n\n if (isVerticallyGrouped) {\n rowMultiplier = dateIndex;\n }\n\n var rowIndex = rowMultiplier * rowCount;\n var cellMultiplier = 0;\n var cells = tableRows[rowIndex].children;\n var cellsPerGroup = isVerticallyGrouped ? rowCount : cells.length / (datesCount * groupCount);\n var cellsPerDay = cells.length / datesCount;\n var cellOffset;\n\n time = getMilliseconds(new Date(+view.startTime()));\n\n for (var cellIndex = 0; cellIndex < cellsPerGroup; cellIndex++) {\n if (!isVerticallyGrouped) {\n cellOffset = (dateIndex * cellsPerDay) + (groupCount * cellIndex);\n cellMultiplier++;\n } else {\n cellOffset = 0;\n cells = tableRows[cellIndex + (cellsPerGroup * dateIndex)].children;\n }\n\n for (var groupIndex = 0; groupIndex < groupCount; groupIndex++) {\n var group = view.groups[groupIndex];\n\n view._addTimeSlotToCollection(group, cells, groupIndex, cellOffset, dateIndex, time, interval);\n }\n time += interval;\n }\n }\n },\n\n _getVerticalGroupCount: function() {\n var view = this._view;\n\n return view.content.find(\"tr\").length;\n },\n\n _getVerticalRowCount: function(eventGroups, groupIndex, maxRowCount) {\n\n return maxRowCount;\n },\n\n _renderEvent: function(eventGroup, event, adjustedEvent, group, range, container, startIndex, endIndex) {\n var view = this._view;\n var element;\n var eventObjects = [];\n\n for (var i = range.start.index; i <= range.end.index; i++) {\n element = view._createEventElement(adjustedEvent.occurrence, event, i !== endIndex, i !== startIndex);\n element.appendTo(container).css({ top: 0, height: view.options.eventHeight });\n var currentSlot = group._timeSlotCollections[0]._slots[i];\n var dateRange = group.timeSlotRanges(currentSlot.start, currentSlot.end, false)[0];\n\n var eventObject = {\n start: i === startIndex ? adjustedEvent.occurrence._startTime || adjustedEvent.occurrence.start : currentSlot.start,\n end: i === endIndex ? adjustedEvent.occurrence._endTime || adjustedEvent.occurrence.end : currentSlot.end,\n element: element,\n uid: event.uid,\n slotRange: dateRange,\n rowIndex: 0,\n offsetTop: 0\n };\n\n eventGroup.events[event.uid] = eventObject;\n eventObjects.push(eventObject);\n\n view.addContinuousEvent(group, dateRange, element, event.isAllDay);\n view._arrangeRows(eventObject, dateRange, eventGroup);\n }\n eventGroup.events[event.uid] = eventObjects;\n },\n\n _verticalCountForLevel: function(level) {\n var view = this._view;\n\n return view._columnCountForLevel(level);\n },\n\n _horizontalCountForLevel: function(level, columnLevel) {\n var view = this._view;\n\n return view._columnCountForLevel(columnLevel) / view._columnCountForLevel(2);\n },\n\n _updateCurrentVerticalTimeMarker: function(ranges,currentTime) {\n var view = this._view;\n var firstTimesCell = view.times.find(\"tr\").first().find(\"th\").first();\n var lastTimesCell = view.times.find(\"tr\").first().find(\"th\").last();\n var elementHtml = \"
\";\n var timesTableMarker = $(elementHtml).prependTo(view.times);\n var markerTopPosition = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).top);\n var timesTableMarkerCss = {};\n\n if (this._isRtl) {\n timesTableMarkerCss.right = firstTimesCell.position().left + outerHeight(firstTimesCell) - outerHeight(lastTimesCell);\n timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + \"-left\");\n } else {\n timesTableMarkerCss.left = lastTimesCell.position().left;\n timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + \"-right\");\n }\n\n timesTableMarkerCss.top = markerTopPosition - (outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2);\n\n timesTableMarker.css(timesTableMarkerCss);\n\n $(elementHtml).prependTo(view.content).css({\n top: markerTopPosition,\n height: \"1px\",\n right: \"1px\",\n width: view.content[0].scrollWidth,\n left: 0\n });\n },\n\n _changeGroup: function(selection, previous, slot) {\n var view = this._view;\n\n if (!slot) {\n selection.groupIndex = previous ? view.groups.length - 1 : 0;\n }\n },\n\n _prevGroupSlot: function(slot) {\n return slot;\n },\n\n _nextGroupSlot: function(slot) {\n return slot;\n },\n\n _changeDate: function(selection, reverse, slot) {\n var view = this._view;\n var group = view.groups[selection.groupIndex];\n var collections, index;\n\n if (reverse) {\n collections = group._getCollections(false);\n index = slot.index - 1;\n\n if (index >= 0) {\n return collections[0]._slots[index];\n }\n } else {\n collections = group._getCollections(false);\n index = slot.index + 1;\n\n if (collections[0] && collections[0]._slots[index]) {\n return collections[0]._slots[index];\n }\n }\n },\n\n _verticalSlots: function(selection, reverse, slot) {\n return this._changeDate(selection, reverse, slot);\n },\n\n _verticalMethod: function(reverse, multiple) {\n if (multiple) {\n return reverse ? \"upSlot\" : \"downSlot\";\n } else {\n return reverse ? \"leftSlot\" : \"rightSlot\";\n }\n },\n\n _normalizeVerticalSelection: function(selection, ranges, reverse, multiple) {\n var view = this._view;\n\n if (!multiple) {\n return view._normalizeVerticalSelection(selection, ranges, reverse);\n }\n\n return undefined$1;\n },\n\n _horizontalSlots: function(selection, group, method, startSlot, endSlot, multiple, reverse) {\n var view = this._view;\n var tempSlot = view._changeGroup(selection, reverse);\n var result = {};\n\n if (!tempSlot) {\n if (!view._isVerticallyGrouped()) {\n result.startSlot = group[method](startSlot);\n result.endSlot = group[method](endSlot);\n }\n\n } else {\n result.startSlot = result.endSlot = tempSlot;\n }\n\n return result;\n },\n\n _changeVerticalViewPeriod: function(slots, shift, selection, reverse) {\n var view = this._view;\n\n if ((!slots.startSlot || !slots.endSlot) && !shift &&\n view._changeViewPeriod(selection, reverse, view._isVerticallyGrouped())) {\n return true;\n }\n return false;\n },\n\n _changeHorizontalViewPeriod: function(slots, shift, selection, reverse) {\n var view = this._view;\n\n if ( view._isVerticallyGrouped()) {\n return false;\n }\n\n if ((!slots.startSlot || !slots.endSlot ) && !shift && view._changeViewPeriod(selection, reverse, false)) {\n return true;\n }\n return false;\n },\n\n _updateDirection: function(selection, ranges, shift, reverse) {\n var view = this._view;\n\n view._updateDirection(selection, ranges, shift, reverse, !view._isVerticallyGrouped());\n },\n\n _createMoveHint: function(range, adjustedEvent) {\n var view = this._view;\n var startSlot = range.start;\n var startEnd = range.end;\n\n for (var slotIdx = startSlot.index; slotIdx <= startEnd.index; slotIdx++) {\n var slot = range.collection._slots[slotIdx];\n var hint = view._createEventElement(adjustedEvent.occurrence ,adjustedEvent.occurrence, false, false);\n\n hint.addClass(\"k-event-drag-hint\");\n\n var css = {\n left: slot.offsetLeft + 2,\n top: slot.offsetTop,\n height: view.options.eventHeight,\n width: slot.offsetWidth\n };\n\n hint.css(css);\n\n if (adjustedEvent.occurrence.inverseColor) {\n hint.addClass(INVERSE_COLOR_CLASS);\n }\n\n view._appendMoveHint(hint);\n }\n },\n\n _adjustLeftPosition: function(left) {\n var view = this._view;\n\n if (view._isRtl && !view._isVerticallyGrouped()) {\n left -= (view.content[0].scrollWidth - view.content[0].offsetWidth);\n }\n\n return left;\n }\n });\n\n kendo.ui.scheduler.TimelineGroupedView = TimelineGroupedView;\n kendo.ui.scheduler.TimelineGroupedByDateView = TimelineGroupedByDateView;\n\n var TimelineView = SchedulerView.extend({\n init: function(element, options) {\n var that = this;\n\n SchedulerView.fn.init.call(that, element, options);\n\n that._groupedView = that._getGroupedView();\n\n that.title = that.options.title || that.options.name;\n\n that._workDays = getWorkDays(that.options);\n\n that._templates();\n\n that._editable();\n\n that.calculateDateRange();\n\n that._groups();\n\n that._currentTime(true);\n },\n name: \"timeline\",\n\n _isVirtualized: function() {\n return false;\n },\n\n _getGroupedView: function() {\n\n if (this._isGroupedByDate()) {\n return new kendo.ui.scheduler.TimelineGroupedByDateView(this);\n } else {\n return new kendo.ui.scheduler.TimelineGroupedView(this);\n }\n },\n\n _getNextEventIndexBySlot: function(slot, sortedEvents, groupIndex) {\n if (this._isVerticallyGrouped()) {\n return kendo.ui.SchedulerView.fn._getNextEventIndexBySlot.call(this, slot, sortedEvents, groupIndex);\n }\n\n var tempIndex = 0;\n\n for (var i = 0; i < sortedEvents.length; i++) {\n if (slot.startDate() > sortedEvents[i].start.startDate()) {\n tempIndex++;\n continue;\n }\n\n if (slot.startDate().getTime() === sortedEvents[i].start.startDate().getTime() &&\n groupIndex > sortedEvents[i].start.groupIndex) {\n tempIndex++;\n continue;\n }\n\n break;\n\n }\n return tempIndex;\n },\n\n _getSelectedSlot: function(slot, sortedEvents, event, idx, pad, prev) {\n if (this._isVerticallyGrouped()) {\n return kendo.ui.SchedulerView.fn._getSelectedSlot.call(this, slot, sortedEvents, event, idx, pad, prev);\n }\n\n return slot;\n },\n\n _getSortedEvents: function(uniqueAllEvents) {\n if (this._isVerticallyGrouped()) {\n return kendo.ui.SchedulerView.fn._getSortedEvents.call(this, uniqueAllEvents);\n }\n\n return uniqueAllEvents.sort(function(first, second) {\n var result = first.start.startDate().getTime() - second.start.startDate().getTime();\n\n if (result === 0) {\n if (first.start.isDaySlot && !second.start.isDaySlot) {\n result = -1;\n }\n\n if (!first.start.isDaySlot && second.start.isDaySlot) {\n result = 1;\n }\n }\n\n if (result === 0) {\n result = first.start.groupIndex - second.start.groupIndex;\n }\n\n if (result === 0) {\n result = $(first.element).index() - $(second.element).index();\n }\n\n return result;\n });\n },\n\n _currentTimeMarkerUpdater: function() {\n this._updateCurrentTimeMarker(new Date());\n },\n\n _scrollTo: function(element, container) {\n SchedulerView.fn._scrollTo.call(this, element, container);\n\n var elementOffset = element.offsetLeft,\n elementOffsetDir = element.offsetWidth,\n containerScroll = container.scrollLeft,\n containerOffsetDir = container.clientWidth,\n rightDistance = elementOffset + elementOffsetDir,\n result = 0;\n\n if (containerScroll > elementOffset) {\n result = elementOffset;\n } else if (rightDistance > (containerScroll + containerOffsetDir)) {\n if (elementOffsetDir <= containerOffsetDir) {\n result = (rightDistance - containerOffsetDir);\n } else {\n result = elementOffset;\n }\n } else {\n result = containerScroll;\n }\n container.scrollLeft = result;\n },\n\n _updateCurrentTimeMarker: function(currentTime) {\n var options = this.options;\n\n this.datesHeader.find(\".\" + CURRENT_TIME_MARKER_CLASS).remove();\n this.times.find(\".\" + CURRENT_TIME_MARKER_CLASS).remove();\n this.content.find(\".\" + CURRENT_TIME_MARKER_CLASS).remove();\n\n if (!this._isInDateSlot({ start: currentTime, end: currentTime })) {\n return;\n }\n\n if (options.currentTimeMarker.useLocalTimezone === false) {\n var timezone = options.dataSource.options.schema.timezone;\n\n if (options.dataSource && timezone) {\n var timezoneOffset = kendo.timezone.offset(currentTime, timezone);\n currentTime = kendo.timezone.convert(currentTime, currentTime.getTimezoneOffset(), timezoneOffset);\n }\n }\n\n var groupsCount = !options.group || options.group.orientation == \"vertical\" ? 1 : this.groups.length;\n\n for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n var currentGroup = this.groups[groupIndex];\n\n if (!currentGroup) {\n return;\n }\n\n var utcCurrentTime = kendo.date.toUtcTime(currentTime);\n var ranges = currentGroup.timeSlotRanges(utcCurrentTime, utcCurrentTime + 1);\n\n if (ranges.length === 0) {\n return;\n }\n\n var collection = ranges[0].collection;\n var slotElement = collection.slotByStartDate(currentTime);\n\n if (slotElement) {\n\n if (this._isVerticallyGrouped()) {\n this._groupedView._updateCurrentVerticalTimeMarker(ranges,currentTime);\n } else {\n var elementHtml = \"
\";\n var headerWrap = this.datesHeader.find(\".\" + SCHEDULER_HEADER_WRAP_CLASS);\n var left = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).left);\n var timesTableMarker = $(elementHtml)\n .prependTo(headerWrap)\n .addClass(CURRENT_TIME_MARKER_ARROW_CLASS + \"-down\");\n\n timesTableMarker.css({\n left: this._adjustLeftPosition(left - (outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2)),\n top: headerWrap.find(\"tr\").last().prev().position().top\n });\n\n $(elementHtml).prependTo(this.content).css({\n left: this._adjustLeftPosition(left),\n width: \"1px\",\n height: this.content[0].scrollHeight - 1,\n top: 0\n });\n }\n }\n }\n },\n\n _adjustLeftPosition: function(left) {\n return this._groupedView._adjustLeftPosition(left);\n },\n\n _currentTime: function(setUpdateTimer) {\n var that = this;\n var markerOptions = that.options.currentTimeMarker;\n\n if (markerOptions !== false && markerOptions.updateInterval !== undefined$1) {\n that._currentTimeMarkerUpdater();\n\n if (setUpdateTimer) {\n that._currentTimeUpdateTimer = setInterval(this._currentTimeMarkerUpdater.bind(that), markerOptions.updateInterval);\n }\n }\n },\n\n _editable: function() {\n if (this.options.editable) {\n if (this._isMobile()) {\n this._touchEditable();\n } else {\n this._mouseEditable();\n }\n }\n },\n\n _mouseEditable: function() {\n var that = this;\n that.element.on(\"click\" + NS, \".k-event a:has(.k-i-close)\", function(e) {\n that.trigger(\"remove\", { uid: $(this).closest(\".k-event\").attr(kendo.attr(\"uid\")) });\n e.preventDefault();\n });\n\n if (that.options.editable.create !== false) {\n that.element.on(\"dblclick\" + NS, \".k-scheduler-content td\", function(e) {\n var slot = that._slotByPosition(e.pageX, e.pageY);\n\n if (slot) {\n var resourceInfo = that._resourceBySlot(slot);\n that.trigger(\"add\", { eventInfo: extend({ start: slot.startDate(), end: slot.endDate() }, resourceInfo) });\n }\n\n e.preventDefault();\n });\n }\n\n if (that.options.editable.update !== false) {\n that.element.on(\"dblclick\" + NS, \".k-event\", function(e) {\n that.trigger(\"edit\", { uid: $(this).closest(\".k-event\").attr(kendo.attr(\"uid\")) });\n e.preventDefault();\n });\n }\n },\n\n _touchEditable: function() {\n var that = this;\n var threshold = 0;\n\n if (kendo.support.mobileOS.android) {\n threshold = 5;\n }\n\n if (that.options.editable.create !== false) {\n that._addUserEvents = new kendo.UserEvents(that.element, {\n threshold: threshold,\n useClickAsTap: !kendo.support.browser.edge,\n filter: \".k-scheduler-content td\",\n tap: function(e) {\n if (that._scrolling) {\n return;\n }\n var x = e.x.location !== undefined$1 ? e.x.location : e.x;\n var y = e.y.location !== undefined$1 ? e.y.location : e.y;\n var slot = that._slotByPosition(x, y);\n\n if (slot) {\n var resourceInfo = that._resourceBySlot(slot);\n that.trigger(\"add\", { eventInfo: extend({ start: slot.startDate(), end: slot.endDate() }, resourceInfo) });\n }\n\n e.preventDefault();\n }\n });\n }\n\n if (that.options.editable.update !== false) {\n that._editUserEvents = new kendo.UserEvents(that.element, {\n threshold: threshold,\n useClickAsTap: !kendo.support.browser.edge,\n filter: \".k-event\",\n tap: function(e) {\n if (that._scrolling) {\n return;\n }\n var eventElement = $(e.target).closest(\".k-event\");\n var touchElement = $(e.touch.initialTouch);\n\n if (touchElement.hasClass(\"k-i-close\")) {\n that.trigger(\"remove\", { uid: eventElement.attr(kendo.attr(\"uid\")) });\n } else if (!eventElement.hasClass(\"k-event-active\")) {\n that.trigger(\"edit\", { uid: eventElement.attr(kendo.attr(\"uid\")) });\n }\n\n e.preventDefault();\n }\n });\n }\n },\n\n _slotByPosition: function(x, y) {\n var slot;\n var content = this.content;\n var offset = content.offset();\n var groupIndex;\n\n x -= offset.left;\n y -= offset.top;\n\n if (this._isRtl) {\n var browser = kendo.support.browser;\n\n if (browser.mozilla || (browser.webkit && browser.version >= 85)) {\n x += (content[0].scrollWidth - content[0].offsetWidth);\n x += content[0].scrollLeft;\n } else if (browser.msie) {\n x -= kendo.scrollLeft(content);\n x += content[0].scrollWidth - content[0].offsetWidth;\n } else if (browser.webkit) {\n x += content[0].scrollLeft;\n }\n } else {\n x += content[0].scrollLeft;\n }\n\n y += content[0].scrollTop;\n\n x = Math.ceil(x);\n y = Math.ceil(y);\n\n for (groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n\n slot = this._groupedView._getTimeSlotByPosition(x, y, groupIndex);\n\n if (slot) {\n return slot;\n }\n }\n\n return null;\n },\n\n options: {\n name: \"TimelineView\",\n title: \"Timeline\",\n selectedDateFormat: \"{0:D}\",\n selectedShortDateFormat: \"{0:d}\",\n selectedMobileDateFormat: \"{0:MMM dd}\",\n date: kendo.date.today(),\n startTime: kendo.date.today(),\n endTime: kendo.date.today(),\n showWorkHours: false,\n minorTickCount: 2,\n editable: true,\n workDayStart: new Date(1980, 1, 1, 8, 0, 0),\n workDayEnd: new Date(1980, 1, 1, 17, 0, 0),\n workWeekStart: 1,\n workWeekEnd: 5,\n majorTick: 60,\n eventHeight: 25,\n eventMinWidth: 0,\n columnWidth: 100,\n groupHeaderTemplate: \"#=text#\",\n majorTimeHeaderTemplate: \"#=kendo.toString(date, 't')#\",\n slotTemplate: \" \",\n eventTemplate: EVENT_TEMPLATE,\n dateHeaderTemplate: DATA_HEADER_TEMPLATE,\n footer: {\n command: \"workDay\"\n },\n currentTimeMarker: {\n updateInterval: 10000,\n useLocalTimezone: true\n },\n messages: {\n defaultRowText: \"All events\",\n showFullDay: \"Show full day\",\n showWorkDay: \"Show business hours\"\n }\n },\n\n events: [\"remove\", \"add\", \"edit\"],\n\n _templates: function() {\n var options = this.options,\n settings = extend({}, kendo.Template, options.templateSettings);\n\n this.eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_STRING);\n this.majorTimeHeaderTemplate = kendo.template(options.majorTimeHeaderTemplate, settings);\n this.dateHeaderTemplate = kendo.template(options.dateHeaderTemplate, settings);\n this.slotTemplate = kendo.template(options.slotTemplate, settings);\n this.groupHeaderTemplate = kendo.template(options.groupHeaderTemplate, settings);\n },\n\n _render: function(dates) {\n var that = this;\n\n dates = dates || [];\n\n that._dates = dates;\n\n that._startDate = dates[0];\n\n that._endDate = dates[(dates.length - 1) || 0];\n\n that._calculateSlotRanges();\n\n that.createLayout(that._layout(dates));\n\n that._content(dates);\n\n that._footer();\n\n that._setContentWidth();\n\n that.refreshLayout();\n\n that.datesHeader.on(\"click\" + NS, \".k-nav-day\", function(e) {\n var th = $(e.currentTarget).closest(\"th\");\n\n var slot = that._slotByPosition(th.offset().left, that.content.offset().top);\n\n that.trigger(\"navigate\", { view: \"timeline\", date: slot.startDate() });\n });\n\n that._groupedView._hideHeaders();\n },\n\n _setContentWidth: function() {\n var content = this.content;\n var contentWidth = content.width();\n var contentTable = this.content.find(\"table\");\n var columnCount = contentTable.find(\"tr\").first().children().length;\n\n var minWidth = 100;\n var calculatedWidth = columnCount * this.options.columnWidth;\n\n if (contentWidth < calculatedWidth) {\n minWidth = Math.ceil((calculatedWidth / contentWidth) * 100);\n }\n\n contentTable.add(this.datesHeader.find(\"table\"))\n .css(\"width\", minWidth + \"%\");\n },\n\n _calculateSlotRanges: function() {\n var dates = this._dates;\n var slotStartTime = this.startTime();\n var slotEndTime = this.endTime();\n\n slotEndTime = getMilliseconds(slotEndTime);\n slotStartTime = getMilliseconds(slotStartTime);\n\n if (slotEndTime === slotStartTime) {\n slotEndTime += MS_PER_DAY - 1;\n } else if (slotEndTime < slotStartTime) {\n slotEndTime += MS_PER_DAY;\n }\n\n var slotRanges = [];\n for (var i = 0; i < dates.length; i++) {\n var rangeStart = getDate(dates[i]);\n setTime(rangeStart, slotStartTime);\n\n var rangeEnd = getDate(dates[i]);\n setTime(rangeEnd, slotEndTime);\n\n slotRanges.push({\n start: kendo.date.toUtcTime(rangeStart),\n end: kendo.date.toUtcTime(rangeEnd)\n });\n }\n\n this._slotRanges = slotRanges;\n },\n\n _forTimeRange: function(min, max, action, verticalByDate, groupsCount) {\n min = toInvariantTime(min); //convert the date to 1/2/1980 and sets the time\n max = toInvariantTime(max);\n\n var that = this,\n msMin = getMilliseconds(min),\n msMax = getMilliseconds(max),\n minorTickCount = that.options.minorTickCount,\n msMajorInterval = that.options.majorTick * MS_PER_MINUTE,\n msInterval = msMajorInterval / minorTickCount || 1,\n start = new Date(+min),\n idx = 0, length,\n html = \"\";\n\n length = MS_PER_DAY / msInterval;\n\n if (msMin != msMax) {\n if (msMin > msMax) {\n msMax += MS_PER_DAY;\n }\n\n length = ((msMax - msMin) / msInterval);\n }\n\n length = verticalByDate ? 1 : Math.round(length);\n\n if (groupsCount) {\n length = length * groupsCount;\n }\n\n for (; idx < length; idx++) {\n var majorTickDivider = idx % (msMajorInterval / msInterval);\n var isMajorTickColumn = majorTickDivider === 0;\n var isMiddleColumn = majorTickDivider < minorTickCount - 1;\n var isLastSlotColumn = majorTickDivider === minorTickCount - 1;\n var minorTickColumns = minorTickCount;\n\n if (length % minorTickCount !== 0) {\n var isLastMajorSlot = (length - (idx + 1)) < minorTickCount;\n if (isMajorTickColumn && isLastMajorSlot) {\n minorTickColumns = length % minorTickCount;\n }\n }\n\n html += action(start, isMajorTickColumn, isMiddleColumn, isLastSlotColumn, minorTickColumns, idx % groupsCount);\n\n if (!verticalByDate) {\n if (groupsCount) {\n if ((idx % groupsCount) === groupsCount - 1) {\n setTime(start, msInterval, false);\n }\n } else {\n setTime(start, msInterval, false);\n }\n }\n }\n\n return html;\n },\n\n _layout: function(dates) {\n var timeColumns = [];\n var columns = [];\n var that = this;\n var rows = [{ text: that.options.messages.defaultRowText }];\n var groupedView = that._groupedView;\n\n var minorTickSlots = [];\n for (var minorTickIndex = 0; minorTickIndex < that.options.minorTickCount; minorTickIndex++) {\n minorTickSlots.push({\n text: \"​\",\n className: \"k-last\",\n minorTicks: true\n });\n }\n\n this._forTimeRange(that.startTime(), that.endTime(), function(date, majorTick, middleColumn, lastSlotColumn, minorSlotsCount) {\n var template = that.majorTimeHeaderTemplate;\n\n if (majorTick) {\n var timeColumn = {\n text: template({ date: date }),\n className: lastSlotColumn ? \"k-slot-cell\" : \"\",\n columns: minorTickSlots.slice(0, minorSlotsCount)\n };\n\n groupedView._setColspan(timeColumn);\n\n timeColumns.push(timeColumn);\n }\n });\n\n for (var idx = 0; idx < dates.length; idx++) {\n columns.push({\n text: that.dateHeaderTemplate({ date: dates[idx] }),\n className: \"k-slot-cell\",\n columns: timeColumns.slice(0)\n });\n }\n\n var resources = this.groupedResources;\n if (resources.length) {\n if (this._groupOrientation() === \"vertical\") {\n rows = groupedView._createRowsLayout(resources, null, this.groupHeaderTemplate, columns);\n columns = groupedView._createVerticalColumnsLayout(resources, null, this.groupHeaderTemplate, columns);\n\n } else {\n columns = groupedView._createColumnsLayout(resources, columns, this.groupHeaderTemplate, columns);\n }\n }\n\n return {\n columns: columns,\n rows: rows\n };\n },\n\n _footer: function() {\n var options = this.options;\n\n if (options.footer !== false) {\n var html = '\";\n\n this.footer = $(html).appendTo(this.element);\n\n var that = this;\n\n this.footer.on(\"click\" + NS, \".k-scheduler-fullday\", function(e) {\n e.preventDefault();\n that.toggleFullDay();\n });\n\n this.footer.on(\"click\" + NS, \".k-scheduler-today\", function(e) {\n e.preventDefault();\n var timezone = that.options.timezone;\n var action = \"today\";\n var currentDate = new Date();\n var date;\n\n if (timezone) {\n var timezoneOffset = kendo.timezone.offset(currentDate, timezone);\n date = kendo.timezone.convert(currentDate, currentDate.getTimezoneOffset(), timezoneOffset);\n } else {\n date = currentDate;\n }\n\n that.trigger(\"navigate\", { view: that.name || options.name, action: action, date: date });\n });\n }\n },\n\n toggleFullDay: function() {\n var options = this.options;\n\n this.trigger(\"navigate\", { view: this.name || options.name, date: options.date, isWorkDay: !options.showWorkHours });\n },\n\n _columnCountForLevel: function(level) {\n var columnLevel = this.columnLevels[level];\n return columnLevel ? columnLevel.length : 0;\n },\n\n _rowCountForLevel: function(level) {\n var rowLevel = this.rowLevels[level];\n return rowLevel ? rowLevel.length : 0;\n },\n\n _isWorkDay: function(date) {\n var day = date.getDay();\n var workDays = this._workDays;\n\n for (var i = 0; i < workDays.length; i++) {\n if (workDays[i] === day) {\n return true;\n }\n }\n return false;\n },\n\n _content: function(dates) {\n var that = this;\n var start = that.startTime();\n var end = this.endTime();\n var groupsCount = 1;\n var rowCount = 1;\n var columnCount = dates.length;\n var html = '';\n var resources = this.groupedResources;\n var slotTemplate = this.slotTemplate;\n var isVerticalGrouped = false;\n\n if (resources.length) {\n isVerticalGrouped = that._groupOrientation() === \"vertical\";\n\n if (isVerticalGrouped) {\n rowCount = that._groupedView._getRowCount(this.rowLevels.length - 1);\n groupsCount = that._groupedView._getGroupsCount();\n } else {\n groupsCount = that._groupCount();\n }\n }\n\n html += '';\n html += that._groupedView._addContent(dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped);\n html += '';\n\n this.content.find(\"table\").append(html);\n },\n\n _groups: function() {\n var groupCount = this._groupCount();\n var dates = this._dates;\n var columnCount = dates.length;\n\n this.groups = [];\n\n for (var idx = 0; idx < groupCount; idx++) {\n var view = this._addResourceView(idx);\n\n var start = dates[0];\n var end = dates[(dates.length - 1) || 0];\n\n var startTime = getMilliseconds(this.startTime());\n var endTime = getMilliseconds(this.endTime());\n\n if (startTime !== 0 && endTime <= startTime) {\n start = getDate(start);\n setTime(start, startTime);\n\n end = getDate(end);\n setTime(end, endTime);\n }\n\n view.addTimeSlotCollection(start, kendo.date.addDays(end, 1));\n }\n\n this._timeSlotGroups(groupCount, columnCount);\n },\n\n _isHorizontallyGrouped: function() {\n return this.groupedResources.length && this._groupOrientation() === \"horizontal\";\n },\n\n _timeSlotGroups: function(groupCount, datesCount) {\n var interval = this._timeSlotInterval();\n var isVerticallyGrouped = this._isVerticallyGrouped();\n var tableRows = this.content.find(\"tr\");\n\n this._groupedView._addTimeSlotsCollections(groupCount, datesCount, tableRows, interval, isVerticallyGrouped);\n\n },\n\n _addTimeSlotToCollection: function(group, cells, cellIndex, cellOffset, dateIndex, time, interval) {\n var cell = cells[cellIndex + cellOffset];\n var collection = group.getTimeSlotCollection(0);\n var currentDate = this._dates[dateIndex];\n var currentTime = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());\n var start = currentTime + time;\n var end = start + interval;\n\n collection.addTimeSlot(cell, start, end, true);\n },\n\n startDate: function() {\n return this._startDate;\n },\n\n endDate: function() {\n return this._endDate;\n },\n\n visibleEndDate: function() {\n var startTime = getMilliseconds(this.startTime());\n var endTime = getMilliseconds(this.endTime());\n var endDate = this.endDate();\n\n if (startTime !== 0 && endTime <= startTime) {\n endDate = kendo.date.addDays(endDate, 1);\n }\n\n return endDate;\n },\n\n startTime: function() {\n var options = this.options;\n return options.showWorkHours ? options.workDayStart : options.startTime;\n },\n\n endTime: function() {\n var options = this.options;\n return options.showWorkHours ? options.workDayEnd : options.endTime;\n },\n\n _timeSlotInterval: function() {\n var options = this.options;\n return (options.majorTick / options.minorTickCount) * MS_PER_MINUTE;\n },\n\n nextDate: function() {\n return kendo.date.nextDay(this.endDate());\n },\n\n previousDate: function() {\n return kendo.date.previousDay(this.startDate());\n },\n\n calculateDateRange: function() {\n this._render([this.options.date]);\n },\n\n render: function(events) {\n this._headerColumnCount = 0;\n\n this._groups();\n\n this.element.find(\".k-event\").remove();\n\n events = new kendo.data.Query(events)\n .sort([{ field: \"start\", dir: \"asc\" },{ field: \"end\", dir: \"desc\" }])\n .toArray();\n\n var eventsByResource = [];\n\n this._eventsByResource(events, this.groupedResources, eventsByResource);\n\n var eventGroups = [];\n var maxRowCount = 0;\n\n for (var groupIndex = 0; groupIndex < eventsByResource.length; groupIndex++) {\n var eventGroup = {\n groupIndex: groupIndex,\n maxRowCount: 0,\n events: {}\n };\n\n eventGroups.push(eventGroup);\n\n this._renderEvents(eventsByResource[groupIndex], groupIndex, eventGroup);\n\n if (maxRowCount < eventGroup.maxRowCount) {\n maxRowCount = eventGroup.maxRowCount;\n }\n }\n\n this._setRowsHeight(eventGroups, eventsByResource.length, maxRowCount);\n\n this._positionEvents(eventGroups, eventsByResource.length);\n\n this._currentTime(false);\n\n this.trigger(\"activate\");\n },\n\n _positionEvents: function(eventGroups, groupsCount) {\n for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n var eventsForGroup = eventGroups[groupIndex].events;\n for (var eventUid in eventsForGroup) {\n var eventObject = eventsForGroup[eventUid];\n if (Array.isArray(eventObject)) {\n for (var eventIndex = 0; eventIndex < eventObject.length; eventIndex++) {\n this._positionEvent(eventObject[eventIndex]);\n }\n } else {\n this._positionEvent(eventObject);\n }\n }\n }\n },\n\n _setRowsHeight: function(eventGroups, groupsCount, maxRowCount) {\n var eventHeight = this.options.eventHeight;\n var eventBottomOffset = this._getBottomRowOffset();\n var groupedView = this._groupedView;\n var verticalGroupCount = groupedView._getVerticalGroupCount(groupsCount);\n\n groupsCount = this._isVerticallyGrouped() ? verticalGroupCount : 1;\n\n for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n var rowsCount = groupedView._getVerticalRowCount(eventGroups, groupIndex, maxRowCount);\n\n rowsCount = rowsCount ? rowsCount : 1;\n\n var rowHeight = ((eventHeight + 2) * rowsCount) + eventBottomOffset;\n var timesRow = $(this.times.find(\"tr\")[groupIndex]);\n var row = $(this.content.find(\"tr\")[groupIndex]);\n\n timesRow.height(rowHeight);\n row.height(rowHeight);\n }\n\n this._setContentWidth();\n this.refreshLayout();\n this._refreshSlots();\n },\n\n _getBottomRowOffset: function() {\n var eventBottomOffset = this.options.eventHeight * 0.50;\n var isMobile = this._isMobile();\n var minOffset;\n var maxOffset;\n\n if (isMobile) {\n minOffset = 30;\n maxOffset = 60;\n } else {\n minOffset = 15;\n maxOffset = 30;\n }\n\n if (eventBottomOffset > maxOffset) {\n eventBottomOffset = maxOffset;\n } else if (eventBottomOffset < minOffset) {\n eventBottomOffset = minOffset;\n }\n\n return eventBottomOffset;\n },\n\n _positionEvent: function(eventObject) {\n var eventHeight = this.options.eventHeight;\n var eventOffset = 2;\n var rect = eventObject.slotRange.innerRect(eventObject.start, eventObject.end, false);\n var left = this._adjustLeftPosition(rect.left);\n var width = rect.right - rect.left;\n\n if (width < 0) {\n width = 0;\n }\n\n if (width < this.options.eventMinWidth) {\n var slotsCollection = eventObject.slotRange.collection;\n var lastSlot = slotsCollection._slots[slotsCollection._slots.length - 1];\n var offsetRight = lastSlot.offsetLeft + lastSlot.offsetWidth;\n\n width = this.options.eventMinWidth;\n\n if (offsetRight < left + width) {\n width = offsetRight - rect.left;\n }\n }\n\n eventObject.element.css({\n top: eventObject.slotRange.start.offsetTop + eventObject.rowIndex * (eventHeight + eventOffset) + \"px\",\n left: left,\n width: width\n });\n },\n\n _refreshSlots: function() {\n for (var groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n this.groups[groupIndex].refresh();\n }\n },\n\n _eventsByResource: function(events, resources, result, parentValue) {\n var resource = resources[0];\n\n if (resource) {\n var view = resource.dataSource.view();\n\n view = view.filter(function(item) {\n var itemParentValue = kendo.getter(resource.dataParentValueField)(item);\n\n return itemParentValue === null || itemParentValue === undefined$1 || itemParentValue === parentValue;\n });\n\n for (var itemIdx = 0; itemIdx < view.length; itemIdx++) {\n var value = this._resourceValue(resource, view[itemIdx]);\n\n var eventsFilteredByResource = new kendo.data.Query(events).filter({ field: resource.field, operator: SchedulerView.groupEqFilter(value) }).toArray();\n\n if (resources.length > 1) {\n this._eventsByResource(eventsFilteredByResource, resources.slice(1), result, value);\n } else {\n result.push(eventsFilteredByResource);\n }\n }\n } else {\n result.push(events);\n }\n },\n\n _isInDateSlot: function(event) {\n var startTime = event.start;\n var endTime = event.end;\n var rangeStart = getDate(this._startDate);\n var rangeEnd = kendo.date.addDays(getDate(this.visibleEndDate()), 1);\n\n if (startTime < rangeEnd && rangeStart <= endTime) {\n return true;\n }\n return false;\n },\n\n _isInTimeSlot: function(event) {\n var startTime = event._startTime || kendo.date.toUtcTime(event.start);\n var endTime = event._endTime || kendo.date.toUtcTime(event.end);\n\n var slotRanges = this._slotRanges;\n\n if (startTime === endTime) {\n endTime = endTime + 1;\n }\n\n for (var slotIndex = 0; slotIndex < slotRanges.length; slotIndex++) {\n if (startTime < slotRanges[slotIndex].end && slotRanges[slotIndex].start < endTime) {\n return true;\n }\n }\n return false;\n },\n\n _adjustEvent: function(event) {\n var start = event.start;\n var end = event.end;\n var eventStartTime = event._time(\"start\");\n var eventEndTime = event._time(\"end\");\n var startTime = getMilliseconds(this.startTime());\n var endTime = getMilliseconds(this.endTime());\n var adjustedStartDate = null;\n var adjustedEndDate = null;\n var occurrence;\n var head = false;\n var tail = false;\n\n if (event.isAllDay) {\n start = getDate(start);\n eventStartTime = 0;\n\n end = getDate(end);\n eventEndTime = MS_PER_DAY;\n adjustedEndDate = kendo.date.addDays(end, 1);\n }\n\n if (endTime === 0) {\n endTime = MS_PER_DAY;\n }\n\n if (endTime <= startTime) {\n if (eventStartTime < startTime && eventStartTime >= endTime) {\n adjustedStartDate = getDate(start);\n setTime(adjustedStartDate, startTime);\n tail = true;\n }\n\n if (eventEndTime > endTime && eventEndTime <= startTime) {\n adjustedEndDate = getDate(end);\n setTime(adjustedEndDate, endTime);\n head = true;\n }\n } else {\n if (startTime > eventStartTime) {\n adjustedStartDate = getDate(start);\n setTime(adjustedStartDate, startTime);\n tail = true;\n } else if (endTime <= eventStartTime) {\n adjustedStartDate = getDate(start);\n adjustedStartDate = kendo.date.addDays(adjustedStartDate, 1);\n setTime(adjustedStartDate, startTime);\n tail = true;\n }\n\n if (endTime < eventEndTime) {\n adjustedEndDate = getDate(end);\n setTime(adjustedEndDate, endTime);\n head = true;\n } else if (startTime > eventEndTime) {\n adjustedEndDate = getDate(end);\n adjustedEndDate = kendo.date.addDays(adjustedEndDate,-1);\n setTime(adjustedEndDate, endTime);\n head = true;\n }\n }\n\n occurrence = event.clone({\n start: adjustedStartDate ? adjustedStartDate : start,\n end: adjustedEndDate ? adjustedEndDate : end,\n _startTime: adjustedStartDate ? kendo.date.toUtcTime(adjustedStartDate) : event._startTime,\n _endTime: adjustedEndDate ? kendo.date.toUtcTime(adjustedEndDate) : event._endTime,\n isAllDay: false\n });\n\n return {\n occurrence: occurrence,\n head: head,\n tail: tail\n };\n },\n\n _renderEvents: function(events, groupIndex, eventGroup) {\n var event;\n var idx;\n var length;\n\n for (idx = 0, length = events.length; idx < length; idx++) {\n event = events[idx];\n\n if (this._isInDateSlot(event)) {\n var isMultiDayEvent = event.isAllDay || event.duration() >= MS_PER_DAY;\n var container = this.content;\n\n if (isMultiDayEvent || this._isInTimeSlot(event)) {\n var adjustedEvent = this._adjustEvent(event);\n var group = this.groups[groupIndex];\n\n if (!group._continuousEvents) {\n group._continuousEvents = [];\n }\n\n if (this._isInTimeSlot(adjustedEvent.occurrence)) {\n var ranges = group.slotRanges(adjustedEvent.occurrence, false);\n var range = ranges[0];\n var startIndex = range.start.index;\n var endIndex = range.end.index;\n\n this._groupedView._renderEvent(eventGroup, event, adjustedEvent, group, range, container, startIndex, endIndex);\n }\n }\n }\n }\n },\n\n addContinuousEvent: function(group, range, element, isAllDay) {\n var events = group._continuousEvents;\n\n events.push({\n element: element,\n isAllDay: isAllDay,\n uid: element.attr(kendo.attr(\"uid\")),\n start: range.start,\n end: range.end\n });\n },\n\n _createEventElement: function(occurrence, event, head, tail) {\n var template = this.eventTemplate;\n var editable = this.options.editable;\n var isMobile = this._isMobile();\n var showDelete = editable && editable.destroy !== false && !isMobile;\n var resizable = editable && editable.resize !== false;\n var eventStartTime = event._time(\"start\");\n var eventEndTime = event._time(\"end\");\n var eventStartDate = event.start;\n var eventEndDate = event.end;\n\n var resources = this.eventResources(event);\n\n if (event._startTime && eventStartTime !== kendo.date.getMilliseconds(event.start)) {\n eventStartDate = new Date(eventStartTime);\n eventStartDate = kendo.timezone.apply(eventStartDate, \"Etc/UTC\");\n }\n\n if (event._endTime && eventEndTime !== kendo.date.getMilliseconds(event.end)) {\n eventEndDate = new Date(eventEndTime);\n eventEndDate = kendo.timezone.apply(eventEndDate, \"Etc/UTC\");\n }\n\n var data = extend({}, {\n ns: kendo.ns,\n resizable: resizable,\n showDelete: showDelete,\n head: head,\n tail: tail,\n singleDay: this._dates.length == 1,\n resources: resources,\n inverseColor: false,\n messages: this.options.messages,\n ariaLabel: this._formatEventAriaLabel(event.title, eventStartDate, eventEndDate, event.isAllDay)\n }, event, {\n start: eventStartDate,\n end: eventEndDate\n });\n\n var element = $(template(data));\n\n this.angular(\"compile\", function() {\n return {\n elements: element,\n data: [ { dataItem: data } ]\n };\n });\n\n return element;\n },\n\n _arrangeRows: function(eventObject, slotRange, eventGroup) {\n var startIndex = slotRange.start.index;\n var endIndex = slotRange.end.index;\n\n var rect = eventObject.slotRange.innerRect(eventObject.start, eventObject.end, false);\n var rectRight = rect.right + this.options.eventMinWidth;\n\n var events = collidingEvents(slotRange.events(), rect.left, rectRight);\n\n slotRange.addEvent({\n slotIndex: startIndex,\n start: startIndex,\n end: endIndex,\n rectLeft: rect.left,\n rectRight: rectRight,\n element: eventObject.element,\n uid: eventObject.uid\n });\n\n events.push({\n start: startIndex,\n end: endIndex,\n uid: eventObject.uid\n });\n\n var rows = SchedulerView.createRows(events);\n\n if (eventGroup.maxRowCount < rows.length) {\n eventGroup.maxRowCount = rows.length;\n }\n\n for (var idx = 0, length = rows.length; idx < length; idx++) {\n var rowEvents = rows[idx].events;\n for (var j = 0, eventLength = rowEvents.length; j < eventLength; j++) {\n eventGroup.events[rowEvents[j].uid].rowIndex = idx;\n }\n }\n },\n\n _groupCount: function() {\n var resources = this.groupedResources;\n var groupedView = this._groupedView;\n\n if (resources.length) {\n if (this._groupOrientation() === \"vertical\") {\n return groupedView._verticalCountForLevel(resources.length - 1);\n } else {\n return groupedView._horizontalCountForLevel(resources.length - 1, this.columnLevels.length - 1);\n }\n }\n return 1;\n },\n\n _updateEventForSelection: function(event) {\n var adjustedEvent = this._adjustEvent(event.clone());\n return adjustedEvent.occurrence;\n },\n\n _eventOptionsForMove: function(event) {\n if (event.isAllDay) {\n return { isAllDay: false };\n }\n\n return {};\n },\n\n _updateEventForResize: function(event) {\n if (event.isAllDay) {\n event.set(\"isAllDay\", false);\n }\n },\n\n _updateMoveHint: function(event, groupIndex, distance) {\n var group = this.groups[groupIndex];\n\n var clonedEvent = event.clone({ start: event.start, end: event.end });\n\n var eventDuraton = clonedEvent.duration();\n clonedEvent.start = new Date(clonedEvent.start.getTime() + distance);\n clonedEvent.end = new Date(+clonedEvent.start + eventDuraton);\n\n this._removeMoveHint(event.uid);\n\n if (this._isInDateSlot(clonedEvent)) {\n if (clonedEvent.isAllDay || clonedEvent.duration() >= MS_PER_DAY || this._isInTimeSlot(clonedEvent)) {\n var adjustedEvent = this._adjustEvent(clonedEvent);\n var ranges = group.slotRanges(adjustedEvent.occurrence, false);\n\n for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n this._groupedView._createMoveHint(ranges[rangeIndex], adjustedEvent);\n }\n }\n }\n },\n\n _appendMoveHint: function(hint) {\n hint.appendTo(this.content);\n\n this._moveHint = this._moveHint.add(hint);\n },\n\n _updateResizeHint: function(event, groupIndex, startTime, endTime) {\n var group = this.groups[groupIndex];\n var ranges = group.ranges(startTime, endTime, false, false);\n\n this._removeResizeHint();\n\n for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n var range = ranges[rangeIndex];\n var start = range.startSlot();\n\n var startRect = range.innerRect(startTime, endTime, false);\n startRect.top = start.offsetTop;\n\n var width = startRect.right - startRect.left;\n\n if (width < 0) {\n for (var i = 0; i < range.events().length; i++) {\n if (range.events()[i].uid === event.uid) {\n width = range.events()[i].rectRight - startRect.left;\n break;\n }\n }\n }\n\n var height = range.endSlot().offsetTop + start.offsetHeight - startRect.top;\n\n var left = this._adjustLeftPosition(startRect.left);\n\n var hint = SchedulerView.fn._createResizeHint.call(this,\n left,\n startRect.top,\n width,\n height\n );\n\n this._resizeHint = this._resizeHint.add(hint);\n }\n\n var format = \"t\";\n var container = this.content;\n\n this._resizeHint.appendTo(container);\n\n this._resizeHint.find(\".k-label-top,.k-label-bottom\").text(\"\");\n\n this._resizeHint.first().addClass(\"k-first\").find(\".k-label-top\").text(kendo.toString(kendo.timezone.toLocalDate(startTime), format));\n\n this._resizeHint.last().addClass(\"k-last\").find(\".k-label-bottom\").text(kendo.toString(kendo.timezone.toLocalDate(endTime), format));\n },\n\n selectionByElement: function(cell) {\n var offset = cell.offset();\n return this._slotByPosition(offset.left, offset.top);\n },\n\n _updateDirection: function(selection, ranges, multiple, reverse, vertical) {\n\n var startSlot = ranges[0].start;\n var endSlot = ranges[ranges.length - 1].end;\n if (multiple && !vertical) {\n if (startSlot.index === endSlot.index &&\n startSlot.collectionIndex === endSlot.collectionIndex) {\n selection.backward = reverse;\n }\n }\n },\n\n _changeGroup: function(selection, previous) {\n var method = previous ? \"prevGroupSlot\" : \"nextGroupSlot\";\n\n var slot = this[method](selection.start, selection.groupIndex, false);\n\n if (slot) {\n selection.groupIndex += previous ? -1 : 1;\n }\n\n this._groupedView._changeGroup(selection, previous, slot);\n return slot;\n },\n\n prevGroupSlot: function(date, groupIndex, isDay) {\n var group = this.groups[groupIndex];\n var slot = group.ranges(date, date, isDay, false)[0].start;\n\n if (groupIndex <= 0) {\n return;\n }\n\n return this._groupedView._prevGroupSlot(slot, group, isDay);\n },\n\n nextGroupSlot: function(date, groupIndex, isDay) {\n var group = this.groups[groupIndex];\n var slot = group.ranges(date, date, isDay, false)[0].start;\n\n if (groupIndex >= this.groups.length - 1) {\n return;\n }\n\n return this._groupedView._nextGroupSlot(slot, group, isDay);\n },\n\n _verticalSlots: function(selection, ranges, multiple, reverse) {\n var groupedView = this._groupedView;\n var method = groupedView._verticalMethod(reverse, multiple);\n var startSlot = ranges[0].start;\n var endSlot = ranges[ranges.length - 1].end;\n var group = this.groups[selection.groupIndex];\n var slot = groupedView._normalizeVerticalSelection(selection, ranges, reverse, multiple);\n\n if (slot) {\n startSlot = endSlot = slot;\n }\n\n startSlot = group[method](startSlot);\n endSlot = group[method](endSlot);\n\n if (!multiple && this._isVerticallyGrouped() && (!startSlot || !endSlot)) {\n startSlot = endSlot = groupedView._verticalSlots(selection, reverse, slot);\n }\n\n return {\n startSlot: startSlot,\n endSlot: endSlot\n };\n },\n\n _horizontalSlots: function(selection, ranges, multiple, reverse) {\n var method = reverse ? \"upSlot\" : \"downSlot\";\n var startSlot = ranges[0].start;\n var endSlot = ranges[ranges.length - 1].end;\n var group = this.groups[selection.groupIndex];\n var result = {};\n\n if (!multiple) {\n result = this._groupedView._horizontalSlots(selection, group, method, startSlot, endSlot, multiple, reverse);\n } else {\n result.startSlot = group[method](startSlot);\n result.endSlot = group[method](endSlot);\n\n if (!multiple && this._isHorizontallyGrouped() && (!startSlot || !endSlot)) {\n result.startSlot = result.endSlot = this._changeGroup(selection, reverse);\n }\n }\n\n return result;\n },\n\n _changeViewPeriod: function(selection, reverse) {\n var date = reverse ? this.previousDate() : this.nextDate();\n var start = selection.start;\n var end = selection.end;\n var newStart, newEnd;\n\n newStart = new Date(date);\n newEnd = new Date(date);\n\n if (this._isInRange(newStart, newEnd)) {\n return false;\n }\n selection.start = newStart;\n selection.end = newEnd;\n\n if (this._isHorizontallyGrouped()) {\n selection.groupIndex = reverse ? this.groups.length - 1 : 0;\n }\n\n var duration = end - start;\n\n if (reverse) {\n end = getMilliseconds(this.endTime());\n end = end === 0 ? MS_PER_DAY : end;\n\n setTime(selection.start, end - duration);\n setTime(selection.end, end);\n } else {\n start = getMilliseconds(this.startTime());\n\n setTime(selection.start, start);\n setTime(selection.end, start + duration);\n }\n\n selection.events = [];\n\n return true;\n },\n\n move: function(selection, key, shift) {\n var handled = false;\n var group = this.groups[selection.groupIndex];\n var keys = kendo.keys;\n var groupedView = this._groupedView;\n var ranges = group.ranges(selection.start, selection.end, false, false);\n var startSlot, endSlot, reverse, slots;\n\n if (key === keys.DOWN || key === keys.UP) {\n handled = true;\n reverse = key === keys.UP;\n\n groupedView._updateDirection(selection, ranges, shift, reverse);\n\n slots = this._verticalSlots(selection, ranges, shift, reverse);\n\n if (groupedView._changeVerticalViewPeriod(slots, shift, selection, reverse)) {\n return handled;\n }\n } else if (key === keys.LEFT || key === keys.RIGHT) {\n handled = true;\n reverse = key === keys.LEFT;\n\n this._updateDirection(selection, ranges, shift, reverse, false);\n\n slots = this._horizontalSlots(selection, ranges, shift, reverse);\n\n if (groupedView._changeHorizontalViewPeriod(slots, shift, selection, reverse)) {\n return handled;\n }\n }\n\n if (handled) {\n startSlot = slots.startSlot;\n endSlot = slots.endSlot;\n\n if (shift) {\n var backward = selection.backward;\n\n if (backward && startSlot) {\n selection.start = startSlot.startDate();\n } else if (!backward && endSlot) {\n selection.end = endSlot.endDate();\n }\n } else if (startSlot && endSlot) {\n selection.start = startSlot.startDate();\n selection.end = endSlot.endDate();\n }\n\n selection.events = [];\n }\n\n return handled;\n },\n\n destroy: function() {\n var that = this;\n\n if (that.element) {\n that.element.off(NS);\n }\n\n if (that.footer) {\n that.footer.remove();\n }\n\n if (that._currentTimeUpdateTimer) {\n clearInterval(that._currentTimeUpdateTimer);\n }\n\n SchedulerView.fn.destroy.call(this);\n\n if (this._isMobile() && that.options.editable) {\n if (that.options.editable.create !== false) {\n that._addUserEvents.destroy();\n }\n\n if (that.options.editable.update !== false) {\n that._editUserEvents.destroy();\n }\n }\n },\n\n _resourceBySlot: function(slot) {\n var resources = this.groupedResources;\n var result = {},\n groupOptions = this.options.group;\n\n if (resources.length && groupOptions.orientation === \"horizontal\" && groupOptions.date) {\n var resourceIndex = slot.groupIndex,\n levels = this.columnLevels,\n groupLevel = levels[levels.length - 1],\n resource = resources[resources.length - 1],\n groupLevelMember = groupLevel[resourceIndex],\n passedChildren, numberOfChildren, j, i;\n\n this._setResourceValue(groupLevelMember, resource, result);\n\n for (j = levels.length - 2; j >= 3; j--) {\n groupLevel = levels[j];\n resource = resources[j - 3];\n passedChildren = 0;\n\n for (i = 0; i < groupLevel.length; i++) {\n groupLevelMember = groupLevel[i];\n numberOfChildren = groupLevelMember.columns.length;\n\n if (numberOfChildren > resourceIndex - passedChildren) {\n this._setResourceValue(groupLevelMember, resource, result);\n\n i = groupLevel.length;\n } else {\n passedChildren += numberOfChildren;\n }\n }\n }\n\n return result;\n } else {\n return SchedulerView.fn._resourceBySlot.call(this, slot);\n }\n }\n });\n\n extend(true, ui, {\n TimelineView: TimelineView,\n TimelineWeekView: TimelineView.extend({\n options: {\n name: \"TimelineWeekView\",\n title: \"Timeline Week\",\n selectedDateFormat: \"{0:D} - {1:D}\",\n selectedShortDateFormat: \"{0:d} - {1:d}\",\n selectedMobileDateFormat: \"{0:MMM dd} - {1:dd}\",\n majorTick: 120\n },\n name: \"timelineWeek\",\n calculateDateRange: function() {\n var selectedDate = this.options.date,\n start = kendo.date.dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1),\n idx, length,\n dates = [];\n\n for (idx = 0, length = 7; idx < length; idx++) {\n dates.push(start);\n start = kendo.date.nextDay(start);\n }\n this._render(dates);\n }\n }),\n TimelineWorkWeekView: TimelineView.extend({\n options: {\n name: \"TimelineWorkWeekView\",\n title: \"Timeline Work Week\",\n selectedDateFormat: \"{0:D} - {1:D}\",\n selectedShortDateFormat: \"{0:d} - {1:d}\",\n selectedMobileDateFormat: \"{0:MMM dd} - {1:dd}\",\n majorTick: 120\n },\n name: \"timelineWorkWeek\",\n nextDate: function() {\n var weekStart = kendo.date.dayOfWeek(kendo.date.nextDay(this.endDate()), this.calendarInfo().firstDay, 1);\n\n return kendo.date.addDays(weekStart, this._workDays[0]);\n },\n previousDate: function() {\n var weekStart = kendo.date.dayOfWeek(this.startDate(), this.calendarInfo().firstDay, -1);\n var workDays = this._workDays;\n\n return kendo.date.addDays(weekStart, workDays[workDays.length - 1] - 7);\n },\n calculateDateRange: function() {\n var options = this.options,\n selectedDate = options.date,\n dayOfWeek = kendo.date.dayOfWeek,\n weekStart = dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1),\n start = dayOfWeek(weekStart, options.workWeekStart, 1),\n end = dayOfWeek(start, options.workWeekEnd, 1),\n dates = [],\n workDays = (options.workDays && options.workDays.length) ? options.workDays.map(function(day) {\n return dayOfWeek(weekStart, day, 1).getTime();\n }) : null;\n\n if (workDays) {\n start = weekStart;\n end = dayOfWeek(start, this.calendarInfo().firstDay + 6, 1);\n }\n\n while (start <= end) {\n if (workDays && workDays.indexOf(start.getTime()) > -1) {\n dates.push(start);\n } else if (!workDays) {\n dates.push(start);\n }\n\n start = kendo.date.nextDay(start);\n }\n\n this._render(dates);\n }\n }),\n TimelineMonthView: TimelineView.extend({\n options: {\n name: \"TimelineMonthView\",\n title: \"Timeline Month\",\n selectedDateFormat: \"{0:D} - {1:D}\",\n selectedShortDateFormat: \"{0:d} - {1:d}\",\n workDayStart: new Date(1980, 1, 1, 0, 0, 0),\n workDayEnd: new Date(1980, 1, 1, 23, 59, 59),\n footer: false,\n majorTick: 1440,\n minorTickCount: 1\n },\n name: \"timelineMonth\",\n calculateDateRange: function() {\n var selectedDate = this.options.date,\n start = kendo.date.firstDayOfMonth(selectedDate),\n end = kendo.date.lastDayOfMonth(selectedDate),\n idx, length,\n dates = [];\n\n for (idx = 0, length = end.getDate(); idx < length; idx++) {\n dates.push(start);\n start = kendo.date.nextDay(start);\n }\n this._render(dates);\n }\n })\n });\n\n })(window.kendo.jQuery);\n\n}));\n"]}