{"version":3,"sources":["webpack:///./node_modules/@progress/kendo-ui/js/dataviz/diagram/services.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","id","loaded","call","m","c","p","0","3","Error","892","906","913","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","f","define","apply","undefined","$","kendo","window","dataviz","diagram","Class","Group","Rect","Rectangle","Utils","isUndefined","Point","Circle","Ticker","deepExtend","Movable","ui","util","drawing","defined","inArray","proxy","Cursors","arrow","grip","cross","add","move","select","south","east","west","north","rowresize","colresize","HIT_TEST_DISTANCE","AUTO","TOP","RIGHT","LEFT","BOTTOM","DEFAULT_SNAP_SIZE","DEFAULT_SNAP_ANGLE","DRAG_START","DRAG","DRAG_END","ITEMROTATE","ITEMBOUNDSCHANGE","MIN_SNAP_SIZE","MIN_SNAP_ANGLE","MOUSE_ENTER","MOUSE_LEAVE","ZOOM_START","ZOOM_END","SCROLL_MIN","SCROLL_MAX","FRICTION","FRICTION_MOBILE","VELOCITY_MULTIPLIER","TRANSPARENT","PAN","ROTATED","SOURCE","TARGET","HANDLE_NAMES","PositionAdapter","extend","init","layoutState","this","initState","pusher","bounds","shape","getShapeById","subjects","push","froms","topLeft","tos","nodeMap","forEach","update","tick","length","i","position","x","y","LayoutUndoUnit","initialState","finalState","animate","_initialState","_finalState","title","undo","setState","redo","state","linkMap","points","conn","visible","ticker","addAdapter","onComplete","play","CompositeUnit","unit","units","undoUnit","ConnectionEditUnit","item","redoSource","redoTarget","_redoSource","_redoTarget","_undoSource","source","_undoTarget","target","_updateConnector","updateModel","ConnectionEditUndoUnit","undoSource","undoTarget","DeleteConnectionUnit","connection","targetConnector","_addConnection","remove","DeleteShapeUnit","_addShape","TransformUnit","shapes","undoStates","adorner","redoStates","hasOwnProperty","layout","refreshBounds","refresh","AddConnectionUnit","AddShapeUnit","deselect","PanUndoUnit","initialPosition","finalPosition","initial","finalPos","pan","RotateUnit","undoRotates","redoRotates","redoAngle","_angle","center","_innerBounds","rotate","angle","_initialize","ToFrontUnit","items","initialIndices","indices","_toIndex","toFront","ToBackUnit","toBack","UndoRedoService","Observable","options","fn","bind","events","stack","index","capacity","begin","composite","cancel","commit","execute","_restart","addCompositeItem","pop","count","trigger","splice","clear","EmptyTool","toolService","start","end","tryActivate","getCursor","ScrollerTool","tool","friction","support","mobileOS","canvas","scroller","scrollable","kendoMobileScroller","velocityMultiplier","mousewheelScrolling","zoom","scroll","_move","data","translate","movableCanvas","element","virtualScroll","dimension","min","max","makeVirtual","virtualSize","dimensions","disable","meta","pannable","enabled","ctrlKey","key","noMeta","hoveredItem","hoveredAdorner","_hoveredConnector","enable","args","scrollPos","scrollLeft","scrollTop","_storePan","times","moveTo","plus","_pan","PointerTool","selectSingle","handle","_hitTest","_resizingAdorner","isDragHandle","connections","startPoint","stop","undoRedoService","_getCursor","SelectionTool","selectable","multiple","selector","rect","isSelected","isEmpty","selectArea","ConnectionTool","type","connector","_createConnection","_c","canDrag","connectionHandle","_connectionManipulation","_removeHover","activeConnection","_cachedTouchTarget","visual","d","cachedTouchTarget","sourceConnector","Shape","getConnector","_syncConnectionChanges","_connectorsAdorner","ConnectionEditTool","isActive","path","name","handleName","testKey","str","charCodeAt","toUpperCase","ToolService","tools","activeTool","_updateHoveredItem","_activateTool","_updateCursor","focus","surface","suspendTracking","updateHovered","resumeTracking","keyDown","metaKey","altKey","toRemove","_triggerRemove","_syncChanges","_destroyToolBar","_discardNewConnection","selectAll","copy","cut","paste","wheel","delta","z","zoomRate","zoomOptions","point","round","Math","zoomMin","zoomMax","setTool","addToSelection","newConnection","cursor","css","disabledShape","isNew","hit","_hover","_visible","selectedConnections","_selectedItems","Connection","_hitTestItems","_hitTestElements","shapeHit","connectionHit","hitTestShapeConnectors","mainLayer","shapeIdx","children","connectionIdx","array","ConnectionRouterBase","LinearConnectionRouter","that","hitTest","rec","getBounds","inflate","contains","Geometry","distanceToPolyline","allPoints","s","e","right","left","top","bottom","PolylineRouter","route","CascadingRouter","SAME_SIDE_DISTANCE_RATIO","routePoints","result","_connectorPoints","_floatingPoints","_resolvedSourceConnector","_resolvedTargetConnector","sourcePoint","targetPoint","_connectorSides","axis","boundsPoint","secondarySign","_connectorSide","sideDistance","minSide","side","shapeBounds","bottomRight","sides","MAX_NUM","idx","abs","_sameSideDistance","width","height","pointX","pointY","sourceConnectorSide","targetConnectorSide","deltaX","deltaY","sameSideDistance","shiftX","shiftY","cascadeStartHorizontal","_startHorizontal","sourceSide","horizontal","AdornerBase","_adorners","ConnectionEditAdorner","_ts","sp","tp","spVisual","handles","epVisual","append","_initialSource","_initialTarget","minus","ts","radiusX","radiusY","sourcePointDistance","distanceTo","targetPointDistance","sourceHandle","targetHandle","redraw","modelToLayer","ConnectorsAdorner","_refreshHandler","show","len","ctr","connectors","_clearVisual","ConnectorVisual","_keepCachedTouchTarget","visualChildren","childrenCount","destroy","unbind","each","hitToOppositeSide","topRight","bottomLeft","ResizingAdorner","_manipulating","map","_initSelection","_createHandles","selected","_internalChange","_rotatedHandler","fill","color","stroke","hover","dashType","offset","_resizable","editable","resize","_handleOptions","drawingElement","value","_bounds","clone","handleBounds","handlesCount","_getHandleBounds","w","h","r","floor","_rotationOffset","_startAngle","_rotates","_positions","initialRotates","initialStates","handleOptions","isDefined","opacity","_sp","_cp","_lp","shapeStates","visibleHandles","currentAngle","dragging","newBounds","staticPoint","scaleX","scaleY","dtl","dbr","changed","_truncateAngle","findAngle","_rotating","shouldSnap","thr","_truncateDistance","_displaceBounds","scale","newCenter","minWidth","minHeight","oldBounds","states","_truncatePositionToGuides","ruler","truncatePositionToGuides","_truncateSizeToGuides","truncateSizeToGuides","a","snap","snapOptions","snapAngle","snapSize","size","drag","tl","br","fromPoints","_diffStates","_syncShapeChanges","equals","boundingBox","b","rotationThumb","thumb","_rotationThumbBounds","Selector","_ep","_adorn","visualBounds","modelToView","relative","_visualBounds","shiftKey","jQuery"],"mappings":"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","file":"js/chunk-vendors~955c3155.e4cb5c75.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(913);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 892:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.drawing\");\n\n/***/ }),\n\n/***/ 906:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./svg\");\n\n/***/ }),\n\n/***/ 913:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (f, define) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(892), __webpack_require__(906) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function () {\n\n\t (function ($, undefined) {\n\t // Imports ================================================================\n\t var kendo = window.kendo,\n\t dataviz = kendo.dataviz,\n\t diagram = dataviz.diagram,\n\t Class = kendo.Class,\n\t Group = diagram.Group,\n\t Rect = diagram.Rect,\n\t Rectangle = diagram.Rectangle,\n\t Utils = diagram.Utils,\n\t isUndefined = Utils.isUndefined,\n\t Point = diagram.Point,\n\t Circle = diagram.Circle,\n\t Ticker = diagram.Ticker,\n\t deepExtend = kendo.deepExtend,\n\t Movable = kendo.ui.Movable,\n\t util = kendo.drawing.util,\n\t defined = util.defined,\n\t inArray = $.inArray,\n\t proxy = $.proxy;\n\n\t // Constants ==============================================================\n\t var Cursors = {\n\t arrow: \"default\",\n\t grip: \"pointer\",\n\t cross: \"pointer\",\n\t add: \"pointer\",\n\t move: \"move\",\n\t select: \"pointer\",\n\t south: \"s-resize\",\n\t east: \"e-resize\",\n\t west: \"w-resize\",\n\t north: \"n-resize\",\n\t rowresize: \"row-resize\",\n\t colresize: \"col-resize\"\n\t },\n\t HIT_TEST_DISTANCE = 10,\n\t AUTO = \"Auto\",\n\t TOP = \"Top\",\n\t RIGHT = \"Right\",\n\t LEFT = \"Left\",\n\t BOTTOM = \"Bottom\",\n\t DEFAULT_SNAP_SIZE = 10,\n\t DEFAULT_SNAP_ANGLE = 10,\n\t DRAG_START = \"dragStart\",\n\t DRAG = \"drag\",\n\t DRAG_END = \"dragEnd\",\n\t ITEMROTATE = \"itemRotate\",\n\t ITEMBOUNDSCHANGE = \"itemBoundsChange\",\n\t MIN_SNAP_SIZE = 5,\n\t MIN_SNAP_ANGLE = 5,\n\t MOUSE_ENTER = \"mouseEnter\",\n\t MOUSE_LEAVE = \"mouseLeave\",\n\t ZOOM_START = \"zoomStart\",\n\t ZOOM_END = \"zoomEnd\",\n\t SCROLL_MIN = -20000,\n\t SCROLL_MAX = 20000,\n\t FRICTION = 0.90,\n\t FRICTION_MOBILE = 0.93,\n\t VELOCITY_MULTIPLIER = 5,\n\t TRANSPARENT = \"transparent\",\n\t PAN = \"pan\",\n\t ROTATED = \"rotated\",\n\t SOURCE = \"source\",\n\t TARGET = \"target\",\n\t HANDLE_NAMES = {\n\t \"-1\": SOURCE,\n\t \"1\": TARGET\n\t };\n\n\t diagram.Cursors = Cursors;\n\n\t var PositionAdapter = kendo.Class.extend({\n\t init: function (layoutState) {\n\t this.layoutState = layoutState;\n\t this.diagram = layoutState.diagram;\n\t },\n\t initState: function () {\n\t this.froms = [];\n\t this.tos = [];\n\t this.subjects = [];\n\t function pusher(id, bounds) {\n\t var shape = this.diagram.getShapeById(id);\n\t if (shape) {\n\t this.subjects.push(shape);\n\t this.froms.push(shape.bounds().topLeft());\n\t this.tos.push(bounds.topLeft());\n\t }\n\t }\n\n\t this.layoutState.nodeMap.forEach(pusher, this);\n\t },\n\t update: function (tick) {\n\t if (this.subjects.length <= 0) {\n\t return;\n\t }\n\t for (var i = 0; i < this.subjects.length; i++) {\n\t //todo: define a Lerp function instead\n\t this.subjects[i].position(\n\t new Point(this.froms[i].x + (this.tos[i].x - this.froms[i].x) * tick, this.froms[i].y + (this.tos[i].y - this.froms[i].y) * tick)\n\t );\n\t }\n\t }\n\t });\n\n\t var LayoutUndoUnit = Class.extend({\n\t init: function (initialState, finalState, animate) {\n\t if (isUndefined(animate)) {\n\t this.animate = false;\n\t }\n\t else {\n\t this.animate = animate;\n\t }\n\t this._initialState = initialState;\n\t this._finalState = finalState;\n\t this.title = \"Diagram layout\";\n\t },\n\t undo: function () {\n\t this.setState(this._initialState);\n\t },\n\t redo: function () {\n\t this.setState(this._finalState);\n\t },\n\t setState: function (state) {\n\t var diagram = state.diagram;\n\t if (this.animate) {\n\t state.linkMap.forEach(\n\t function (id, points) {\n\t var conn = diagram.getShapeById(id);\n\t conn.visible(false);\n\t if (conn) {\n\t conn.points(points);\n\t }\n\t }\n\t );\n\t var ticker = new Ticker();\n\t ticker.addAdapter(new PositionAdapter(state));\n\t ticker.onComplete(function () {\n\t state.linkMap.forEach(\n\t function (id) {\n\t var conn = diagram.getShapeById(id);\n\t conn.visible(true);\n\t }\n\t );\n\t });\n\t ticker.play();\n\t }\n\t else {\n\t state.nodeMap.forEach(function (id, bounds) {\n\t var shape = diagram.getShapeById(id);\n\t if (shape) {\n\t shape.position(bounds.topLeft());\n\t }\n\t });\n\t state.linkMap.forEach(\n\t function (id, points) {\n\t var conn = diagram.getShapeById(id);\n\t if (conn) {\n\t conn.points(points);\n\t }\n\t }\n\t );\n\t }\n\t }\n\t });\n\n\t var CompositeUnit = Class.extend({\n\t init: function (unit) {\n\t this.units = [];\n\t this.title = \"Composite unit\";\n\t if (unit !== undefined) {\n\t this.units.push(unit);\n\t }\n\t },\n\t add: function (undoUnit) {\n\t this.units.push(undoUnit);\n\t },\n\t undo: function () {\n\t for (var i = 0; i < this.units.length; i++) {\n\t this.units[i].undo();\n\t }\n\t },\n\t redo: function () {\n\t for (var i = 0; i < this.units.length; i++) {\n\t this.units[i].redo();\n\t }\n\t }\n\t });\n\n\t var ConnectionEditUnit = Class.extend({\n\t init: function (item, redoSource, redoTarget) {\n\t this.item = item;\n\t this._redoSource = redoSource;\n\t this._redoTarget = redoTarget;\n\t if (defined(redoSource)) {\n\t this._undoSource = item.source();\n\t }\n\n\t if (defined(redoTarget)) {\n\t this._undoTarget = item.target();\n\t }\n\t this.title = \"Connection Editing\";\n\t },\n\t undo: function () {\n\t if (this._undoSource !== undefined) {\n\t this.item._updateConnector(this._undoSource, \"source\");\n\t }\n\n\t if (this._undoTarget !== undefined) {\n\t this.item._updateConnector(this._undoTarget, \"target\");\n\t }\n\n\t this.item.updateModel();\n\t },\n\t redo: function () {\n\t if (this._redoSource !== undefined) {\n\t this.item._updateConnector(this._redoSource, \"source\");\n\t }\n\n\t if (this._redoTarget !== undefined) {\n\t this.item._updateConnector(this._redoTarget, \"target\");\n\t }\n\n\t this.item.updateModel();\n\t }\n\t });\n\n\t var ConnectionEditUndoUnit = Class.extend({\n\t init: function (item, undoSource, undoTarget) {\n\t this.item = item;\n\t this._undoSource = undoSource;\n\t this._undoTarget = undoTarget;\n\t this._redoSource = item.source();\n\t this._redoTarget = item.target();\n\t this.title = \"Connection Editing\";\n\t },\n\t undo: function () {\n\t this.item._updateConnector(this._undoSource, \"source\");\n\t this.item._updateConnector(this._undoTarget, \"target\");\n\t this.item.updateModel();\n\t },\n\t redo: function () {\n\t this.item._updateConnector(this._redoSource, \"source\");\n\t this.item._updateConnector(this._redoTarget, \"target\");\n\t this.item.updateModel();\n\t }\n\t });\n\n\t var DeleteConnectionUnit = Class.extend({\n\t init: function (connection) {\n\t this.connection = connection;\n\t this.diagram = connection.diagram;\n\t this.targetConnector = connection.targetConnector;\n\t this.title = \"Delete connection\";\n\t },\n\t undo: function () {\n\t this.diagram._addConnection(this.connection, false);\n\t },\n\t redo: function () {\n\t this.diagram.remove(this.connection, false);\n\t }\n\t });\n\n\t var DeleteShapeUnit = Class.extend({\n\t init: function (shape) {\n\t this.shape = shape;\n\t this.diagram = shape.diagram;\n\t this.title = \"Deletion\";\n\t },\n\t undo: function () {\n\t this.diagram._addShape(this.shape, false);\n\t this.shape.select(false);\n\t },\n\t redo: function () {\n\t this.shape.select(false);\n\t this.diagram.remove(this.shape, false);\n\t }\n\t });\n\t /**\n\t * Holds the undoredo state when performing a rotation, translation or scaling. The adorner is optional.\n\t * @type {*}\n\t */\n\t var TransformUnit = Class.extend({\n\t init: function (shapes, undoStates, adorner) {\n\t this.shapes = shapes;\n\t this.undoStates = undoStates;\n\t this.title = \"Transformation\";\n\t this.redoStates = [];\n\t this.adorner = adorner;\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t this.redoStates.push(shape.bounds());\n\t }\n\t },\n\t undo: function () {\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t shape.bounds(this.undoStates[i]);\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape, this.redoStates[i], this.undoStates[i]);\n\t }\n\t shape.updateModel();\n\t }\n\t if (this.adorner) {\n\t this.adorner.refreshBounds();\n\t this.adorner.refresh();\n\t }\n\t },\n\t redo: function () {\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t shape.bounds(this.redoStates[i]);\n\t // the 'layout' property, if implemented, lets the shape itself work out what to do with the new bounds\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape, this.undoStates[i], this.redoStates[i]);\n\t }\n\t shape.updateModel();\n\t }\n\n\t if (this.adorner) {\n\t this.adorner.refreshBounds();\n\t this.adorner.refresh();\n\t }\n\t }\n\t });\n\n\t var AddConnectionUnit = Class.extend({\n\t init: function (connection, diagram) {\n\t this.connection = connection;\n\t this.diagram = diagram;\n\t this.title = \"New connection\";\n\t },\n\n\t undo: function () {\n\t this.diagram.remove(this.connection, false);\n\t },\n\n\t redo: function () {\n\t this.diagram._addConnection(this.connection, false);\n\t }\n\t });\n\n\t var AddShapeUnit = Class.extend({\n\t init: function (shape, diagram) {\n\t this.shape = shape;\n\t this.diagram = diagram;\n\t this.title = \"New shape\";\n\t },\n\n\t undo: function () {\n\t this.diagram.deselect();\n\t this.diagram.remove(this.shape, false);\n\t },\n\n\t redo: function () {\n\t this.diagram._addShape(this.shape, false);\n\t }\n\t });\n\n\t var PanUndoUnit = Class.extend({\n\t init: function (initialPosition, finalPosition, diagram) {\n\t this.initial = initialPosition;\n\t this.finalPos = finalPosition;\n\t this.diagram = diagram;\n\t this.title = \"Pan Unit\";\n\t },\n\t undo: function () {\n\t this.diagram.pan(this.initial);\n\t },\n\t redo: function () {\n\t this.diagram.pan(this.finalPos);\n\t }\n\t });\n\n\t var RotateUnit = Class.extend({\n\t init: function (adorner, shapes, undoRotates) {\n\t this.shapes = shapes;\n\t this.undoRotates = undoRotates;\n\t this.title = \"Rotation\";\n\t this.redoRotates = [];\n\t this.redoAngle = adorner._angle;\n\t this.adorner = adorner;\n\t this.center = adorner._innerBounds.center();\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t this.redoRotates.push(shape.rotate().angle);\n\t }\n\t },\n\t undo: function () {\n\t var i, shape;\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t shape.rotate(this.undoRotates[i], this.center, false);\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape);\n\t }\n\t shape.updateModel();\n\t }\n\t if (this.adorner) {\n\t this.adorner._initialize();\n\t this.adorner.refresh();\n\t }\n\t },\n\t redo: function () {\n\t var i, shape;\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t shape.rotate(this.redoRotates[i], this.center, false);\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape);\n\t }\n\t shape.updateModel();\n\t }\n\t if (this.adorner) {\n\t this.adorner._initialize();\n\t this.adorner.refresh();\n\t }\n\t }\n\t });\n\n\t var ToFrontUnit = Class.extend({\n\t init: function (diagram, items, initialIndices) {\n\t this.diagram = diagram;\n\t this.indices = initialIndices;\n\t this.items = items;\n\t this.title = \"Rotate Unit\";\n\t },\n\t undo: function () {\n\t this.diagram._toIndex(this.items, this.indices);\n\t },\n\t redo: function () {\n\t this.diagram.toFront(this.items, false);\n\t }\n\t });\n\n\t var ToBackUnit = Class.extend({\n\t init: function (diagram, items, initialIndices) {\n\t this.diagram = diagram;\n\t this.indices = initialIndices;\n\t this.items = items;\n\t this.title = \"Rotate Unit\";\n\t },\n\t undo: function () {\n\t this.diagram._toIndex(this.items, this.indices);\n\t },\n\t redo: function () {\n\t this.diagram.toBack(this.items, false);\n\t }\n\t });\n\n\t /**\n\t * Undo-redo service.\n\t */\n\t var UndoRedoService = kendo.Observable.extend({\n\t init: function (options) {\n\t kendo.Observable.fn.init.call(this, options);\n\t this.bind(this.events, options);\n\t this.stack = [];\n\t this.index = 0;\n\t this.capacity = 100;\n\t },\n\n\t events: [\"undone\", \"redone\"],\n\n\t /**\n\t * Starts the collection of units. Add those with\n\t * the addCompositeItem method and call commit. Or cancel to forget about it.\n\t */\n\t begin: function () {\n\t this.composite = new CompositeUnit();\n\t },\n\n\t /**\n\t * Cancels the collection process of unit started with 'begin'.\n\t */\n\t cancel: function () {\n\t this.composite = undefined;\n\t },\n\n\t /**\n\t * Commits a batch of units.\n\t */\n\t commit: function (execute) {\n\t if (this.composite.units.length > 0) {\n\t this._restart(this.composite, execute);\n\t }\n\t this.composite = undefined;\n\t },\n\n\t /**\n\t * Adds a unit as part of the begin-commit batch.\n\t * @param undoUnit\n\t */\n\t addCompositeItem: function (undoUnit) {\n\t if (this.composite) {\n\t this.composite.add(undoUnit);\n\t } else {\n\t this.add(undoUnit);\n\t }\n\t },\n\n\t /**\n\t * Standard addition of a unit. See also the batch version; begin-addCompositeUnit-commit methods.\n\t * @param undoUnit The unit to be added.\n\t * @param execute If false, the unit will be added but not executed.\n\t */\n\t add: function (undoUnit, execute) {\n\t this._restart(undoUnit, execute);\n\t },\n\n\t /**\n\t * Returns the number of undoable unit in the stack.\n\t * @returns {Number}\n\t */\n\n\t pop: function() {\n\t if (this.index > 0) {\n\t this.stack.pop();\n\t this.index--;\n\t }\n\t },\n\n\t count: function () {\n\t return this.stack.length;\n\t },\n\n\t /**\n\t * Rollback of the unit on top of the stack.\n\t */\n\t undo: function () {\n\t if (this.index > 0) {\n\t this.index--;\n\t this.stack[this.index].undo();\n\t this.trigger(\"undone\");\n\t }\n\t },\n\n\t /**\n\t * Redo of the last undone action.\n\t */\n\t redo: function () {\n\t if (this.stack.length > 0 && this.index < this.stack.length) {\n\t this.stack[this.index].redo();\n\t this.index++;\n\t this.trigger(\"redone\");\n\t }\n\t },\n\n\t _restart: function (composite, execute) {\n\t // throw away anything beyond this point if this is a new branch\n\t this.stack.splice(this.index, this.stack.length - this.index);\n\t this.stack.push(composite);\n\t if (execute !== false) {\n\t this.redo();\n\t } else {\n\t this.index++;\n\t }\n\t // check the capacity\n\t if (this.stack.length > this.capacity) {\n\t this.stack.splice(0, this.stack.length - this.capacity);\n\t this.index = this.capacity; //points to the end of the stack\n\t }\n\t },\n\n\t /**\n\t * Clears the stack.\n\t */\n\t clear: function () {\n\t this.stack = [];\n\t this.index = 0;\n\t }\n\t });\n\n\t// Tools =========================================\n\n\t var EmptyTool = Class.extend({\n\t init: function (toolService) {\n\t this.toolService = toolService;\n\t },\n\t start: function () {\n\t },\n\t move: function () {\n\t },\n\t end: function () {\n\t },\n\t tryActivate: function () {\n\t return false;\n\t },\n\t getCursor: function () {\n\t return Cursors.arrow;\n\t }\n\t });\n\n\t var ScrollerTool = EmptyTool.extend({\n\t init: function (toolService) {\n\t var tool = this;\n\t var friction = kendo.support.mobileOS ? FRICTION_MOBILE : FRICTION;\n\t EmptyTool.fn.init.call(tool, toolService);\n\n\t var diagram = tool.toolService.diagram,\n\t canvas = diagram.canvas;\n\n\t var scroller = diagram.scroller = tool.scroller = $(diagram.scrollable).kendoMobileScroller({\n\t friction: friction,\n\t velocityMultiplier: VELOCITY_MULTIPLIER,\n\t mousewheelScrolling: false,\n\t zoom: false,\n\t scroll: proxy(tool._move, tool)\n\t }).data(\"kendoMobileScroller\");\n\n\t if (canvas.translate) {\n\t tool.movableCanvas = new Movable(canvas.element);\n\t }\n\n\t var virtualScroll = function (dimension, min, max) {\n\t dimension.makeVirtual();\n\t dimension.virtualSize(min || SCROLL_MIN, max || SCROLL_MAX);\n\t };\n\n\t virtualScroll(scroller.dimensions.x);\n\t virtualScroll(scroller.dimensions.y);\n\t scroller.disable();\n\t },\n\n\t tryActivate: function (p, meta) {\n\t var toolService = this.toolService;\n\t var options = toolService.diagram.options.pannable;\n\t var enabled = meta.ctrlKey;\n\n\t if (defined(options.key)) {\n\t if (!options.key || options.key == \"none\") {\n\t enabled = noMeta(meta) && !defined(toolService.hoveredItem);\n\t } else {\n\t enabled = meta[options.key + \"Key\"];\n\t }\n\t }\n\n\t return options !== false && enabled && !defined(toolService.hoveredAdorner) && !defined(toolService._hoveredConnector);\n\t },\n\n\t start: function () {\n\t this.scroller.enable();\n\t },\n\t move: function () {\n\t },//the tool itself should not handle the scrolling. Let kendo scroller take care of this part. Check _move\n\t _move: function (args) {\n\t var tool = this,\n\t diagram = tool.toolService.diagram,\n\t canvas = diagram.canvas,\n\t scrollPos = new Point(args.scrollLeft, args.scrollTop);\n\n\t if (canvas.translate) {\n\t diagram._storePan(scrollPos.times(-1));\n\t tool.movableCanvas.moveTo(scrollPos);\n\t canvas.translate(scrollPos.x, scrollPos.y);\n\t } else {\n\t scrollPos = scrollPos.plus(diagram._pan.times(-1));\n\t }\n\n\t diagram.trigger(PAN, {pan: scrollPos});\n\t },\n\t end: function () {\n\t this.scroller.disable();\n\t },\n\t getCursor: function () {\n\t return Cursors.move;\n\t }\n\t });\n\n\t /**\n\t * The tool handling the transformations via the adorner.\n\t * @type {*}\n\t */\n\t var PointerTool = Class.extend({\n\t init: function (toolService) {\n\t this.toolService = toolService;\n\t },\n\t tryActivate: function () {\n\t return true; // the pointer tool is last and handles all others requests.\n\t },\n\t start: function (p, meta) {\n\t var toolService = this.toolService,\n\t diagram = toolService.diagram,\n\t hoveredItem = toolService.hoveredItem;\n\n\t if (hoveredItem) {\n\t toolService.selectSingle(hoveredItem, meta);\n\t if (hoveredItem.adorner) { //connection\n\t this.adorner = hoveredItem.adorner;\n\t this.handle = this.adorner._hitTest(p);\n\t }\n\t }\n\n\t if (!this.handle) {\n\t this.handle = diagram._resizingAdorner._hitTest(p);\n\t if (this.handle) {\n\t this.adorner = diagram._resizingAdorner;\n\t }\n\t }\n\n\t if (this.adorner) {\n\t if (!this.adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_START, { shapes: this.adorner.shapes, connections: [] })) {\n\t this.adorner.start(p);\n\t } else {\n\t toolService.startPoint = p;\n\t toolService.end(p);\n\t }\n\t }\n\t },\n\n\t move: function (p) {\n\t if (this.adorner) {\n\t this.adorner.move(this.handle, p);\n\t if (this.adorner.isDragHandle(this.handle)) {\n\t this.toolService.diagram.trigger(DRAG, { shapes: this.adorner.shapes, connections: [] });\n\t }\n\t }\n\t },\n\n\t end: function () {\n\t var diagram = this.toolService.diagram,\n\t adorner = this.adorner,\n\t unit;\n\n\t if (adorner) {\n\t if (!adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_END, { shapes: adorner.shapes, connections: [] })) {\n\t unit = adorner.stop();\n\t if (unit) {\n\t diagram.undoRedoService.add(unit, false);\n\t }\n\t } else {\n\t adorner.cancel();\n\t }\n\t }\n\n\t this.adorner = undefined;\n\t this.handle = undefined;\n\t },\n\t getCursor: function (p) {\n\t return this.toolService.hoveredItem ? this.toolService.hoveredItem._getCursor(p) : Cursors.arrow;\n\t }\n\t });\n\n\t var SelectionTool = Class.extend({\n\t init: function (toolService) {\n\t this.toolService = toolService;\n\t },\n\t tryActivate: function (p, meta) {\n\t var toolService = this.toolService;\n\t var selectable = toolService.diagram.options.selectable;\n\t var enabled = selectable && selectable.multiple !== false;\n\n\t if (enabled) {\n\t if (selectable.key && selectable.key != \"none\") {\n\t enabled = meta[selectable.key + \"Key\"];\n\t } else {\n\t enabled = noMeta(meta);\n\t }\n\t }\n\n\t return enabled && !defined(toolService.hoveredItem) && !defined(toolService.hoveredAdorner);\n\t },\n\t start: function (p) {\n\t var diagram = this.toolService.diagram;\n\t diagram.deselect();\n\t diagram.selector.start(p);\n\t },\n\t move: function (p) {\n\t var diagram = this.toolService.diagram;\n\t diagram.selector.move(p);\n\t },\n\t end: function (p, meta) {\n\t var diagram = this.toolService.diagram, hoveredItem = this.toolService.hoveredItem;\n\t var rect = diagram.selector.bounds();\n\t if ((!hoveredItem || !hoveredItem.isSelected) && !meta.ctrlKey) {\n\t diagram.deselect();\n\t }\n\t if (!rect.isEmpty()) {\n\t diagram.selectArea(rect);\n\t }\n\t diagram.selector.end();\n\t },\n\t getCursor: function () {\n\t return Cursors.arrow;\n\t }\n\t });\n\n\t var ConnectionTool = Class.extend({\n\t init: function (toolService) {\n\t this.toolService = toolService;\n\t this.type = \"ConnectionTool\";\n\t },\n\t tryActivate: function() {\n\t return this.toolService._hoveredConnector;\n\t },\n\t start: function (p, meta) {\n\t var toolService = this.toolService,\n\t diagram = toolService.diagram,\n\t connector = toolService._hoveredConnector,\n\t connection = diagram._createConnection({}, connector._c, p);\n\n\t if (canDrag(connection) && !diagram.trigger(DRAG_START, { shapes: [], connections: [connection], connectionHandle: TARGET }) && diagram._addConnection(connection)) {\n\t toolService._connectionManipulation(connection, connector._c.shape, true);\n\t toolService._removeHover();\n\t toolService.selectSingle(toolService.activeConnection, meta);\n\t if (meta.type == \"touchmove\") {\n\t diagram._cachedTouchTarget = connector.visual;\n\t }\n\t } else {\n\t connection.source(null);\n\t toolService.end(p);\n\t }\n\t },\n\n\t move: function (p) {\n\t var toolService = this.toolService;\n\t var connection = toolService.activeConnection;\n\n\t connection.target(p);\n\t toolService.diagram.trigger(DRAG, { shapes: [], connections: [connection], connectionHandle: TARGET });\n\t return true;\n\t },\n\n\t end: function (p) {\n\t var toolService = this.toolService,\n\t d = toolService.diagram,\n\t connection = toolService.activeConnection,\n\t hoveredItem = toolService.hoveredItem,\n\t connector = toolService._hoveredConnector,\n\t target,\n\t cachedTouchTarget = d._cachedTouchTarget;\n\n\t if (!connection) {\n\t return;\n\t }\n\n\t if (connector && connector._c != connection.sourceConnector) {\n\t target = connector._c;\n\t } else if (hoveredItem && hoveredItem instanceof diagram.Shape) {\n\t target = hoveredItem.getConnector(AUTO) || hoveredItem.getConnector(p);\n\t } else {\n\t target = p;\n\t }\n\n\t connection.target(target);\n\n\t if (!d.trigger(DRAG_END, { shapes: [], connections: [connection], connectionHandle: TARGET })) {\n\t connection.updateModel();\n\t d._syncConnectionChanges();\n\t } else {\n\t d.remove(connection, false);\n\t d.undoRedoService.pop();\n\t }\n\t toolService._connectionManipulation();\n\n\t if(cachedTouchTarget) {\n\t d._connectorsAdorner.visual.remove(cachedTouchTarget);\n\t d._cachedTouchTarget = null;\n\t }\n\t },\n\n\t getCursor: function () {\n\t return Cursors.arrow;\n\t }\n\t });\n\n\t var ConnectionEditTool = Class.extend({\n\t init: function (toolService) {\n\t this.toolService = toolService;\n\t this.type = \"ConnectionTool\";\n\t },\n\n\t tryActivate: function (p, meta) {\n\t var toolService = this.toolService,\n\t diagram = toolService.diagram,\n\t selectable = diagram.options.selectable,\n\t item = toolService.hoveredItem,\n\t isActive = selectable !== false &&\n\t item && item.path && !(item.isSelected && meta.ctrlKey);\n\n\t if (isActive) {\n\t this._c = item;\n\t }\n\n\t return isActive;\n\t },\n\n\t start: function (p, meta) {\n\t var toolService = this.toolService;\n\t var connection = this._c;\n\n\t toolService.selectSingle(connection, meta);\n\n\t var adorner = connection.adorner;\n\n\t var handle, name;\n\t if (adorner) {\n\t handle = adorner._hitTest(p);\n\t name = HANDLE_NAMES[handle];\n\t }\n\n\t if (canDrag(connection) && adorner && !toolService.diagram.trigger(DRAG_START, { shapes: [], connections: [connection], connectionHandle: name })) {\n\t this.handle = handle;\n\t this.handleName = name;\n\t adorner.start(p);\n\t } else {\n\t toolService.startPoint = p;\n\t toolService.end(p);\n\t }\n\t },\n\n\t move: function (p) {\n\t var adorner = this._c.adorner;\n\t if (canDrag(this._c) && adorner) {\n\t adorner.move(this.handle, p);\n\t this.toolService.diagram.trigger(DRAG, { shapes: [], connections: [this._c], connectionHandle: this.handleName });\n\n\t return true;\n\t }\n\t },\n\n\t end: function (p) {\n\t var connection = this._c;\n\t var adorner = connection.adorner;\n\t var toolService = this.toolService;\n\t var diagram = toolService.diagram;\n\n\t if (adorner) {\n\t if (canDrag(connection)) {\n\t var unit = adorner.stop(p);\n\t if (!diagram.trigger(DRAG_END, { shapes: [], connections: [connection], connectionHandle: this.handleName })) {\n\t diagram.undoRedoService.add(unit, false);\n\t connection.updateModel();\n\t diagram._syncConnectionChanges();\n\t } else {\n\t unit.undo();\n\t }\n\t }\n\t }\n\t },\n\n\t getCursor: function () {\n\t return Cursors.move;\n\t }\n\t });\n\n\t function testKey(key, str) {\n\t return str.charCodeAt(0) == key || str.toUpperCase().charCodeAt(0) == key;\n\t }\n\n\t /**\n\t * The service managing the tools.\n\t * @type {*}\n\t */\n\t var ToolService = Class.extend({\n\t init: function (diagram) {\n\t this.diagram = diagram;\n\t this.tools = [\n\t new ScrollerTool(this),\n\t new ConnectionEditTool(this),\n\t new ConnectionTool(this),\n\t new SelectionTool(this),\n\t new PointerTool(this)\n\t ]; // the order matters.\n\n\t this.activeTool = undefined;\n\t },\n\n\t start: function (p, meta) {\n\t meta = deepExtend({}, meta);\n\t if (this.activeTool) {\n\t this.activeTool.end(p, meta);\n\t }\n\t this._updateHoveredItem(p);\n\t this._activateTool(p, meta);\n\t this.activeTool.start(p, meta);\n\t this._updateCursor(p);\n\t this.diagram.focus();\n\t this.diagram.canvas.surface.suspendTracking();\n\t this.startPoint = p;\n\t return true;\n\t },\n\n\t move: function (p, meta) {\n\t meta = deepExtend({}, meta);\n\t var updateHovered = true;\n\t if (this.activeTool) {\n\t updateHovered = this.activeTool.move(p, meta);\n\t }\n\t if (updateHovered) {\n\t this._updateHoveredItem(p);\n\t }\n\t this._updateCursor(p);\n\t return true;\n\t },\n\n\t end: function (p, meta) {\n\t meta = deepExtend({}, meta);\n\t if (this.activeTool) {\n\t this.activeTool.end(p, meta);\n\t }\n\t this.diagram.canvas.surface.resumeTracking();\n\t this.activeTool = undefined;\n\t this._updateCursor(p);\n\t return true;\n\t },\n\n\t keyDown: function (key, meta) {\n\t var diagram = this.diagram;\n\t meta = deepExtend({ ctrlKey: false, metaKey: false, altKey: false }, meta);\n\t if ((meta.ctrlKey || meta.metaKey) && !meta.altKey) {// ctrl or option\n\t if (testKey(key, \"a\")) {// A: select all\n\t diagram.selectAll();\n\t diagram._destroyToolBar();\n\t return true;\n\t } else if (testKey(key, \"z\")) {// Z: undo\n\t diagram.undo();\n\t diagram._destroyToolBar();\n\t return true;\n\t } else if (testKey(key, \"y\")) {// y: redo\n\t diagram.redo();\n\t diagram._destroyToolBar();\n\t return true;\n\t } else if (testKey(key, \"c\")) {\n\t diagram.copy();\n\t diagram._destroyToolBar();\n\t } else if (testKey(key, \"x\")) {\n\t diagram.cut();\n\t diagram._destroyToolBar();\n\t } else if (testKey(key, \"v\")) {\n\t diagram.paste();\n\t diagram._destroyToolBar();\n\t } else if (testKey(key, \"l\")) {\n\t diagram.layout();\n\t diagram._destroyToolBar();\n\t } else if (testKey(key, \"d\")) {\n\t diagram._destroyToolBar();\n\t diagram.copy();\n\t diagram.paste();\n\t }\n\t } else if (key === 46 || key === 8) {// del: deletion\n\t var toRemove = this.diagram._triggerRemove(diagram.select());\n\t if (toRemove.length) {\n\t this.diagram.remove(toRemove, true);\n\t this.diagram._syncChanges();\n\t this.diagram._destroyToolBar();\n\t }\n\n\t return true;\n\t } else if (key === 27) {// ESC: stop any action\n\t this._discardNewConnection();\n\t diagram.deselect();\n\t diagram._destroyToolBar();\n\t return true;\n\t }\n\n\t },\n\t wheel: function (p, meta) {\n\t var diagram = this.diagram,\n\t delta = meta.delta,\n\t z = diagram.zoom(),\n\t options = diagram.options,\n\t zoomRate = options.zoomRate,\n\t zoomOptions = { point: p, meta: meta, zoom: z };\n\n\t if (diagram.trigger(ZOOM_START, zoomOptions)) {\n\t return;\n\t }\n\n\t if (delta < 0) {\n\t z += zoomRate;\n\t } else {\n\t z -= zoomRate;\n\t }\n\n\t z = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, z)), 2);\n\t zoomOptions.zoom = z;\n\n\t diagram.zoom(z, zoomOptions);\n\t diagram.trigger(ZOOM_END, zoomOptions);\n\n\t return true;\n\t },\n\t setTool: function (tool, index) {\n\t tool.toolService = this;\n\t this.tools[index] = tool;\n\t },\n\n\t selectSingle: function(item, meta) {\n\t var diagram = this.diagram;\n\t var selectable = diagram.options.selectable;\n\t if (selectable && !item.isSelected && item.options.selectable !== false) {\n\t var addToSelection = meta.ctrlKey && selectable.multiple !== false;\n\t diagram.select(item, { addToSelection: addToSelection });\n\t }\n\t },\n\n\t _discardNewConnection: function () {\n\t if (this.newConnection) {\n\t this.diagram.remove(this.newConnection);\n\t this.newConnection = undefined;\n\t }\n\t },\n\t _activateTool: function (p, meta) {\n\t for (var i = 0; i < this.tools.length; i++) {\n\t var tool = this.tools[i];\n\t if (tool.tryActivate(p, meta)) {\n\t this.activeTool = tool;\n\t break; // activating the first available tool in the loop.\n\t }\n\t }\n\t },\n\t _updateCursor: function (p) {\n\t var element = this.diagram.element;\n\t var cursor = this.activeTool ? this.activeTool.getCursor(p) : (this.hoveredAdorner ? this.hoveredAdorner._getCursor(p) : (this.hoveredItem ? this.hoveredItem._getCursor(p) : Cursors.arrow));\n\n\t element.css({cursor: cursor});\n\t },\n\t _connectionManipulation: function (connection, disabledShape, isNew) {\n\t this.activeConnection = connection;\n\t this.disabledShape = disabledShape;\n\t if (isNew) {\n\t this.newConnection = this.activeConnection;\n\t } else {\n\t this.newConnection = undefined;\n\t }\n\t },\n\t _updateHoveredItem: function (p) {\n\t var hit = this._hitTest(p);\n\t var diagram = this.diagram;\n\n\t if (hit != this.hoveredItem && (!this.disabledShape || hit != this.disabledShape)) {\n\t if (this.hoveredItem) {\n\t diagram.trigger(MOUSE_LEAVE, { item: this.hoveredItem });\n\t this.hoveredItem._hover(false);\n\t }\n\n\t if (hit && hit.options.enable) {\n\t diagram.trigger(MOUSE_ENTER, { item: hit });\n\n\t this.hoveredItem = hit; // Shape, connection or connector\n\t this.hoveredItem._hover(true);\n\t } else {\n\t this.hoveredItem = undefined;\n\t }\n\t }\n\t },\n\t _removeHover: function () {\n\t if (this.hoveredItem) {\n\t this.hoveredItem._hover(false);\n\t this.hoveredItem = undefined;\n\t }\n\t },\n\t _hitTest: function (point) {\n\t var hit, d = this.diagram, item, i;\n\n\t // connectors\n\t if (this._hoveredConnector) {\n\t this._hoveredConnector._hover(false);\n\t this._hoveredConnector = undefined;\n\t }\n\t if (d._connectorsAdorner._visible) {\n\t hit = d._connectorsAdorner._hitTest(point);\n\t if (hit) {\n\t return hit;\n\t }\n\t }\n\n\t hit = this.diagram._resizingAdorner._hitTest(point);\n\t if (hit) {\n\t this.hoveredAdorner = d._resizingAdorner;\n\t if (hit.x !== 0 || hit.y !== 0) { // hit testing for resizers or rotator, otherwise if (0,0) than pass through.\n\t return;\n\t }\n\t hit = undefined;\n\t } else {\n\t this.hoveredAdorner = undefined;\n\t }\n\n\t if (!this.activeTool || this.activeTool.type !== \"ConnectionTool\") {\n\t var selectedConnections = []; // only the connections should have higher presence because the connection edit point is on top of connector.\n\t // TODO: This should be reworked. The connection adorner should be one for all selected connections and should be hit tested prior the connections and shapes itself.\n\t for (i = 0; i < d._selectedItems.length; i++) {\n\t item = d._selectedItems[i];\n\t if (item instanceof diagram.Connection) {\n\t selectedConnections.push(item);\n\t }\n\t }\n\t hit = this._hitTestItems(selectedConnections, point);\n\t }\n\n\t return hit || this._hitTestElements(point);\n\t },\n\n\t _hitTestElements: function(point) {\n\t var diagram = this.diagram;\n\t var shapeHit = this._hitTestItems(diagram.shapes, point);\n\t var connectionHit = this._hitTestItems(diagram.connections, point);\n\t var hit;\n\n\t if ((!this.activeTool || this.activeTool.type != \"ConnectionTool\") && shapeHit && connectionHit && !hitTestShapeConnectors(shapeHit, point)) {\n\t var mainLayer = diagram.mainLayer;\n\t var shapeIdx = inArray(shapeHit.visual, mainLayer.children);\n\t var connectionIdx = inArray(connectionHit.visual, mainLayer.children);\n\t hit = shapeIdx > connectionIdx ? shapeHit : connectionHit;\n\t }\n\t return hit || shapeHit || connectionHit;\n\t },\n\n\t _hitTestItems: function (array, point) {\n\t var i, item, hit;\n\t for (i = array.length - 1; i >= 0; i--) {\n\t item = array[i];\n\t hit = item._hitTest(point);\n\t if (hit) {\n\t return hit;\n\t }\n\t }\n\t }\n\t });\n\n\t// Routing =========================================\n\n\t /**\n\t * Base class for connection routers.\n\t */\n\t var ConnectionRouterBase = kendo.Class.extend({\n\t init: function () {\n\t }\n\t /*route: function (connection) {\n\t },\n\t hitTest: function (p) {\n\n\t },\n\t getBounds: function () {\n\n\t }*/\n\t });\n\n\t /**\n\t * Base class for polyline and cascading routing.\n\t */\n\t var LinearConnectionRouter = ConnectionRouterBase.extend({\n\t init: function (connection) {\n\t var that = this;\n\t ConnectionRouterBase.fn.init.call(that);\n\t this.connection = connection;\n\t },\n\t /**\n\t * Hit testing for polyline paths.\n\t */\n\t hitTest: function (p) {\n\t var rec = this.getBounds().inflate(HIT_TEST_DISTANCE);\n\t if (!rec.contains(p)) {\n\t return false;\n\t }\n\t return diagram.Geometry.distanceToPolyline(p, this.connection.allPoints()) < HIT_TEST_DISTANCE;\n\t },\n\n\t /**\n\t * Bounds of a polyline.\n\t * @returns {kendo.dataviz.diagram.Rect}\n\t */\n\t getBounds: function () {\n\t var points = this.connection.allPoints(),\n\t s = points[0],\n\t e = points[points.length - 1],\n\t right = Math.max(s.x, e.x),\n\t left = Math.min(s.x, e.x),\n\t top = Math.min(s.y, e.y),\n\t bottom = Math.max(s.y, e.y);\n\n\t for (var i = 1; i < points.length - 1; ++i) {\n\t right = Math.max(right, points[i].x);\n\t left = Math.min(left, points[i].x);\n\t top = Math.min(top, points[i].y);\n\t bottom = Math.max(bottom, points[i].y);\n\t }\n\n\t return new Rect(left, top, right - left, bottom - top);\n\t }\n\t });\n\n\t /**\n\t * A simple poly-linear routing which does not alter the intermediate points.\n\t * Does hold the underlying hit, bounds....logic.\n\t * @type {*|Object|void|extend|Zepto.extend|b.extend}\n\t */\n\t var PolylineRouter = LinearConnectionRouter.extend({\n\t init: function (connection) {\n\t var that = this;\n\t LinearConnectionRouter.fn.init.call(that);\n\t this.connection = connection;\n\t },\n\t route: function () {\n\t // just keep the points as is\n\t }\n\t });\n\n\t var CascadingRouter = LinearConnectionRouter.extend({\n\t SAME_SIDE_DISTANCE_RATIO: 5,\n\n\t init: function (connection) {\n\t var that = this;\n\t LinearConnectionRouter.fn.init.call(that);\n\t this.connection = connection;\n\t },\n\n\t routePoints: function(start, end, sourceConnector, targetConnector) {\n\t var result;\n\n\t if (sourceConnector && targetConnector) {\n\t result = this._connectorPoints(start, end, sourceConnector, targetConnector);\n\t } else {\n\t result = this._floatingPoints(start, end, sourceConnector);\n\t }\n\t return result;\n\t },\n\n\t route: function () {\n\t var sourceConnector = this.connection._resolvedSourceConnector;\n\t var targetConnector = this.connection._resolvedTargetConnector;\n\t var start = this.connection.sourcePoint();\n\t var end = this.connection.targetPoint();\n\t var points = this.routePoints(start, end, sourceConnector, targetConnector);\n\t this.connection.points(points);\n\t },\n\n\t _connectorSides: [{\n\t name: \"Top\",\n\t axis: \"y\",\n\t boundsPoint: \"topLeft\",\n\t secondarySign: 1\n\t }, {\n\t name: \"Left\",\n\t axis: \"x\",\n\t boundsPoint: \"topLeft\",\n\t secondarySign: 1\n\t }, {\n\t name: \"Bottom\",\n\t axis: \"y\",\n\t boundsPoint: \"bottomRight\",\n\t secondarySign: -1\n\t }, {\n\t name: \"Right\",\n\t axis: \"x\",\n\t boundsPoint: \"bottomRight\",\n\t secondarySign: -1\n\t }],\n\n\t _connectorSide: function(connector, targetPoint) {\n\t var position = connector.position();\n\t var shapeBounds = connector.shape.bounds(ROTATED);\n\t var bounds = {\n\t topLeft: shapeBounds.topLeft(),\n\t bottomRight: shapeBounds.bottomRight()\n\t };\n\t var sides = this._connectorSides;\n\t var min = util.MAX_NUM;\n\t var sideDistance;\n\t var minSide;\n\t var axis;\n\t var side;\n\t for (var idx = 0; idx < sides.length; idx++) {\n\t side = sides[idx];\n\t axis = side.axis;\n\t sideDistance = Math.round(Math.abs(position[axis] - bounds[side.boundsPoint][axis]));\n\t if (sideDistance < min) {\n\t min = sideDistance;\n\t minSide = side;\n\t } else if (sideDistance === min &&\n\t (position[axis] - targetPoint[axis]) * side.secondarySign > (position[minSide.axis] - targetPoint[minSide.axis]) * minSide.secondarySign) {\n\t minSide = side;\n\t }\n\t }\n\t return minSide.name;\n\t },\n\n\t _sameSideDistance: function(connector) {\n\t var bounds = connector.shape.bounds(ROTATED);\n\t return Math.min(bounds.width, bounds.height) / this.SAME_SIDE_DISTANCE_RATIO;\n\t },\n\n\t _connectorPoints: function(start, end, sourceConnector, targetConnector) {\n\t var sourceConnectorSide = this._connectorSide(sourceConnector, end);\n\t var targetConnectorSide = this._connectorSide(targetConnector, start);\n\t var deltaX = end.x - start.x;\n\t var deltaY = end.y - start.y;\n\t var sameSideDistance = this._sameSideDistance(sourceConnector);\n\t var result = [];\n\t var pointX, pointY;\n\n\t if (sourceConnectorSide === TOP || sourceConnectorSide == BOTTOM) {\n\t if (targetConnectorSide == TOP || targetConnectorSide == BOTTOM) {\n\t if (sourceConnectorSide == targetConnectorSide) {\n\t if (sourceConnectorSide == TOP) {\n\t pointY = Math.min(start.y, end.y) - sameSideDistance;\n\t } else {\n\t pointY = Math.max(start.y, end.y) + sameSideDistance;\n\t }\n\t result = [new Point(start.x, pointY), new Point(end.x, pointY)];\n\t } else {\n\t result = [new Point(start.x, start.y + deltaY / 2), new Point(end.x, start.y + deltaY / 2)];\n\t }\n\t } else {\n\t result = [new Point(start.x, end.y)];\n\t }\n\t } else {\n\t if (targetConnectorSide == LEFT || targetConnectorSide == RIGHT) {\n\t if (sourceConnectorSide == targetConnectorSide) {\n\t if (sourceConnectorSide == LEFT) {\n\t pointX = Math.min(start.x, end.x) - sameSideDistance;\n\t } else {\n\t pointX = Math.max(start.x, end.x) + sameSideDistance;\n\t }\n\t result = [new Point(pointX, start.y), new Point(pointX, end.y)];\n\t } else {\n\t result = [new Point(start.x + deltaX / 2, start.y), new Point(start.x + deltaX / 2, start.y + deltaY)];\n\t }\n\t } else {\n\t result = [new Point(end.x, start.y)];\n\t }\n\t }\n\t return result;\n\t },\n\n\t _floatingPoints: function(start, end, sourceConnector) {\n\t var sourceConnectorSide = sourceConnector ? this._connectorSide(sourceConnector, end) : null;\n\t var cascadeStartHorizontal = this._startHorizontal(start, end, sourceConnectorSide);\n\t var points = [start, start, end, end];\n\t var deltaX = end.x - start.x;\n\t var deltaY = end.y - start.y;\n\t var length = points.length;\n\t var shiftX;\n\t var shiftY;\n\n\t // note that this is more generic than needed for only two intermediate points.\n\t for (var idx = 1; idx < length - 1; ++idx) {\n\t if (cascadeStartHorizontal) {\n\t if (idx % 2 !== 0) {\n\t shiftX = deltaX / (length / 2);\n\t shiftY = 0;\n\t }\n\t else {\n\t shiftX = 0;\n\t shiftY = deltaY / ((length - 1) / 2);\n\t }\n\t }\n\t else {\n\t if (idx % 2 !== 0) {\n\t shiftX = 0;\n\t shiftY = deltaY / (length / 2);\n\t }\n\t else {\n\t shiftX = deltaX / ((length - 1) / 2);\n\t shiftY = 0;\n\t }\n\t }\n\t points[idx] = new Point(points[idx - 1].x + shiftX, points[idx - 1].y + shiftY);\n\t }\n\t // need to fix the wrong 1.5 factor of the last intermediate point\n\t idx--;\n\t if ((cascadeStartHorizontal && (idx % 2 !== 0)) || (!cascadeStartHorizontal && (idx % 2 === 0))) {\n\t points[length - 2] = new Point(points[length - 1].x, points[length - 2].y);\n\t } else {\n\t points[length - 2] = new Point(points[length - 2].x, points[length - 1].y);\n\t }\n\n\t return [points[1], points[2]];\n\t },\n\n\t _startHorizontal: function (start, end, sourceSide) {\n\t var horizontal;\n\t if (sourceSide !== null && (sourceSide === RIGHT || sourceSide === LEFT)) {\n\t horizontal = true;\n\t } else {\n\t horizontal = Math.abs(start.x - end.x) > Math.abs(start.y - end.y);\n\t }\n\n\t return horizontal;\n\t }\n\t });\n\n\t// Adorners =========================================\n\n\t var AdornerBase = Class.extend({\n\t init: function (diagram, options) {\n\t var that = this;\n\t that.diagram = diagram;\n\t that.options = deepExtend({}, that.options, options);\n\t that.visual = new Group();\n\t that.diagram._adorners.push(that);\n\t },\n\t refresh: function () {\n\n\t }\n\t });\n\n\t var ConnectionEditAdorner = AdornerBase.extend({\n\t init: function (connection, options) {\n\t var that = this, diagram;\n\t that.connection = connection;\n\t diagram = that.connection.diagram;\n\t that._ts = diagram.toolService;\n\t AdornerBase.fn.init.call(that, diagram, options);\n\t var sp = that.connection.sourcePoint();\n\t var tp = that.connection.targetPoint();\n\t that.spVisual = new Circle(deepExtend(that.options.handles, { center: sp }));\n\t that.epVisual = new Circle(deepExtend(that.options.handles, { center: tp }));\n\t that.visual.append(that.spVisual);\n\t that.visual.append(that.epVisual);\n\t },\n\n\t options: {\n\t handles: {}\n\t },\n\n\t _getCursor: function () {\n\t return Cursors.move;\n\t },\n\n\t start: function (p) {\n\t this.handle = this._hitTest(p);\n\t this.startPoint = p;\n\t this._initialSource = this.connection.source();\n\t this._initialTarget = this.connection.target();\n\t switch (this.handle) {\n\t case -1:\n\t if (this.connection.targetConnector) {\n\t this._ts._connectionManipulation(this.connection, this.connection.targetConnector.shape);\n\t }\n\t break;\n\t case 1:\n\t if (this.connection.sourceConnector) {\n\t this._ts._connectionManipulation(this.connection, this.connection.sourceConnector.shape);\n\t }\n\t break;\n\t }\n\t },\n\n\t move: function (handle, p) {\n\t switch (handle) {\n\t case -1:\n\t this.connection.source(p);\n\t break;\n\t case 1:\n\t this.connection.target(p);\n\t break;\n\t default:\n\t var delta = p.minus(this.startPoint);\n\t this.startPoint = p;\n\t if (!this.connection.sourceConnector) {\n\t this.connection.source(this.connection.sourcePoint().plus(delta));\n\t }\n\t if (!this.connection.targetConnector) {\n\t this.connection.target(this.connection.targetPoint().plus(delta));\n\t }\n\t break;\n\t }\n\t this.refresh();\n\t return true;\n\t },\n\n\t stop: function (p) {\n\t var ts = this.diagram.toolService, item = ts.hoveredItem, target;\n\t if (ts._hoveredConnector) {\n\t target = ts._hoveredConnector._c;\n\t } else if (item && item instanceof diagram.Shape) {\n\t target = item.getConnector(AUTO) || item.getConnector(p);\n\t } else {\n\t target = p;\n\t }\n\n\t if (this.handle === -1) {\n\t this.connection.source(target);\n\t } else if (this.handle === 1) {\n\t this.connection.target(target);\n\t }\n\n\t this.handle = undefined;\n\t this._ts._connectionManipulation();\n\t return new ConnectionEditUndoUnit(this.connection, this._initialSource, this._initialTarget);\n\t },\n\n\t _hitTest: function (point) {\n\t var sourcePoint = this.connection.sourcePoint();\n\t var targetPoint = this.connection.targetPoint();\n\t var radiusX = this.options.handles.width / 2 + HIT_TEST_DISTANCE;\n\t var radiusY = this.options.handles.height / 2 + HIT_TEST_DISTANCE;\n\t var sourcePointDistance = sourcePoint.distanceTo(point);\n\t var targetPointDistance = targetPoint.distanceTo(point);\n\t var sourceHandle = new Rect(sourcePoint.x, sourcePoint.y).inflate(radiusX, radiusY).contains(point);\n\t var targetHandle = new Rect(targetPoint.x, targetPoint.y).inflate(radiusX, radiusY).contains(point);\n\t var handle = 0;\n\n\t if (sourceHandle && (!targetHandle || sourcePointDistance < targetPointDistance)) {\n\t handle = -1;\n\t } else if (targetHandle && (!sourceHandle || targetPointDistance < sourcePointDistance)) {\n\t handle = 1;\n\t }\n\n\t return handle;\n\t },\n\n\t refresh: function () {\n\t this.spVisual.redraw({ center: this.diagram.modelToLayer(this.connection.sourcePoint()) });\n\t this.epVisual.redraw({ center: this.diagram.modelToLayer(this.connection.targetPoint()) });\n\t }\n\t });\n\n\t var ConnectorsAdorner = AdornerBase.extend({\n\t init: function (diagram, options) {\n\t var that = this;\n\t AdornerBase.fn.init.call(that, diagram, options);\n\t that._refreshHandler = function (e) {\n\t if (e.item == that.shape) {\n\t that.refresh();\n\t }\n\t };\n\t },\n\n\t show: function (shape) {\n\t var that = this, len, i, ctr;\n\t that._visible = true;\n\t that.shape = shape;\n\t that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler);\n\t len = shape.connectors.length;\n\t that.connectors = [];\n\t that._clearVisual();\n\t for (i = 0; i < len; i++) {\n\t ctr = new ConnectorVisual(shape.connectors[i]);\n\t that.connectors.push(ctr);\n\t that.visual.append(ctr.visual);\n\t }\n\t that.visual.visible(true);\n\t that.refresh();\n\t },\n\n\t _clearVisual: function() {\n\t var that = this;\n\t if(that.diagram._cachedTouchTarget) {\n\t that._keepCachedTouchTarget();\n\t } else {\n\t that.visual.clear();\n\t }\n\t },\n\n\t _keepCachedTouchTarget: function () {\n\t var that = this,\n\t visualChildren = that.visual.children;\n\t var childrenCount = visualChildren.length;\n\t var index = inArray(that.diagram._cachedTouchTarget, visualChildren);\n\t for (var i = childrenCount - 1; i >= 0; i--) {\n\t if(i == index) {\n\t continue;\n\t }\n\t that.visual.remove(visualChildren[i]);\n\t }\n\t },\n\n\t destroy: function () {\n\t var that = this;\n\t that.diagram.unbind(ITEMBOUNDSCHANGE, that._refreshHandler);\n\t that.shape = undefined;\n\t that._visible = undefined;\n\t that.visual.visible(false);\n\t },\n\n\t _hitTest: function (p) {\n\t var ctr, i;\n\t for (i = 0; i < this.connectors.length; i++) {\n\t ctr = this.connectors[i];\n\t if (ctr._hitTest(p)) {\n\t ctr._hover(true);\n\t this.diagram.toolService._hoveredConnector = ctr;\n\t break;\n\t }\n\t }\n\t },\n\n\t refresh: function () {\n\t if (this.shape) {\n\t var bounds = this.shape.bounds();\n\t bounds = this.diagram.modelToLayer(bounds);\n\t this.visual.position(bounds.topLeft());\n\t $.each(this.connectors, function () {\n\t this.refresh();\n\t });\n\t }\n\t }\n\t });\n\n\t function hitToOppositeSide(hit, bounds) {\n\t var result;\n\n\t if (hit.x == -1 && hit.y == -1) {\n\t result = bounds.bottomRight();\n\t } else if (hit.x == 1 && hit.y == 1) {\n\t result = bounds.topLeft();\n\t } else if (hit.x == -1 && hit.y == 1) {\n\t result = bounds.topRight();\n\t } else if (hit.x == 1 && hit.y == -1) {\n\t result = bounds.bottomLeft();\n\t } else if (hit.x === 0 && hit.y == -1) {\n\t result = bounds.bottom();\n\t } else if (hit.x === 0 && hit.y == 1) {\n\t result = bounds.top();\n\t } else if (hit.x == 1 && hit.y === 0) {\n\t result = bounds.left();\n\t } else if (hit.x == -1 && hit.y === 0) {\n\t result = bounds.right();\n\t }\n\n\t return result;\n\t }\n\n\t var ResizingAdorner = AdornerBase.extend({\n\t init: function (diagram, options) {\n\t var that = this;\n\t AdornerBase.fn.init.call(that, diagram, options);\n\t that._manipulating = false;\n\t that.map = [];\n\t that.shapes = [];\n\n\t that._initSelection();\n\t that._createHandles();\n\t that.redraw();\n\t that.diagram.bind(\"select\", function (e) {\n\t that._initialize(e.selected);\n\t });\n\n\t that._refreshHandler = function () {\n\t if (!that._internalChange) {\n\t that.refreshBounds();\n\t that.refresh();\n\t }\n\t };\n\n\t that._rotatedHandler = function () {\n\t if (that.shapes.length == 1) {\n\t that._angle = that.shapes[0].rotate().angle;\n\t }\n\t that._refreshHandler();\n\t };\n\n\t that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler).bind(ITEMROTATE, that._rotatedHandler);\n\t that.refreshBounds();\n\t that.refresh();\n\t },\n\n\t options: {\n\t handles: {\n\t fill: {\n\t color: \"#fff\"\n\t },\n\t stroke: {\n\t color: \"#282828\"\n\t },\n\t height: 7,\n\t width: 7,\n\t hover: {\n\t fill: {\n\t color: \"#282828\"\n\t },\n\t stroke: {\n\t color: \"#282828\"\n\t }\n\t }\n\t },\n\t selectable: {\n\t stroke: {\n\t color: \"#778899\",\n\t width: 1,\n\t dashType: \"dash\"\n\t },\n\t fill: {\n\t color: TRANSPARENT\n\t }\n\t },\n\t offset: 10\n\t },\n\n\t _initSelection: function() {\n\t var that = this;\n\t var diagram = that.diagram;\n\t var selectable = diagram.options.selectable;\n\t var options = deepExtend({}, that.options.selectable, selectable);\n\t that.rect = new Rectangle(options);\n\t that.visual.append(that.rect);\n\t },\n\n\t _resizable: function() {\n\t return this.options.editable && this.options.editable.resize !== false;\n\t },\n\n\t _handleOptions: function() {\n\t return (this.options.editable.resize || {}).handles || this.options.handles;\n\t },\n\n\t _createHandles: function() {\n\t var handles, item, y, x;\n\n\t if (this._resizable()) {\n\t handles = this._handleOptions();\n\t for (x = -1; x <= 1; x++) {\n\t for (y = -1; y <= 1; y++) {\n\t if ((x !== 0) || (y !== 0)) { // (0, 0) element, (-1, -1) top-left, (+1, +1) bottom-right\n\t item = new Rectangle(handles);\n\t item.drawingElement._hover = proxy(this._hover, this);\n\t this.map.push({ x: x, y: y, visual: item });\n\t this.visual.append(item);\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t bounds: function (value) {\n\t if (value) {\n\t this._innerBounds = value.clone();\n\t this._bounds = this.diagram.modelToLayer(value).inflate(this.options.offset, this.options.offset);\n\t } else {\n\t return this._bounds;\n\t }\n\t },\n\n\t _hitTest: function (p) {\n\t var tp = this.diagram.modelToLayer(p),\n\t i, hit, handleBounds, handlesCount = this.map.length, handle;\n\n\t if (this._angle) {\n\t tp = tp.clone().rotate(this._bounds.center(), this._angle);\n\t }\n\n\t if (this._resizable()) {\n\t for (i = 0; i < handlesCount; i++) {\n\t handle = this.map[i];\n\t hit = new Point(handle.x, handle.y);\n\t handleBounds = this._getHandleBounds(hit); //local coordinates\n\t handleBounds.offset(this._bounds.x, this._bounds.y);\n\t if (handleBounds.contains(tp)) {\n\t return hit;\n\t }\n\t }\n\t }\n\n\t if (this._bounds.contains(tp)) {\n\t return new Point(0, 0);\n\t }\n\t },\n\n\t _getHandleBounds: function (p) {\n\t if (this._resizable()) {\n\t var handles = this._handleOptions(),\n\t w = handles.width,\n\t h = handles.height,\n\t r = new Rect(0, 0, w, h);\n\n\t if (p.x < 0) {\n\t r.x = - w / 2;\n\t } else if (p.x === 0) {\n\t r.x = Math.floor(this._bounds.width / 2) - w / 2;\n\t } else if (p.x > 0) {\n\t r.x = this._bounds.width + 1.0 - w / 2;\n\t } if (p.y < 0) {\n\t r.y = - h / 2;\n\t } else if (p.y === 0) {\n\t r.y = Math.floor(this._bounds.height / 2) - h / 2;\n\t } else if (p.y > 0) {\n\t r.y = this._bounds.height + 1.0 - h / 2;\n\t }\n\n\t return r;\n\t }\n\t },\n\n\t _getCursor: function (point) {\n\t var hit = this._hitTest(point);\n\t if (hit && (hit.x >= -1) && (hit.x <= 1) && (hit.y >= -1) && (hit.y <= 1) && this._resizable()) {\n\t var angle = this._angle;\n\t if (angle) {\n\t angle = 360 - angle;\n\t hit.rotate(new Point(0, 0), angle);\n\t hit = new Point(Math.round(hit.x), Math.round(hit.y));\n\t }\n\n\t if (hit.x == -1 && hit.y == -1) {\n\t return \"nw-resize\";\n\t }\n\t if (hit.x == 1 && hit.y == 1) {\n\t return \"se-resize\";\n\t }\n\t if (hit.x == -1 && hit.y == 1) {\n\t return \"sw-resize\";\n\t }\n\t if (hit.x == 1 && hit.y == -1) {\n\t return \"ne-resize\";\n\t }\n\t if (hit.x === 0 && hit.y == -1) {\n\t return \"n-resize\";\n\t }\n\t if (hit.x === 0 && hit.y == 1) {\n\t return \"s-resize\";\n\t }\n\t if (hit.x == 1 && hit.y === 0) {\n\t return \"e-resize\";\n\t }\n\t if (hit.x == -1 && hit.y === 0) {\n\t return \"w-resize\";\n\t }\n\t }\n\t return this._manipulating ? Cursors.move : Cursors.select;\n\t },\n\n\t _initialize: function() {\n\t var that = this, i, item,\n\t items = that.diagram.select();\n\n\t that.shapes = [];\n\t for (i = 0; i < items.length; i++) {\n\t item = items[i];\n\t if (item instanceof diagram.Shape) {\n\t that.shapes.push(item);\n\t item._rotationOffset = new Point();\n\t }\n\t }\n\n\t that._angle = that.shapes.length == 1 ? that.shapes[0].rotate().angle : 0;\n\t that._startAngle = that._angle;\n\t that._rotates();\n\t that._positions();\n\t that.refreshBounds();\n\t that.refresh();\n\t that.redraw();\n\t },\n\n\t _rotates: function () {\n\t var that = this, i, shape;\n\t that.initialRotates = [];\n\t for (i = 0; i < that.shapes.length; i++) {\n\t shape = that.shapes[i];\n\t that.initialRotates.push(shape.rotate().angle);\n\t }\n\t },\n\n\t _positions: function () {\n\t var that = this, i, shape;\n\t that.initialStates = [];\n\t for (i = 0; i < that.shapes.length; i++) {\n\t shape = that.shapes[i];\n\t that.initialStates.push(shape.bounds());\n\t }\n\t },\n\n\t _hover: function(value, element) {\n\t if (this._resizable()) {\n\t var handleOptions = this._handleOptions(),\n\t hover = handleOptions.hover,\n\t stroke = handleOptions.stroke,\n\t fill = handleOptions.fill;\n\n\t if (value && Utils.isDefined(hover.stroke)) {\n\t stroke = deepExtend({}, stroke, hover.stroke);\n\t }\n\n\t if (value && Utils.isDefined(hover.fill)) {\n\t fill = hover.fill;\n\t }\n\t element.stroke(stroke.color, stroke.width, stroke.opacity);\n\t element.fill(fill.color, fill.opacity);\n\t }\n\t },\n\n\t start: function (p) {\n\t this._sp = p;\n\t this._cp = p;\n\t this._lp = p;\n\t this._manipulating = true;\n\t this._internalChange = true;\n\t this.shapeStates = [];\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t this.shapeStates.push(shape.bounds());\n\t }\n\t },\n\n\t redraw: function () {\n\t var i, handle,\n\t visibleHandles = this._resizable();\n\n\t for (i = 0; i < this.map.length; i++) {\n\t handle = this.map[i];\n\t handle.visual.visible(visibleHandles);\n\t }\n\t },\n\n\t angle: function(value) {\n\t if (defined(value)) {\n\t this._angle = value;\n\t }\n\n\t return this._angle;\n\t },\n\n\t rotate: function() {\n\t var center = this._innerBounds.center();\n\t var currentAngle = this.angle();\n\t this._internalChange = true;\n\t for (var i = 0; i < this.shapes.length; i++) {\n\t var shape = this.shapes[i];\n\t currentAngle = (currentAngle + this.initialRotates[i] - this._startAngle) % 360;\n\t shape.rotate(currentAngle, center);\n\t }\n\t this.refresh();\n\t },\n\n\t move: function (handle, p) {\n\t var delta, dragging,\n\t dtl = new Point(),\n\t dbr = new Point(),\n\t bounds, center, shape,\n\t i, angle, newBounds,\n\t changed = 0, staticPoint,\n\t scaleX, scaleY;\n\n\t if (handle.y === -2 && handle.x === -1) {\n\t center = this._innerBounds.center();\n\t this._angle = this._truncateAngle(Utils.findAngle(center, p));\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t angle = (this._angle + this.initialRotates[i] - this._startAngle) % 360;\n\t shape.rotate(angle, center);\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape);\n\t }\n\t this._rotating = true;\n\t }\n\t this.refresh();\n\t } else {\n\t if (this.shouldSnap()) {\n\t var thr = this._truncateDistance(p.minus(this._lp));\n\t // threshold\n\t if (thr.x === 0 && thr.y === 0) {\n\t this._cp = p;\n\t return;\n\t }\n\t delta = thr;\n\t this._lp = new Point(this._lp.x + thr.x, this._lp.y + thr.y);\n\t } else {\n\t delta = p.minus(this._cp);\n\t }\n\n\t if (this.isDragHandle(handle)) {\n\t dbr = dtl = delta; // dragging\n\t dragging = true;\n\t } else {\n\t if (this._angle) { // adjust the delta so that resizers resize in the correct direction after rotation.\n\t delta.rotate(new Point(0, 0), this._angle);\n\t }\n\t if (handle.x == -1) {\n\t dtl.x = delta.x;\n\t } else if (handle.x == 1) {\n\t dbr.x = delta.x;\n\t }\n\t if (handle.y == -1) {\n\t dtl.y = delta.y;\n\t } else if (handle.y == 1) {\n\t dbr.y = delta.y;\n\t }\n\t }\n\n\t if (!dragging) {\n\t staticPoint = hitToOppositeSide(handle, this._innerBounds);\n\t scaleX = (this._innerBounds.width + delta.x * handle.x) / this._innerBounds.width;\n\t scaleY = (this._innerBounds.height + delta.y * handle.y) / this._innerBounds.height;\n\t }\n\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t bounds = shape.bounds();\n\t if (dragging) {\n\t if (!canDrag(shape)) {\n\t continue;\n\t }\n\t newBounds = this._displaceBounds(bounds, dtl, dbr, dragging);\n\t } else {\n\t newBounds = bounds.clone();\n\t newBounds.scale(scaleX, scaleY, staticPoint, this._innerBounds.center(), shape.rotate().angle);\n\t var newCenter = newBounds.center(); // fixes the new rotation center.\n\t newCenter.rotate(bounds.center(), -this._angle);\n\t newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n\t }\n\t if (newBounds.width >= shape.options.minWidth && newBounds.height >= shape.options.minHeight) { // if we up-size very small shape\n\t var oldBounds = bounds;\n\t shape.bounds(newBounds);\n\t if (shape.hasOwnProperty(\"layout\")) {\n\t shape.layout(shape, oldBounds, newBounds);\n\t }\n\t if (oldBounds.width !== newBounds.width || oldBounds.height !== newBounds.height) {\n\t shape.rotate(shape.rotate().angle); // forces the rotation to update it's rotation center\n\t }\n\t changed += 1;\n\t }\n\t }\n\n\t if (changed) {\n\t if (changed == i) {\n\t newBounds = this._displaceBounds(this._innerBounds, dtl, dbr, dragging);\n\t this.bounds(newBounds);\n\t } else {\n\t this.refreshBounds();\n\t }\n\t this.refresh();\n\t }\n\n\t this._positions();\n\t }\n\n\t this._cp = p;\n\t },\n\n\t isDragHandle: function(handle) {\n\t return handle.x === 0 && handle.y === 0;\n\t },\n\n\t cancel: function() {\n\t var shapes = this.shapes;\n\t var states = this.shapeStates;\n\t for (var idx = 0; idx < shapes.length; idx++) {\n\t shapes[idx].bounds(states[idx]);\n\t }\n\t this.refreshBounds();\n\t this.refresh();\n\t this._manipulating = undefined;\n\t this._internalChange = undefined;\n\t this._rotating = undefined;\n\t },\n\n\t _truncatePositionToGuides: function (bounds) {\n\t if (this.diagram.ruler) {\n\t return this.diagram.ruler.truncatePositionToGuides(bounds);\n\t }\n\t return bounds;\n\t },\n\n\t _truncateSizeToGuides: function (bounds) {\n\t if (this.diagram.ruler) {\n\t return this.diagram.ruler.truncateSizeToGuides(bounds);\n\t }\n\t return bounds;\n\t },\n\n\t _truncateAngle: function (a) {\n\t var snap = this.snapOptions();\n\t var snapAngle = Math.max(snap.angle || DEFAULT_SNAP_ANGLE, MIN_SNAP_ANGLE);\n\t return snap ? Math.floor((a % 360) / snapAngle) * snapAngle : (a % 360);\n\t },\n\n\t _truncateDistance: function (d) {\n\t if (d instanceof diagram.Point) {\n\t return new diagram.Point(this._truncateDistance(d.x), this._truncateDistance(d.y));\n\t } else {\n\t var snap = this.snapOptions() || {};\n\t var snapSize = Math.max(snap.size || DEFAULT_SNAP_SIZE, MIN_SNAP_SIZE);\n\t return snap ? Math.floor(d / snapSize) * snapSize : d;\n\t }\n\t },\n\n\t snapOptions: function() {\n\t var editable = this.diagram.options.editable;\n\t var snap = ((editable || {}).drag || {}).snap || {};\n\t return snap;\n\t },\n\n\t shouldSnap: function() {\n\t var editable = this.diagram.options.editable;\n\t var drag = (editable || {}).drag;\n\t var snap = (drag || {}).snap;\n\t return editable !== false && drag !== false && snap !== false;\n\t },\n\n\t _displaceBounds: function (bounds, dtl, dbr, dragging) {\n\t var tl = bounds.topLeft().plus(dtl),\n\t br = bounds.bottomRight().plus(dbr),\n\t newBounds = Rect.fromPoints(tl, br),\n\t newCenter;\n\t if (!dragging) {\n\t newCenter = newBounds.center();\n\t newCenter.rotate(bounds.center(), -this._angle);\n\t newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n\t }\n\t return newBounds;\n\t },\n\n\t stop: function () {\n\t var unit, i, shape;\n\t if (this._cp != this._sp) {\n\t if (this._rotating) {\n\t unit = new RotateUnit(this, this.shapes, this.initialRotates);\n\t this._rotating = false;\n\t } else if (this._diffStates()) {\n\t if (this.diagram.ruler) {\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t var bounds = shape.bounds();\n\t bounds = this._truncateSizeToGuides(this._truncatePositionToGuides(bounds));\n\t shape.bounds(bounds);\n\t this.refreshBounds();\n\t this.refresh();\n\t }\n\t }\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t shape.updateModel();\n\t }\n\t unit = new TransformUnit(this.shapes, this.shapeStates, this);\n\t this.diagram._syncShapeChanges();\n\t }\n\t }\n\n\t this._manipulating = undefined;\n\t this._internalChange = undefined;\n\t this._rotating = undefined;\n\t return unit;\n\t },\n\n\t _diffStates: function() {\n\t var shapes = this.shapes;\n\t var states = this.shapeStates;\n\t for (var idx = 0; idx < shapes.length; idx++) {\n\t if (!shapes[idx].bounds().equals(states[idx])) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\n\t refreshBounds: function () {\n\t var bounds = this.shapes.length == 1 ?\n\t this.shapes[0].bounds().clone() :\n\t this.diagram.boundingBox(this.shapes, true);\n\n\t this.bounds(bounds);\n\t },\n\n\t refresh: function () {\n\t var that = this, b, bounds;\n\t if (this.shapes.length > 0) {\n\t bounds = this.bounds();\n\t this.visual.visible(true);\n\t this.visual.position(bounds.topLeft());\n\t $.each(this.map, function () {\n\t b = that._getHandleBounds(new Point(this.x, this.y));\n\t this.visual.position(b.topLeft());\n\t });\n\t this.visual.position(bounds.topLeft());\n\n\t var center = new Point(bounds.width / 2, bounds.height / 2);\n\t this.visual.rotate(this._angle, center);\n\t this.rect.redraw({ width: bounds.width, height: bounds.height });\n\t if (this.rotationThumb) {\n\t var thumb = this.options.editable.rotate.thumb;\n\t this._rotationThumbBounds = new Rect(bounds.center().x, bounds.y + thumb.y, 0, 0).inflate(thumb.width);\n\t this.rotationThumb.redraw({ x: bounds.width / 2 - thumb.width / 2 });\n\t }\n\t } else {\n\t this.visual.visible(false);\n\t }\n\t }\n\t });\n\n\t var Selector = Class.extend({\n\t init: function (diagram) {\n\t var selectable = diagram.options.selectable;\n\t this.options = deepExtend({}, this.options, selectable);\n\n\t this.visual = new Rectangle(this.options);\n\t this.diagram = diagram;\n\t },\n\t options: {\n\t stroke: {\n\t color: \"#778899\",\n\t width: 1,\n\t dashType: \"dash\"\n\t },\n\t fill: {\n\t color: TRANSPARENT\n\t }\n\t },\n\t start: function (p) {\n\t this._sp = this._ep = p;\n\t this.refresh();\n\t this.diagram._adorn(this, true);\n\t },\n\t end: function () {\n\t this._sp = this._ep = undefined;\n\t this.diagram._adorn(this, false);\n\t },\n\t bounds: function (value) {\n\t if (value) {\n\t this._bounds = value;\n\t }\n\t return this._bounds;\n\t },\n\t move: function (p) {\n\t this._ep = p;\n\t this.refresh();\n\t },\n\t refresh: function () {\n\t if (this._sp) {\n\t var visualBounds = Rect.fromPoints(this.diagram.modelToLayer(this._sp), this.diagram.modelToLayer(this._ep));\n\t this.bounds(Rect.fromPoints(this._sp, this._ep));\n\t this.visual.position(visualBounds.topLeft());\n\t this.visual.redraw({ height: visualBounds.height + 1, width: visualBounds.width + 1 });\n\t }\n\t }\n\t });\n\n\t var ConnectorVisual = Class.extend({\n\t init: function (connector) {\n\t this.options = deepExtend({}, connector.options);\n\t this._c = connector;\n\t this.visual = new Circle(this.options);\n\t this.refresh();\n\t },\n\t _hover: function (value) {\n\t var options = this.options,\n\t hover = options.hover,\n\t stroke = options.stroke,\n\t fill = options.fill;\n\n\t if (value && Utils.isDefined(hover.stroke)) {\n\t stroke = deepExtend({}, stroke, hover.stroke);\n\t }\n\n\t if (value && Utils.isDefined(hover.fill)) {\n\t fill = hover.fill;\n\t }\n\n\t this.visual.redraw({\n\t stroke: stroke,\n\t fill: fill\n\t });\n\t },\n\t refresh: function () {\n\t var p = this._c.shape.diagram.modelToView(this._c.position()),\n\t relative = p.minus(this._c.shape.bounds(\"transformed\").topLeft()),\n\t value = new Rect(p.x, p.y, 0, 0);\n\t value.inflate(this.options.width / 2, this.options.height / 2);\n\t this._visualBounds = value;\n\t this.visual.redraw({ center: new Point(relative.x, relative.y) });\n\t },\n\t _hitTest: function (p) {\n\t var tp = this._c.shape.diagram.modelToView(p);\n\t return this._visualBounds.contains(tp);\n\t }\n\t });\n\n\t function canDrag(element) {\n\t var editable = element.options.editable;\n\t return editable && editable.drag !== false;\n\t }\n\n\t function hitTestShapeConnectors(shape, point) {\n\t var connector, position, rect;\n\t for (var idx = 0; idx < shape.connectors.length; idx++) {\n\t connector = shape.connectors[idx];\n\t position = connector.position();\n\t rect = new Rect(position.x, position.y);\n\t rect.inflate(HIT_TEST_DISTANCE, HIT_TEST_DISTANCE);\n\t if (rect.contains(point)) {\n\t return connector;\n\t }\n\t }\n\t }\n\n\t function noMeta(meta) {\n\t return meta.ctrlKey === false && meta.altKey === false && meta.shiftKey === false;\n\t }\n\n\t deepExtend(diagram, {\n\t CompositeUnit: CompositeUnit,\n\t TransformUnit: TransformUnit,\n\t PanUndoUnit: PanUndoUnit,\n\t AddShapeUnit: AddShapeUnit,\n\t AddConnectionUnit: AddConnectionUnit,\n\t DeleteShapeUnit: DeleteShapeUnit,\n\t DeleteConnectionUnit: DeleteConnectionUnit,\n\t ConnectionEditAdorner: ConnectionEditAdorner,\n\t ConnectionTool: ConnectionTool,\n\t ConnectorVisual: ConnectorVisual,\n\t UndoRedoService: UndoRedoService,\n\t ResizingAdorner: ResizingAdorner,\n\t Selector: Selector,\n\t ToolService: ToolService,\n\t ConnectorsAdorner: ConnectorsAdorner,\n\t LayoutUndoUnit: LayoutUndoUnit,\n\t ConnectionEditUnit: ConnectionEditUnit,\n\t ToFrontUnit: ToFrontUnit,\n\t ToBackUnit: ToBackUnit,\n\t ConnectionRouterBase: ConnectionRouterBase,\n\t PolylineRouter: PolylineRouter,\n\t CascadingRouter: CascadingRouter,\n\t SelectionTool: SelectionTool,\n\t ScrollerTool: ScrollerTool,\n\t PointerTool: PointerTool,\n\t ConnectionEditTool: ConnectionEditTool,\n\t RotateUnit: RotateUnit\n\t });\n\t})(window.kendo.jQuery);\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });"],"sourceRoot":""}