{"version":3,"file":"kendo.gantt.timeline.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendogantt","timeline","js","this","$","Widget","kendo","ui","kendoDomElement","dom","element","kendoTextElement","text","kendoHtmlElement","html","isPlainObject","outerWidth","_outerWidth","outerHeight","_outerHeight","extend","isRtl","keys","Query","data","NS","CLICK","MOUSEMOVE","MOUSEENTER","MOUSELEAVE","DOT","DAY_HEADER_TEMPLATE","ref","start","toString","WEEK_HEADER_TEMPLATE","end","date","addDays","MONTH_HEADER_TEMPLATE","RESIZE_TOOLTIP_TEMPLATE","styles","messages","format","htmlEncode","TASK_TOOLTIP_TEMPLATE","task","taskDetails","title","percentComplete","SIZE_CALCULATION_TEMPLATE","attr","defaultViews","day","type","week","month","year","blurActiveElement","activeElement","_activeElement","nodeName","toLowerCase","trigger","GanttView","init","options","fn","call","name","header","find","gridHeader","content","gridContent","contentWidth","width","_workDays","workDays","dayIndex","workWeekStart","push","workWeekEnd","getWorkDays","_headerTree","headerTree","_taskTree","taskTree","_taskTemplate","taskTemplate","template","Template","templateSettings","_dependencyTree","dependencyTree","_taskCoordinates","_currentTime","destroy","clearTimeout","_tooltipTimeout","headerRow","_dragHint","_resizeHint","_resizeTooltip","_taskTooltip","_percentCompleteResizeTooltip","showWorkHours","showWorkDays","workDayStart","Date","workDayEnd","hourSpan","slotSize","currentTimeMarker","updateInterval","renderLayout","_slots","_createSlots","_tableWidth","_calculateTableWidth","createLayout","_layout","_slotDimensions","_adjustHeight","dependenciesWrapper","height","rows","headers","_headers","colgroup","_colgroup","tree","className","tbody","table","headerTable","style","role","render","first","last","slot","children","slots","_timeSlots","i","length","offsetLeft","offsetWidth","tasks","contentTable","totalHeight","taskCount","rowsTable","_rowsTable","columnsTable","_columnsTable","tasksTable","_tasksTable","calculatedSize","row","_contentHeight","_rowHeight","undefined","_renderCurrentTime","rowCount","attributes","tableRow","alt","tableCell","_createTable","slotSpan","cells","slotsCount","totalSpan","span","colspan","isNonWorking","nonWorking","cell","position","plannedPosition","resourcesPosition","resourceStyle","taskElement","rowIndex","taskLeft","taskRight","coordinates","size","_calculateMilestoneWidth","milestoneWidth","Math","round","resourcesField","resource","resourceAlt","resourcesMargin","_calculateResourcesMargin","taskBorderWidth","_calculateTaskBorderWidth","showPlannedTasks","l","_taskPosition","_taskPositionPlanned","borderWidth","_renderTask","navigatable","left","max","clientWidth","resourcesWrap","_renderResources","isMilestone","id","cols","currentSpan","maxSpan","boundingClientRect","taskMilestone","milestone","css","visibility","append","getBoundingClientRect","right","remove","margin","wrapper","parseInt","computedStyle","taskSingle","getComputedStyles","parseFloat","taskWrapper","progressHandleOffset","plannedElement","endTaskDotLeft","taskOffsetWrap","offsetElement","editable","wrapClassName","taskWrap","dragHandleStyle","taskWrapAttr","endTaskDotRight","taskFullWidth","_renderPlannedMilestone","_renderPlannedSingleTask","summary","_renderSummary","taskSummaryWrap","_renderMilestone","taskMilestoneWrap","_renderSingleTask","plannedStart","plannedEnd","taskOffset","resize","update","taskActions","link","taskDelete","href","icon","iconDelete","taskResizeHandle","taskResizeHandleWest","taskResizeHandleEast","taskInnerWrap","dependencyCreate","taskDot","taskDotStart","taskDotEnd","dragPercentComplete","taskDragHandle","progressWidth","taskContent","taskChildren","classes","widthExceptDelay","taskDelayed","taskAdvanced","taskComplete","uid","taskSummary","taskSummaryProgress","taskSummaryComplete","taskPlannedMoment","taskPlannedMomentLeft","taskPlannedDuration","taskPlanned","resources","color","get","reverse","startLeft","_offset","slotOffset","_slotIndex","field","value","middle","startIdx","endIdx","slice","ceil","_timeByPosition","x","snap","snapToEnd","_slotByPosition","offset","duration","getTime","slotIndex","_renderDependencies","dependencies","elements","apply","_renderDependency","dependency","predecessor","predecessorId","successor","successorId","_renderFF","from","to","lines","_dependencyFF","_arrow","_renderSS","_renderFS","_dependencyFS","_renderSF","delta","that","top","dir","rowHeight","fromTop","floor","toTop","addHorizontal","_line","line","lineHorizontal","addVertical","lineVertical","abs","minLineHeight","direction","arrowWest","arrowEast","count","j","_createDragHint","clone","addClass","dragHint","cursor","closest","_updateDragHint","_removeDragHint","_createResizeHint","tooltipTop","taskTop","RESIZE_HINT","views","resizeTooltipFormat","_resizeTooltipWidth","_resizeTooltipTop","_updateResizeHint","resizeStart","tooltipLeft","tablesWidth","support","scrollbar","tooltipWidth","tableOffset","tasksWrapper","appendTo","_removeResizeHint","_updatePercentCompleteTooltip","_removePercentCompleteTooltip","tooltip","PERCENT_RESIZE_TOOLTIP_TEMPLATE","applyStylesFromKendoAttributes","tooltipMiddle","arrow","callout","arrowHeight","_updateDependencyDragHint","_removeDependencyDragHint","_creteDependencyDragHint","deltaX","deltaY","y","sqrt","angle","atan","PI","dependencyHint","transform","_createTaskTooltip","mouseLeft","contentOffset","contentScrollLeft","scrollLeft","parents","rowOffset","scrollTop","tooltipWrapper","_adjustTooltipDimensions","_removeTaskTooltip","_createOffsetTooltip","hours","_offsetTooltip","offsetValue","plannedTasksMessages","plannedTasks","minutes","offsetText","days","offsetTooltipDelay","offsetPrefix","_removeOffsetTooltip","_createPlannedTooltip","_plannedTooltip","plannedTooltip","editorMessages","editor","startDate","endDate","_removePlannedTooltip","_scrollTo","elementLeft","elementWidth","elementRight","rowTop","rowBottom","contentTop","contentBottom","contentLeft","contentRight","scrollbarWidth","_scrollToDate","viewStart","viewEnd","columnLevels","level","column","headerText","levelIndex","levelCount","columnIndex","columnCount","_hours","slotEnd","isWorkHour","getHours","setHours","_days","isWorkDay","nextDay","_isWorkDay","_weeks","daySlots","firstDay","calendarInfo","dayOfWeek","_months","endMonth","firstDayOfMonth","setMonth","getMonth","_years","monthSpan","_slotHeaders","columns","getDay","getCulture","calendars","standard","currentTime","_getCurrentTime","timeOffset","viewStyles","tablesWrap","markerOptions","_currentTimeUpdateTimer","setInterval","bind","reset","gridHeaderWrap","taskDetailsPercent","tooltipContent","tooltipCallout","marquee","marqueeColor","offsetTooltipAdvanced","GanttDayView","timeHeaderTemplate","dayHeaderTemplate","range","optionsRange","getDate","getMilliseconds","daySlot","hourSlots","GanttWeekView","weekHeaderTemplate","endDay","rangeEnd","setDate","GanttMonthView","monthHeaderTemplate","lastDayOfMonth","GanttYearView","yearHeaderTemplate","monthSlots","each","index","GanttTimeline","_wrapper","_domTrees","_views","_selectable","_draggable","_resizable","_percentResizeDraggable","_createDependencyDraggable","_attachEvents","_navigatable","_tooltip","selectable","clearInterval","_unbindView","_selectedView","_moveDraggable","_resizeDraggable","_percentDraggable","_dependencyDraggable","touch","off","_findNext","next","_findFirst","_findLast","_findPrev","prev","_scrollTasks","timelineWrapper","timelineScroll","on","e","newTask","target","handled","keyCode","HOME","END","DOWN","UP","focus","LEFT","altKey","hasClass","setTimeout","select","RIGHT","ENTER","stopPropagation","DELETE","preventDefault","calculatedRowHeight","calculatedCellHeight","gridContentWrap","_calculatedSize","Tree","view","isSettings","defaultView","selected","_selectedViewName","_selectView","action","_initializeView","_viewByIndex","getter","window","Error","newRange","newDate","prefix","_range","sort","toArray","_render","_tasks","_taskByUid","currentStart","startOffset","cleanUp","dragInProgress","move","Draggable","distance","filter","holdToDrag","mobileOS","ignore","currentTarget","parent","location","throttle","updateHintDate","userEvents","currentEnd","taskElementOffset","timelineOffset","originalPercentWidth","maxPercentWidth","currentPercentComplete","updateElement","siblings","initialDelta","currentWidth","min","originalHandle","startX","startY","hoveredHandle","hoveredTask","removeClass","hovered","origin","toggleHandles","toggleClass","elementOffset","tablesOffset","elementUnderCursor","currentX","currentY","fromStart","toStart","predecessorElement","successorElement","ctrlKey","document","elementFromPoint","clientX","clientY","click","selectDependency","clearSelection","taskWrapActive","selectedDependency","dependencyDestroy","kendoTouch","doubletap","currentMousePosition","tooltipOptions","mouseMoveHandler","visible","relatedTarget","currentPosition","client","_offsetTooltipTimeout","_plannedTooltipTimeout","_setPlanned","jQuery"],"sources":["kendo.gantt.timeline.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.dom.js'), require('kendo.touch.js'), require('kendo.draganddrop.js'), require('kendo.icons.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.dom', 'kendo.touch', 'kendo.draganddrop', 'kendo.icons'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendogantt = global.kendogantt || {}, global.kendogantt.timeline = global.kendogantt.timeline || {}, global.kendogantt.timeline.js = factory()));\n})(this, (function () {\n var __meta__ = {\n id: \"gantt.timeline\",\n name: \"Gantt Timeline\",\n category: \"web\",\n description: \"The Gantt Timeline\",\n depends: [ \"dom\", \"touch\", \"draganddrop\", \"icons\" ],\n hidden: true\n };\n\n (function($) {\n\n var Widget = kendo.ui.Widget;\n var kendoDomElement = kendo.dom.element;\n var kendoTextElement = kendo.dom.text;\n var kendoHtmlElement = kendo.dom.html;\n var isPlainObject = $.isPlainObject;\n var outerWidth = kendo._outerWidth;\n var outerHeight = kendo._outerHeight;\n var extend = $.extend;\n var isRtl = false;\n var keys = kendo.keys;\n var Query = kendo.data.Query;\n var STRING = \"string\";\n var NS = \".kendoGanttTimeline\";\n var CLICK = \"click\";\n var DBLCLICK = \"dblclick\";\n var MOUSEMOVE = \"mousemove\";\n var MOUSEENTER = \"mouseenter\";\n var MOUSELEAVE = \"mouseleave\";\n var KEYDOWN = \"keydown\";\n var DOT = \".\";\n var TIME_HEADER_TEMPLATE = function (ref) {\n var start = ref.start;\n\n return kendo.toString(start, 't');\n };\n var DAY_HEADER_TEMPLATE = function (ref) {\n var start = ref.start;\n\n return kendo.toString(start, 'ddd M/dd');\n };\n var WEEK_HEADER_TEMPLATE = function (ref) {\n var start = ref.start;\n var end = ref.end;\n\n return ((kendo.toString(start, 'ddd M/dd')) + \" - \" + (kendo.toString(kendo.date.addDays(end, -1), 'ddd M/dd')));\n };\n var MONTH_HEADER_TEMPLATE = function (ref) {\n var start = ref.start;\n\n return kendo.toString(start, 'MMM');\n };\n var YEAR_HEADER_TEMPLATE = function (ref) {\n var start = ref.start;\n\n return kendo.toString(start, 'yyyy');\n };\n var RESIZE_HINT = function (ref) {\n var styles = ref.styles;\n\n return \"
\" +\n \"
\" +\n '
';\n };\n var RESIZE_TOOLTIP_TEMPLATE = function (ref) {\n var styles = ref.styles;\n var messages = ref.messages;\n var start = ref.start;\n var end = ref.end;\n var format = ref.format;\n\n return \"
\" +\n \"
\" +\n \"
\" + (kendo.htmlEncode(messages.start)) + \": \" + (kendo.toString(start, format)) + \"
\" +\n \"
\" + (kendo.htmlEncode(messages.end)) + \": \" + (kendo.toString(end, format)) + \"
\" +\n '
' +\n '
';\n };\n var PERCENT_RESIZE_TOOLTIP_TEMPLATE = function (ref) {\n var styles = ref.styles;\n var text = ref.text;\n\n return \"
\" +\n \"
\" + text + \"%
\" +\n \"
\" +\n '
';\n };\n var TASK_TOOLTIP_TEMPLATE = function (ref) {\n var styles = ref.styles;\n var task = ref.task;\n var messages = ref.messages;\n\n return \"
\" +\n \"\" + (kendo.htmlEncode(task.title)) + \"\" +\n \"
\" + (kendo.toString(task.percentComplete, \"p0\")) + \"
\" +\n \"' +\n '
';\n };\n var OFFSET_TOOLTIP_TEMPLATE = function (ref) {\n var offsetPrefix = ref.offsetPrefix;\n var offsetText = ref.offsetText;\n\n return (\"\" + offsetPrefix + \": \" + offsetText + \"\");\n };\n var PLANNED_TOOLTIP_TEMPLATE = function (ref) {\n var plannedStart = ref.plannedStart;\n var plannedEnd = ref.plannedEnd;\n var startDate = ref.startDate;\n var endDate = ref.endDate;\n\n return '
' +\n \"
\" + plannedStart + \": \" + startDate + \"
\" +\n \"
\" + plannedEnd + \": \" + endDate + \"
\" +\n '
';\n };\n var SIZE_CALCULATION_TEMPLATE = \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"
 
\";\n\n var defaultViews = {\n day: {\n type: \"kendo.ui.GanttDayView\"\n },\n week: {\n type: \"kendo.ui.GanttWeekView\"\n },\n month: {\n type: \"kendo.ui.GanttMonthView\"\n },\n year: {\n type: \"kendo.ui.GanttYearView\"\n }\n };\n\n function trimOptions(options) {\n delete options.name;\n delete options.prefix;\n delete options.views;\n\n return options;\n }\n\n function getWorkDays(options) {\n var workDays = [];\n var dayIndex = options.workWeekStart;\n\n workDays.push(dayIndex);\n\n while (options.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 blurActiveElement() {\n var activeElement = kendo._activeElement();\n\n if (activeElement && activeElement.nodeName.toLowerCase() !== \"body\") {\n $(activeElement).trigger(\"blur\");\n }\n }\n\n var viewStyles = {\n alt: \"k-alt k-table-row k-table-alt-row\",\n reset: \"k-reset\",\n nonWorking: \"k-nonwork-hour\",\n header: \"k-header k-table-td\",\n gridHeader: \"k-grid-header\",\n gridHeaderWrap: \"k-grid-header-wrap\",\n gridContent: \"k-grid-content\",\n tasksWrapper: \"k-gantt-tables\",\n rowsTable: \"k-gantt-rows\",\n columnsTable: \"k-gantt-columns\",\n tasksTable: \"k-gantt-tasks\",\n dependenciesWrapper: \"k-gantt-dependencies\",\n resource: \"k-resource\",\n resourceAlt: \"k-resource k-alt\",\n headerTable: \"k-grid-header-table k-table k-table-md\",\n table: \"k-table k-table-md\",\n tbody: \"k-table-tbody\",\n tableRow: \"k-table-row\",\n tableCell: \"k-table-td\",\n task: \"k-task\",\n taskSingle: \"k-task-single\",\n taskMilestone: \"k-task-milestone\",\n taskSummary: \"k-task-summary\",\n taskWrap: \"k-task-wrap\",\n taskMilestoneWrap: \"k-milestone-wrap\",\n taskSummaryWrap: \"k-summary-wrap\",\n taskPlanned: \"k-task-planned\",\n taskPlannedMoment: \"k-task-moment\",\n taskPlannedDuration: \"k-task-duration\",\n taskPlannedMomentLeft: \"k-moment-left\",\n taskAdvanced: \"k-task-advanced\",\n taskDelayed: \"k-task-delayed\",\n taskOffset: \"k-task-offset\",\n taskOffsetWrap: \"k-task-offset-wrap\",\n taskInnerWrap: \"k-task-inner-wrap\",\n resourcesWrap: \"k-resources-wrap\",\n taskDot: \"k-task-dot\",\n taskDotStart: \"k-task-start\",\n taskDotEnd: \"k-task-end\",\n taskDragHandle: \"k-task-draghandle\",\n taskContent: \"k-task-content\",\n taskTemplate: \"k-task-template\",\n taskActions: \"k-task-actions\",\n taskDelete: \"k-task-delete\",\n taskComplete: \"k-task-complete\",\n taskDetails: \"k-task-details\",\n taskDetailsPercent: \"k-task-pct\",\n link: \"k-link\",\n iconDelete: \"x\",\n taskResizeHandle: \"k-resize-handle\",\n taskResizeHandleWest: \"k-resize-w\",\n taskResizeHandleEast: \"k-resize-e\",\n taskSummaryProgress: \"k-task-summary-progress\",\n taskSummaryComplete: \"k-task-summary-complete\",\n line: \"k-gantt-line\",\n lineHorizontal: \"k-gantt-line-h\",\n lineVertical: \"k-gantt-line-v\",\n arrowWest: \"k-arrow-w\",\n arrowEast: \"k-arrow-e\",\n dragHint: \"k-drag-hint\",\n dependencyHint: \"k-gantt-dependency-hint\",\n tooltipWrapper: \"k-tooltip\",\n tooltipContent: \"k-tooltip-content\",\n tooltipCallout: \"k-callout k-callout-s\",\n callout: \"k-callout\",\n marquee: \"k-marquee k-gantt-marquee\",\n marqueeColor: \"k-marquee-color\",\n offsetTooltipAdvanced: \"k-offset-tooltip-advanced\",\n offsetTooltipDelay: \"k-offset-tooltip-delayed\",\n plannedTooltip: \"k-planned-tooltip\"\n };\n\n var GanttView = kendo.ui.GanttView = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n\n this.title = this.options.title || this.options.name;\n\n this.header = this.element.find(DOT + GanttView.styles.gridHeader);\n\n this.content = this.element.find(DOT + GanttView.styles.gridContent);\n\n this.contentWidth = this.content.width();\n\n this._workDays = getWorkDays(this.options);\n\n this._headerTree = options.headerTree;\n\n this._taskTree = options.taskTree;\n\n this._taskTemplate = options.taskTemplate ?\n kendo.template(options.taskTemplate, extend({}, kendo.Template, options.templateSettings)) :\n null;\n\n this._dependencyTree = options.dependencyTree;\n\n this._taskCoordinates = {};\n\n this._currentTime();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n clearTimeout(this._tooltipTimeout);\n\n this.headerRow = null;\n this.header = null;\n this.content = null;\n\n this._dragHint = null;\n this._resizeHint = null;\n this._resizeTooltip = null;\n this._taskTooltip = null;\n this._percentCompleteResizeTooltip = null;\n\n this._headerTree = null;\n this._taskTree = null;\n this._dependencyTree = null;\n },\n\n options: {\n showWorkHours: false,\n showWorkDays: false,\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 hourSpan: 1,\n slotSize: 100,\n currentTimeMarker: {\n updateInterval: 10000\n }\n },\n\n renderLayout: function() {\n this._slots = this._createSlots();\n\n this._tableWidth = this._calculateTableWidth();\n\n this.createLayout(this._layout());\n\n this._slotDimensions();\n\n this._adjustHeight();\n\n this.content.find(DOT + GanttView.styles.dependenciesWrapper).width(this._tableWidth);\n },\n\n _adjustHeight: function() {\n if (this.content) {\n this.content.height(this.element.height() - outerHeight(this.header));\n }\n },\n\n createLayout: function(rows) {\n var headers = this._headers(rows);\n var colgroup = this._colgroup();\n var tree = this._headerTree;\n var header = kendoDomElement(\"tbody\", { className: GanttView.styles.tbody }, headers);\n var table = kendoDomElement(\"table\", { className: GanttView.styles.headerTable, style: { width: this._tableWidth + \"px\" }, role: \"presentation\" }, [colgroup, header]);\n\n tree.render([table]);\n\n this.headerRow = this.header.find(\"table\").first().find(\"tr\").last();\n },\n\n _slotDimensions: function() {\n var headers = this.headerRow[0].children;\n var slots = this._timeSlots();\n var slot;\n var header;\n\n for (var i = 0, length = headers.length; i < length; i++) {\n header = headers[i];\n slot = slots[i];\n\n slot.offsetLeft = header.offsetLeft;\n slot.offsetWidth = header.offsetWidth;\n }\n },\n\n render: function(tasks) {\n var taskCount = tasks.length;\n var styles = GanttView.styles;\n var contentTable;\n var rowsTable = this._rowsTable(taskCount);\n var columnsTable = this._columnsTable(taskCount);\n var tasksTable = this._tasksTable(tasks);\n var currentTimeMarker = this.options.currentTimeMarker;\n var calculatedSize = this.options.calculatedSize;\n var totalHeight;\n\n this._taskTree.render([rowsTable, columnsTable, tasksTable]);\n\n contentTable = this.content.find(DOT + styles.rowsTable);\n\n if (calculatedSize) {\n totalHeight = calculatedSize.row * tasks.length;\n this.content.find(DOT + styles.tasksTable).height(totalHeight);\n contentTable.height(totalHeight);\n }\n\n this._contentHeight = contentTable.height();\n this._rowHeight = calculatedSize ? calculatedSize.row : this._contentHeight / contentTable.find(\"tr\").length;\n\n this.content.find(DOT + styles.columnsTable).height(this._contentHeight);\n\n if (currentTimeMarker !== false && currentTimeMarker.updateInterval !== undefined) {\n this._renderCurrentTime();\n }\n },\n\n _rowsTable: function(rowCount) {\n var rows = [];\n var row;\n var styles = GanttView.styles;\n var attributes = [{ className: styles.tableRow }, { className: styles.alt }];\n\n for (var i = 0; i < rowCount; i++) {\n row = kendoDomElement(\"tr\", attributes[i % 2], [\n kendoDomElement(\"td\", { className: styles.tableCell }, [\n kendoTextElement(\"\\u00a0\")\n ])\n ]);\n\n rows.push(row);\n }\n\n return this._createTable(1, rows, { className: styles.rowsTable + \" k-grid-table \" + styles.table });\n },\n\n _columnsTable: function() {\n var cells = [];\n var row;\n var styles = GanttView.styles;\n var slots = this._timeSlots();\n var slotsCount = slots.length;\n var slot;\n var slotSpan;\n var totalSpan = 0;\n var attributes;\n\n for (var i = 0; i < slotsCount; i++) {\n slot = slots[i];\n\n attributes = { className: styles.tableCell };\n\n slotSpan = slot.span;\n\n totalSpan += slotSpan;\n\n if (slotSpan !== 1) {\n attributes.colspan = slotSpan;\n }\n\n if (slot.isNonWorking) {\n attributes.className += \" \" + styles.nonWorking;\n }\n\n cells.push(kendoDomElement(\"td\", attributes, [\n kendoTextElement(\"\\u00a0\")\n ]));\n }\n\n row = kendoDomElement(\"tr\", { className: styles.tableRow }, cells);\n\n return this._createTable(totalSpan, [row], { className: styles.columnsTable + \" \" + styles.table });\n },\n\n _tasksTable: function(tasks) {\n var rows = [];\n var row;\n var cell;\n var position;\n var plannedPosition;\n var task;\n var styles = GanttView.styles;\n var coordinates = this._taskCoordinates = {};\n var size = this._calculateMilestoneWidth();\n var milestoneWidth = Math.round(size.width);\n var resourcesField = this.options.resourcesField;\n var className = [styles.resource, styles.resourceAlt];\n var calculatedSize = this.options.calculatedSize;\n var resourcesPosition;\n var resourcesMargin = this._calculateResourcesMargin();\n var taskBorderWidth = this._calculateTaskBorderWidth();\n var resourceStyle;\n var showPlannedTasks = this.options.showPlannedTasks;\n var attributes = [{ className: styles.tableRow }, { className: styles.alt }];\n var taskElement;\n\n var addCoordinates = function(rowIndex) {\n var taskLeft;\n var taskRight;\n\n taskLeft = position.left;\n taskRight = taskLeft + position.width;\n\n if (task.isMilestone()) {\n taskLeft -= milestoneWidth / 2;\n taskRight = taskLeft + milestoneWidth;\n }\n\n coordinates[task.id] = {\n start: taskLeft,\n end: taskRight,\n rowIndex: rowIndex\n };\n };\n\n for (var i = 0, l = tasks.length; i < l; i++) {\n task = tasks[i];\n\n position = this._taskPosition(task);\n\n if (showPlannedTasks) {\n plannedPosition = this._taskPositionPlanned(task);\n plannedPosition.borderWidth = taskBorderWidth;\n }\n position.borderWidth = taskBorderWidth;\n\n row = kendoDomElement(\"tr\", attributes[i % 2]);\n cell = kendoDomElement(\"td\", { className: styles.tableCell });\n\n if (task.start <= this.end && task.end >= this.start) {\n taskElement = this._renderTask(tasks[i], position, plannedPosition);\n if (this.options.navigatable) {\n taskElement.children[0].attr[\"tabIndex\"] = i ? -1 : 0;\n }\n cell.children.push(taskElement);\n\n if (task[resourcesField] && task[resourcesField].length) {\n if (isRtl) {\n resourcesPosition = this._tableWidth - position.left;\n } else {\n resourcesPosition = Math.max((position.width || size.clientWidth), 0) + position.left;\n }\n\n resourceStyle = {\n width: (this._tableWidth - (resourcesPosition + resourcesMargin)) + \"px\"\n };\n\n resourceStyle[isRtl ? \"right\" : \"left\"] = resourcesPosition + \"px\";\n\n if (calculatedSize) {\n resourceStyle.height = calculatedSize.cell + \"px\";\n }\n\n cell.children.push(kendoDomElement(\"div\",\n {\n className: styles.resourcesWrap,\n style: resourceStyle\n },\n this._renderResources(task[resourcesField], className[i % 2]))\n );\n }\n\n addCoordinates(i);\n }\n row.children.push(cell);\n rows.push(row);\n }\n\n return this._createTable(1, rows, { className: GanttView.styles.tasksTable + \" \" + styles.table });\n },\n\n _createTable: function(colspan, rows, styles) {\n var cols = [];\n var colgroup;\n var tbody;\n\n for (var i = 0; i < colspan; i++) {\n cols.push(kendoDomElement(\"col\"));\n }\n\n colgroup = kendoDomElement(\"colgroup\", null, cols);\n\n tbody = kendoDomElement(\"tbody\", { className: GanttView.styles.tbody }, rows);\n\n if (!styles.style) {\n styles.style = {};\n }\n\n styles.style.width = this._tableWidth + \"px\";\n styles.role = \"presentation\";\n\n return kendoDomElement(\"table\", styles, [colgroup, tbody]);\n },\n\n _calculateTableWidth: function() {\n var slots = this._timeSlots();\n var maxSpan = 0;\n var totalSpan = 0;\n var currentSpan;\n var tableWidth;\n\n for (var i = 0, length = slots.length; i < length; i++) {\n currentSpan = slots[i].span;\n\n totalSpan += currentSpan;\n\n if (currentSpan > maxSpan) {\n maxSpan = currentSpan;\n }\n }\n\n tableWidth = Math.round((totalSpan * this.options.slotSize) / maxSpan);\n\n return tableWidth;\n },\n\n _calculateMilestoneWidth: function() {\n var size;\n var className = GanttView.styles.task + \" \" + GanttView.styles.taskMilestone;\n var boundingClientRect;\n var milestone = $((\"
\")).css({\n visibility: \"hidden\",\n position: \"absolute\"\n });\n\n this.content.append(milestone);\n\n boundingClientRect = milestone[0].getBoundingClientRect();\n\n size = {\n \"width\": boundingClientRect.right - boundingClientRect.left,\n \"clientWidth\": milestone[0].clientWidth\n };\n\n milestone.remove();\n\n return size;\n },\n\n _calculateResourcesMargin: function() {\n var margin;\n var wrapper = $((\"
\")).css({\n visibility: \"hidden\",\n position: \"absolute\"\n });\n\n this.content.append(wrapper);\n\n margin = parseInt(wrapper.css(isRtl ? \"margin-right\" : \"margin-left\"), 10);\n\n wrapper.remove();\n\n return margin;\n },\n\n _calculateTaskBorderWidth: function() {\n var width;\n var className = GanttView.styles.task + \" \" + GanttView.styles.taskSingle;\n var computedStyle;\n var task = $((\"
\")).css({\n visibility: \"hidden\",\n position: \"absolute\"\n });\n\n this.content.append(task);\n\n computedStyle = kendo.getComputedStyles(task[0], [\"border-left-width\"]);\n\n width = parseFloat(computedStyle[\"border-left-width\"], 10);\n\n task.remove();\n\n return width;\n },\n\n _renderTask: function(task, position, plannedPosition) {\n var editable = this.options.editable;\n var taskLeft = position.left;\n var styles = GanttView.styles;\n var wrapClassName = styles.taskWrap;\n var calculatedSize = this.options.calculatedSize;\n var dragHandleStyle = {};\n var taskWrapAttr = {\n className: wrapClassName,\n style: { left: taskLeft + \"px\" }\n };\n var children = [];\n var endTaskDotRight = 0;\n var taskFullWidth = position.width;\n var taskWrapper, taskElement, progressHandleOffset, plannedElement;\n var endTaskDotLeft, taskOffsetWrap, offsetElement, offsetWidth;\n\n if (calculatedSize) {\n taskWrapAttr.style.height = calculatedSize.cell + \"px\";\n }\n\n if (plannedPosition) {\n if (task.isMilestone()) {\n plannedElement = this._renderPlannedMilestone(position, plannedPosition);\n } else {\n plannedElement = this._renderPlannedSingleTask(position, plannedPosition, task);\n }\n\n children.push(plannedElement);\n\n if (isRtl && plannedPosition.left <= position.left) {\n taskWrapAttr.style.left = plannedPosition.left + \"px\";\n }\n }\n\n if (task.summary) {\n taskElement = this._renderSummary(task, position, plannedPosition);\n taskWrapAttr.className += \" \" + styles.taskSummaryWrap;\n } else if (task.isMilestone()) {\n taskElement = this._renderMilestone(task, position);\n taskWrapAttr.className += \" \" + styles.taskMilestoneWrap;\n } else {\n taskElement = this._renderSingleTask(task, position, plannedPosition);\n }\n\n if (plannedPosition && !task.isMilestone() && task.plannedStart < task.end && task.plannedEnd > task.start && task.plannedEnd < task.end) {\n if (isRtl) {\n taskFullWidth = position.left + position.width - plannedPosition.left;\n } else {\n taskFullWidth = plannedPosition.left + plannedPosition.width - position.left;\n }\n\n if (isRtl) {\n offsetWidth = plannedPosition.left - position.left;\n } else {\n offsetWidth = position.left + position.width - (plannedPosition.left + plannedPosition.width);\n }\n\n offsetElement = kendoDomElement(\"div\", {\n className: styles.taskOffset,\n style: { width: offsetWidth - 2 * plannedPosition.borderWidth + \"px\" }\n });\n\n if (editable && editable.resize !== false && editable.update !== false && !task.summary) {\n if (editable.destroy !== false) {\n offsetElement.children.push(kendoDomElement(\"span\", { className: styles.taskActions, \"aria-hidden\": \"true\" }, [\n kendoDomElement(\"a\", { className: styles.link + \" \" + styles.taskDelete, href: \"#\", \"aria-label\": \"Delete\" }, [\n kendoDomElement($(kendo.ui.icon(styles.iconDelete))[0])\n ])\n ]));\n }\n\n if (isRtl) {\n offsetElement.children.push(kendoDomElement(\"span\", {\n className: styles.taskResizeHandle + \" \" + styles.taskResizeHandleWest,\n style: {\n right: position.width - 5 + \"px\"\n }\n }));\n } else {\n offsetElement.children.push(kendoDomElement(\"span\", {\n className: styles.taskResizeHandle + \" \" + styles.taskResizeHandleEast\n }));\n }\n }\n\n taskOffsetWrap = kendoDomElement(\"div\", {\n className: styles.taskOffsetWrap + \" \" + styles.taskInnerWrap\n }, [ taskElement, offsetElement ]);\n\n children.push(taskOffsetWrap);\n } else if (plannedPosition) {\n children.push(kendoDomElement(\"div\", {\n className: styles.taskInnerWrap\n }, [ taskElement ]));\n } else {\n children.push(taskElement);\n }\n\n taskWrapper = kendoDomElement(\"div\", taskWrapAttr, children);\n\n if (editable && editable.dependencyCreate !== false) {\n if (plannedPosition && task.plannedEnd > task.end) {\n endTaskDotRight = plannedPosition.left + plannedPosition.width - position.left - position.width - 3 + \"px\";\n }\n\n taskWrapper.children.push(kendoDomElement(\"div\", {\n className: styles.taskDot + \" \" + styles.taskDotStart\n }));\n\n if (isRtl) {\n endTaskDotRight = \"auto\";\n if (plannedPosition && task.plannedEnd > task.end) {\n endTaskDotLeft = position.left - plannedPosition.left + \"px\";\n }\n }\n\n taskWrapper.children.push(kendoDomElement(\"div\", {\n className: styles.taskDot + \" \" + styles.taskDotEnd,\n style: { right: endTaskDotRight, left: endTaskDotLeft }\n }));\n }\n\n if (!task.summary && !task.isMilestone() && editable && editable.dragPercentComplete !== false && editable.update !== false && this._taskTemplate === null) {\n progressHandleOffset = Math.round(taskFullWidth * task.percentComplete);\n\n dragHandleStyle[isRtl ? \"right\" : \"left\"] = progressHandleOffset + \"px\";\n taskWrapper.children.push(kendoDomElement(\"div\", { className: styles.taskDragHandle, style: dragHandleStyle }));\n }\n\n return taskWrapper;\n },\n\n _renderSingleTask: function(task, position, plannedPosition) {\n var styles = GanttView.styles;\n var progressWidth;\n var taskChildren = [];\n var taskContent;\n var editable = this.options.editable;\n var classes = styles.task + \" \" + styles.taskSingle;\n var widthExceptDelay = position.width;\n\n if (plannedPosition) {\n if (task.plannedEnd && task.plannedEnd <= task.start) {\n classes += \" \" + styles.taskDelayed;\n } else if (task.plannedEnd && task.plannedEnd > task.end) {\n classes += \" \" + styles.taskAdvanced;\n } else if (task.plannedEnd && task.plannedEnd < task.end) {\n if (!isRtl) {\n widthExceptDelay = widthExceptDelay - (position.left + position.width - plannedPosition.left - plannedPosition.width);\n } else {\n widthExceptDelay = widthExceptDelay + position.left - plannedPosition.left;\n }\n }\n }\n\n progressWidth = Math.round(widthExceptDelay * task.percentComplete);\n\n if (this._taskTemplate !== null) {\n taskContent = kendoHtmlElement(this._taskTemplate(task));\n } else {\n taskContent = kendoTextElement(task.title);\n taskChildren.push(kendoDomElement(\"div\", { className: styles.taskComplete, style: { width: progressWidth + \"px\" }, \"aria-hidden\": \"true\" }));\n }\n\n var content = kendoDomElement(\"div\", { className: styles.taskContent }, [\n kendoDomElement(\"div\", { className: styles.taskTemplate }, [\n taskContent\n ])\n ]);\n\n taskChildren.push(content);\n\n if (editable) {\n if (editable.destroy !== false && (!plannedPosition || !task.plannedEnd || (task.end <= task.plannedEnd || task.start >= task.plannedEnd))) {\n content.children.push(kendoDomElement(\"span\", { className: styles.taskActions, \"aria-hidden\": \"true\" }, [\n kendoDomElement(\"a\", { className: styles.link + \" \" + styles.taskDelete, href: \"#\", \"aria-label\": \"Delete\" }, [\n kendoDomElement($(kendo.ui.icon(styles.iconDelete))[0])\n ])\n ]));\n }\n\n if (editable.resize !== false && editable.update !== false) {\n content.children.push(kendoDomElement(\"span\", {\n className: styles.taskResizeHandle + \" \" + styles.taskResizeHandleWest\n }));\n content.children.push(kendoDomElement(\"span\", {\n className: styles.taskResizeHandle + \" \" + styles.taskResizeHandleEast\n }));\n }\n }\n\n var element = kendoDomElement(\"div\", {\n className: classes, \"data-uid\": task.uid, role: \"treeitem\", style:\n { width: Math.max((widthExceptDelay - position.borderWidth * 2), 0) + \"px\" }\n }, taskChildren);\n\n return element;\n },\n\n _renderMilestone: function(task) {\n var styles = GanttView.styles;\n var classes = styles.task + \" \" + styles.taskMilestone;\n var showPlanned = this.options.showPlannedTasks;\n\n if (showPlanned && task.plannedEnd && task.plannedEnd < task.start) {\n classes += \" \" + styles.taskDelayed;\n } else if (task.plannedStart && task.plannedStart > task.end) {\n classes += \" \" + styles.taskAdvanced;\n }\n\n return kendoDomElement(\"div\", { className: classes, \"data-uid\": task.uid, role: \"treeitem\", \"aria-label\": task.title });\n },\n\n _renderSummary: function(task, position, plannedPosition) {\n var styles = GanttView.styles;\n var widthExceptDelay = position.width;\n var progressWidth;\n var classes = styles.task + \" \" + styles.taskSummary;\n\n if (plannedPosition) {\n if (task.plannedEnd && task.plannedEnd <= task.start) {\n classes += \" \" + styles.taskDelayed;\n } else if (task.plannedEnd && task.plannedEnd > task.end) {\n classes += \" \" + styles.taskAdvanced;\n } else if (task.plannedEnd && task.plannedEnd < task.end) {\n if (!isRtl) {\n widthExceptDelay = widthExceptDelay - (position.left + position.width - plannedPosition.left - plannedPosition.width);\n } else {\n widthExceptDelay = widthExceptDelay + position.left - plannedPosition.left;\n }\n }\n }\n\n progressWidth = Math.round(widthExceptDelay * task.percentComplete);\n\n var element = kendoDomElement(\"div\", { className: classes, \"data-uid\": task.uid, role: \"treeitem\", \"aria-label\": task.title, style: { width: widthExceptDelay + \"px\" } }, [\n kendoDomElement(\"div\", { className: styles.taskSummaryProgress, style: { width: progressWidth + \"px\" } }, [\n kendoDomElement(\"div\", { className: styles.taskSummaryComplete, style: { width: position.width + \"px\" } })\n ])\n ]);\n\n return element;\n },\n\n _renderPlannedSingleTask: function(position, plannedPosition, task) {\n var styles = GanttView.styles;\n var children = [];\n var style = {};\n\n if (task.plannedStart && task.plannedEnd) {\n children.push(kendoDomElement(\"div\", { className: styles.taskPlannedMoment + \" \" + styles.taskPlannedMomentLeft }));\n children.push(kendoDomElement(\"div\", {\n className: styles.taskPlannedDuration, style:\n { width: Math.max((plannedPosition.width - plannedPosition.borderWidth * 2 - 16), 0) + \"px\" }\n }));\n children.push(kendoDomElement(\"div\", { className: styles.taskPlannedMoment }));\n } else if (task.plannedStart) {\n children.push(kendoDomElement(\"div\", { className: styles.taskPlannedMoment + \" \" + styles.taskPlannedMomentLeft }));\n } else if (task.plannedEnd) {\n children.push(kendoDomElement(\"div\", { className: styles.taskPlannedMoment, style: { \"margin-left\": Math.max(plannedPosition.width - 5, 0) + \"px\" } }));\n }\n\n if (isRtl) {\n style = {\n \"margin-right\": position.left - plannedPosition.left + position.width - plannedPosition.width + \"px\"\n };\n } else {\n style = {\n \"margin-left\": plannedPosition.left - position.left + \"px\"\n };\n }\n\n var element = kendoDomElement(\"div\", {\n className: styles.taskPlanned,\n style: style\n }, children);\n\n return element;\n },\n\n _renderPlannedMilestone: function(position, plannedPosition) {\n var styles = GanttView.styles;\n var style = {};\n var element;\n\n if (isRtl) {\n style = {\n \"margin-right\": position.left - plannedPosition.left + \"px\"\n };\n } else {\n style = {\n \"margin-left\": plannedPosition.left - position.left + \"px\"\n };\n }\n\n element = kendoDomElement(\"div\", {\n className: styles.taskPlanned,\n style: style\n }, [\n kendoDomElement(\"div\", { className: styles.taskPlannedMoment })\n ]);\n\n return element;\n },\n\n _renderResources: function(resources, className) {\n var children = [];\n var resource;\n\n for (var i = 0, length = resources.length; i < length; i++) {\n resource = resources[i];\n children.push(kendoDomElement(\"span\", {\n className: className,\n style: {\n \"color\": resource.get(\"color\")\n }\n }, [kendoTextElement(resource.get(\"name\"))]));\n }\n\n if (isRtl) {\n children.reverse();\n }\n\n return children;\n },\n\n _taskPosition: function(task) {\n var round = Math.round;\n\n var startLeft = round(this._offset(isRtl ? task.end : task.start));\n var endLeft = round(this._offset(isRtl ? task.start : task.end));\n\n return { left: startLeft, width: endLeft - startLeft };\n },\n\n _taskPositionPlanned: function(task) {\n var round = Math.round;\n\n var startLeft = round(this._offset(isRtl ? task.plannedEnd : task.plannedStart));\n var endLeft = round(this._offset(isRtl ? task.plannedStart : task.plannedEnd));\n\n return { left: startLeft, width: endLeft - startLeft };\n },\n\n _offset: function(date) {\n var slots = this._timeSlots();\n var slot;\n var startOffset;\n var slotDuration;\n var slotOffset = 0;\n var startIndex;\n\n if (!slots.length) {\n return 0;\n }\n\n startIndex = this._slotIndex(\"start\", date);\n\n slot = slots[startIndex];\n\n if (slot.end < date) {\n slotOffset = slot.offsetWidth;\n } else if (slot.start <= date) {\n startOffset = date - slot.start;\n slotDuration = slot.end - slot.start;\n slotOffset = (startOffset / slotDuration) * slot.offsetWidth;\n }\n\n if (isRtl) {\n slotOffset = (slot.offsetWidth + 1) - slotOffset; // Add one pixel for border\n }\n\n return slot.offsetLeft + slotOffset;\n },\n\n _slotIndex: function(field, value, reverse) {\n var slots = this._timeSlots();\n var startIdx = 0;\n var endIdx = slots.length - 1;\n var middle;\n\n if (reverse) {\n slots = [].slice.call(slots).reverse();\n }\n\n do {\n middle = Math.ceil((endIdx + startIdx) / 2);\n\n if (slots[middle][field] < value) {\n startIdx = middle;\n } else {\n if (middle === endIdx) {\n middle--;\n }\n\n endIdx = middle;\n }\n } while (startIdx !== endIdx);\n\n if (reverse) {\n startIdx = (slots.length - 1) - startIdx;\n }\n\n return startIdx;\n },\n\n _timeByPosition: function(x, snap, snapToEnd) {\n var slot = this._slotByPosition(x);\n\n if (snap) {\n return snapToEnd ? slot.end : slot.start;\n }\n\n var offsetLeft = x - this.element.find(DOT + GanttView.styles.tasksTable).offset().left;\n var duration = slot.end - slot.start;\n var slotOffset = offsetLeft - slot.offsetLeft;\n\n if (isRtl) {\n slotOffset = slot.offsetWidth - slotOffset;\n }\n\n return new Date(slot.start.getTime() + (duration * (slotOffset / slot.offsetWidth)));\n },\n\n _slotByPosition: function(x) {\n var offsetLeft = x - this.element.find(DOT + GanttView.styles.tasksTable).offset().left;\n var slotIndex = this._slotIndex(\"offsetLeft\", offsetLeft, isRtl);\n\n return this._timeSlots()[slotIndex];\n },\n\n _renderDependencies: function(dependencies) {\n var elements = [];\n var tree = this._dependencyTree;\n\n for (var i = 0, l = dependencies.length; i < l; i++) {\n elements.push.apply(elements, this._renderDependency(dependencies[i]));\n }\n\n tree.render(elements);\n },\n\n _renderDependency: function(dependency) {\n var predecessor = this._taskCoordinates[dependency.predecessorId];\n var successor = this._taskCoordinates[dependency.successorId];\n var elements;\n var method;\n\n if (!predecessor || !successor) {\n return [];\n }\n\n method = \"_render\" + [\"FF\", \"FS\", \"SF\", \"SS\"][isRtl ? 3 - dependency.type : dependency.type];\n\n elements = this[method](predecessor, successor);\n\n for (var i = 0, length = elements.length; i < length; i++) {\n elements[i].attr[\"data-uid\"] = dependency.uid;\n }\n\n return elements;\n },\n\n _renderFF: function(from, to) {\n var lines = this._dependencyFF(from, to, false);\n\n lines[lines.length - 1].children[0] = this._arrow(true);\n\n return lines;\n },\n\n _renderSS: function(from, to) {\n var lines = this._dependencyFF(to, from, true);\n\n lines[0].children[0] = this._arrow(false);\n\n return lines.reverse();\n },\n\n _renderFS: function(from, to) {\n var lines = this._dependencyFS(from, to, false);\n\n lines[lines.length - 1].children[0] = this._arrow(false);\n\n return lines;\n },\n\n _renderSF: function(from, to) {\n var lines = this._dependencyFS(to, from, true);\n\n lines[0].children[0] = this._arrow(true);\n\n return lines.reverse();\n },\n\n _dependencyFF: function(from, to, reverse) {\n var that = this;\n var lines = [];\n var left = 0;\n var top = 0;\n var width = 0;\n var height = 0;\n var dir = reverse ? \"start\" : \"end\";\n var delta;\n var overlap = 2;\n var arrowOverlap = 1;\n var rowHeight = this._rowHeight;\n var minLineWidth = 10;\n var fromTop = from.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n var toTop = to.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n var styles = GanttView.styles;\n\n var addHorizontal = function() {\n lines.push(that._line(styles.line + \" \" + styles.lineHorizontal, { left: left + \"px\", top: top + \"px\", width: width + \"px\" }));\n };\n var addVertical = function() {\n lines.push(that._line(styles.line + \" \" + styles.lineVertical, { left: left + \"px\", top: top + \"px\", height: height + \"px\" }));\n };\n\n left = from[dir];\n top = fromTop;\n width = minLineWidth;\n\n delta = to[dir] - from[dir];\n\n if ((delta) > 0 !== reverse) {\n width = Math.abs(delta) + minLineWidth;\n }\n\n if (reverse) {\n left -= width;\n width -= arrowOverlap;\n addHorizontal();\n } else {\n addHorizontal();\n left += width - overlap;\n }\n\n if (toTop < top) {\n height = top - toTop;\n height += overlap;\n top = toTop;\n addVertical();\n } else {\n height = toTop - top;\n height += overlap;\n addVertical();\n top += (height - overlap);\n }\n\n width = Math.abs(left - to[dir]);\n\n if (!reverse) {\n width -= arrowOverlap;\n left -= width;\n }\n\n addHorizontal();\n\n return lines;\n },\n\n _dependencyFS: function(from, to, reverse) {\n var that = this;\n var lines = [];\n var left = 0;\n var top = 0;\n var width = 0;\n var height = 0;\n var rowHeight = this._rowHeight;\n var minLineHeight = Math.floor(rowHeight / 2);\n var minLineWidth = 10;\n var minDistance = 2 * minLineWidth;\n var delta = to.start - from.end;\n var overlap = 2;\n var arrowOverlap = 1;\n var fromTop = from.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n var toTop = to.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n var styles = GanttView.styles;\n\n var addHorizontal = function() {\n lines.push(that._line(styles.line + \" \" + styles.lineHorizontal, { left: left + \"px\", top: top + \"px\", width: width + \"px\" }));\n };\n var addVertical = function() {\n lines.push(that._line(styles.line + \" \" + styles.lineVertical, { left: left + \"px\", top: top + \"px\", height: height + \"px\" }));\n };\n\n left = from.end;\n top = fromTop;\n width = minLineWidth;\n\n if (reverse) {\n left += arrowOverlap;\n\n if (delta > minDistance) {\n width = delta - (minLineWidth - overlap);\n }\n\n width -= arrowOverlap;\n }\n\n addHorizontal();\n left += width - overlap;\n\n if ((delta) <= minDistance) {\n height = reverse ? Math.abs(toTop - fromTop) - minLineHeight : minLineHeight;\n\n if (toTop < fromTop) {\n top -= height;\n\n height += overlap;\n\n addVertical();\n } else {\n addVertical();\n top += height;\n }\n\n width = (from.end - to.start) + minDistance;\n\n if (width < minLineWidth) {\n width = minLineWidth;\n }\n\n left -= width - overlap;\n\n addHorizontal();\n }\n\n if (toTop < fromTop) {\n height = top - toTop;\n top = toTop;\n\n height += overlap;\n\n addVertical();\n } else {\n height = toTop - top;\n addVertical();\n top += height;\n }\n\n width = to.start - left;\n\n if (!reverse) {\n width -= arrowOverlap;\n }\n\n addHorizontal();\n\n return lines;\n },\n\n _line: function(className, styles) {\n return kendoDomElement(\"div\", { className: className, style: styles });\n },\n\n _arrow: function(direction) {\n return kendoDomElement(\"span\", { className: direction ? GanttView.styles.arrowWest : GanttView.styles.arrowEast });\n },\n\n _colgroup: function() {\n var slots = this._timeSlots();\n var count = slots.length;\n var cols = [];\n\n for (var i = 0; i < count; i++) {\n for (var j = 0, length = slots[i].span; j < length; j++) {\n cols.push(kendoDomElement(\"col\"));\n }\n }\n\n return kendoDomElement(\"colgroup\", null, cols);\n },\n\n _createDragHint: function(element) {\n var styles = GanttView.styles;\n var plannedElement;\n\n this._dragHint = element\n .clone()\n .addClass(styles.dragHint)\n .css({\n \"cursor\": \"move\"\n });\n\n plannedElement = this._dragHint.find(DOT + styles.taskPlanned);\n\n plannedElement.css({\n \"visibility\": \"hidden\"\n });\n\n if (isRtl && element.find(DOT + styles.taskAdvanced).length > 0) {\n plannedElement.css({\n \"margin-right\": \"auto\",\n \"width\": 0\n });\n\n this._dragHint.find(DOT + styles.taskDotEnd).css({\n \"left\": 0\n });\n }\n\n element\n .closest(\"td\")\n .append(this._dragHint);\n },\n\n _updateDragHint: function(start) {\n var left = this._offset(start);\n this._dragHint\n .css({\n \"left\": left\n });\n },\n\n _removeDragHint: function() {\n this._dragHint.remove();\n this._dragHint = null;\n },\n\n _createResizeHint: function(task) {\n var styles = GanttView.styles;\n var taskTop = this._taskCoordinates[task.id].rowIndex * this._rowHeight;\n var tooltipHeight;\n var tooltipTop;\n var options = this.options;\n var messages = options.messages;\n\n this._resizeHint = $(RESIZE_HINT({ styles: styles })).css({\n \"top\": 0,\n \"height\": this._contentHeight\n });\n\n this.content.append(this._resizeHint);\n\n this._resizeTooltip = $(RESIZE_TOOLTIP_TEMPLATE({\n styles: styles,\n start: task.start,\n end: task.end,\n messages: messages.views,\n format: options.resizeTooltipFormat\n }))\n .css({\n \"z-index\": \"100002\",\n \"top\": 0,\n \"left\": 0\n });\n\n this.content.append(this._resizeTooltip);\n\n this._resizeTooltipWidth = outerWidth(this._resizeTooltip);\n tooltipHeight = outerHeight(this._resizeTooltip);\n\n tooltipTop = taskTop - tooltipHeight;\n\n if (tooltipTop < 0) {\n tooltipTop = taskTop + this._rowHeight;\n }\n\n this._resizeTooltipTop = tooltipTop;\n },\n\n _updateResizeHint: function(start, end, resizeStart) {\n var left = this._offset(isRtl ? end : start);\n var right = this._offset(isRtl ? start : end);\n var width = right - left;\n var tooltipLeft = (resizeStart !== isRtl) ? left : right;\n var tablesWidth = this._tableWidth - kendo.support.scrollbar();\n var tooltipWidth = this._resizeTooltipWidth;\n var options = this.options;\n var messages = options.messages;\n var tableOffset = this.element.find(DOT + GanttView.styles.tasksTable).offset().left - this.element.find(DOT + GanttView.styles.tasksWrapper).offset().left;\n\n if (isRtl) {\n left += tableOffset;\n }\n\n this._resizeHint\n .css({\n \"left\": left,\n \"width\": width\n });\n\n if (this._resizeTooltip) {\n this._resizeTooltip.remove();\n }\n\n tooltipLeft -= Math.round(tooltipWidth / 2);\n\n if (tooltipLeft < 0) {\n tooltipLeft = 0;\n } else if (tooltipLeft + tooltipWidth > tablesWidth) {\n tooltipLeft = tablesWidth - tooltipWidth;\n }\n\n if (isRtl) {\n tooltipLeft += tableOffset;\n }\n\n this._resizeTooltip = $(RESIZE_TOOLTIP_TEMPLATE({\n styles: GanttView.styles,\n start: start,\n end: end,\n messages: messages.views,\n format: options.resizeTooltipFormat\n }))\n .css({\n \"z-index\": \"100002\",\n \"top\": this._resizeTooltipTop,\n \"left\": tooltipLeft,\n \"min-width\": tooltipWidth\n })\n .appendTo(this.content);\n },\n\n _removeResizeHint: function() {\n this._resizeHint.remove();\n this._resizeHint = null;\n\n this._resizeTooltip.remove();\n this._resizeTooltip = null;\n },\n\n _updatePercentCompleteTooltip: function(top, left, text) {\n this._removePercentCompleteTooltip();\n\n var tooltip = this._percentCompleteResizeTooltip = $(PERCENT_RESIZE_TOOLTIP_TEMPLATE({ styles: GanttView.styles, text: text }));\n kendo.applyStylesFromKendoAttributes(tooltip, [\"z-index\", \"left\"]);\n tooltip.appendTo(this.element);\n\n var tooltipMiddle = Math.round(outerWidth(tooltip) / 2);\n var arrow = tooltip.find(DOT + GanttView.styles.callout);\n var arrowHeight = Math.round(outerWidth(arrow) / 2);\n\n tooltip.css({\n \"top\": top - (outerHeight(tooltip) + arrowHeight),\n \"left\": left - tooltipMiddle\n });\n\n arrow.css(\"left\", tooltipMiddle - arrowHeight);\n },\n\n _removePercentCompleteTooltip: function() {\n if (this._percentCompleteResizeTooltip) {\n this._percentCompleteResizeTooltip.remove();\n }\n\n this._percentCompleteResizeTooltip = null;\n },\n\n _updateDependencyDragHint: function(from, to) {\n this._removeDependencyDragHint();\n\n this._creteDependencyDragHint(from, to);\n },\n\n _creteDependencyDragHint: function(from, to) {\n var styles = GanttView.styles;\n\n var deltaX = to.x - from.x;\n var deltaY = to.y - from.y;\n\n var width = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n var angle = Math.atan(deltaY / deltaX);\n\n if (deltaX < 0) {\n angle += Math.PI;\n }\n\n $(\"
\")\n .css({\n \"top\": from.y,\n \"left\": from.x,\n \"width\": width,\n \"transform-origin\": \"0% 0\",\n \"-ms-transform-origin\": \"0% 0\",\n \"-webkit-transform-origin\": \"0% 0\",\n \"transform\": \"rotate(\" + angle + \"rad)\",\n \"-ms-transform\": \"rotate(\" + angle + \"rad)\",\n \"-webkit-transform\": \"rotate(\" + angle + \"rad)\"\n })\n .appendTo(this.content);\n },\n\n _removeDependencyDragHint: function() {\n this.content.find(DOT + GanttView.styles.dependencyHint).remove();\n },\n\n _createTaskTooltip: function(task, element, mouseLeft) {\n var styles = GanttView.styles;\n var options = this.options;\n var content = this.content;\n var contentOffset = content.offset();\n var contentScrollLeft = kendo.scrollLeft(content);\n var row = $(element).parents(\"tr\").first();\n var rowOffset = row.offset();\n var template = (options.tooltip && options.tooltip.template) ? kendo.template(options.tooltip.template) : TASK_TOOLTIP_TEMPLATE;\n var left = isRtl ? mouseLeft - (contentOffset.left + contentScrollLeft + kendo.support.scrollbar())\n : mouseLeft - (contentOffset.left - contentScrollLeft);\n var top = (rowOffset.top + outerHeight(row) - contentOffset.top) + content.scrollTop();\n var tooltip = this._taskTooltip = $('
' +\n '
');\n\n tooltip\n .css({\n \"z-index\": \"100002\",\n \"left\": left,\n \"top\": top\n })\n .appendTo(content)\n .find(DOT + styles.taskContent)\n .append(template({\n styles: styles,\n task: task,\n messages: options.messages.views\n }));\n\n this._adjustTooltipDimensions(tooltip, rowOffset, contentOffset, left, contentScrollLeft);\n },\n\n _removeTaskTooltip: function() {\n if (this._taskTooltip) {\n this._taskTooltip.remove();\n }\n\n this._taskTooltip = null;\n },\n\n _createOffsetTooltip: function(task, element, mouseLeft) {\n var styles = GanttView.styles;\n var content = this.content;\n var contentOffset = content.offset();\n var contentScrollLeft = kendo.scrollLeft(content);\n var row = element.parents(\"tr\").first();\n var rowOffset = row.offset();\n var left = isRtl ? mouseLeft - (contentOffset.left + contentScrollLeft + kendo.support.scrollbar())\n : mouseLeft - (contentOffset.left - contentScrollLeft);\n var top = (rowOffset.top + outerHeight(row) - contentOffset.top) + content.scrollTop();\n var tooltip = this._offsetTooltip = $('
');\n var offsetValue = Math.round((task.end.getTime() - task.plannedEnd.getTime()) / 60000);\n var plannedTasksMessages = this.options.messages.plannedTasks;\n var minutes = offsetValue % 60;\n var offsetText = minutes + \" \" + plannedTasksMessages.minutes;\n var hours, days;\n\n if (offsetValue >= 60) {\n hours = offsetValue = Math.floor(offsetValue / 60);\n\n offsetText = hours + \" \" + plannedTasksMessages.hours;\n\n if (minutes !== 0) {\n offsetText += (\" \" + minutes + \" \" + plannedTasksMessages.minutes);\n }\n\n if (offsetValue >= 24) {\n hours = offsetValue % 24;\n days = offsetValue = Math.floor(offsetValue / 24);\n\n offsetText = days + \" \" + plannedTasksMessages.days;\n\n if (hours !== 0) {\n offsetText += (\" \" + hours + \" \" + plannedTasksMessages.hours);\n }\n }\n }\n\n tooltip\n .css({\n \"z-index\": \"100002\",\n \"left\": left,\n \"top\": top\n })\n .addClass(styles.offsetTooltipDelay)\n .appendTo(content)\n .append(OFFSET_TOOLTIP_TEMPLATE({\n offsetPrefix: plannedTasksMessages.offsetTooltipDelay,\n offsetText: offsetText\n }));\n\n this._adjustTooltipDimensions(tooltip, rowOffset, contentOffset, left, contentScrollLeft);\n },\n\n _removeOffsetTooltip: function() {\n if (this._offsetTooltip) {\n this._offsetTooltip.remove();\n }\n\n this._offsetTooltip = null;\n },\n\n _createPlannedTooltip: function(task, element, mouseLeft) {\n var styles = GanttView.styles;\n var content = this.content;\n var contentOffset = content.offset();\n var contentScrollLeft = kendo.scrollLeft(content);\n var row = element.parents(\"tr\").first();\n var rowOffset = row.offset();\n var left = isRtl ? mouseLeft - (contentOffset.left + contentScrollLeft + kendo.support.scrollbar())\n : mouseLeft - (contentOffset.left - contentScrollLeft);\n var top = (rowOffset.top + outerHeight(row) - contentOffset.top) + content.scrollTop();\n var tooltip = this._plannedTooltip = $('
');\n var editorMessages = this.options.messages.editor;\n\n tooltip\n .css({\n \"z-index\": \"100002\",\n \"left\": left,\n \"top\": top\n })\n .appendTo(content)\n .append(PLANNED_TOOLTIP_TEMPLATE({\n plannedStart: editorMessages.plannedStart,\n startDate: kendo.toString(task.plannedStart, \"H:mm tt ddd, MMM dd\"),\n plannedEnd: editorMessages.plannedEnd,\n endDate: kendo.toString(task.plannedEnd, \"H:mm tt ddd, MMM dd\")\n }));\n\n this._adjustTooltipDimensions(tooltip, rowOffset, contentOffset, left, contentScrollLeft);\n },\n\n _removePlannedTooltip: function() {\n if (this._plannedTooltip) {\n this._plannedTooltip.remove();\n }\n\n this._plannedTooltip = null;\n },\n\n _adjustTooltipDimensions: function(tooltip, rowOffset, contentOffset, left, contentScrollLeft) {\n var content = this.content;\n var contentWidth = content.width();\n var tooltipWidth;\n\n if (outerHeight(tooltip) < rowOffset.top - contentOffset.top) {\n tooltip.css(\"top\", ((rowOffset.top - contentOffset.top) - outerHeight(tooltip)) + content.scrollTop());\n }\n\n tooltipWidth = outerWidth(tooltip);\n\n if ((tooltipWidth + left) - contentScrollLeft > contentWidth) {\n left -= tooltipWidth;\n\n if (left < contentScrollLeft) {\n left = (contentScrollLeft + contentWidth) - (tooltipWidth + 17);\n }\n\n tooltip.css(\"left\", left);\n }\n },\n\n _scrollTo: function(element) {\n var elementLeft = element.offset().left;\n var elementWidth = element.width();\n var elementRight = elementLeft + elementWidth;\n\n var row = element.closest(\"tr\");\n var rowTop = row.offset().top;\n var rowHeight = row.height();\n var rowBottom = rowTop + rowHeight;\n\n var content = this.content;\n var contentOffset = content.offset();\n var contentTop = contentOffset.top;\n var contentHeight = content.height();\n var contentBottom = contentTop + contentHeight;\n var contentLeft = contentOffset.left;\n var contentWidth = content.width();\n var contentRight = contentLeft + contentWidth;\n\n var scrollbarWidth = kendo.support.scrollbar();\n\n if (rowTop < contentTop) {\n content.scrollTop(content.scrollTop() + (rowTop - contentTop));\n } else if (rowBottom > contentBottom) {\n content.scrollTop(content.scrollTop() + (rowBottom + scrollbarWidth - contentBottom));\n }\n\n if (elementLeft < contentLeft && elementWidth > contentWidth && elementRight < contentRight ||\n elementRight > contentRight && elementWidth < contentWidth) {\n kendo.scrollLeft(content, kendo.scrollLeft(content) + (elementRight + scrollbarWidth - contentRight));\n } else if (elementRight > contentRight && elementWidth > contentWidth && elementLeft > contentLeft ||\n elementLeft < contentLeft && elementWidth < contentWidth) {\n kendo.scrollLeft(content, kendo.scrollLeft(content) + (elementLeft - contentLeft));\n }\n },\n\n _scrollToDate: function(date) {\n var viewStart = this.start;\n var viewEnd = this.end;\n var offset;\n\n if (date >= viewStart && date < viewEnd) {\n offset = this._offset(date);\n\n if (kendo.support.isRtl(this.element)) {\n offset = this._tableWidth - offset;\n }\n\n kendo.scrollLeft(this.content, offset);\n }\n },\n\n _timeSlots: function() {\n if (!this._slots || !this._slots.length) {\n return [];\n }\n\n return this._slots[this._slots.length - 1];\n },\n\n _headers: function(columnLevels) {\n var rows = [];\n var level;\n var headers;\n var column;\n var headerText;\n var styles = GanttView.styles;\n\n for (var levelIndex = 0, levelCount = columnLevels.length; levelIndex < levelCount; levelIndex++) {\n level = columnLevels[levelIndex];\n headers = [];\n\n for (var columnIndex = 0, columnCount = level.length; columnIndex < columnCount; columnIndex++) {\n column = level[columnIndex];\n\n headerText = kendoHtmlElement(column.text);\n headers.push(kendoDomElement(\"td\", { colspan: column.span, className: styles.header + (column.isNonWorking ? (\" \" + styles.nonWorking) : \"\") }, [headerText]));\n }\n\n rows.push(kendoDomElement(\"tr\", { className: styles.tableRow }, headers));\n }\n\n return rows;\n },\n\n _hours: function(start, end) {\n var slotEnd;\n var slots = [];\n var options = this.options;\n var workDayStart = options.workDayStart.getHours();\n var workDayEnd = options.workDayEnd.getHours();\n var isWorkHour;\n var hours;\n var hourSpan = options.hourSpan;\n\n start = new Date(start);\n end = new Date(end);\n\n if (options.showWorkHours) {\n start.setHours(workDayStart);\n }\n\n while (start < end) {\n slotEnd = new Date(start);\n hours = slotEnd.getHours();\n\n isWorkHour = hours >= workDayStart && hours < workDayEnd;\n\n slotEnd.setHours(slotEnd.getHours() + hourSpan);\n\n if (hours == slotEnd.getHours()) {\n // Chrome DTS Fix\n slotEnd.setHours(slotEnd.getHours() + 2 * hourSpan);\n }\n\n if (!options.showWorkHours || isWorkHour) {\n slots.push({\n start: start,\n end: slotEnd,\n isNonWorking: !isWorkHour,\n span: 1\n });\n }\n\n start = slotEnd;\n }\n\n return slots;\n },\n\n _days: function(start, end) {\n var slotEnd;\n var slots = [];\n var isWorkDay;\n\n start = new Date(start);\n end = new Date(end);\n\n while (start < end) {\n slotEnd = end < kendo.date.nextDay(start) ? end : kendo.date.nextDay(start);\n\n isWorkDay = this._isWorkDay(start);\n\n if (!this.options.showWorkDays || isWorkDay) {\n slots.push({\n start: start,\n end: slotEnd,\n isNonWorking: !isWorkDay,\n span: 1\n });\n }\n\n start = slotEnd;\n }\n\n return slots;\n },\n\n _weeks: function(start, end) {\n var slotEnd;\n var slots = [];\n var firstDay = this.calendarInfo().firstDay;\n var daySlots;\n var span;\n\n start = new Date(start);\n end = new Date(end);\n\n while (start < end) {\n slotEnd = kendo.date.dayOfWeek(kendo.date.addDays(start, 1), firstDay, 1);\n\n if (slotEnd > end) {\n slotEnd = end;\n }\n\n daySlots = this._days(start, slotEnd);\n span = daySlots.length;\n\n if (span > 0) {\n slots.push({\n start: daySlots[0].start,\n end: daySlots[span - 1].end,\n span: span\n });\n }\n\n start = slotEnd;\n }\n\n return slots;\n },\n\n _months: function(start, end) {\n var slotEnd;\n var endMonth;\n var slots = [];\n var daySlots;\n var span;\n\n start = new Date(start);\n end = new Date(end);\n\n while (start < end) {\n slotEnd = new Date(start);\n endMonth = kendo.date.firstDayOfMonth(new Date(slotEnd.setMonth(slotEnd.getMonth() + 1)));\n slotEnd = end < endMonth ? end : endMonth;\n\n daySlots = this._days(start, slotEnd);\n span = daySlots.length;\n\n if (span > 0) {\n slots.push({\n start: daySlots[0].start,\n end: daySlots[span - 1].end,\n span: span\n });\n }\n\n start = slotEnd;\n }\n\n return slots;\n },\n\n _years: function(start, end) {\n var slotEnd;\n var monthSpan;\n var endMonth;\n var slots = [];\n\n start = new Date(start);\n end = new Date(end);\n\n while (start < end) {\n slotEnd = new Date(start);\n slotEnd = kendo.date.firstDayOfMonth(new Date(slotEnd.setMonth(12)));\n\n if (slotEnd >= end) {\n slotEnd = end;\n }\n\n endMonth = slotEnd.getMonth() || 12;\n monthSpan = endMonth - start.getMonth();\n\n slots.push({\n start: start,\n end: slotEnd,\n span: monthSpan\n });\n\n start = slotEnd;\n }\n\n return slots;\n },\n\n _slotHeaders: function(slots, template) {\n var columns = [];\n var slot;\n\n for (var i = 0, l = slots.length; i < l; i++) {\n slot = slots[i];\n\n columns.push({\n text: template(slot),\n isNonWorking: !!slot.isNonWorking,\n span: slot.span\n });\n }\n\n return columns;\n },\n\n _isWorkDay: function(date) {\n var day = date.getDay();\n var workDays = this._workDays;\n\n for (var i = 0, l = workDays.length; i < l; i++) {\n if (workDays[i] === day) {\n return true;\n }\n }\n\n return false;\n },\n\n calendarInfo: function() {\n return kendo.getCulture().calendars.standard;\n },\n\n _renderCurrentTime: function() {\n var currentTime = this._getCurrentTime();\n var timeOffset = this._offset(currentTime);\n var element = $(\"
\");\n var viewStyles = GanttView.styles;\n var tablesWrap = this.element.find(DOT + viewStyles.tasksWrapper);\n var tasksTable = this.element.find(DOT + viewStyles.tasksTable);\n var slot;\n\n if (!this.content || !this._timeSlots().length) {\n return;\n }\n\n this.content.find(\".k-current-time\").remove();\n\n slot = this._timeSlots()[this._slotIndex(\"start\", currentTime)];\n\n if (currentTime < slot.start || currentTime > slot.end) {\n return;\n }\n\n if (tablesWrap.length && tasksTable.length) {\n timeOffset += tasksTable.offset().left - tablesWrap.offset().left;\n }\n\n element.css({\n left: timeOffset + \"px\",\n top: \"0px\",\n width: \"1px\",\n height: this._contentHeight + \"px\"\n })\n .appendTo(this.content);\n },\n\n _getCurrentTime: function() {\n // Introduced for testing purposes\n return new Date();\n },\n\n _currentTime: function() {\n var markerOptions = this.options.currentTimeMarker;\n\n if (markerOptions !== false && markerOptions.updateInterval !== undefined) {\n this._renderCurrentTime();\n this._currentTimeUpdateTimer = setInterval(this._renderCurrentTime.bind(this), markerOptions.updateInterval);\n }\n }\n });\n\n extend(true, GanttView, { styles: viewStyles });\n\n kendo.ui.GanttDayView = GanttView.extend({\n name: \"day\",\n\n options: {\n timeHeaderTemplate: TIME_HEADER_TEMPLATE,\n dayHeaderTemplate: DAY_HEADER_TEMPLATE,\n resizeTooltipFormat: \"h:mm tt ddd, MMM d\"\n },\n\n range: function(range) {\n var optionsRange = this.options.range;\n this.start = kendo.date.getDate(range.start);\n this.end = kendo.date.getDate(range.end);\n\n if (kendo.date.getMilliseconds(range.end) > 0 || this.end.getTime() === this.start.getTime()) {\n this.end = kendo.date.addDays(this.end, 1);\n }\n\n if (optionsRange && optionsRange.start) {\n this.start = kendo.date.getDate(optionsRange.start);\n this.start.setHours(optionsRange.start.getHours());\n }\n\n if (optionsRange && optionsRange.end) {\n this.end = kendo.date.getDate(optionsRange.end);\n this.end.setHours(optionsRange.end.getHours());\n }\n },\n\n _createSlots: function() {\n var daySlots;\n var daySlot;\n var hourSlots;\n var hours;\n var slots = [];\n\n daySlots = this._days(this.start, this.end);\n hourSlots = [];\n\n for (var i = 0, l = daySlots.length; i < l; i++) {\n daySlot = daySlots[i];\n hours = this._hours(daySlot.start, daySlot.end);\n\n daySlot.span = hours.length;\n\n hourSlots.push.apply(hourSlots, hours);\n }\n\n slots.push(daySlots);\n slots.push(hourSlots);\n\n return slots;\n },\n\n _layout: function() {\n var rows = [];\n var options = this.options;\n\n rows.push(this._slotHeaders(this._slots[0], kendo.template(options.dayHeaderTemplate)));\n rows.push(this._slotHeaders(this._slots[1], kendo.template(options.timeHeaderTemplate)));\n\n return rows;\n }\n });\n\n kendo.ui.GanttWeekView = GanttView.extend({\n name: \"week\",\n\n options: {\n dayHeaderTemplate: DAY_HEADER_TEMPLATE,\n weekHeaderTemplate: WEEK_HEADER_TEMPLATE,\n resizeTooltipFormat: \"h:mm tt ddd, MMM d\"\n },\n\n range: function(range) {\n var optionsRange = this.options.range;\n var calendarInfo = this.calendarInfo();\n var firstDay = calendarInfo.firstDay;\n var rangeEnd = range.end;\n var endDay;\n\n if (firstDay === rangeEnd.getDay()) {\n rangeEnd.setDate(rangeEnd.getDate() + 7);\n }\n\n this.start = kendo.date.getDate(kendo.date.dayOfWeek(range.start, firstDay, -1));\n this.end = kendo.date.getDate(kendo.date.dayOfWeek(rangeEnd, firstDay, 1));\n\n if (optionsRange && optionsRange.start) {\n this.start = kendo.date.getDate(optionsRange.start);\n }\n\n if (optionsRange && optionsRange.end) {\n endDay = new Date(optionsRange.end);\n\n if (kendo.date.getDate(endDay) < optionsRange.end) {\n this.end = kendo.date.getDate(new Date(endDay.setDate(endDay.getDate() + 1)));\n } else {\n this.end = kendo.date.getDate(endDay);\n }\n }\n },\n\n _createSlots: function() {\n var slots = [];\n\n slots.push(this._weeks(this.start, this.end));\n slots.push(this._days(this.start, this.end));\n\n return slots;\n },\n\n _layout: function() {\n var rows = [];\n var options = this.options;\n\n rows.push(this._slotHeaders(this._slots[0], kendo.template(options.weekHeaderTemplate)));\n rows.push(this._slotHeaders(this._slots[1], kendo.template(options.dayHeaderTemplate)));\n\n return rows;\n }\n });\n\n kendo.ui.GanttMonthView = GanttView.extend({\n name: \"month\",\n\n options: {\n weekHeaderTemplate: WEEK_HEADER_TEMPLATE,\n monthHeaderTemplate: MONTH_HEADER_TEMPLATE,\n resizeTooltipFormat: \"dddd, MMM d, yyyy\"\n },\n\n range: function(range) {\n var optionsRange = this.options.range;\n var endDay;\n this.start = kendo.date.firstDayOfMonth(range.start);\n this.end = kendo.date.addDays(kendo.date.getDate(kendo.date.lastDayOfMonth(range.end)), 1);\n\n if (optionsRange && optionsRange.start) {\n this.start = kendo.date.getDate(optionsRange.start);\n }\n\n if (optionsRange && optionsRange.end) {\n endDay = new Date(optionsRange.end);\n\n if (kendo.date.getDate(endDay) < optionsRange.end) {\n this.end = kendo.date.getDate(new Date(endDay.setDate(endDay.getDate() + 1)));\n } else {\n this.end = kendo.date.getDate(endDay);\n }\n }\n },\n\n _createSlots: function() {\n var slots = [];\n\n slots.push(this._months(this.start, this.end));\n slots.push(this._weeks(this.start, this.end));\n\n return slots;\n },\n\n _layout: function() {\n var rows = [];\n var options = this.options;\n\n rows.push(this._slotHeaders(this._slots[0], kendo.template(options.monthHeaderTemplate)));\n rows.push(this._slotHeaders(this._slots[1], kendo.template(options.weekHeaderTemplate)));\n\n return rows;\n }\n });\n\n kendo.ui.GanttYearView = GanttView.extend({\n name: \"year\",\n\n options: {\n yearHeaderTemplate: YEAR_HEADER_TEMPLATE,\n monthHeaderTemplate: MONTH_HEADER_TEMPLATE,\n resizeTooltipFormat: \"dddd, MMM d, yyyy\"\n },\n\n range: function(range) {\n var optionsRange = this.options.range;\n var firstDayOfMonth;\n this.start = kendo.date.firstDayOfMonth(new Date(range.start.setMonth(0)));\n this.end = kendo.date.firstDayOfMonth(new Date(range.end.setMonth(12))); //set month to first month of next year\n\n if (optionsRange && optionsRange.start) {\n this.start = kendo.date.firstDayOfMonth(optionsRange.start);\n }\n\n if (optionsRange && optionsRange.end) {\n firstDayOfMonth = kendo.date.firstDayOfMonth(optionsRange.end);\n\n this.end = kendo.date.getDate(new Date(firstDayOfMonth.setMonth(firstDayOfMonth.getMonth() + 1)));\n }\n },\n\n _createSlots: function() {\n var slots = [];\n var monthSlots = this._months(this.start, this.end);\n\n $(monthSlots).each(function(index, slot) {\n slot.span = 1;\n });\n\n slots.push(this._years(this.start, this.end));\n slots.push(monthSlots);\n\n return slots;\n },\n\n _layout: function() {\n var rows = [];\n var options = this.options;\n\n rows.push(this._slotHeaders(this._slots[0], kendo.template(options.yearHeaderTemplate)));\n rows.push(this._slotHeaders(this._slots[1], kendo.template(options.monthHeaderTemplate)));\n\n return rows;\n }\n });\n\n var timelineStyles = {\n wrapper: \"k-timeline k-grid\",\n gridHeader: \"k-grid-header\",\n gridHeaderWrap: \"k-grid-header-wrap\",\n gridContent: \"k-grid-content\",\n gridContentWrap: \"k-grid-content\",\n tasksWrapper: \"k-gantt-tables\",\n dependenciesWrapper: \"k-gantt-dependencies\",\n task: \"k-task\",\n taskOffset: \"k-task-offset\",\n taskOffsetWrap: \"k-task-offset-wrap\",\n taskPlanned: \"k-task-planned\",\n line: \"k-gantt-line\",\n taskResizeHandle: \"k-resize-handle\",\n taskResizeHandleWest: \"k-resize-w\",\n taskDragHandle: \"k-task-draghandle\",\n taskComplete: \"k-task-complete\",\n taskDelete: \"k-task-delete\",\n taskWrapActive: \"k-task-wrap-active\",\n taskWrap: \"k-task-wrap\",\n taskDot: \"k-task-dot\",\n taskDotStart: \"k-task-start\",\n taskDotEnd: \"k-task-end\",\n hovered: \"k-hover\",\n selected: \"k-selected\",\n origin: \"k-origin\"\n };\n\n var GanttTimeline = kendo.ui.GanttTimeline = Widget.extend({\n init: function(element, options) {\n\n Widget.fn.init.call(this, element, options);\n\n if (!this.options.views || !this.options.views.length) {\n this.options.views = [\"day\", \"week\", \"month\"];\n }\n\n isRtl = kendo.support.isRtl(element);\n\n this._wrapper();\n\n this._domTrees();\n\n this._views();\n\n this._selectable();\n\n this._draggable();\n\n this._resizable();\n\n this._percentResizeDraggable();\n\n this._createDependencyDraggable();\n\n this._attachEvents();\n\n this._navigatable();\n\n this._tooltip();\n },\n\n options: {\n name: \"GanttTimeline\",\n messages: {\n views: {\n day: \"Day\",\n week: \"Week\",\n month: \"Month\",\n year: \"Year\",\n start: \"Start\",\n end: \"End\"\n }\n },\n snap: true,\n selectable: true,\n editable: true\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n clearTimeout(this._tooltipTimeout);\n\n if (this._currentTimeUpdateTimer) {\n clearInterval(this._currentTimeUpdateTimer);\n }\n\n this._unbindView(this._selectedView);\n\n if (this._moveDraggable) {\n this._moveDraggable.destroy();\n }\n\n if (this._resizeDraggable) {\n this._resizeDraggable.destroy();\n }\n\n if (this._percentDraggable) {\n this._percentDraggable.destroy();\n }\n\n if (this._dependencyDraggable) {\n this._dependencyDraggable.destroy();\n }\n\n if (this.touch) {\n this.touch.destroy();\n }\n\n this._headerTree = null;\n this._taskTree = null;\n this._dependencyTree = null;\n\n this.wrapper.off(NS);\n\n kendo.destroy(this.wrapper);\n },\n\n _findNext: function(row) {\n return row.next().find(\".k-task\");\n },\n\n _findFirst: function(row) {\n return row.closest(\".k-table-tbody\").find(\".k-task\").first();\n },\n\n _findLast: function(row) {\n return row.closest(\".k-table-tbody\").find(\".k-task\").last();\n },\n\n _findPrev: function(row) {\n return row.prev().find(\".k-task\");\n },\n\n _scrollTasks: function(dir) {\n var that = this;\n var timelineWrapper = that.wrapper;\n var timelineScroll = kendo.scrollLeft(timelineWrapper.find(\".k-grid-content\"));\n\n kendo.scrollLeft(timelineWrapper.find(\".k-grid-content\"), (timelineScroll + (20 * dir)));\n },\n\n _navigatable: function() {\n var that = this;\n if (!that.options.navigatable) {\n return;\n }\n\n that.wrapper.on(\"keydown\" + NS, \".k-gantt-tables .k-gantt-tasks .k-task\", function(e) {\n var target = $(e.target);\n var row = target.closest(\".k-table-row\");\n var handled = false;\n var newTask;\n\n if (e.keyCode == keys.HOME) {\n newTask = that._findFirst(row);\n }\n\n if (e.keyCode == keys.END) {\n newTask = that._findLast(row);\n }\n\n if (e.keyCode == keys.DOWN) {\n newTask = that._findNext(row);\n }\n\n if (e.keyCode == keys.UP) {\n newTask = that._findPrev(row);\n }\n\n if (newTask) {\n handled = true;\n if (newTask[0] !== target[0]) {\n target.closest(\".k-gantt-tasks\").find(\".k-task\").attr(\"tabindex\", -1);\n newTask.attr(\"tabindex\", 0);\n newTask.focus();\n }\n }\n\n if (e.keyCode == keys.LEFT) {\n if (e.altKey) {\n if (target.hasClass(\"k-task-summary\")) {\n that.trigger(\"collapse\", { uid: target.attr(\"data-uid\") });\n setTimeout(function() {\n that.select().focus();\n }, 1);\n }\n } else {\n that._scrollTasks(-1);\n }\n handled = true;\n }\n\n if (e.keyCode == keys.RIGHT) {\n if (e.altKey) {\n if (target.hasClass(\"k-task-summary\")) {\n that.trigger(\"expand\", { uid: target.attr(\"data-uid\") });\n setTimeout(function() {\n that.select().focus();\n }, 1);\n }\n } else {\n that._scrollTasks(1);\n }\n handled = true;\n }\n\n if (e.keyCode == keys.ENTER) {\n handled = true;\n if (that.options.editable.update !== false) {\n that.trigger(\"editTask\", { uid: target.attr(\"data-uid\") });\n e.stopPropagation();\n }\n }\n\n if (e.keyCode == keys.DELETE) {\n handled = true;\n if (that.options.editable.update !== false) {\n that.trigger(\"removeTask\", { uid: target.attr(\"data-uid\") });\n e.stopPropagation();\n }\n }\n\n if (handled) {\n e.preventDefault();\n }\n })\n .on(CLICK + NS, DOT + GanttTimeline.styles.task , function(e) {\n e.preventDefault();\n var task = $(this);\n\n that.wrapper.find(DOT + GanttTimeline.styles.task).attr(\"tabindex\", \"-1\");\n\n task.attr(\"tabindex\", \"0\").focus();\n });\n },\n\n\n _wrapper: function() {\n var styles = GanttTimeline.styles;\n var that = this;\n var options = this.options;\n var calculateSize = function() {\n var rowHeight = typeof options.rowHeight === STRING ? options.rowHeight :\n options.rowHeight + \"px\";\n var table = $(kendo.format(SIZE_CALCULATION_TEMPLATE, rowHeight));\n var calculatedRowHeight;\n var calculatedCellHeight;\n var content = that.wrapper.find(DOT + styles.tasksWrapper);\n\n kendo.applyStylesFromKendoAttributes(table, [\"height\", \"visibility\"]);\n content.append(table);\n\n calculatedRowHeight = outerHeight(table.find(\"tr\"));\n calculatedCellHeight = table.find(\"td\").height();\n\n table.remove();\n\n return {\n \"row\": calculatedRowHeight,\n \"cell\": calculatedCellHeight\n };\n };\n\n this.wrapper = this.element\n .addClass(styles.wrapper)\n .append(\"
\")\n .append(\"
\");\n\n if (options.rowHeight) {\n this._calculatedSize = calculateSize();\n }\n },\n\n _domTrees: function() {\n var styles = GanttTimeline.styles;\n var tree = kendo.dom.Tree;\n var wrapper = this.wrapper;\n\n this._headerTree = new tree(wrapper.find(DOT + styles.gridHeaderWrap)[0]);\n\n this._taskTree = new tree(wrapper.find(DOT + styles.tasksWrapper)[0]);\n\n this._dependencyTree = new tree(wrapper.find(DOT + styles.dependenciesWrapper)[0]);\n },\n\n _views: function() {\n var views = this.options.views;\n var view;\n var isSettings;\n var name;\n var defaultView;\n var selected;\n\n this.views = {};\n\n for (var i = 0, l = views.length; i < l; i++) {\n view = views[i];\n\n isSettings = isPlainObject(view);\n\n if (isSettings && view.selectable === false) {\n continue;\n }\n\n name = isSettings ? ((typeof view.type !== \"string\") ? view.title : view.type) : view;\n\n defaultView = defaultViews[name];\n\n if (defaultView) {\n if (isSettings) {\n view.type = defaultView.type;\n }\n\n defaultView.title = this.options.messages.views[name];\n }\n\n view = extend({ title: name }, defaultView, isSettings ? view : {});\n\n if (name) {\n this.views[name] = view;\n\n if (!selected || view.selected) {\n selected = name;\n }\n }\n }\n\n if (selected) {\n this._selectedViewName = selected;\n }\n },\n\n view: function(name) {\n if (name) {\n this._selectView(name);\n\n this.trigger(\"navigate\", { view: name, action: \"changeView\" });\n }\n\n return this._selectedView;\n },\n\n _selectView: function(name) {\n if (name && this.views[name]) {\n if (this._selectedView) {\n this._unbindView(this._selectedView);\n }\n\n this._selectedView = this._initializeView(name);\n this._selectedViewName = name;\n }\n },\n\n _viewByIndex: function(index) {\n var view;\n var views = this.views;\n\n for (view in views) {\n if (!index) {\n return view;\n }\n\n index--;\n }\n },\n\n _initializeView: function(name) {\n var view = this.views[name];\n\n if (view) {\n var type = view.type;\n\n if (typeof type === \"string\") {\n type = kendo.getter(view.type)(window);\n }\n\n if (type) {\n var newRange = {};\n extend(newRange, this.options.range, view.range);\n\n var newDate = view.date || this.options.date;\n\n view = new type(this.wrapper, trimOptions(extend(true, {\n headerTree: this._headerTree,\n taskTree: this._taskTree,\n dependencyTree: this._dependencyTree,\n calculatedSize: this._calculatedSize\n }, view, this.options, {\n date: newDate,\n range: newRange\n })));\n } else {\n throw new Error(\"There is no such view\");\n }\n }\n\n return view;\n },\n\n _unbindView: function(view) {\n if (view) {\n view.destroy();\n }\n },\n\n _range: function(tasks) {\n var startOrder = {\n field: \"start\",\n dir: \"asc\"\n };\n var endOrder = {\n field: \"end\",\n dir: \"desc\"\n };\n\n if (!tasks || !tasks.length) {\n return { start: new Date(), end: new Date() };\n }\n\n var start = new Query(tasks).sort(startOrder).toArray()[0].start || new Date();\n var end = new Query(tasks).sort(endOrder).toArray()[0].end || new Date();\n\n return {\n start: new Date(start),\n end: new Date(end)\n };\n },\n\n _render: function(tasks) {\n var view = this.view();\n var range = this._range(tasks);\n var date = view.options.date;\n\n this._tasks = tasks;\n\n view.range(range);\n\n view.renderLayout();\n\n view.render(tasks);\n\n if (date) {\n view._scrollToDate(date);\n }\n },\n\n _renderDependencies: function(dependencies) {\n this.view()._renderDependencies(dependencies);\n },\n\n _taskByUid: function(uid) {\n var tasks = this._tasks;\n var length = tasks.length;\n var task;\n\n for (var i = 0; i < length; i++) {\n task = tasks[i];\n\n if (task.uid === uid) {\n return task;\n }\n }\n },\n\n _draggable: function() {\n var that = this;\n var element;\n var task;\n var currentStart;\n var startOffset;\n var snap = this.options.snap;\n var styles = GanttTimeline.styles;\n var editable = this.options.editable;\n\n var cleanUp = function() {\n that.view()._removeDragHint();\n\n if (element) {\n element.css(\"opacity\", 1);\n }\n\n element = null;\n task = null;\n that.dragInProgress = false;\n };\n\n if (!editable || editable.move === false || editable.update === false) {\n return;\n }\n\n this._moveDraggable = new kendo.ui.Draggable(this.wrapper, {\n distance: 0,\n filter: DOT + styles.task + \",\" + DOT + styles.taskOffset,\n holdToDrag: kendo.support.mobileOS,\n ignore: DOT + styles.taskResizeHandle\n });\n\n this._moveDraggable\n .bind(\"dragstart\", function(e) {\n var view = that.view();\n element = e.currentTarget.closest(DOT + styles.taskWrap);\n task = that._taskByUid(e.currentTarget.parent().find(DOT + styles.task).attr(\"data-uid\"));\n\n if (that.trigger(\"moveStart\", { task: task })) {\n e.preventDefault();\n return;\n }\n\n currentStart = task.start;\n startOffset = view._timeByPosition(e.x.location, snap) - currentStart;\n\n view._createDragHint(element);\n\n element.css(\"opacity\", 0.5);\n\n clearTimeout(that._tooltipTimeout);\n that.dragInProgress = true;\n })\n .bind(\"drag\", kendo.throttle(function(e) {\n if (!that.dragInProgress) {\n return;\n }\n\n var view = that.view();\n var date = new Date(view._timeByPosition(e.x.location, snap) - startOffset);\n var updateHintDate = date;\n\n if (!that.trigger(\"move\", { task: task, start: date })) {\n currentStart = date;\n\n if (isRtl) {\n updateHintDate = new Date(currentStart.getTime() + task.duration());\n }\n\n view._updateDragHint(updateHintDate);\n }\n }, 15))\n .bind(\"dragend\", function() {\n that.trigger(\"moveEnd\", { task: task, start: currentStart });\n\n cleanUp();\n })\n .bind(\"dragcancel\", function() {\n cleanUp();\n })\n .userEvents.bind(\"select\", function() {\n blurActiveElement();\n });\n },\n\n _resizable: function() {\n var that = this;\n var element;\n var task;\n var currentStart;\n var currentEnd;\n var resizeStart;\n var snap = this.options.snap;\n var styles = GanttTimeline.styles;\n var editable = this.options.editable;\n\n var cleanUp = function() {\n that.view()._removeResizeHint();\n element = null;\n task = null;\n that.dragInProgress = false;\n };\n\n if (!editable || editable.resize === false || editable.update === false) {\n return;\n }\n\n this._resizeDraggable = new kendo.ui.Draggable(this.wrapper, {\n distance: 0,\n filter: DOT + styles.taskResizeHandle,\n holdToDrag: false\n });\n\n this._resizeDraggable\n .bind(\"dragstart\", function(e) {\n resizeStart = e.currentTarget.hasClass(styles.taskResizeHandleWest);\n\n if (isRtl) {\n resizeStart = !resizeStart;\n }\n\n element = e.currentTarget.closest(DOT + styles.taskWrap).find(DOT + styles.task);\n\n task = that._taskByUid(element.attr(\"data-uid\"));\n\n if (that.trigger(\"resizeStart\", { task: task })) {\n e.preventDefault();\n return;\n }\n\n currentStart = task.start;\n currentEnd = task.end;\n\n that.view()._createResizeHint(task);\n\n clearTimeout(that._tooltipTimeout);\n that.dragInProgress = true;\n })\n .bind(\"drag\", kendo.throttle(function(e) {\n if (!that.dragInProgress) {\n return;\n }\n\n var view = that.view();\n var date = view._timeByPosition(e.x.location, snap, !resizeStart);\n\n if (resizeStart) {\n if (date < currentEnd) {\n currentStart = date;\n } else {\n currentStart = currentEnd;\n }\n } else {\n if (date > currentStart) {\n currentEnd = date;\n } else {\n currentEnd = currentStart;\n }\n }\n\n if (!that.trigger(\"resize\", { task: task, start: currentStart, end: currentEnd })) {\n view._updateResizeHint(currentStart, currentEnd, resizeStart);\n }\n }, 15))\n .bind(\"dragend\", function() {\n that.trigger(\"resizeEnd\", { task: task, resizeStart: resizeStart, start: currentStart, end: currentEnd });\n\n cleanUp();\n })\n .bind(\"dragcancel\", function() {\n cleanUp();\n })\n .userEvents.bind(\"select\", function() {\n blurActiveElement();\n });\n },\n\n _percentResizeDraggable: function() {\n var that = this;\n var task;\n var taskElement;\n var taskElementOffset;\n var timelineOffset;\n var originalPercentWidth;\n var maxPercentWidth;\n var currentPercentComplete;\n var tooltipTop;\n var tooltipLeft;\n var styles = GanttTimeline.styles;\n var delta;\n var editable = this.options.editable;\n\n var cleanUp = function() {\n that.view()._removePercentCompleteTooltip();\n taskElement = null;\n task = null;\n that.dragInProgress = false;\n };\n\n var updateElement = function(width) {\n var taskDragHandle = taskElement.siblings(DOT + styles.taskDragHandle);\n\n if (!taskDragHandle.length) {\n taskDragHandle = taskElement.closest(DOT + styles.taskWrap).find(DOT + styles.taskDragHandle);\n }\n\n taskDragHandle.css(isRtl ? \"right\" : \"left\", width);\n\n taskElement\n .find(DOT + styles.taskComplete)\n .width(width);\n };\n\n if (!editable || editable.dragPercentComplete === false || editable.update === false) {\n return;\n }\n\n this._percentDraggable = new kendo.ui.Draggable(this.wrapper, {\n distance: 0,\n filter: DOT + styles.taskDragHandle,\n holdToDrag: false\n });\n\n this._percentDraggable\n .bind(\"dragstart\", function(e) {\n if (that.trigger(\"percentResizeStart\")) {\n e.preventDefault();\n return;\n }\n\n taskElement = e.currentTarget.siblings(DOT + styles.task);\n\n if (!taskElement.length) {\n taskElement = e.currentTarget.closest(DOT + styles.taskWrap).find(DOT + styles.task);\n }\n\n task = that._taskByUid(taskElement.attr(\"data-uid\"));\n\n currentPercentComplete = task.percentComplete;\n\n taskElementOffset = taskElement.offset();\n timelineOffset = this.element.offset();\n\n originalPercentWidth = taskElement.find(DOT + styles.taskComplete).width();\n maxPercentWidth = outerWidth(taskElement);\n\n clearTimeout(that._tooltipTimeout);\n that.dragInProgress = true;\n })\n .bind(\"drag\", kendo.throttle(function(e) {\n if (!that.dragInProgress) {\n return;\n }\n\n delta = isRtl ? -e.x.initialDelta : e.x.initialDelta;\n\n var currentWidth = Math.max(0, Math.min(maxPercentWidth, originalPercentWidth + delta));\n\n currentPercentComplete = Math.round((currentWidth / maxPercentWidth) * 100);\n\n updateElement(currentWidth);\n\n tooltipTop = taskElementOffset.top - timelineOffset.top;\n tooltipLeft = taskElementOffset.left + currentWidth - timelineOffset.left;\n\n if (isRtl) {\n tooltipLeft += (maxPercentWidth - 2 * currentWidth);\n }\n\n that.view()._updatePercentCompleteTooltip(tooltipTop, tooltipLeft, currentPercentComplete);\n }, 15))\n .bind(\"dragend\", function() {\n that.trigger(\"percentResizeEnd\", { task: task, percentComplete: currentPercentComplete / 100 });\n\n cleanUp();\n })\n .bind(\"dragcancel\", function() {\n updateElement(originalPercentWidth);\n\n cleanUp();\n })\n .userEvents.bind(\"select\", function() {\n blurActiveElement();\n });\n },\n\n _createDependencyDraggable: function() {\n var that = this;\n var originalHandle;\n var hoveredHandle = $();\n var hoveredTask = $();\n var startX;\n var startY;\n var styles = GanttTimeline.styles;\n var editable = this.options.editable;\n\n var cleanUp = function() {\n originalHandle\n .css(\"display\", \"\")\n .removeClass(styles.hovered);\n\n originalHandle.parent().removeClass(styles.origin);\n originalHandle = null;\n\n toggleHandles(false);\n\n hoveredTask = $();\n hoveredHandle = $();\n\n that.view()._removeDependencyDragHint();\n\n that.dragInProgress = false;\n };\n\n var toggleHandles = function(value) {\n if (!hoveredTask.hasClass(styles.origin)) {\n hoveredTask.find(DOT + styles.taskDot).css(\"display\", value ? \"block\" : \"\");\n hoveredHandle.toggleClass(styles.hovered, value);\n }\n };\n\n if (!editable || editable.dependencyCreate === false) {\n return;\n }\n\n this._dependencyDraggable = new kendo.ui.Draggable(this.wrapper, {\n distance: 0,\n filter: DOT + styles.taskDot,\n holdToDrag: false\n });\n\n this._dependencyDraggable\n .bind(\"dragstart\", function(e) {\n if (that.trigger(\"dependencyDragStart\")) {\n e.preventDefault();\n return;\n }\n\n originalHandle = e.currentTarget\n .css(\"display\", \"block\")\n .addClass(styles.hovered);\n\n originalHandle.parent().addClass(styles.origin);\n\n var elementOffset = originalHandle.offset();\n var tablesOffset = that.wrapper.find(DOT + styles.tasksWrapper).offset();\n\n startX = Math.round(elementOffset.left - tablesOffset.left + (outerHeight(originalHandle) / 2));\n startY = Math.round(elementOffset.top - tablesOffset.top + (outerWidth(originalHandle) / 2));\n\n clearTimeout(that._tooltipTimeout);\n that.dragInProgress = true;\n })\n .bind(\"drag\", kendo.throttle(function(e) {\n if (!that.dragInProgress) {\n return;\n }\n\n that.view()._removeDependencyDragHint();\n\n var target = $(kendo.elementUnderCursor(e));\n var tablesOffset = that.wrapper.find(DOT + styles.tasksWrapper).offset();\n var currentX = e.x.location - tablesOffset.left;\n var currentY = e.y.location - tablesOffset.top;\n\n that.view()._updateDependencyDragHint({ x: startX, y: startY }, { x: currentX, y: currentY });\n\n toggleHandles(false);\n\n hoveredHandle = (target.hasClass(styles.taskDot)) ? target : $();\n hoveredTask = target.closest(DOT + styles.taskWrap);\n\n toggleHandles(true);\n }, 15))\n .bind(\"dragend\", function() {\n if (hoveredHandle.length) {\n var fromStart = originalHandle.hasClass(styles.taskDotStart);\n var toStart = hoveredHandle.hasClass(styles.taskDotStart);\n\n var type = fromStart ? (toStart ? 3 : 2) : (toStart ? 1 : 0);\n\n var predecessorElement = originalHandle.siblings(DOT + styles.task);\n if (!predecessorElement.length) {\n predecessorElement = originalHandle.closest(DOT + styles.taskWrap).find(DOT + styles.task);\n }\n var predecessor = that._taskByUid(predecessorElement.attr(\"data-uid\"));\n\n var successorElement = hoveredHandle.siblings(DOT + styles.task);\n if (!successorElement.length) {\n successorElement = hoveredHandle.closest(DOT + styles.taskWrap).find(DOT + styles.task);\n }\n var successor = that._taskByUid(successorElement.attr(\"data-uid\"));\n\n if (predecessor !== successor) {\n that.trigger(\"dependencyDragEnd\", { type: type, predecessor: predecessor, successor: successor });\n }\n }\n\n cleanUp();\n })\n .bind(\"dragcancel\", function() {\n cleanUp();\n })\n .userEvents.bind(\"select\", function() {\n blurActiveElement();\n });\n },\n\n _selectable: function() {\n var that = this;\n var styles = GanttTimeline.styles;\n\n if (this.options.selectable) {\n this.wrapper\n .on(CLICK + NS, DOT + styles.task + \",\" + DOT + styles.taskOffset, function(e) {\n e.stopPropagation();\n\n var uid = $(this).attr(\"data-uid\");\n\n if (!uid) {\n uid = $(this).closest(DOT + styles.taskWrap).find(DOT + styles.task).data(\"uid\");\n }\n\n if (!e.ctrlKey) {\n that.trigger(\"select\", { uid: uid });\n } else {\n that.trigger(\"clear\");\n }\n })\n .on(CLICK + NS, DOT + styles.taskWrap, function(e) {\n e.stopPropagation();\n\n // Decrease z-index of wrap so the we can get to the\n // dependency line underneath, if there is any\n $(this).css(\"z-index\", \"0\");\n\n var target = $(document.elementFromPoint(e.clientX, e.clientY));\n\n if (target.hasClass(styles.line)) {\n target.click();\n }\n\n $(this).css(\"z-index\", \"\");\n })\n .on(CLICK + NS, DOT + styles.tasksWrapper, function() {\n if (that.selectDependency().length > 0) {\n that.clearSelection();\n } else {\n that.trigger(\"clear\");\n }\n })\n .on(CLICK + NS, DOT + styles.line, function(e) {\n e.stopPropagation();\n\n that.selectDependency(this);\n });\n }\n },\n\n select: function(value) {\n var element = this.wrapper.find(value);\n var styles = GanttTimeline.styles;\n\n if (element.length) {\n this.clearSelection();\n\n element.addClass(styles.selected);\n\n if (kendo.support.mobileOS) {\n element.parent().addClass(styles.taskWrapActive);\n }\n\n return;\n }\n\n return this.wrapper.find(DOT + styles.task + DOT + styles.selected);\n },\n\n selectDependency: function(value) {\n var element = this.wrapper.find(value);\n var uid;\n var styles = GanttTimeline.styles;\n\n if (element.length) {\n this.clearSelection();\n this.trigger(\"clear\");\n\n uid = $(element).attr(\"data-uid\");\n\n this.wrapper.find(DOT + styles.line + \"[data-uid='\" + uid + \"']\").addClass(styles.selected);\n\n return;\n }\n\n return this.wrapper.find(DOT + styles.line + DOT + styles.selected);\n },\n\n clearSelection: function() {\n var styles = GanttTimeline.styles;\n\n this.wrapper\n .find(DOT + styles.selected)\n .removeClass(styles.selected);\n\n if (kendo.support.mobileOS) {\n this.wrapper\n .find(DOT + styles.taskWrapActive)\n .removeClass(styles.taskWrapActive);\n }\n },\n\n _attachEvents: function() {\n var that = this;\n var styles = GanttTimeline.styles;\n var editable = this.options.editable;\n\n if (editable) {\n\n this.wrapper\n .on(CLICK + NS, DOT + styles.taskDelete, function(e) {\n that.trigger(\"removeTask\", { uid: $(this).closest(DOT + styles.taskWrap).find(DOT + styles.task).attr(\"data-uid\") });\n e.stopPropagation();\n e.preventDefault();\n })\n .on(KEYDOWN + NS, function(e) {\n var selectedDependency;\n var editable = that.options.editable;\n\n if (e.keyCode === keys.DELETE && editable && editable.dependencyDestroy !== false) {\n selectedDependency = that.selectDependency();\n\n if (selectedDependency.length) {\n that.trigger(\"removeDependency\", { uid: selectedDependency.attr(\"data-uid\") });\n that.clearSelection();\n }\n }\n });\n\n if (!kendo.support.mobileOS) {\n this.wrapper\n .on(DBLCLICK + NS, DOT + styles.task + \",\" + DOT + styles.taskOffset, function(e) {\n if (that.options.editable.update !== false) {\n that.trigger(\"editTask\", { uid: $(this).closest(DOT + styles.taskWrap).find(DOT + styles.task).attr(\"data-uid\") });\n\n e.stopPropagation();\n e.preventDefault();\n }\n });\n } else {\n this.touch = this.wrapper\n .kendoTouch({\n filter: DOT + styles.task + \",\" + DOT + styles.taskOffset,\n doubletap: function(e) {\n if (that.options.editable.update !== false) {\n that.trigger(\"editTask\", { uid: $(e.touch.currentTarget).closest(DOT + styles.taskWrap).find(DOT + styles.task).attr(\"data-uid\") });\n }\n }\n }).data(\"kendoTouch\");\n }\n }\n },\n\n _tooltip: function() {\n var that = this;\n var tooltipOptions = this.options.tooltip;\n var styles = GanttTimeline.styles;\n var currentMousePosition;\n var mouseMoveHandler = function(e) {\n currentMousePosition = e.clientX;\n };\n\n if (tooltipOptions && tooltipOptions.visible === false) {\n return;\n }\n\n if (!kendo.support.mobileOS) {\n this.wrapper\n .on(MOUSEENTER + NS, DOT + styles.task, function() {\n var element = this;\n var task = that._taskByUid($(this).attr(\"data-uid\"));\n\n if (that.dragInProgress) {\n return;\n }\n\n that._tooltipTimeout = setTimeout(function() {\n that.view()._createTaskTooltip(task, element, currentMousePosition);\n }, 800);\n\n $(this).on(MOUSEMOVE, mouseMoveHandler);\n })\n .on(MOUSELEAVE + NS, DOT + styles.task, function() {\n clearTimeout(that._tooltipTimeout);\n\n that.view()._removeTaskTooltip();\n\n $(this).off(MOUSEMOVE, mouseMoveHandler);\n })\n .on(MOUSEENTER + NS, DOT + styles.taskOffset, function() {\n var taskElement = $(this).closest(DOT + styles.taskWrap).find(DOT + styles.task);\n var task = that._taskByUid(taskElement.attr(\"data-uid\"));\n\n if (that.dragInProgress) {\n return;\n }\n\n that._offsetTooltipTimeout = setTimeout(function() {\n that.view()._createOffsetTooltip(task, taskElement, currentMousePosition);\n }, 800);\n\n $(this).on(MOUSEMOVE, mouseMoveHandler);\n })\n .on(MOUSELEAVE + NS, DOT + styles.taskOffset, function() {\n clearTimeout(that._offsetTooltipTimeout);\n\n that.view()._removeOffsetTooltip();\n\n $(this).off(MOUSEMOVE, mouseMoveHandler);\n })\n .on(MOUSEENTER + NS, DOT + styles.taskPlanned, function() {\n var taskElement = $(this).closest(DOT + styles.taskWrap).find(DOT + styles.task);\n var task = that._taskByUid(taskElement.attr(\"data-uid\"));\n\n that._plannedTooltipTimeout = setTimeout(function() {\n that.view()._createPlannedTooltip(task, taskElement, currentMousePosition);\n }, 800);\n\n $(this).on(MOUSEMOVE, mouseMoveHandler);\n })\n .on(MOUSELEAVE + NS, DOT + styles.taskPlanned, function() {\n clearTimeout(that._plannedTooltipTimeout);\n\n that.view()._removePlannedTooltip();\n\n $(this).off(MOUSEMOVE, mouseMoveHandler);\n });\n } else {\n this.wrapper\n .on(CLICK + NS, DOT + styles.taskDelete, function(e) {\n e.stopPropagation();\n that.view()._removeTaskTooltip();\n })\n .on(MOUSELEAVE + NS, DOT + styles.task, function(e) {\n var parents = $(e.relatedTarget).parents(DOT + styles.taskWrap, DOT + styles.task);\n\n if (parents.length === 0) {\n that.view()._removeTaskTooltip();\n }\n })\n .on(MOUSELEAVE + NS, DOT + styles.taskOffset, function(e) {\n var parents = $(e.relatedTarget).parents(DOT + styles.taskWrap, DOT + styles.task);\n\n if (parents.length === 0) {\n that.view()._removeOffsetTooltip();\n }\n })\n .on(MOUSELEAVE + NS, DOT + styles.taskPlanned, function(e) {\n var parents = $(e.relatedTarget).parents(DOT + styles.taskWrap, DOT + styles.task);\n\n if (parents.length === 0) {\n that.view()._removePlannedTooltip();\n }\n });\n\n if (this.touch) {\n this.touch\n .bind(\"tap\", function(e) {\n var element = $(e.touch.target);\n var currentPosition = e.touch.x.client;\n var task;\n\n if (!element.hasClass(styles.task)) {\n task = that._taskByUid(element.closest(DOT + styles.taskWrap).find(DOT + styles.task).attr(\"data-uid\"));\n if (that.view()._offsetTooltip) {\n that.view()._removeOffsetTooltip();\n }\n\n that.view()._createOffsetTooltip(task, element, currentPosition);\n } else {\n task = that._taskByUid(element.attr(\"data-uid\"));\n if (that.view()._taskTooltip) {\n that.view()._removeTaskTooltip();\n }\n\n that.view()._createTaskTooltip(task, element, currentPosition);\n }\n })\n .bind(\"doubletap\", function() {\n that.view()._removeTaskTooltip();\n that.view()._removeOffsetTooltip();\n });\n }\n }\n },\n _setPlanned: function(value) {\n this.options.showPlannedTasks = value;\n this.view().options.showPlannedTasks = value;\n }\n });\n\n extend(true, GanttTimeline, { styles: timelineStyles });\n\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}