{"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","start","toString","WEEK_HEADER_TEMPLATE","end","date","addDays","MONTH_HEADER_TEMPLATE","RESIZE_TOOLTIP_TEMPLATE","styles","messages","format","tooltipWrapper","tooltipContent","htmlEncode","TASK_TOOLTIP_TEMPLATE","task","taskDetails","title","taskDetailsPercent","percentComplete","reset","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","marquee","marqueeColor","RESIZE_HINT","views","resizeTooltipFormat","_resizeTooltipWidth","_resizeTooltipTop","_updateResizeHint","resizeStart","tooltipLeft","tablesWidth","support","scrollbar","tooltipWidth","tableOffset","tasksWrapper","appendTo","_removeResizeHint","_updatePercentCompleteTooltip","_removePercentCompleteTooltip","tooltip","tooltipCallout","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","_adjustTooltipDimensions","_removeTaskTooltip","_createOffsetTooltip","hours","_offsetTooltip","offsetValue","plannedTasksMessages","plannedTasks","minutes","offsetText","days","offsetTooltipDelay","offsetPrefix","OFFSET_TOOLTIP_TEMPLATE","_removeOffsetTooltip","_createPlannedTooltip","_plannedTooltip","plannedTooltip","editorMessages","editor","startDate","endDate","PLANNED_TOOLTIP_TEMPLATE","_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","gridHeaderWrap","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 = ({ start }) => kendo.toString(start, 't');\n var DAY_HEADER_TEMPLATE = ({ start }) => kendo.toString(start, 'ddd M/dd');\n var WEEK_HEADER_TEMPLATE = ({ start, end }) => `${kendo.toString(start, 'ddd M/dd')} - ${kendo.toString(kendo.date.addDays(end, -1), 'ddd M/dd')}`;\n var MONTH_HEADER_TEMPLATE = ({ start }) => kendo.toString(start, 'MMM');\n var YEAR_HEADER_TEMPLATE = ({ start }) => kendo.toString(start, 'yyyy');\n var RESIZE_HINT = ({ styles }) => `
` +\n `
` +\n '
';\n var RESIZE_TOOLTIP_TEMPLATE = ({ styles, messages, start, end, format }) => `
` +\n `
` +\n `
${kendo.htmlEncode(messages.start)}: ${kendo.toString(start, format)}
` +\n `
${kendo.htmlEncode(messages.end)}: ${kendo.toString(end, format)}
` +\n '
' +\n '
';\n var PERCENT_RESIZE_TOOLTIP_TEMPLATE = ({ styles, text }) => `
` +\n `
${text}%
` +\n `
` +\n '
';\n var TASK_TOOLTIP_TEMPLATE = ({ styles, task, messages }) => `
` +\n `${kendo.htmlEncode(task.title)}` +\n `
${kendo.toString(task.percentComplete, \"p0\")}
` +\n `' +\n '
';\n var OFFSET_TOOLTIP_TEMPLATE = ({ offsetPrefix, offsetText }) => `${offsetPrefix}: ${offsetText}`;\n var PLANNED_TOOLTIP_TEMPLATE = ({ plannedStart, plannedEnd, startDate, endDate }) => '
' +\n `
${plannedStart}: ${startDate}
` +\n `
${plannedEnd}: ${endDate}
` +\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-gantt-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"]}