{"version":3,"file":"kendo.scheduler.view.min.js","names":["factory","define","amd","kendo","ui","scheduler","$","window","getDate","date","Widget","outerHeight","_outerHeight","keys","NS","math","Math","SPACE","levels","values","key","result","collect","depth","level","idx","length","push","table","tableRows","className","trim","join","scrollbarWidth","ResourceView","Class","extend","init","index","isRtl","enforceAllDaySlot","this","_index","_timeSlotCollections","_daySlotCollections","_isRtl","_enforceAllDaySlot","addTimeSlotCollection","startDate","endDate","_addCollection","addDaySlotCollection","collections","collection","SlotCollection","timeSlotCollectionCount","daySlotCollectionCount","daySlotByPosition","x","y","byDate","_slotByPosition","timeSlotByPosition","collectionIndex","slotIndex","count","nextSlot","slot","at","width","offsetWidth","height","offsetHeight","horizontalEnd","offsetLeft","verticalEnd","offsetTop","refresh","timeSlotRanges","startTime","endTime","firstIndex","lastIndex","start","_startSlot","inRange","end","_endSlot","MS_PER_DAY","first","last","_continuousRange","TimeSlotRange","daySlotRanges","isAllDay","DaySlotRange","range","startSlot","endSlot","startIndex","endIndex","ranges","head","tail","slotRanges","event","isDay","_startTime","toUtcTime","_endTime","undefined","isMultiDay","_startCollection","startInRange","_endCollection","endInRange","_getCollections","continuousSlot","reverse","pad","isDaySlot","firstSlot","lastSlot","upSlot","keepCollection","groupByDateVertically","that","_verticalSlot","downSlot","leftSlot","_horizontalSlot","rightSlot","step","swapCollection","_collection","multiday","time","_start","slotByStartDate","slotByEndDate","getSlotCollection","getTimeSlotCollection","getDaySlotCollection","SlotRange","options","innerHeight","events","addEvent","outerRect","snap","_rect","property","top","bottom","left","right","support","element","startOffset","startSlotDuration","endOffset","endSlotDuration","round","innerRect","innerWidth","groupIndex","_slots","_events","_end","_groupIndex","_collectionIndex","allday","addTimeSlot","isHorizontal","TimeSlot","addDaySlot","eventCount","DaySlot","Slot","clientWidth","clientHeight","timezone","toLocalDate","fn","apply","arguments","offsetX","rtl","offset","difference","duration","floor","children","firstChild","firstChildHeight","firstChildTop","Date","rangeIndex","eventElement","SchedulerView","call","_normalizeOptions","_scrollbar","scrollbar","_resizeHint","_moveHint","_cellId","guid","_resourcesForGroups","_selectedSlots","attr","messages","ariaEventLabel","on","to","allDay","prefix","visibleEndDate","setMilliseconds","workDayStart","workDayEnd","_isMobile","mobile","mobileOS","_addResourceView","resourceView","groups","dateForTitle","format","selectedDateFormat","shortDateForTitle","selectedShortDateFormat","mobileDateForTitle","selectedMobileDateFormat","_changeGroup","selection","previous","_isGroupedByDate","_changeDate","group","_changeGroupContinuously","_changeViewPeriod","_isInRange","newStart","newEnd","min","max","_horizontalSlots","multiple","method","horizontalRange","isVertical","_isVerticallyGrouped","_normalizeHorizontalSelection","tempSlot","_getNextHorizontalRange","_continuousSlot","_verticalSlots","verticalRange","_normalizeVerticalSelection","_getNextVerticalRange","_footer","html","today","footer","appendTo","e","preventDefault","currentDate","timezoneOffset","convert","getTimezoneOffset","trigger","view","name","action","constrainSelection","move","shift","handled","verticalByDate","slots","DOWN","UP","_updateDirection","LEFT","RIGHT","backward","moveToEventInGroup","selectedEvents","prev","i","lastSelected","_continuousEvents","uid","inArray","moveToEvent","allEvents","_getAllEvents","uniqueAllEvents","_getUniqueEvents","sortedEvents","_getSortedEvents","eventIndex","_getNextEventIndexBySlot","_getStartIdx","_getSelectedSlot","current","candidate","_current","content","has","_scrollTo","select","clearSelection","_selectEvents","_selectSlots","tempIndex","slotStartDate","eventStartDate","getTime","selectedEventIndex","each","concat","exists","j","sort","second","firstStartDate","secondStartDate","cell","replace","selectedStateRegExp","groupEvent","found","groupEvents","add","indexOf","addClass","addDays","_resourceValue","resource","item","valuePrimitive","getter","dataValueField","_setResourceValue","groupLevelMember","value","setter","field","_resourceBySlot","resources","groupedResources","passedChildren","numberOfChildren","resourceIndex","groupOptions","nestedMember","orientation","rowLevels","columnLevels","dateGroupCompensation","groupLevel","_createResizeHint","css","_removeResizeHint","remove","_removeMoveHint","filter","container","elementOffset","elementOffsetDir","containerScroll","scrollTop","containerOffsetDir","bottomDistance","_inverseEventColor","eventColor","eventColorIsDark","Color","isDark","eventBackground","_eventTmpl","template","wrapper","settings","Template","templateSettings","paramName","type","state","storage","tmpl","bind","eventResources","data","dataSource","eventResource","dataIndex","get","resourceColor","dataColorField","title","text","dataTextField","color","createLayout","layout","allDayIndex","rows","allDaySlot","splice","_isVirtualized","_trimRowLevels","rowCount","find","append","_topSection","_bottomSection","_updateDomRowLevels","_groupOrientation","_outerWidth","_scroller","virtual","levelMarker","lastGroup","cachedRowLevels","_hasContentToRender","stopAtLevel","parentLevel","parentValue","rowLevelIndex","stop","createNextLayout","trimmedRowLevels","clone","_height","_times","rowSpan","parseInt","_virtualContent","render","_cachedEvents","_tryRenderContent","bufferHeight","groupCells","times","_rowLevelIndices","toArray","map","refreshLayout","toolbar","headerHeight","paddingDirection","eq","datesHeader","timesHeader","datesHeaderRows","el","initialHeight","contentDiv","kineticScrollNeeded","style","timesTable","removeClass","thElm","columnLevelCount","_datesHeader","dateGroup","closest","wrap","parent","scrollLeft","touchScroller","avoidScrolling","target","movable","_touchScroller","scrollElement","sender","groupIdx","groupLength","_createDateLayout","dates","inner","createDateLayoutConfiguration","_createColumnsLayout","createLayoutConfiguration","_createRowsLayout","selectionByElement","removeAttr","destroy","calendarInfo","getCulture","calendars","standard","prevGroupSlot","nextGroupSlot","_eventOptionsForMove","_updateEventForResize","_updateEventForSelection","_innerElements","countInner","innerCollection","innerSpan","innerEls","isMobile","rowIndex","Array","split","rowHeaderRows","rowsBefore","currentRow","rowspan","columnIndex","dateTableRows","columnLevelIndex","th","column","colspan","allDayTableRows","lastLevel","td","cellContent","_formatEventAriaLabel","labelText","labelMessages","sameDate","toString","re","processor","parts","channels","formats","resolveColor","process","exec","r","g","b","normalizeByte","_createColumns","eventElements","columns","eventRange","columnLength","endOverlaps","configuration","obj","minorTicks","itemParentValue","dataParentValueField","htmlEncode","slice","prototype","charAt","substr","toLowerCase","namedColors","isNaN","percBrightness","sqrt","aqua","azure","beige","black","blue","brown","coral","cyan","darkblue","darkcyan","darkgray","darkgreen","darkorange","darkred","dimgray","fuchsia","gold","goldenrod","gray","green","greenyellow","indigo","ivory","khaki","lightblue","lightgrey","lightgreen","lightpink","lightyellow","lime","limegreen","linen","magenta","maroon","mediumblue","navy","olive","orange","orangered","orchid","pink","plum","purple","red","royalblue","salmon","silver","skyblue","slateblue","slategray","snow","steelblue","tan","teal","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","createColumns","createRows","collidingEvents","elements","slotStart","slotEnd","eventsForSlot","groupEqFilter","isArray","ObservableArray","jQuery"],"sources":["kendo.scheduler.view.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"scheduler.view\",\n name: \"Scheduler View\",\n category: \"web\",\n description: \"The Scheduler Common View\",\n depends: [ \"core\" ],\n hidden: true\n };\n kendo.ui.scheduler = {};\n\n (function($) {\n var kendo = window.kendo,\n ui = kendo.ui,\n getDate = kendo.date.getDate,\n Widget = ui.Widget,\n outerHeight = kendo._outerHeight,\n keys = kendo.keys,\n NS = \".kendoSchedulerView\",\n INVERSE_COLOR_CLASS = \"k-event-inverse\",\n MIN_HORIZONTAL_SCROLL_SIZE = 1024,\n math = Math,\n SPACE = \" \";\n\n function levels(values, key) {\n var result = [];\n\n function collect(depth, values) {\n values = values[key];\n\n if (values) {\n var level = result[depth] = result[depth] || [];\n\n for (var idx = 0; idx < values.length; idx++) {\n level.push(values[idx]);\n collect(depth + 1, values[idx]);\n }\n }\n }\n\n collect(0, values);\n\n return result;\n }\n\n function table(tableRows, className) {\n if (!tableRows.length) {\n return \"\";\n }\n\n return '' +\n '' +\n tableRows.join(\"\") +\n '' +\n '
';\n }\n\n function allDayTable(tableRows, className) {\n if (!tableRows.length) {\n return \"\";\n }\n\n return \"
\" + table(tableRows, className) + \"
\";\n }\n\n function timesHeader(columnLevelCount, allDaySlot, rowCount) {\n var tableRows = [];\n\n if (rowCount > 0) {\n for (var idx = 0; idx < columnLevelCount; idx++) {\n tableRows.push(\"​\");\n }\n }\n\n if (allDaySlot) {\n tableRows.push('' + allDaySlot.text + '');\n }\n\n if (rowCount < 1) {\n return $();\n }\n\n return $('
' + table(tableRows) + '
');\n }\n\n function content() {\n return $(\n '
' +\n '
' +\n '
'\n );\n }\n var HINT = '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n\n\n var ResourceView = kendo.Class.extend({\n init: function(index, isRtl, enforceAllDaySlot) {\n this._index = index;\n this._timeSlotCollections = [];\n this._daySlotCollections = [];\n this._isRtl = isRtl;\n this._enforceAllDaySlot = enforceAllDaySlot;\n },\n\n addTimeSlotCollection: function(startDate, endDate) {\n return this._addCollection(startDate, endDate, this._timeSlotCollections);\n },\n\n addDaySlotCollection: function(startDate, endDate) {\n return this._addCollection(startDate, endDate, this._daySlotCollections);\n },\n\n _addCollection: function(startDate, endDate, collections) {\n var collection = new SlotCollection(startDate, endDate, this._index, collections.length);\n\n collections.push(collection);\n\n return collection;\n },\n\n timeSlotCollectionCount: function() {\n return this._timeSlotCollections.length;\n },\n\n daySlotCollectionCount: function() {\n return this._daySlotCollections.length;\n },\n\n daySlotByPosition: function(x, y, byDate) {\n return this._slotByPosition(x, y, this._daySlotCollections, byDate);\n },\n\n timeSlotByPosition: function(x, y, byDate) {\n return this._slotByPosition(x, y, this._timeSlotCollections, byDate);\n },\n\n _slotByPosition: function(x, y, collections, byDate) {\n for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n var collection = collections[collectionIndex];\n\n for (var slotIndex = 0; slotIndex < collection.count(); slotIndex++) {\n var slot = collection.at(slotIndex);\n var width = slot.offsetWidth;\n var height = slot.offsetHeight;\n var nextSlot;\n\n var horizontalEnd = slot.offsetLeft + width;\n var verticalEnd = slot.offsetTop + height;\n\n if (!byDate) {\n nextSlot = collection.at(slotIndex + 1);\n }\n\n if (nextSlot) {\n if (nextSlot.offsetLeft != slot.offsetLeft) {\n if (this._isRtl) {\n horizontalEnd = slot.offsetLeft + (slot.offsetLeft - nextSlot.offsetLeft);\n } else {\n horizontalEnd = nextSlot.offsetLeft;\n }\n } else {\n verticalEnd = nextSlot.offsetTop;\n }\n }\n\n if (x >= slot.offsetLeft && x < horizontalEnd &&\n y >= slot.offsetTop && y < verticalEnd) {\n return slot;\n }\n }\n }\n },\n\n refresh: function() {\n var collectionIndex;\n\n for (collectionIndex = 0; collectionIndex < this._daySlotCollections.length; collectionIndex++) {\n this._daySlotCollections[collectionIndex].refresh();\n }\n\n for (collectionIndex = 0; collectionIndex < this._timeSlotCollections.length; collectionIndex++) {\n this._timeSlotCollections[collectionIndex].refresh();\n }\n },\n\n timeSlotRanges: function(startTime, endTime) {\n var collections = this._timeSlotCollections;\n var start = this._startSlot(startTime, collections);\n var firstIndex, lastIndex;\n\n if (!start.inRange && startTime >= start.slot.end) {\n firstIndex = start.slot.collectionIndex + 1;\n start = null;\n }\n\n var end = start;\n\n if (startTime < endTime) {\n end = this._endSlot(endTime, collections);\n }\n\n if (end && !end.inRange && endTime <= end.slot.start) {\n lastIndex = end.slot.collectionIndex;\n\n if (endTime === end.slot.start && ((start && lastIndex > start.slot.collectionIndex) || (lastIndex > firstIndex))) {\n lastIndex -= 1;\n }\n\n end = null;\n }\n\n if (start === null && end === null) {\n if (endTime - startTime < kendo.date.MS_PER_DAY) {\n return [];\n } else {\n start = {\n inRange: true,\n slot: collections[firstIndex].first()\n };\n\n end = {\n inRange: true,\n slot: collections[lastIndex].last()\n };\n }\n }\n\n if (start === null) {\n if (end.slot.end <= startTime) {\n return [];\n }\n\n start = {\n inRange: true,\n slot: (collections[firstIndex] || collections[end.slot.collectionIndex]).first()\n };\n }\n\n if (end === null) {\n if (start.slot.start >= endTime) {\n return [];\n }\n\n end = {\n inRange: true,\n slot: (collections[lastIndex] || collections[start.slot.collectionIndex]).last()\n };\n }\n\n return this._continuousRange(TimeSlotRange, collections, start, end);\n },\n\n daySlotRanges: function(startTime, endTime, isAllDay) {\n var collections = this._daySlotCollections;\n\n var start = this._startSlot(startTime, collections, isAllDay);\n\n if (!start.inRange && startTime >= start.slot.end) {\n start = null;\n }\n\n var end = start;\n\n if (startTime < endTime) {\n end = this._endSlot(endTime, collections, isAllDay);\n }\n\n if (end && !end.inRange && endTime <= end.slot.start) {\n end = null;\n }\n\n if (start === null && end === null) {\n return [];\n }\n\n if (start === null) {\n if (end.slot.end <= startTime) {\n return [];\n }\n\n do {\n startTime += kendo.date.MS_PER_DAY;\n start = this._startSlot(startTime, collections, isAllDay);\n } while (!start.inRange && startTime >= start.slot.end);\n }\n\n if (end === null) {\n if (start.slot.start >= endTime) {\n return [];\n }\n\n do {\n endTime -= kendo.date.MS_PER_DAY;\n end = this._endSlot(endTime, collections, isAllDay);\n } while (!end.inRange && endTime <= end.slot.start);\n }\n\n return this._continuousRange(DaySlotRange, collections, start, end);\n },\n\n _continuousRange: function(range, collections, start, end) {\n var startSlot = start.slot;\n var endSlot = end.slot;\n\n var startIndex = startSlot.collectionIndex;\n var endIndex = endSlot.collectionIndex;\n\n var ranges = [];\n\n for (var collectionIndex = startIndex; collectionIndex <= endIndex; collectionIndex++) {\n var collection = collections[collectionIndex];\n\n var first = collection.first();\n var last = collection.last();\n var head = false;\n var tail = false;\n\n if (collectionIndex == startIndex) {\n tail = !start.inRange;\n }\n\n if (collectionIndex == endIndex) {\n head = !end.inRange;\n }\n\n if (first.start < startSlot.start) {\n first = startSlot;\n }\n\n if (last.start > endSlot.start) {\n last = endSlot;\n }\n\n if (startIndex < endIndex) {\n if (collectionIndex == startIndex) {\n head = true;\n } else if (collectionIndex == endIndex) {\n tail = true;\n } else {\n head = tail = true;\n }\n }\n\n ranges.push(new range({\n start: first,\n end: last,\n collection: collection,\n head: head,\n tail: tail\n }));\n }\n\n return ranges;\n },\n\n slotRanges: function(event, isDay) {\n var startTime = event._startTime || kendo.date.toUtcTime(event.start);\n var endTime = event._endTime || kendo.date.toUtcTime(event.end);\n\n if (isDay === undefined) {\n if (this._enforceAllDaySlot) {\n isDay = event.isMultiDay();\n } else {\n isDay = event.isAllDay;\n }\n }\n\n if (isDay) {\n return this.daySlotRanges(startTime, endTime, event.isAllDay);\n }\n\n return this.timeSlotRanges(startTime, endTime);\n },\n\n ranges: function(startTime, endTime, isDay, isAllDay) {\n if (typeof startTime != \"number\") {\n startTime = kendo.date.toUtcTime(startTime);\n }\n\n if (typeof endTime != \"number\") {\n endTime = kendo.date.toUtcTime(endTime);\n }\n\n if (isDay) {\n return this.daySlotRanges(startTime, endTime, isAllDay);\n }\n\n return this.timeSlotRanges(startTime, endTime);\n },\n\n _startCollection: function(date, collections) {\n for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n var collection = collections[collectionIndex];\n\n if (collection.startInRange(date)) {\n return collection;\n }\n }\n\n return null;\n },\n\n _endCollection: function(date, collections, isAllDay) {\n for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n var collection = collections[collectionIndex];\n\n if (collection.endInRange(date, isAllDay)) {\n return collection;\n }\n }\n\n return null;\n },\n\n _getCollections: function(isDay) {\n return isDay ? this._daySlotCollections : this._timeSlotCollections;\n },\n\n continuousSlot: function(slot, reverse) {\n var pad = reverse ? -1 : 1;\n var collections = this._getCollections(slot.isDaySlot);\n var collection = collections[slot.collectionIndex + pad];\n\n return collection ? collection[reverse ? \"last\" : \"first\"]() : undefined;\n },\n\n firstSlot: function() {\n var collections = this._getCollections(this.daySlotCollectionCount());\n\n return collections[0].first();\n },\n\n lastSlot: function() {\n var collections = this._getCollections(this.daySlotCollectionCount());\n\n return collections[collections.length - 1].last();\n },\n\n upSlot: function(slot, keepCollection, groupByDateVertically) {\n var that = this;\n var moveToDaySlot = function(isDaySlot, collectionIndex, index) {\n var isFirstCell = index === 0;\n\n if (!keepCollection && !isDaySlot && isFirstCell && that.daySlotCollectionCount()) {\n return that._daySlotCollections[0].at(collectionIndex);\n }\n };\n\n if (!this.timeSlotCollectionCount()) {\n keepCollection = true;\n }\n\n return this._verticalSlot(slot, -1, moveToDaySlot, groupByDateVertically);\n },\n\n downSlot: function(slot, keepCollection, groupByDateVertically) {\n var that = this;\n var moveToTimeSlot = function(isDaySlot, collectionIndex, index) {\n if (!keepCollection && isDaySlot && that.timeSlotCollectionCount()) {\n return that._timeSlotCollections[index].at(0);\n }\n };\n\n if (!this.timeSlotCollectionCount()) {\n keepCollection = true;\n }\n\n return this._verticalSlot(slot, 1, moveToTimeSlot, groupByDateVertically);\n },\n\n leftSlot: function(slot, groupByDateVertically) {\n return this._horizontalSlot(slot, -1, groupByDateVertically);\n },\n\n rightSlot: function(slot, groupByDateVertically) {\n return this._horizontalSlot(slot, 1, groupByDateVertically);\n },\n\n _horizontalSlot: function(slot, step, groupByDateVertically) {\n var index = slot.index;\n var isDaySlot = slot.isDaySlot;\n var collectionIndex = slot.collectionIndex;\n var collections = this._getCollections(isDaySlot);\n\n isDaySlot = groupByDateVertically ? false : isDaySlot;\n\n if (isDaySlot) {\n index += step;\n } else {\n collectionIndex += step;\n }\n\n var collection = collections[collectionIndex];\n\n return collection ? collection.at(index) : undefined;\n },\n\n _verticalSlot: function(slot, step, swapCollection, groupByDateVertically) {\n var index = slot.index;\n var isDaySlot = slot.isDaySlot;\n var collectionIndex = slot.collectionIndex;\n var collections = this._getCollections(isDaySlot);\n\n slot = swapCollection(isDaySlot, collectionIndex, index);\n if (slot) {\n return slot;\n }\n\n isDaySlot = groupByDateVertically ? false : isDaySlot;\n\n if (isDaySlot) {\n collectionIndex += step;\n } else {\n index += step;\n }\n\n var collection = collections[collectionIndex];\n\n return collection ? collection.at(index) : undefined;\n },\n\n _collection: function(index, multiday) {\n var collections = multiday ? this._daySlotCollections : this._timeSlotCollections;\n\n return collections[index];\n },\n\n _startSlot: function(time, collections, isAllDay) {\n var collection = this._startCollection(time, collections);\n var inRange = true;\n var index = 0;\n\n if (!collection) {\n collection = collections[index];\n\n while (index < collections.length - 1 && collection._start < time) {\n index++;\n collection = collections[index];\n }\n\n inRange = false;\n }\n\n var slot = collection.slotByStartDate(time, isAllDay);\n\n if (!slot) {\n slot = collection.first();\n inRange = false;\n }\n\n return {\n slot: slot,\n inRange: inRange\n };\n },\n\n _endSlot: function(time, collections, isAllDay) {\n var collection = this._endCollection(time, collections, isAllDay);\n var inRange = true;\n var index = collections.length - 1;\n\n if (!collection) {\n collection = collections[index];\n\n while (index > 0 && collection._start > time) {\n index--;\n collection = collections[index];\n }\n\n inRange = false;\n }\n\n var slot = collection.slotByEndDate(time, isAllDay);\n\n if (!slot) {\n if (time <= collection.first().start) {\n slot = collection.first();\n } else {\n slot = collection.last();\n }\n\n inRange = false;\n }\n\n return {\n slot: slot,\n inRange: inRange\n };\n },\n\n getSlotCollection: function(index, isDay) {\n return this[isDay ? \"getDaySlotCollection\" : \"getTimeSlotCollection\"](index);\n },\n\n getTimeSlotCollection: function(index) {\n return this._timeSlotCollections[index];\n },\n\n getDaySlotCollection: function(index) {\n return this._daySlotCollections[index];\n }\n });\n\n var SlotRange = kendo.Class.extend({\n init: function(options) {\n $.extend(this, options);\n },\n\n innerHeight: function() {\n var collection = this.collection;\n\n var startIndex = this.start.index;\n\n var endIndex = this.end.index;\n\n var result = 0;\n\n for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n result += collection.at(slotIndex).offsetHeight;\n }\n\n return result;\n },\n\n events: function() {\n return this.collection.events();\n },\n\n addEvent: function(event) {\n this.events().push(event);\n },\n\n startSlot: function() {\n if (this.start.offsetLeft > this.end.offsetLeft) {\n return this.end;\n }\n return this.start;\n },\n\n endSlot: function() {\n if (this.start.offsetLeft > this.end.offsetLeft) {\n return this.start;\n }\n return this.end;\n }\n });\n\n var TimeSlotRange = SlotRange.extend({\n innerHeight: function() {\n var collection = this.collection;\n\n var startIndex = this.start.index;\n\n var endIndex = this.end.index;\n\n var result = 0;\n\n for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n result += collection.at(slotIndex).offsetHeight;\n }\n\n return result;\n },\n\n outerRect: function(start, end, snap) {\n return this._rect(\"offset\", start, end, snap);\n },\n\n _rect: function(property, start, end, snap) {\n var top;\n var bottom;\n var left;\n var right;\n var startSlot = this.start;\n var endSlot = this.end;\n var isRtl = kendo.support.isRtl(startSlot.element);\n\n if (typeof start != \"number\") {\n start = kendo.date.toUtcTime(start);\n }\n\n if (typeof end != \"number\") {\n end = kendo.date.toUtcTime(end);\n }\n\n if (snap) {\n top = startSlot.offsetTop;\n bottom = endSlot.offsetTop + endSlot[property + \"Height\"];\n if (isRtl) {\n left = endSlot.offsetLeft;\n right = startSlot.offsetLeft + startSlot[property + \"Width\"];\n } else {\n left = startSlot.offsetLeft;\n right = endSlot.offsetLeft + endSlot[property + \"Width\"];\n }\n } else {\n var startOffset = start - startSlot.start;\n\n if (startOffset < 0) {\n startOffset = 0;\n }\n\n var startSlotDuration = startSlot.end - startSlot.start;\n\n top = startSlot.offsetTop + startSlot[property + \"Height\"] * startOffset / startSlotDuration;\n\n var endOffset = endSlot.end - end;\n\n if (endOffset < 0) {\n endOffset = 0;\n }\n\n var endSlotDuration = endSlot.end - endSlot.start;\n\n bottom = endSlot.offsetTop + endSlot[property + \"Height\"] - endSlot[property + \"Height\"] * endOffset / endSlotDuration;\n\n if (isRtl) {\n left = Math.round(endSlot.offsetLeft + endSlot[property + \"Width\"] * endOffset / endSlotDuration);\n right = Math.round(startSlot.offsetLeft + startSlot[property + \"Width\"] - startSlot[property + \"Width\"] * startOffset / startSlotDuration);\n } else {\n left = Math.round(startSlot.offsetLeft + startSlot[property + \"Width\"] * startOffset / startSlotDuration);\n right = Math.round(endSlot.offsetLeft + endSlot[property + \"Width\"] - endSlot[property + \"Width\"] * endOffset / endSlotDuration);\n }\n }\n\n return {\n top: top,\n bottom: bottom,\n //first column has no left border\n left: left === 0 ? left : left + 1,\n right: right\n };\n },\n\n innerRect: function(start, end, snap) {\n return this._rect(\"client\", start, end, snap);\n }\n });\n\n var DaySlotRange = SlotRange.extend({\n innerWidth: function() {\n var collection = this.collection;\n\n var startIndex = this.start.index;\n\n var endIndex = this.end.index;\n\n var result = 0;\n\n var width = startIndex !== endIndex ? \"offsetWidth\" : \"clientWidth\";\n\n for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n result += collection.at(slotIndex)[width];\n }\n\n return result;\n }\n });\n\n var SlotCollection = kendo.Class.extend({\n init: function(startDate, endDate, groupIndex, collectionIndex) {\n this._slots = [];\n\n this._events = [];\n\n this._start = kendo.date.toUtcTime(startDate);\n\n this._end = kendo.date.toUtcTime(endDate);\n\n this._groupIndex = groupIndex;\n\n this._collectionIndex = collectionIndex;\n },\n refresh: function() {\n for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n this._slots[slotIndex].refresh();\n }\n },\n\n startInRange: function(date) {\n return this._start <= date && date < this._end;\n },\n\n endInRange: function(date, isAllDay) {\n var end = isAllDay ? date < this._end : date <= this._end;\n return this._start <= date && end;\n },\n\n slotByStartDate: function(date) {\n var time = date;\n\n if (typeof time != \"number\") {\n time = kendo.date.toUtcTime(date);\n }\n\n for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n var slot = this._slots[slotIndex];\n\n if (slot.startInRange(time)) {\n return slot;\n }\n }\n\n return null;\n },\n\n slotByEndDate: function(date, allday) {\n var time = date;\n\n if (typeof time != \"number\") {\n time = kendo.date.toUtcTime(date);\n }\n\n if (allday) {\n return this.slotByStartDate(date, false);\n }\n\n for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n var slot = this._slots[slotIndex];\n\n if (slot.endInRange(time)) {\n return slot;\n }\n }\n\n return null;\n },\n\n count: function() {\n return this._slots.length;\n },\n events: function() {\n return this._events;\n },\n addTimeSlot: function(element, start, end, isHorizontal) {\n var slot = new TimeSlot(element, start, end, this._groupIndex, this._collectionIndex, this._slots.length, isHorizontal);\n\n this._slots.push(slot);\n },\n addDaySlot: function(element, start, end, eventCount) {\n var slot = new DaySlot(element, start, end, this._groupIndex, this._collectionIndex, this._slots.length, eventCount);\n\n this._slots.push(slot);\n },\n first: function() {\n return this._slots[0];\n },\n last: function() {\n return this._slots[this._slots.length - 1];\n },\n at: function(index) {\n return this._slots[index];\n }\n });\n\n var Slot = kendo.Class.extend({\n init: function(element, start, end, groupIndex, collectionIndex, index) {\n this.element = element;\n this.clientWidth = element.clientWidth;\n this.clientHeight = element.clientHeight;\n this.offsetWidth = element.offsetWidth;\n this.offsetHeight = element.offsetHeight;\n this.offsetTop = element.offsetTop;\n this.offsetLeft = element.offsetLeft;\n\n this.start = start;\n this.end = end;\n this.element = element;\n this.groupIndex = groupIndex;\n this.collectionIndex = collectionIndex;\n this.index = index;\n this.isDaySlot = false;\n },\n\n refresh: function() {\n var element = this.element;\n\n this.clientWidth = element.clientWidth;\n this.clientHeight = element.clientHeight;\n this.offsetWidth = element.offsetWidth;\n this.offsetHeight = element.offsetHeight;\n this.offsetTop = element.offsetTop;\n this.offsetLeft = element.offsetLeft;\n },\n\n startDate: function() {\n return kendo.timezone.toLocalDate(this.start);\n },\n\n endDate: function() {\n return kendo.timezone.toLocalDate(this.end);\n },\n\n startInRange: function(date) {\n return this.start <= date && date < this.end;\n },\n\n endInRange: function(date) {\n return this.start < date && date <= this.end;\n },\n\n startOffset: function() {\n return this.start;\n },\n\n endOffset: function() {\n return this.end;\n }\n });\n\n var TimeSlot = Slot.extend({\n init: function(element, start, end, groupIndex, collectionIndex, index, isHorizontal) {\n Slot.fn.init.apply(this, arguments);\n\n this.isHorizontal = isHorizontal ? true : false;\n },\n\n offsetX: function(rtl, offset) {\n if (rtl) {\n return this.offsetLeft + offset;\n } else {\n return this.offsetLeft + offset;\n }\n },\n\n startInRange: function(date) {\n return this.start <= date && date < this.end;\n },\n\n endInRange: function(date) {\n return this.start < date && date <= this.end;\n },\n\n startOffset: function(x, y, snap) {\n if (snap) {\n return this.start;\n }\n\n var offset = $(this.element).offset();\n\n var duration = this.end - this.start;\n var difference;\n var time;\n\n if (this.isHorizontal) {\n //need update\n var isRtl = kendo.support.isRtl(this.element);\n difference = x - offset.left;\n time = Math.floor(duration * ( difference / this.offsetWidth));\n\n if (isRtl) {\n return this.start + duration - time;\n }\n } else {\n difference = y - offset.top;\n time = Math.floor(duration * ( difference / this.offsetHeight));\n }\n\n return this.start + time;\n },\n\n endOffset: function(x, y, snap) {\n if (snap) {\n return this.end;\n }\n\n var offset = $(this.element).offset();\n\n var duration = this.end - this.start;\n var difference;\n var time;\n\n if (this.isHorizontal) {\n //need update\n var isRtl = kendo.support.isRtl(this.element);\n difference = x - offset.left;\n time = Math.floor(duration * ( difference / this.offsetWidth));\n\n if (isRtl) {\n return this.start + duration - time;\n }\n } else {\n difference = y - offset.top;\n time = Math.floor(duration * ( difference / this.offsetHeight));\n }\n\n return this.start + time;\n }\n });\n\n var DaySlot = Slot.extend({\n init: function(element, start, end, groupIndex, collectionIndex, index, eventCount) {\n Slot.fn.init.apply(this, arguments);\n\n this.eventCount = eventCount;\n this.isDaySlot = true;\n\n if (this.element.children.length) {\n var firstChild = this.element.children[0];\n\n this.firstChildHeight = firstChild.offsetHeight;\n this.firstChildTop = firstChild.offsetTop;\n } else {\n this.firstChildHeight = 3;\n this.firstChildTop = 0;\n }\n },\n\n startDate: function() {\n var date = new Date(this.start);\n\n return kendo.timezone.apply(date, \"Etc/UTC\");\n },\n\n endDate: function() {\n var date = new Date(this.end);\n\n return kendo.timezone.apply(date, \"Etc/UTC\");\n },\n\n startInRange: function(date) {\n return this.start <= date && date < this.end;\n },\n\n endInRange: function(date) {\n return this.start < date && date <= this.end;\n }\n });\n\n var scrollbarWidth;\n function scrollbar() {\n scrollbarWidth = scrollbarWidth ? scrollbarWidth : kendo.support.scrollbar();\n return scrollbarWidth;\n }\n\n kendo.ui.SchedulerView = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, $.extend({}, this.options, options));\n\n this._normalizeOptions();\n this._scrollbar = scrollbar();\n this._isRtl = kendo.support.isRtl(element);\n this._resizeHint = $();\n this._moveHint = $();\n this._cellId = kendo.guid();\n this._resourcesForGroups();\n this._selectedSlots = [];\n this.element.attr(\"role\", \"application\");\n },\n\n options: {\n messages: {\n ariaEventLabel: {\n on: \"on\",\n at: \"at\",\n to: \"to\",\n allDay: \"(all day)\",\n prefix: \"\"\n }\n }\n },\n\n visibleEndDate: function() {\n return this.endDate();\n },\n\n _normalizeOptions: function() {\n var options = this.options;\n\n if (options.startTime) {\n options.startTime.setMilliseconds(0);\n }\n\n if (options.endTime) {\n options.endTime.setMilliseconds(0);\n }\n\n if (options.workDayStart) {\n options.workDayStart.setMilliseconds(0);\n }\n\n if (options.workDayEnd) {\n options.workDayEnd.setMilliseconds(0);\n }\n },\n\n _isMobile: function() {\n var options = this.options;\n return (options.mobile === true && kendo.support.mobileOS) || options.mobile === \"phone\" || options.mobile === \"tablet\";\n },\n\n _addResourceView: function() {\n var resourceView = new ResourceView(this.groups.length, this._isRtl, this.options.enforceAllDaySlot);\n\n this.groups.push(resourceView);\n\n return resourceView;\n },\n\n dateForTitle: function() {\n return kendo.format(this.options.selectedDateFormat, this.startDate(), this.endDate());\n },\n\n shortDateForTitle: function() {\n return kendo.format(this.options.selectedShortDateFormat, this.startDate(), this.endDate());\n },\n\n mobileDateForTitle: function() {\n return kendo.format(this.options.selectedMobileDateFormat || this.options.selectedShortDateFormat, this.startDate(), this.endDate());\n },\n\n _changeGroup: function(selection, previous) {\n var method = previous ? \"prevGroupSlot\" : \"nextGroupSlot\";\n var slot = this[method](selection.start, selection.groupIndex, selection.isAllDay);\n\n if (slot) {\n selection.groupIndex += previous ? -1 : 1;\n }\n\n if (this._isGroupedByDate() && !slot) {\n selection.groupIndex = previous ? this.groups.length - 1 : 0;\n }\n\n return slot;\n },\n\n _changeDate: function(selection, slot, previous) {\n var group = this.groups[selection.groupIndex];\n var collections, index;\n\n if (previous) {\n collections = group._getCollections(false);\n index = group.daySlotCollectionCount() ? slot.index - 1 : slot.collectionIndex - 1;\n\n if (index >= 0) {\n return collections[index]._slots[collections[index]._slots.length - 1];\n }\n } else {\n collections = group._getCollections(group.daySlotCollectionCount());\n index = group.daySlotCollectionCount() ? 0 : slot.collectionIndex + 1;\n var slotIndex = group.daySlotCollectionCount() ? slot.collectionIndex + 1 : 0;\n\n if (collections[index] && collections[index]._slots[slotIndex]) {\n return collections[index]._slots[slotIndex];\n }\n }\n },\n\n _changeGroupContinuously: function() {\n return null;\n },\n\n _changeViewPeriod: function() {\n return false;\n },\n\n _isInRange: function(newStart, newEnd) {\n if (!newStart || !newEnd || !this.options.min || !this.options.max) {\n return false;\n }\n return getDate(newStart) <= getDate(this.options.min) || getDate(newEnd) >= getDate(this.options.max);\n },\n\n _horizontalSlots: function(selection, ranges, multiple, reverse) {\n var method = reverse ? \"leftSlot\" : \"rightSlot\";\n var horizontalRange = {\n startSlot: ranges[0].start,\n endSlot: ranges[ranges.length - 1].end\n };\n var group = this.groups[selection.groupIndex];\n var isVertical = this._isVerticallyGrouped();\n\n if (!multiple) {\n var slot = this._normalizeHorizontalSelection(selection, ranges, reverse);\n if (slot) {\n horizontalRange.startSlot = horizontalRange.endSlot = slot;\n }\n }\n\n if (this._isGroupedByDate() && !multiple) {\n var tempSlot = this._changeGroup(selection, reverse);\n\n if (!tempSlot)\n {\n horizontalRange = this._getNextHorizontalRange(group, method, horizontalRange);\n } else {\n horizontalRange.startSlot = horizontalRange.endSlot = tempSlot;\n }\n } else {\n horizontalRange.startSlot = group[method](horizontalRange.startSlot);\n horizontalRange.endSlot = group[method](horizontalRange.endSlot);\n\n if (!multiple && !isVertical && (!horizontalRange.startSlot || !horizontalRange.endSlot)) {\n horizontalRange.startSlot = horizontalRange.endSlot = this._changeGroup(selection, reverse);\n }\n }\n\n var continuousSlot;\n\n if ((!horizontalRange.startSlot || !horizontalRange.endSlot) && !this._isGroupedByDate()) {\n continuousSlot = this._continuousSlot(selection, ranges, reverse);\n continuousSlot = this._changeGroupContinuously(selection, continuousSlot, multiple, reverse);\n\n if (continuousSlot) {\n horizontalRange.startSlot = horizontalRange.endSlot = continuousSlot;\n }\n }\n\n return horizontalRange;\n },\n\n _getNextHorizontalRange: function(group, method, horizontalRange) {\n if (!this._isVerticallyGrouped()) {\n horizontalRange.startSlot = group[method](horizontalRange.startSlot);\n horizontalRange.endSlot = group[method](horizontalRange.endSlot);\n }\n\n return horizontalRange;\n },\n\n _verticalSlots: function(selection, ranges, multiple, reverse) {\n var group = this.groups[selection.groupIndex];\n var slot;\n var verticalRange = {\n startSlot: ranges[0].start,\n endSlot: ranges[ranges.length - 1].end\n };\n\n if (!multiple) {\n slot = this._normalizeVerticalSelection(selection, ranges, reverse);\n if (slot) {\n verticalRange.startSlot = verticalRange.endSlot = slot;\n }\n }\n\n var method = reverse ? \"upSlot\" : \"downSlot\";\n\n verticalRange = this._getNextVerticalRange(group, method, verticalRange, multiple);\n\n if (!multiple && this._isVerticallyGrouped() && (!verticalRange.startSlot || !verticalRange.endSlot)) {\n if (this._isGroupedByDate()) {\n verticalRange.startSlot = verticalRange.endSlot = this._changeDate(selection, slot, reverse);\n\n } else {\n verticalRange.startSlot = verticalRange.endSlot = this._changeGroup(selection, reverse);\n }\n }\n\n return verticalRange;\n },\n\n _getNextVerticalRange: function(group, method, verticalRange, multiple) {\n verticalRange.startSlot = group[method](verticalRange.startSlot, multiple);\n verticalRange.endSlot = group[method](verticalRange.endSlot, multiple);\n\n return verticalRange;\n },\n\n _normalizeHorizontalSelection: function() {\n return null;\n },\n\n _normalizeVerticalSelection: function(selection, ranges, reverse) {\n var slot;\n\n if (reverse) {\n slot = ranges[0].start;\n } else {\n slot = ranges[ranges.length - 1].end;\n }\n\n return slot;\n },\n\n _continuousSlot: function() {\n return null;\n },\n\n _footer: function() {\n var that = this;\n var options = that.options;\n\n if (that._isMobile()) {\n var html = '\";\n that.footer = $(html).appendTo(that.element);\n }\n\n if (that.footer) {\n that.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 constrainSelection: function(selection) {\n var group = this.groups[0];\n var slot;\n\n if (!this.inRange(selection)) {\n slot = group.firstSlot();\n\n selection.isAllDay = slot.isDaySlot;\n selection.start = slot.startDate();\n selection.end = slot.endDate();\n } else {\n if (!group.daySlotCollectionCount()) {\n selection.isAllDay = false;\n } else if (!group.timeSlotCollectionCount()) {\n selection.isAllDay = true;\n }\n }\n\n if (!this.groups[selection.groupIndex]) {\n selection.groupIndex = 0;\n }\n },\n\n move: function(selection, key, shift) {\n var handled = false;\n var group = this.groups[selection.groupIndex];\n var verticalByDate = this._isGroupedByDate() && this._isVerticallyGrouped();\n\n if (!group.timeSlotCollectionCount()) {\n selection.isAllDay = true;\n }\n\n var ranges = group.ranges(selection.start, selection.end, selection.isAllDay, 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 this._updateDirection(selection, ranges, shift, reverse, true);\n\n slots = this._verticalSlots(selection, ranges, shift, reverse);\n\n if (!slots.startSlot && !shift && this._changeViewPeriod(selection, reverse, !verticalByDate)) {\n return handled;\n }\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 (!slots.startSlot && !shift && this._changeViewPeriod(selection, reverse, verticalByDate)) {\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 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.isAllDay = startSlot.isDaySlot;\n selection.start = startSlot.startDate();\n selection.end = endSlot.endDate();\n }\n\n selection.events = [];\n }\n\n return handled;\n },\n\n moveToEventInGroup: function(group, slot, selectedEvents, prev) {\n var events = group._continuousEvents || [];\n var found, event;\n var pad = prev ? -1 : 1;\n var length = events.length;\n var idx = prev ? length - 1 : 0;\n var i, lastSelected;\n\n if (selectedEvents.length) {\n lastSelected = selectedEvents[selectedEvents.length - 1];\n\n if (prev) {\n for (i = 0; i < events.length; i++) {\n if (events[i].uid === lastSelected) {\n idx = i + pad;\n }\n }\n } else {\n for (i = events.length - 1; i > -1; i--) {\n if (events[i].uid === lastSelected) {\n idx = i + pad;\n }\n }\n }\n }\n\n while (idx < length && idx > -1) {\n event = events[idx];\n\n if ( (!prev && event.start.startDate() >= slot.startDate()) ||\n (prev && event.start.startDate() <= slot.startDate()) ) {\n\n if (event && $.inArray(event.uid, selectedEvents) === -1) {\n found = !!event;\n break;\n }\n }\n\n idx += pad;\n }\n\n return event;\n },\n\n moveToEvent: function(selection, prev) {\n var groupIndex = selection.groupIndex;\n\n var group = this.groups[groupIndex];\n var slot = group.ranges(selection.start, selection.end, this.name === \"month\" || selection.isAllDay, false)[0].start;\n\n var length = this.groups.length;\n var pad = prev ? -1 : 1;\n var events = selection.events;\n var event;\n\n if (this._isGroupedByDate()) {\n var allEvents = this._getAllEvents();\n var uniqueAllEvents = this._getUniqueEvents(allEvents);\n var sortedEvents = this._getSortedEvents(uniqueAllEvents);\n\n if (events.length === 0) {\n var eventIndex = this._getNextEventIndexBySlot(slot, sortedEvents, groupIndex);\n\n if (prev) {\n eventIndex--;\n }\n\n event = sortedEvents[eventIndex];\n } else {\n var idx = this._getStartIdx(events, sortedEvents);\n\n while (idx < sortedEvents.length && idx > -1) {\n if (events.length > 0) {\n slot = this._getSelectedSlot(slot, sortedEvents, event, idx, pad, prev);\n }\n\n if (!slot) {\n break;\n }\n\n if ( (!prev && sortedEvents[idx].start.startDate() >= slot.startDate()) ||\n (prev && sortedEvents[idx].start.startDate() <= slot.startDate())) {\n if (events[0] != sortedEvents[idx].uid) {\n event = sortedEvents[idx];\n break;\n }\n }\n idx += pad;\n }\n }\n } else {\n while (groupIndex < length && groupIndex > -1) {\n event = this.moveToEventInGroup(group, slot, events, prev);\n\n groupIndex += pad;\n group = this.groups[groupIndex];\n\n if (!group || event) {\n break;\n }\n\n events = [];\n if (prev) {\n slot = group.lastSlot();\n } else {\n slot = group.firstSlot(true);\n }\n }\n }\n\n if (event) {\n selection.events = [ event.uid ];\n selection.start = event.start.startDate();\n selection.end = event.end.endDate();\n selection.isAllDay = event.start.isDaySlot;\n selection.groupIndex = event.start.groupIndex;\n selection.eventElement = event.element[0];\n }\n\n return !!event;\n },\n\n current: function(candidate) {\n if (candidate !== undefined) {\n this._current = candidate;\n if (this.content.has(candidate)) {\n this._scrollTo(candidate, this.content[0]);\n }\n } else {\n return this._current;\n }\n },\n\n select: function(selection) {\n this.clearSelection();\n\n if (!this._selectEvents(selection)) {\n this._selectSlots(selection);\n }\n },\n\n _getNextEventIndexBySlot: function(slot, sortedEvents, groupIndex) {\n var tempIndex = 0;\n var slotStartDate = kendo.date.getDate(slot.startDate());\n\n for (var i = 0; i < sortedEvents.length; i++) {\n var eventStartDate = kendo.date.getDate(sortedEvents[i].start.startDate());\n if (slotStartDate > eventStartDate) {\n tempIndex++;\n continue;\n }\n\n if (slotStartDate.getTime() === eventStartDate.getTime() && groupIndex > sortedEvents[i].start.groupIndex) {\n tempIndex++;\n continue;\n }\n\n if (slotStartDate.getTime() === eventStartDate.getTime() &&\n groupIndex >= sortedEvents[i].start.groupIndex &&\n slot.startDate() > sortedEvents[i].start.startDate()) {\n tempIndex++;\n continue;\n }\n\n break;\n }\n return tempIndex;\n },\n\n _getSelectedSlot: function(slot, sortedEvents, event, idx, pad, prev) {\n if (sortedEvents[idx + pad] &&\n sortedEvents[idx].start.groupIndex !== sortedEvents[idx + pad].start.groupIndex) {\n var groupIndex = sortedEvents[idx + pad].start.groupIndex;\n var group = this.groups[groupIndex];\n\n if (!group || event) {\n slot = null;\n }\n\n if (prev) {\n slot = group.lastSlot();\n } else {\n slot = group.firstSlot(true);\n }\n }\n return slot;\n },\n\n _getStartIdx: function(events, sortedEvents) {\n var selectedEventIndex = 0;\n\n $.each(sortedEvents, function() {\n if (this.uid === events[0]) {\n return false;\n }\n\n selectedEventIndex++;\n });\n\n return selectedEventIndex;\n },\n\n _getAllEvents: function() {\n var allEvents = [];\n var groups = this.groups;\n\n for (var idx = 0; idx < groups.length; idx++) {\n if (groups[idx]._continuousEvents) {\n allEvents = allEvents.concat(groups[idx]._continuousEvents);\n }\n }\n\n return allEvents;\n },\n\n _getUniqueEvents: function(allEvents) {\n var uniqueAllEvents = [];\n\n for (var i = 0; i < allEvents.length; i++) {\n var exists = false;\n for (var j = 0; j < uniqueAllEvents.length; j++) {\n if (allEvents[i].uid === uniqueAllEvents[j].uid) {\n exists = true;\n break;\n }\n }\n\n if (!exists) {\n uniqueAllEvents.push(allEvents[i]);\n }\n }\n\n return uniqueAllEvents;\n },\n\n _getSortedEvents: function(uniqueAllEvents) {\n return uniqueAllEvents.sort(function(first, second) {\n var firstStartDate = first.start.startDate();\n var secondStartDate = second.start.startDate();\n var result = kendo.date.getDate(firstStartDate) - kendo.date.getDate(secondStartDate);\n\n if (result === 0) {\n result = first.start.groupIndex - second.start.groupIndex;\n }\n\n if (result === 0) {\n result = firstStartDate.getTime() - secondStartDate.getTime();\n }\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.element).index() - $(second.element).index();\n }\n\n return result;\n });\n },\n\n _selectSlots: function(selection) {\n var isAllDay = selection.isAllDay;\n var group = this.groups[selection.groupIndex];\n\n if (!group.timeSlotCollectionCount()) {\n isAllDay = true;\n }\n\n this._selectedSlots = [];\n\n var ranges = group.ranges(selection.start, selection.end, isAllDay, false);\n var element;\n var slot;\n\n for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n var range = ranges[rangeIndex];\n var collection = range.collection;\n\n for (var slotIndex = range.start.index; slotIndex <= range.end.index; slotIndex++) {\n slot = collection.at(slotIndex);\n\n element = slot.element;\n addSelectedState(element);\n\n this._selectedSlots.push({\n start: slot.startDate(),\n end: slot.endDate(),\n element: element\n });\n }\n }\n\n if (selection.backward) {\n element = ranges[0].start.element;\n }\n\n this.current(element);\n },\n\n _selectEvents: function(selection) {\n var found = false;\n var events = selection.events;\n var groupEvents = this._getAllEvents();\n var idx, groupEvent, length = groupEvents.length;\n\n if (!events[0] || !groupEvents[0]) {\n return found;\n }\n\n var result = $();\n selection.events = [];\n for (idx = 0; idx < length; idx ++) {\n if ($.inArray(groupEvents[idx].uid, events) > -1) {\n groupEvent = groupEvents[idx];\n result = result.add(groupEvent.element);\n if (selection.events.indexOf(groupEvent.uid) === -1) {\n selection.events.push(groupEvent.uid);\n }\n }\n }\n\n if (result[0]) {\n result.addClass(\"k-selected\");\n\n if (selection.eventElement) {\n this.current(selection.eventElement);\n } else {\n this.current(result.last()[0]);\n }\n\n this._selectedSlots = [];\n found = true;\n }\n\n return found;\n },\n\n inRange: function(options) {\n var startDate = this.startDate();\n var endDate = kendo.date.addDays(this.endDate(), 1);\n var start = options.start;\n var end = options.end;\n\n return startDate <= start && start < endDate && startDate < end && end <= endDate;\n },\n\n _resourceValue: function(resource, item) {\n if (resource.valuePrimitive) {\n item = kendo.getter(resource.dataValueField)(item);\n }\n return item;\n },\n\n _setResourceValue: function(groupLevelMember, resource, result) {\n var value = groupLevelMember.value,\n setter;\n\n if (resource.multiple) {\n value = [value];\n }\n\n setter = kendo.setter(resource.field);\n setter(result, value);\n },\n\n _resourceBySlot: function(slot) {\n var resources = this.groupedResources;\n var result = {};\n\n if (resources.length) {\n var resourceIndex = slot.groupIndex,\n groupOptions = this.options.group,\n nestedMember = groupOptions.date || groupOptions.orientation === \"horizontal\" ? \"columns\" : \"rows\",\n levels = nestedMember === \"rows\" ? this.rowLevels : this.columnLevels,\n dateGroupCompensation = groupOptions.date && groupOptions.orientation === \"horizontal\" ? 1 : 0,\n groupLevel = levels[resources.length - 1 + dateGroupCompensation],\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 = resources.length - 2; j >= 0; j--) {\n groupLevel = levels[j + dateGroupCompensation];\n resource = resources[j];\n passedChildren = 0;\n\n for (i = 0; i < groupLevel.length; i++) {\n groupLevelMember = groupLevel[i];\n numberOfChildren = groupLevelMember[nestedMember].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\n return result;\n },\n\n _createResizeHint: function(left, top, width, height) {\n return $(HINT).css({\n left: left,\n top: top,\n width: width,\n height: height\n });\n },\n\n _removeResizeHint: function() {\n this._resizeHint.remove();\n this._resizeHint = $();\n },\n\n _removeMoveHint: function(uid) {\n if (uid) {\n this._moveHint.filter(\"[data-uid='\" + uid + \"']\").remove();\n\n this._moveHint = this._moveHint.filter(\"[data-uid!='\" + uid + \"']\");\n } else {\n this._moveHint.remove();\n this._moveHint = $();\n }\n },\n\n _scrollTo: function(element, container) {\n var elementOffset = element.offsetTop,\n elementOffsetDir = element.offsetHeight,\n containerScroll = container.scrollTop,\n containerOffsetDir = container.clientHeight,\n bottomDistance = elementOffset + elementOffsetDir,\n result = 0;\n\n if (containerScroll > elementOffset) {\n result = elementOffset;\n } else if (bottomDistance > (containerScroll + containerOffsetDir)) {\n if (elementOffsetDir <= containerOffsetDir) {\n result = (bottomDistance - containerOffsetDir);\n } else {\n result = elementOffset;\n }\n } else {\n result = containerScroll;\n }\n container.scrollTop = result;\n },\n\n _inverseEventColor: function(element) {\n var eventColor = element.css(\"color\");\n var eventColorIsDark = new Color(eventColor).isDark();\n var eventBackground = element.css(\"background-color\");\n var eventBackgroundIsDark = new Color(eventBackground).isDark();\n\n if (eventColorIsDark == eventBackgroundIsDark) {\n element.addClass(INVERSE_COLOR_CLASS);\n }\n },\n\n _eventTmpl: function(template, wrapper) {\n var options = this.options,\n settings = $.extend({}, kendo.Template, options.templateSettings),\n paramName = settings.paramName,\n html = \"\",\n type = typeof template,\n state = { storage: {}, count: 0 };\n\n if (type === \"function\") {\n state.storage[\"tmpl\" + state.count] = template;\n html += \"#=this.tmpl\" + state.count + \"(\" + paramName + \")#\";\n state.count ++;\n } else if (type === \"string\") {\n html += template;\n }\n\n var tmpl = kendo.template(kendo.format(wrapper, html), settings);\n\n if (state.count > 0) {\n tmpl = tmpl.bind(state.storage);\n }\n\n return tmpl;\n },\n\n eventResources: function(event) {\n var resources = [],\n options = this.options;\n\n if (!options.resources) {\n return resources;\n }\n\n for (var idx = 0; idx < options.resources.length; idx++) {\n var resource = options.resources[idx];\n var field = resource.field;\n var eventResources = kendo.getter(field)(event);\n\n if (eventResources == null) {\n continue;\n }\n\n if (!resource.multiple) {\n eventResources = [eventResources];\n }\n\n var data = resource.dataSource.view();\n\n for (var resourceIndex = 0; resourceIndex < eventResources.length; resourceIndex++) {\n var eventResource = null;\n\n var value = eventResources[resourceIndex];\n\n if (!resource.valuePrimitive) {\n value = kendo.getter(resource.dataValueField)(value);\n }\n\n for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n if (data[dataIndex].get(resource.dataValueField) == value) {\n eventResource = data[dataIndex];\n break;\n }\n }\n\n if (eventResource !== null) {\n var resourceColor = kendo.getter(resource.dataColorField)(eventResource);\n resources.push({\n field: resource.field,\n title: resource.title,\n name: resource.name,\n text: kendo.getter(resource.dataTextField)(eventResource),\n value: value,\n color: resourceColor\n });\n }\n }\n }\n return resources;\n },\n\n createLayout: function(layout) {\n var allDayIndex = -1;\n\n if (!layout.rows) {\n layout.rows = [];\n }\n\n for (var idx = 0; idx < layout.rows.length; idx++) {\n if (layout.rows[idx].allDay) {\n allDayIndex = idx;\n break;\n }\n }\n\n var allDaySlot = layout.rows[allDayIndex];\n\n if (allDayIndex >= 0) {\n layout.rows.splice(allDayIndex, 1);\n }\n\n var columnLevels = this.columnLevels = levels(layout, \"columns\");\n var rowLevels = this.rowLevels = levels(layout, \"rows\");\n\n if (this._isVirtualized()) {\n this._trimRowLevels(rowLevels);\n }\n\n this.table = $('
');\n\n var rowCount = rowLevels[rowLevels.length - 1].length;\n\n this.table.find(\"tbody\").first().append(this._topSection(columnLevels, allDaySlot, rowCount));\n this.table.find(\"tbody\").first().append(this._bottomSection(columnLevels, rowLevels, rowCount));\n this.element.append(this.table);\n\n if (this._isVirtualized()) {\n this._updateDomRowLevels();\n }\n\n // Enable horizontal scrolling when mobile, grouped and less than 1024px width\n if (this._isMobile() &&\n columnLevels.length > 1 &&\n this._groupOrientation() === \"horizontal\" &&\n kendo._outerWidth($(window)) < MIN_HORIZONTAL_SCROLL_SIZE ) {\n\n this.table.find(\".k-scheduler-content .k-scheduler-table\").width((columnLevels[columnLevels.length - 2].length * 100) + \"%\");\n this.table.find(\".k-scheduler-header .k-scheduler-table\").width((columnLevels[columnLevels.length - 2].length * 100) + \"%\");\n }\n\n this._scroller();\n },\n\n _isVirtualized: function() {\n return this.options.virtual && this.rowLevels.length > 1 && this._isVerticallyGrouped();\n },\n\n _trimRowLevels: function(rowLevels) {\n var lastGroup = rowLevels[rowLevels.length - 2];\n var cachedRowLevels = this.cachedRowLevels || [];\n var levelMarker;\n\n this._hasContentToRender = true;\n\n var stopAtLevel = function(levels, index) {\n var hasParent = levels[index - 1].length > 0,\n parentLevel, parentValue;\n\n if (hasParent) {\n parentLevel = levels[index - 1][0];\n parentValue = levels[index][0].parentValue;\n\n return parentLevel.value !== parentValue;\n } else {\n return true;\n }\n };\n\n for (var rowLevelIndex = rowLevels.length - 2; rowLevelIndex >= 0; rowLevelIndex--) {\n var stop = false;\n if (rowLevelIndex > 0 && stopAtLevel(rowLevels, rowLevelIndex)) {\n stop = true;\n levelMarker = rowLevelIndex;\n }\n\n cachedRowLevels[rowLevelIndex] = rowLevels[rowLevelIndex].splice(1);\n\n if (rowLevelIndex < rowLevels.length - 2 && rowLevels[rowLevelIndex][0].rows.length != 1) {\n rowLevels[rowLevelIndex][0].rows = rowLevels[rowLevelIndex + 1];\n }\n\n if (stop) {\n break;\n }\n }\n\n cachedRowLevels[rowLevels.length - 1] = rowLevels[rowLevels.length - 1].splice(lastGroup[0].rows.length);\n\n this.cachedRowLevels = cachedRowLevels;\n\n if (!cachedRowLevels[cachedRowLevels.length - 1].length) {\n this._hasContentToRender = false;\n }\n\n return {\n levelMarker: levelMarker || 0,\n rowLevels: rowLevels\n };\n },\n\n createNextLayout: function() {\n var clone = [];\n var trimmedRowLevels;\n var rowLevels;\n var levelMarker;\n var rowCount;\n\n for (var rowLevelIndex = 0; rowLevelIndex < this.cachedRowLevels.length; rowLevelIndex++) {\n clone[rowLevelIndex] = this.cachedRowLevels[rowLevelIndex];\n }\n\n trimmedRowLevels = this._trimRowLevels(clone);\n rowLevels = trimmedRowLevels.rowLevels.splice(trimmedRowLevels.levelMarker);\n levelMarker = trimmedRowLevels.levelMarker;\n rowCount = rowLevels[rowLevels.length - 1].length;\n\n delete this._height;\n\n for (var i = levelMarker; i < this.rowLevels.length; i++) {\n this.rowLevels[i] = this.rowLevels[i].concat(rowLevels[i - levelMarker]);\n }\n\n this.table\n .find(\".k-scheduler-times\").last().find(\"tbody\")\n .append(this._times(rowLevels, rowCount, this._isMobile()).find(\"tr\"));\n\n this._updateDomRowLevels();\n\n if (levelMarker > 0) {\n for (i = 0; i < levelMarker; i++) {\n var cell = this.table.find(\"[data-row-level=\" + i + \"]\").last();\n var rowSpan = parseInt(cell.attr(\"rowspan\"),10) + rowCount;\n cell.attr(\"rowspan\", rowSpan);\n }\n }\n\n this._virtualContent(rowLevels, this.columnLevels);\n this.render(this._cachedEvents);\n },\n\n _tryRenderContent: function() {\n var that = this;\n var bufferHeight = that.table.innerHeight();\n var height = that.content.find(\"table\").innerHeight();\n var scrollTop = that.content.scrollTop();\n\n while (that._hasContentToRender && height - bufferHeight < scrollTop) {\n that.createNextLayout();\n height = that.content.find(\"table\").innerHeight();\n }\n },\n\n _updateDomRowLevels: function() {\n var that = this;\n var groupCells = that.times.find(\".k-scheduler-group-cell:not([data-row-level])\");\n\n if (!this._rowLevelIndices) {\n this._rowLevelIndices = groupCells.map(function(index, item) {\n $(item).attr(\"data-row-level\", index);\n return index;\n }).toArray().reverse();\n return;\n }\n\n groupCells = groupCells.toArray().reverse();\n\n for (var i = 0; i <= groupCells.length; i++) {\n $(groupCells[i]).attr(\"data-row-level\", this._rowLevelIndices[i]);\n }\n },\n\n refreshLayout: function() {\n var that = this,\n toolbar = that.element.find(\"> .k-scheduler-toolbar\"),\n height = that.element.innerHeight(),\n scrollbar = this._scrollbar,\n headerHeight = 0,\n paddingDirection = this._isRtl ? \"left\" : \"right\";\n\n for (var idx = 0; idx < toolbar.length; idx++) {\n height -= outerHeight(toolbar.eq(idx));\n }\n\n if (that.datesHeader) {\n headerHeight = outerHeight(that.datesHeader);\n }\n\n if (that.timesHeader && outerHeight(that.timesHeader) > headerHeight) {\n headerHeight = outerHeight(that.timesHeader);\n }\n\n if (that.datesHeader && that.timesHeader) {\n var datesHeaderRows = that.datesHeader.find(\"table\").first().find(\"tr\");\n\n that.timesHeader.find(\"tr\").height(function(index) {\n $(this).height(datesHeaderRows.eq(index).height());\n });\n }\n\n if (headerHeight) {\n height -= headerHeight;\n }\n\n if (that.footer) {\n height -= outerHeight(that.footer);\n }\n\n var isSchedulerHeightSet = function(el) {\n var initialHeight, newHeight;\n if (el[0].style.height) {\n return true;\n } else {\n initialHeight = el.height();\n }\n\n el.height(\"auto\");\n newHeight = el.height();\n\n if (initialHeight != newHeight) {\n el.height(\"\");\n return true;\n }\n el.height(\"\");\n return false;\n };\n\n var contentDiv = that.content[0],\n scrollbarWidth = !kendo.support.kineticScrollNeeded ? scrollbar : 0;\n\n if (isSchedulerHeightSet(that.element)) { // set content height only if needed\n if (height > scrollbar * 2) { // do not set height if proper scrollbar cannot be displayed\n that.content.height(height);\n } else {\n that.content.height(scrollbar * 2 + 1);\n }\n\n if (that.times) {\n that.times.height(contentDiv.clientHeight);\n\n var timesTable = that.times.find(\"table\");\n if (timesTable.length) {\n timesTable.height(that.content.find(\"table\")[0].clientHeight);\n }\n }\n }\n\n if (that.table) {\n if (contentDiv.offsetWidth - contentDiv.clientWidth > 0) {\n that.table.addClass(\"k-scrollbar-v\");\n that.datesHeader.css(\"padding-\" + paddingDirection, scrollbarWidth - parseInt(that.datesHeader.children().css(\"border-\" + paddingDirection + \"-width\"), 10));\n } else {\n that.datesHeader.css(\"padding-\" + paddingDirection, \"0\");\n }\n if (contentDiv.offsetHeight - contentDiv.clientHeight > 0 || contentDiv.clientHeight > that.content.children(\".k-scheduler-table\").height()) {\n that.table.addClass(\"k-scrollbar-h\");\n } else {\n that.table.removeClass(\"k-scrollbar-h\");\n }\n }\n },\n\n _topSection: function(columnLevels, allDaySlot, rowCount) {\n var thElm = $(\"\");\n\n this.timesHeader = timesHeader(columnLevels.length, allDaySlot, rowCount);\n this.datesHeader = this._datesHeader(columnLevels, allDaySlot);\n\n var dateGroup = this.datesHeader.find(\".k-nav-day\");\n\n if (dateGroup.length) {\n dateGroup.closest(\"tr\").addClass(\"k-scheduler-date-group\");\n }\n\n if (this._isMobile()) {\n thElm.addClass(\"k-mobile-header\");\n thElm.addClass(\"k-mobile-\" + this._groupOrientation() + \"-header\");\n }\n\n return $(thElm).append(this.timesHeader.add(this.datesHeader).wrap(\"\").parent());\n },\n\n _bottomSection: function(columnLevels, rowLevels, rowCount) {\n this.times = this._times(rowLevels, rowCount, this._isMobile());\n\n this.content = content(columnLevels[columnLevels.length - 1], rowLevels[rowLevels.length - 1]);\n\n return $(\"\").append(this.times.add(this.content).wrap(\"\").parent());\n },\n\n _scroller: function() {\n var that = this;\n\n this.content.on(\"scroll\" + NS, function() {\n kendo.scrollLeft(that.datesHeader.find(\">.k-scheduler-header-wrap\"), this.scrollLeft);\n that.times.scrollTop(this.scrollTop);\n if (that._isVirtualized()) {\n that._tryRenderContent();\n }\n });\n\n var touchScroller = kendo.touchScroller(this.content, {\n avoidScrolling: function(e) {\n return $(e.event.target).closest(\".k-event.k-event-active\").length > 0;\n }\n });\n\n if (touchScroller && touchScroller.movable) {\n\n this._touchScroller = touchScroller;\n\n this.content = touchScroller.scrollElement;\n\n touchScroller.movable.bind(\"change\", function(e) {\n kendo.scrollLeft(that.datesHeader.find(\">.k-scheduler-header-wrap\"), -e.sender.x);\n that.times.scrollTop(-e.sender.y);\n if (that._isVirtualized()) {\n that._tryRenderContent();\n }\n });\n }\n },\n\n _resourcesForGroups: function() {\n var result = [];\n var groups = this.options.group;\n var resources = this.options.resources;\n\n groups = groups && groups.resources ? groups.resources : [];\n\n if (resources && groups.length) {\n for (var idx = 0, length = resources.length; idx < length; idx++) {\n for (var groupIdx = 0, groupLength = groups.length; groupIdx < groupLength; groupIdx++) {\n if (resources[idx].name === groups[groupIdx]) {\n result.push(resources[idx]);\n }\n }\n }\n }\n\n this.groupedResources = result;\n },\n\n _createDateLayout: function(dates, inner, times) {\n return createDateLayoutConfiguration(\"rows\", dates, inner, times);\n },\n\n _createColumnsLayout: function(resources, inner, template, dates, times, parentValue) {\n return createLayoutConfiguration(\"columns\", resources, inner, template, dates, times, parentValue);\n },\n\n _groupOrientation: function() {\n var groups = this.options.group;\n return groups && groups.resources ? groups.orientation : \"horizontal\";\n },\n\n _isGroupedByDate: function() {\n return this.options.group && this.options.group.date;\n },\n\n _isVerticallyGrouped: function() {\n return this.groupedResources.length && this._groupOrientation() === \"vertical\";\n },\n\n _createRowsLayout: function(resources, inner, template, dates) {\n return createLayoutConfiguration(\"rows\", resources, inner, template, dates);\n },\n\n selectionByElement: function() {\n return null;\n },\n\n clearSelection: function() {\n this.content\n .find(\".k-selected\")\n .removeAttr(\"id\")\n .removeClass(\"k-selected\");\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(this);\n\n if (that.table) {\n kendo.destroy(that.table);\n that.table.remove();\n }\n\n if (that.footer) {\n kendo.destroy(that.footer);\n that.footer.remove();\n }\n\n that.groups = null;\n that.table = null;\n that.content = null;\n that.times = null;\n that.datesHeader = null;\n that.timesHeader = null;\n that.footer = null;\n that._resizeHint = null;\n that._moveHint = null;\n },\n\n calendarInfo: function() {\n return kendo.getCulture().calendars.standard;\n },\n\n prevGroupSlot: function(date, groupIndex, isDay) {\n var collection;\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 if (this._isGroupedByDate()) {\n return slot;\n }\n\n if (this._isVerticallyGrouped()) {\n if (!group.timeSlotCollectionCount()) {\n collection = group._collection(group.daySlotCollectionCount() - 1, true);\n return collection.at(slot.index);\n } else {\n collection = group._collection(isDay ? slot.index : slot.collectionIndex, false);\n return collection.last();\n }\n } else {\n if (!group.timeSlotCollectionCount()) {\n collection = group._collection(slot.collectionIndex, true);\n return collection.last();\n } else {\n collection = group._collection(isDay ? 0 : group.timeSlotCollectionCount() - 1, isDay);\n return isDay ? collection.last() : collection.at(slot.index);\n }\n }\n },\n\n nextGroupSlot: function(date, groupIndex, isDay) {\n var collection;\n var group = this.groups[groupIndex];\n var slot = group.ranges(date, date, isDay, false)[0].start;\n var daySlotCollectionCount;\n\n if (groupIndex >= this.groups.length - 1) {\n return;\n }\n\n if (this._isGroupedByDate()) {\n return slot;\n }\n\n if (this._isVerticallyGrouped()) {\n if (!group.timeSlotCollectionCount()) {\n collection = group._collection(0, true);\n return collection.at(slot.index);\n } else {\n daySlotCollectionCount = group.daySlotCollectionCount();\n collection = group._collection(daySlotCollectionCount ? 0 : slot.collectionIndex, daySlotCollectionCount);\n\n return isDay ? collection.first() : collection.at(slot.collectionIndex);\n }\n } else {\n if (!group.timeSlotCollectionCount()) {\n collection = group._collection(slot.collectionIndex, true);\n return collection.first();\n } else {\n collection = group._collection(0, isDay);\n return isDay ? collection.first() : collection.at(slot.index);\n }\n }\n },\n\n _eventOptionsForMove: function() {\n return {};\n },\n\n _updateEventForResize: function() {\n return;\n },\n\n _updateEventForSelection: function(event) {\n return event;\n },\n\n _innerElements: function(element, type, inner) {\n var count = 0,\n countInner = function(el) {\n var innerSpan = el[inner],\n innerEls = el[type],\n current, innerCollection, i;\n\n if (innerSpan) {\n count += innerSpan;\n return;\n }\n\n if (!innerEls || innerEls.length === 0) {\n count += 1;\n return;\n }\n\n for (i = 0; i < innerEls.length; i++) {\n current = innerEls[i];\n innerCollection = current[type];\n\n if (innerCollection && innerCollection[0]) {\n if (!innerCollection[0][type] || innerCollection[0][type].length === 0) {\n count += innerCollection.length;\n } else {\n countInner(current);\n }\n } else {\n count += 1;\n }\n }\n };\n\n countInner(element);\n\n return count;\n },\n\n _times: function(rowLevels, rowCount, isMobile) {\n var that = this;\n var rows = new Array(rowCount).join().split(\",\");\n var rowHeaderRows = [];\n var rowIndex;\n\n for (var rowLevelIndex = 0; rowLevelIndex < rowLevels.length; rowLevelIndex++) {\n var level = rowLevels[rowLevelIndex];\n var rowsBefore = 0;\n\n for (rowIndex = 0; rowIndex < level.length; rowIndex++) {\n var currentRow = level[rowIndex];\n var className = currentRow.className || \"\";\n var text = currentRow.text;\n var rowspan = that._innerElements(currentRow, \"rows\");\n\n rowsBefore += rowspan;\n\n if (currentRow.allDay) {\n className = \"k-scheduler-times-all-day\";\n }\n\n if (isMobile && className.indexOf(\"k-scheduler-group-cell\") !== -1) {\n text = '' + text + '';\n }\n\n rows[rowsBefore - rowspan] += '' + text + \"\";\n }\n }\n\n for (rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n rowHeaderRows.push(rows[rowIndex]);\n }\n\n if (rowCount < 1) {\n return $();\n }\n\n return $('
' + table(rowHeaderRows) + '
');\n },\n\n _datesHeader: function(columnLevels, allDaySlot) {\n var that = this;\n var dateTableRows = [];\n var columnIndex;\n\n for (var columnLevelIndex = 0; columnLevelIndex < columnLevels.length; columnLevelIndex++) {\n var level = columnLevels[columnLevelIndex];\n var th = [];\n\n for (columnIndex = 0; columnIndex < level.length; columnIndex ++) {\n var column = level[columnIndex];\n var colspan = that._innerElements(column, \"columns\", \"colspan\");\n\n th.push('' + column.text + \"\");\n }\n\n dateTableRows.push(th.join(\"\"));\n }\n\n var allDayTableRows = [];\n\n if (allDaySlot) {\n var lastLevel = columnLevels[columnLevels.length - 1];\n var td = [];\n var cellContent = allDaySlot.cellContent;\n\n for (columnIndex = 0; columnIndex < lastLevel.length; columnIndex++) {\n td.push('' + (cellContent ? cellContent(columnIndex) : ' ') + '');\n }\n\n allDayTableRows.push(td.join(\"\"));\n }\n\n return $(\n '
' +\n '
' +\n table(dateTableRows) +\n allDayTable(allDayTableRows, \"k-scheduler-header-all-day\") +\n '
' +\n '
'\n );\n },\n\n _formatEventAriaLabel: function(title, start, end, isAllDay) {\n var labelMessages = this.options.messages.ariaEventLabel,\n sameDate = kendo.date.getDate(start).getTime() === kendo.date.getDate(end).getTime(),\n labelText;\n\n if (typeof(labelMessages) === \"string\") {\n return kendo.format(labelMessages, title, start, start);\n }\n\n labelText = (labelMessages.prefix + SPACE + title + SPACE + labelMessages.on + SPACE + kendo.toString(start, \"D\")).trim();\n\n if (isAllDay && sameDate) {\n return labelText + SPACE + labelMessages.allDay;\n } else if (isAllDay) {\n return labelText + SPACE + labelMessages.to + SPACE + kendo.toString(end, \"D\") + SPACE + labelMessages.allDay;\n } else {\n labelText = labelText + SPACE + labelMessages.at + SPACE + kendo.toString(start, \"t\") + SPACE + labelMessages.to + SPACE;\n\n if (sameDate) {\n return labelText + kendo.toString(end, \"t\");\n } else {\n return labelText + kendo.toString(end, \"D\") + SPACE + labelMessages.at + SPACE + kendo.toString(end, \"t\");\n }\n }\n }\n });\n\n function collidingEvents(elements, start, end) {\n var idx,\n index,\n startIndex,\n overlaps,\n endIndex;\n\n for (idx = elements.length - 1; idx >= 0; idx--) {\n index = rangeIndex(elements[idx]);\n startIndex = index.start;\n endIndex = index.end;\n\n overlaps = startIndex <= start && endIndex >= start;\n\n if (overlaps || (startIndex >= start && endIndex <= end) || (start <= startIndex && end >= startIndex)) {\n if (startIndex < start) {\n start = startIndex;\n }\n\n if (endIndex > end) {\n end = endIndex;\n }\n }\n }\n\n return eventsForSlot(elements, start, end);\n }\n\n function rangeIndex(eventElement) {\n return {\n start: eventElement.start,\n end: eventElement.end\n };\n }\n\n function eventsForSlot(elements, slotStart, slotEnd) {\n var events = [];\n\n for (var idx = 0; idx < elements.length; idx++) {\n var event = rangeIndex(elements[idx]);\n\n if ((event.start < slotStart && event.end > slotStart) || (event.start >= slotStart && event.end <= slotEnd)) {\n events.push(elements[idx]);\n }\n }\n\n return events;\n }\n\n function createColumns(eventElements) {\n return _createColumns(eventElements);\n }\n\n function createRows(eventElements) {\n return _createColumns(eventElements);\n }\n\n var Color = function(value) {\n var color = this,\n formats = Color.formats,\n re,\n processor,\n parts,\n i,\n channels;\n\n if (arguments.length === 1) {\n value = color.resolveColor(value);\n\n for (i = 0; i < formats.length; i++) {\n re = formats[i].re;\n processor = formats[i].process;\n parts = re.exec(value);\n\n if (parts) {\n channels = processor(parts);\n color.r = channels[0];\n color.g = channels[1];\n color.b = channels[2];\n }\n }\n } else {\n color.r = arguments[0];\n color.g = arguments[1];\n color.b = arguments[2];\n }\n\n color.r = color.normalizeByte(color.r);\n color.g = color.normalizeByte(color.g);\n color.b = color.normalizeByte(color.b);\n };\n\n Color.prototype = {\n resolveColor: function(value) {\n value = value || \"#000\";\n\n if (value.charAt(0) == \"#\") {\n value = value.substr(1, 6);\n }\n\n value = value.replace(/ /g, \"\");\n value = value.toLowerCase();\n value = Color.namedColors[value] || value;\n\n return value;\n },\n\n normalizeByte: function(value) {\n return (value < 0 || isNaN(value)) ? 0 : ((value > 255) ? 255 : value);\n },\n\n percBrightness: function() {\n var color = this;\n return math.sqrt(0.241 * color.r * color.r + 0.691 * color.g * color.g + 0.068 * color.b * color.b);\n },\n\n isDark: function() {\n var color = this;\n var brightnessValue = color.percBrightness();\n return brightnessValue < 180;\n }\n };\n\n Color.formats = [{\n re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n process: function(parts) {\n return [\n parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10)\n ];\n }\n }, {\n re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n process: function(parts) {\n return [\n parseInt(parts[1], 16), parseInt(parts[2], 16), parseInt(parts[3], 16)\n ];\n }\n }, {\n re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n process: function(parts) {\n return [\n parseInt(parts[1] + parts[1], 16),\n parseInt(parts[2] + parts[2], 16),\n parseInt(parts[3] + parts[3], 16)\n ];\n }\n }\n ];\n\n Color.namedColors = {\n aqua: \"00ffff\", azure: \"f0ffff\", beige: \"f5f5dc\",\n black: \"000000\", blue: \"0000ff\", brown: \"a52a2a\",\n coral: \"ff7f50\", cyan: \"00ffff\", darkblue: \"00008b\",\n darkcyan: \"008b8b\", darkgray: \"a9a9a9\", darkgreen: \"006400\",\n darkorange: \"ff8c00\", darkred: \"8b0000\", dimgray: \"696969\",\n fuchsia: \"ff00ff\", gold: \"ffd700\", goldenrod: \"daa520\",\n gray: \"808080\", green: \"008000\", greenyellow: \"adff2f\",\n indigo: \"4b0082\", ivory: \"fffff0\", khaki: \"f0e68c\",\n lightblue: \"add8e6\", lightgrey: \"d3d3d3\", lightgreen: \"90ee90\",\n lightpink: \"ffb6c1\", lightyellow: \"ffffe0\", lime: \"00ff00\",\n limegreen: \"32cd32\", linen: \"faf0e6\", magenta: \"ff00ff\",\n maroon: \"800000\", mediumblue: \"0000cd\", navy: \"000080\",\n olive: \"808000\", orange: \"ffa500\", orangered: \"ff4500\",\n orchid: \"da70d6\", pink: \"ffc0cb\", plum: \"dda0dd\",\n purple: \"800080\", red: \"ff0000\", royalblue: \"4169e1\",\n salmon: \"fa8072\", silver: \"c0c0c0\", skyblue: \"87ceeb\",\n slateblue: \"6a5acd\", slategray: \"708090\", snow: \"fffafa\",\n steelblue: \"4682b4\", tan: \"d2b48c\", teal: \"008080\",\n tomato: \"ff6347\", turquoise: \"40e0d0\", violet: \"ee82ee\",\n wheat: \"f5deb3\", white: \"ffffff\", whitesmoke: \"f5f5f5\",\n yellow: \"ffff00\", yellowgreen: \"9acd32\"\n };\n\n function _createColumns(eventElements) {\n var columns = [];\n\n for (var idx = 0; idx < eventElements.length; idx++) {\n var event = eventElements[idx];\n var eventRange = rangeIndex(event);\n var column = null;\n\n for (var j = 0, columnLength = columns.length; j < columnLength; j++) {\n var endOverlaps = eventRange.start > columns[j].end;\n\n if (eventRange.start < columns[j].start || endOverlaps) {\n\n column = columns[j];\n\n if (column.end < eventRange.end) {\n column.end = eventRange.end;\n }\n\n break;\n }\n }\n\n if (!column) {\n column = { start: eventRange.start, end: eventRange.end, events: [] };\n columns.push(column);\n }\n\n column.events.push(event);\n }\n\n return columns;\n }\n\n function createDateLayoutConfiguration(name, dates, inner, times) {\n var configuration = [];\n\n $.each(dates, function(index, item) {\n var className = item.className ? \"k-slot-cell \" + item.className : \"k-slot-cell\";\n\n var obj = {\n text: item.text,\n className: className\n };\n\n if (times && !item.minorTicks) {\n obj[name] = createDateLayoutConfiguration(name, item.columns, inner, times);\n } else {\n obj[name] = inner;\n }\n configuration.push(obj);\n });\n\n return configuration;\n }\n\n function createLayoutConfiguration(name, resources, inner, template, dates, times, parentValue) {\n var resource = resources[0];\n var configuration = [];\n\n if (resource) {\n if (dates && inner) {\n $.each(dates, function(index, item) {\n if (times && !item.minorTicks) {\n item[name] = createLayoutConfiguration(name, resources, item.columns, template, item.columns, times, parentValue);\n } else {\n item[name] = createLayoutConfiguration(name, resources, null, template, null, null, parentValue);\n }\n });\n configuration = dates;\n } else {\n var data = resource.dataSource.view();\n\n data = data.filter(function(item) {\n var itemParentValue = kendo.getter(resource.dataParentValueField)(item);\n\n return itemParentValue === null || itemParentValue === undefined || itemParentValue === parentValue;\n });\n\n for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n var value = kendo.getter(resource.dataValueField)(data[dataIndex]);\n var obj = {\n text: template({\n text: kendo.htmlEncode(kendo.getter(resource.dataTextField)(data[dataIndex])),\n color: kendo.getter(resource.dataColorField)(data[dataIndex]),\n field: resource.field,\n title: resource.title,\n name: resource.name,\n value: value\n }),\n className: \"k-slot-cell k-scheduler-group-cell\",\n parentValue: parentValue,\n value: value\n };\n\n // filter-out those inner resources that are not relevant\n obj[name] = createLayoutConfiguration(name, resources.slice(1), inner, template, dates, times, value);\n\n configuration.push(obj);\n }\n }\n return configuration;\n }\n return inner;\n }\n\n function groupEqFilter(value) {\n return function(item) {\n if (Array.isArray(item) || item instanceof kendo.data.ObservableArray) {\n for (var idx = 0; idx < item.length; idx++) {\n if (item[idx] == value) {\n return true;\n }\n }\n return false;\n }\n return item == value;\n };\n }\n\n var selectedStateRegExp = /\\s*k-selected/;\n function addSelectedState(cell) {\n cell.className = cell.className.replace(selectedStateRegExp, \"\") + \" k-selected\";\n }\n\n $.extend(ui.SchedulerView, {\n createColumns: createColumns,\n createRows: createRows,\n rangeIndex: rangeIndex,\n collidingEvents: collidingEvents,\n groupEqFilter: groupEqFilter\n });\n\n })(window.kendo.jQuery);\n\n}));\n"]}