{"version":3,"sources":["webpack:///./node_modules/@progress/kendo-ui/js/dataviz/diagram/dom.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","id","loaded","call","m","c","p","0","3","Error","889","890","891","900","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","f","define","apply","undefined","$","dataviz","kendo","draw","drawing","geom","geometry","diagram","Widget","ui","Class","proxy","deepExtend","outerWidth","_outerWidth","outerHeight","_outerHeight","extend","HierarchicalDataSource","data","Canvas","Group","Rectangle","Circle","CompositeTransform","Rect","Path","DeleteShapeUnit","DeleteConnectionUnit","TextBlock","Image","Point","Intersect","ConnectionEditAdorner","UndoRedoService","ToolService","Selector","ResizingAdorner","ConnectorsAdorner","Cursors","Utils","Observable","ToBackUnit","ToFrontUnit","PolylineRouter","CascadingRouter","isUndefined","isDefined","defined","util","isArray","Array","isFunction","isString","isPlainObject","math","Math","NS","CASCADING","ITEMBOUNDSCHANGE","CHANGE","CLICK","DRAG","DRAG_END","DRAG_START","MOUSE_ENTER","MOUSE_LEAVE","ERROR","AUTO","TOP","RIGHT","LEFT","BOTTOM","MAXINT","SELECT","ITEMROTATE","PAN","ZOOM_START","ZOOM_END","NONE","DEFAULT_CANVAS_WIDTH","DEFAULT_CANVAS_HEIGHT","DEFAULT_SHAPE_TYPE","DEFAULT_SHAPE_WIDTH","DEFAULT_SHAPE_HEIGHT","DEFAULT_SHAPE_MINWIDTH","DEFAULT_SHAPE_MINHEIGHT","DEFAULT_SHAPE_POSITION","DEFAULT_CONNECTION_BACKGROUND","MAX_VALUE","Number","MIN_VALUE","ABSOLUTE","TRANSFORMED","ROTATED","TRANSPARENT","WIDTH","HEIGHT","X","Y","MOUSEWHEEL_NS","MOBILE_ZOOM_RATE","MOBILE_PAN_DISTANCE","BUTTON_TEMPLATE","CONNECTION_CONTENT_OFFSET","DefaultConnectors","name","position","shape","getPosition","defaultButtons","cancel","text","imageClass","className","iconClass","update","mwDelta","e","origEvent","originalEvent","delta","wheelDelta","ceil","floor","detail","isAutoConnector","connector","options","toLowerCase","closestConnector","point","connectors","resCtr","minimumDistance","i","length","dist","distanceTo","indicesOfItems","group","visuals","visual","indices","children","drawingContainer","j","push","shapeDefaults","extra","defaults","type","path","autoSize","x","y","minWidth","minHeight","width","height","hover","editable","connect","tools","rotation","angle","simpleExtend","DiagramElement","init","that","this","dataItem","fn","randomId","isSelected","_template","cursor","grip","content","align","selectable","serializable","enable","_getCursor","adorner","visible","value","bounds","refresh","redraw","toString","serialize","json","_content","contentOptions","contentVisual","_contentVisual","_updateContentVisual","_createContentVisual","_includeInBBox","append","_hitTest","contains","template","elementTemplate","paramName","_canSelect","toJSON","Connector","connections","fill","color","shapeId","parse","str","tempStr","split","shapes","getConnector","trim","Shape","updateOptionsFromModel","createShapeVisual","updateBounds","_createConnectors","_setOptionsFromModel","model","modelOptions","filterShapeDataItem","redrawVisual","field","_isEditable","inArray","_redrawVisual","clear","updateModel","syncChanges","_bounds","_suspendModelRefresh","set","_resumeModelRefresh","_syncShapeChanges","_measure","_rotate","_alignContent","result","containerRect","aligner","RectAlign","contentBounds","drawingElement","bbox","contentRect","alignedBounds","topLeft","connectorDefaults","_transformedBounds","pan","_pan","_rotatedBounds","_setBounds","_triggerBoundsChange","_layouting","refreshConnections","rect","max","clone","cloneDataItem","select","selected","deselected","_selectedItems","remove","_internalSelection","_selectionChanged","rotate","center","undoable","undoRedoService","add","RotateUnit","_resizingAdorner","deltaAngle","newPosition","b","sc","minus","_rotationOffset","plus","_connectorsAdorner","trigger","item","con","cons","ctr","source","target","each","nameOrPoint","toLocaleLowerCase","side","fnName","charAt","slice","_transformPoint","boundsChange","shapeOptions","shapeVisual","_visualOptions","_diffNumericOptions","_updateConnectors","connection","idx","diffNumericOptions","stroke","tl","br","bottomRight","fromPoints","modelToView","rotatedBounds","_hover","_showConnectors","rotatedPoint","isEmpty","rects","visualOptions","visualTemplate","translateToOrigin","Connection","from","to","_initRouter","Polyline","_sourcePoint","_targetPoint","_setSource","_setTarget","definers","points","startCap","endCap","fromConnector","toConnector","dataMap","_dataMap","filterConnectionDataItem","fromX","fromY","toX","toY","connectionsDataSource","getByUid","uid","clearField","sourceConnector","targetConnector","_syncConnectionChanges","sourcePoint","_resolvedSourceConnector","shapeSource","defaultConnector","_removeFromSourceConnector","_clearSourceConnector","_setFromOptions","addCompositeItem","ConnectionEditUnit","fromPoint","sourceDefiner","_sourceDefiner","PathDefiner","left","targetPoint","_resolvedTargetConnector","shapeTarget","_removeFromTargetConnector","_clearTargetConnector","_setToOptions","toPoint","targetDefiner","_targetDefiner","right","_updateConnector","instance","getShapeById","connectorName","setNewTarget","inactiveItem","_inactiveShapeItems","_deferredConnectionUpdates","onActivate","offset","allPoints","endIdx","startIdx","equals","endPoint","startPoint","boundingBox","alignToPath","distance","deg","atan2","abs","midIdx","offsetX","offsetY","selection","_adorn","_router","pts","k","definition","hasOwnProperty","_resolveConnectors","_refreshPath","sourceConnectors","targetConnectors","_resolveAutoConnectors","minNonConflictSource","minNonConflictTarget","minSource","minTarget","sourceIdx","targetIdx","minNonConflict","minDist","round","_testRoutePoints","router","passRoute","start","end","exclude","routePoints","_getRouteExclude","unshift","min","_shapesQuadTree","hitTestRect","sourceShape","targetShape","_isPointInsideShape","pointX","pointY","boundsX","boundsY","hitTest","_drawPath","getBounds","route","concat","Diagram","element","userOptions","destroy","_initTheme","_initElements","_extendLayoutOptions","_initDefaults","_interactionDefaults","_initCanvas","mainLayer","canvas","ShapesQuadTree","_adorners","adornerLayer","_createHandlers","_initialize","selector","_clipboard","pauseMouseHandlers","_fetchFreshData","_createGlobalToolBar","_createOptionElements","zoom","theme","layout","zoomRate","zoomMin","zoomMax","dataSource","draggable","autoBind","resize","drag","snap","size","pannable","key","tooltip","enabled","format","copy","connectionDefaults","events","items","toolBar","DiagramToolBar","click","_toolBarClick","modal","css","textAlign","prepend","_resize","createShape","editor","view","index","createModel","_createShape","insert","edit","createConnection","_createConnection","_connectionsDataMap","addConnection","editModel","editorType","editors","cancelEdit","shapeEditors","shapeTemplate","connectionSelectorHandler","connectionSelector","connectionEditors","connectionTemplate","PopupEditor","_update","_cancel","_editArgs","_getEditDataSource","cancelChanges","_destroyEditor","saveEdit","sync","container","wrapper","close","empty","attr","addClass","scrollable","appendTo","userShapeDefaults","copyDefaultOptions","mobile","support","mobileOS","multiple","canvasContainer","viewPort","viewport","on","_wheel","_keydown","_userEvents","UserEvents","multiTouch","fastTap","tap","_tap","_dragStart","move","_drag","_dragEnd","gesturestart","_gestureStart","gesturechange","_gestureChange","gestureend","_gestureEnd","doubleTap","_doubleTap","supportDoubleTap","toolService","_mouseover","_mouseout","_mouseMove","_mouseDown","_mouseUp","_syncHandler","_syncChanges","_resizeHandler","onResize","bind","_destroyToolBar","_pauseMouseHandlers","_eventPositions","event","_meta","preventDefault","_createToolBar","_updateHoveredItem","_updateCursor","focused","focus","hoveredItem","meta","ctrlPressed","ctrlKey","addToSelection","deselect","keyDown","keyCode","wheel","metaKey","altKey","shiftKey","touch","pageX","pageY","documentToModel","scroller","disable","initialCenter","eventArgs","_gesture","_initialCenter","previousGesture","documentToView","scaleDelta","_zoom","updateZoom","_getValidZoom","zoomedPoint","times","_panTransform","_updateAdorners","pointPosition","zoomOptions","node","_kendoNode","srcElement","themeOptions","themeName","themes","SASS_THEMES","indexOf","autoTheme","shapesLength","_createShapes","_createConnections","addShape","conn","_findConnectionTarget","unbindResize","off","destroyScroller","_destroyGlobalToolBar","save","is","_activeElement","scrollContainer","containers","offsets","documentElement","document","parentNode","scrollHeight","clientHeight","scrollTop","load","setOptions","connected","AddConnectionUnit","added","removed","_addConnection","AddShapeUnit","_addShape","elements","splitDiagramElements","begin","_removeItem","commit","_removeShapeDataItem","_removeConnectionDataItem","_triggerRemove","args","toRemove","undo","redo","selectAll","selectArea","toFront","_getDiagramItems","unit","_fixOrdering","toBack","bringIntoView","current","original","newPan","animate","_zoomMainLayer","alignShapes","direction","val","undoStates","TransformUnit","staticPoint","viewportVector","raw","_storePan","surface","hideTooltip","_getPan","translate","animatedScrollTo","scrollTo","_copyOffset","cut","paste","copied","mapping","_updateCopiedConnection","sourceConnection","origin","temp","di","union","_containerOffset","containerOffset","top","viewToDocument","viewToModel","_transformWithMatrix","_matrixInvert","_matrix","modelToLayer","_layerMatrix","layerToModel","_layerMatrixInvert","viewPoint","scrollLeft","modelToDocument","matrix","setDataSource","_dataSource","fetch","setConnectionsDataSource","_connectionDataSource","l","TreeLayout","LayeredLayout","SpringLayout","initialState","LayoutState","finalState","LayoutUndoUnit","_redrawConnections","found","first","s","getShapeByModelId","getShapeByModelUid","getConnectionByModelId","getConnectionByModelUid","LayoutBase","defaultOptions","pos","_transformMainLayer","_finishPan","total","NaN","_storeViewMatrix","transform","render","_storeLayerMatrix","canvasTransform","toMatrix","invert","_toIndex","toIndex","shapePos","conPos","removedConnections","_removeShape","_removeConnection","sources","targets","_removeHover","_removeDataItems","recursive","shift","_removeShapeConnections","hasChildren","_addDataItem","_addDataItemByUid","_addDataItems","parent","parentShape","_refreshSource","dataBound","action","_bindingRoots","_addItem","preventClosing","singleToolBar","padding","popupZIndex","parseInt","closest","popupWidth","_popup","popupHeight","shapeBounds","connectionBounds","showAt","one","_normalizePointZoom","InactiveItemsCollection","undone","redone","_loadingShapes","_loadingConnections","dsOptions","ds","_shapesRefreshHandler","unbind","_shapesRequestStartHandler","_shapesErrorHandler","_refreshShapes","_shapesRequestStart","_error","DataSource","create","_treeDataSource","_connectionsRefreshHandler","_connectionsRequestStartHandler","_connectionsErrorHandler","_refreshConnections","_connectionsRequestStart","_connectionsError","_shouldRefresh","_removeShapes","_updateShapes","_syncShapes","_suspended","_rebindShapesAndConnections","_addShapes","_addConnections","inactiveItems","forEach","isNew","activate","dataItems","_removeConnections","_updateConnections","_addConnectionDataItem","_validateConnector","fields","_refreshHandler","_unbindDataSource","_errorHandler","isActive","show","adorners","refreshBounds","_refresh","hide","exportDOMVisual","viewBox","_viewBox","scrollOffset","viewRect","clipPath","fromRect","wrap","clipWrap","clip","root","exportVisual","scale","when","then","deferredConnectionUpdates","ExportMixin","PDFMixin","_tools","createToolBar","createTools","appendTools","createPopup","kendoPopup","getKendoPopup","tool","buttons","_toolBar","kendoToolBar","resizable","getKendoToolBar","createTool","toolName","attributes","_setAttributes","open","newGroup","editTool","icon","showText","deleteTool","rotateAnticlockwiseTool","_appendGroup","_rotateGroup","step","rotateClockwiseTool","createShapeTool","_createGroup","createConnectionTool","undoTool","_historyGroup","redoTool","prop","_getAttributes","eventData","selectedElements","selectedElemens","rotateClockwise","parseFloat","rotateAnticlockwise","Editor","_getFields","_initContainer","createEditable","Editable","clearContainer","modelFields","find","columns","window","title","formContent","_renderTemplate","_renderFields","_renderButtons","Window","userTriggered","sender","_cancelClick","_attachButtonEvents","unescape","form","_createButton","_cancelClickHandler","_updateClickHandler","_updateClick","_editUpdateClickHandler","reader","textField","idField","kendoDropDownList","dataValueField","dataTextField","optionLabel","valuePrimitive","InactiveItem","callbacks","prototype","callback","deffered","Deferred","deferred","resolve","QuadRoot","_add","_quadNode","splice","_testRect","hit","overlaps","QuadNode","inBounds","nodeRect","nodeBottomRight","overlapsBounds","inserted","_initChildren","childIdx","shapeIdx","halfWidth","halfHeight","ROOT_SIZE","boundsChangeHandler","_boundsChange","initRoots","rootMap","rootSize","sectors","getSectors","inRoot","bottomX","bottomY","xIdx","yIdx","Model","_defaultId","ObservableObject","mainOptions","elementOptions","clippedBBox","plugin","jQuery","901","902","903","904","905","906","907","908"],"mappings":"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","file":"js/chunk-vendors~72574242.deb3fc15.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__(900);\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/***/ 889:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.data\");\n\n/***/ }),\n\n/***/ 890:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.dataviz.core\");\n\n/***/ }),\n\n/***/ 891:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.dataviz.themes\");\n\n/***/ }),\n\n/***/ 900:\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__(889), __webpack_require__(902), __webpack_require__(903),\n\t __webpack_require__(904),\n\t __webpack_require__(905),\n\t __webpack_require__(901),\n\t __webpack_require__(890),\n\t __webpack_require__(891),\n\t __webpack_require__(906),\n\t __webpack_require__(907),\n\t __webpack_require__(908) ], __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 dataviz = kendo.dataviz,\n\t draw = kendo.drawing,\n\t geom = kendo.geometry,\n\t diagram = dataviz.diagram,\n\t Widget = kendo.ui.Widget,\n\t Class = kendo.Class,\n\t proxy = $.proxy,\n\t deepExtend = kendo.deepExtend,\n\t outerWidth = kendo._outerWidth,\n\t outerHeight = kendo._outerHeight,\n\t extend = $.extend,\n\t HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n\t Canvas = diagram.Canvas,\n\t Group = diagram.Group,\n\t Rectangle = diagram.Rectangle,\n\t Circle = diagram.Circle,\n\t CompositeTransform = diagram.CompositeTransform,\n\t Rect = diagram.Rect,\n\t Path = diagram.Path,\n\t DeleteShapeUnit = diagram.DeleteShapeUnit,\n\t DeleteConnectionUnit = diagram.DeleteConnectionUnit,\n\t TextBlock = diagram.TextBlock,\n\t Image = diagram.Image,\n\t Point = diagram.Point,\n\t Intersect = diagram.Intersect,\n\t ConnectionEditAdorner = diagram.ConnectionEditAdorner,\n\t UndoRedoService = diagram.UndoRedoService,\n\t ToolService = diagram.ToolService,\n\t Selector = diagram.Selector,\n\t ResizingAdorner = diagram.ResizingAdorner,\n\t ConnectorsAdorner = diagram.ConnectorsAdorner,\n\t Cursors = diagram.Cursors,\n\t Utils = diagram.Utils,\n\t Observable = kendo.Observable,\n\t ToBackUnit = diagram.ToBackUnit,\n\t ToFrontUnit = diagram.ToFrontUnit,\n\t PolylineRouter = diagram.PolylineRouter,\n\t CascadingRouter = diagram.CascadingRouter,\n\t isUndefined = Utils.isUndefined,\n\t isDefined = Utils.isDefined,\n\t defined = draw.util.defined,\n\t isArray = Array.isArray,\n\t isFunction = kendo.isFunction,\n\t isString = Utils.isString,\n\t isPlainObject = $.isPlainObject,\n\n\t math = Math;\n\n\t // Constants ==============================================================\n\t var NS = \".kendoDiagram\",\n\t CASCADING = \"cascading\",\n\t ITEMBOUNDSCHANGE = \"itemBoundsChange\",\n\t CHANGE = \"change\",\n\t CLICK = \"click\",\n\t DRAG = \"drag\",\n\t DRAG_END = \"dragEnd\",\n\t DRAG_START = \"dragStart\",\n\t MOUSE_ENTER = \"mouseEnter\",\n\t MOUSE_LEAVE = \"mouseLeave\",\n\t ERROR = \"error\",\n\t AUTO = \"Auto\",\n\t TOP = \"Top\",\n\t RIGHT = \"Right\",\n\t LEFT = \"Left\",\n\t BOTTOM = \"Bottom\",\n\t MAXINT = 9007199254740992,\n\t SELECT = \"select\",\n\t ITEMROTATE = \"itemRotate\",\n\t PAN = \"pan\",\n\t ZOOM_START = \"zoomStart\",\n\t ZOOM_END = \"zoomEnd\",\n\t NONE = \"none\",\n\t DEFAULT_CANVAS_WIDTH = 600,\n\t DEFAULT_CANVAS_HEIGHT = 600,\n\t DEFAULT_SHAPE_TYPE = \"rectangle\",\n\t DEFAULT_SHAPE_WIDTH = 100,\n\t DEFAULT_SHAPE_HEIGHT = 100,\n\t DEFAULT_SHAPE_MINWIDTH = 20,\n\t DEFAULT_SHAPE_MINHEIGHT = 20,\n\t DEFAULT_SHAPE_POSITION = 0,\n\t DEFAULT_CONNECTION_BACKGROUND = \"Yellow\",\n\t MAX_VALUE = Number.MAX_VALUE,\n\t MIN_VALUE = -Number.MAX_VALUE,\n\t ABSOLUTE = \"absolute\",\n\t TRANSFORMED = \"transformed\",\n\t ROTATED = \"rotated\",\n\t TRANSPARENT = \"transparent\",\n\t WIDTH = \"width\",\n\t HEIGHT = \"height\",\n\t X = \"x\",\n\t Y = \"y\",\n\t MOUSEWHEEL_NS = \"DOMMouseScroll\" + NS + \" mousewheel\" + NS,\n\t MOBILE_ZOOM_RATE = 0.05,\n\t MOBILE_PAN_DISTANCE = 5,\n\t BUTTON_TEMPLATE = '#=text#',\n\t CONNECTION_CONTENT_OFFSET = 5;\n\n\t diagram.DefaultConnectors = [{\n\t name: TOP\n\t }, {\n\t name: BOTTOM\n\t }, {\n\t name: LEFT\n\t }, {\n\t name: RIGHT\n\t }, {\n\t name: AUTO,\n\t position: function (shape) {\n\t return shape.getPosition(\"center\");\n\t }\n\t }];\n\n\t var defaultButtons = {\n\t cancel: {\n\t text: \"Cancel\",\n\t imageClass: \"k-i-cancel\",\n\t className: \"k-diagram-cancel\",\n\t iconClass: \"k-icon\"\n\t },\n\t update: {\n\t text: \"Update\",\n\t imageClass: \"k-i-checkmark\",\n\t className: \"k-diagram-update\",\n\t iconClass: \"k-icon\"\n\t }\n\t };\n\n\t diagram.shapeDefaults = function(extra) {\n\t var defaults = {\n\t type: DEFAULT_SHAPE_TYPE,\n\t path: \"\",\n\t autoSize: true,\n\t visual: null,\n\t x: DEFAULT_SHAPE_POSITION,\n\t y: DEFAULT_SHAPE_POSITION,\n\t minWidth: DEFAULT_SHAPE_MINWIDTH,\n\t minHeight: DEFAULT_SHAPE_MINHEIGHT,\n\t width: DEFAULT_SHAPE_WIDTH,\n\t height: DEFAULT_SHAPE_HEIGHT,\n\t hover: {},\n\t editable: {\n\t connect: true,\n\t tools: []\n\t },\n\t connectors: diagram.DefaultConnectors,\n\t rotation: {\n\t angle: 0\n\t }\n\t };\n\n\t Utils.simpleExtend(defaults, extra);\n\n\t return defaults;\n\t };\n\n\t function mwDelta(e) {\n\t var origEvent = e.originalEvent,\n\t delta = 0;\n\n\t if (origEvent.wheelDelta) {\n\t delta = -origEvent.wheelDelta / 40;\n\t delta = delta > 0 ? math.ceil(delta) : math.floor(delta);\n\t } else if (origEvent.detail) {\n\t delta = origEvent.detail;\n\t }\n\n\t return delta;\n\t }\n\n\t function isAutoConnector(connector) {\n\t return connector.options.name.toLowerCase() === AUTO.toLowerCase();\n\t }\n\n\t function closestConnector(point, connectors) {\n\t var minimumDistance = MAXINT, resCtr, connector;\n\t for (var i = 0; i < connectors.length; i++) {\n\t connector = connectors[i];\n\t if (!isAutoConnector(connector)) {\n\t var dist = point.distanceTo(connector.position());\n\t if (dist < minimumDistance) {\n\t minimumDistance = dist;\n\t resCtr = connector;\n\t }\n\t }\n\t }\n\t return resCtr;\n\t }\n\n\t function indicesOfItems(group, visuals) {\n\t var i, indices = [], visual;\n\t var children = group.drawingContainer().children;\n\t var length = children.length;\n\t for (i = 0; i < visuals.length; i++) {\n\t visual = visuals[i];\n\t for (var j = 0; j < length; j++) {\n\t if (children[j] == visual.drawingContainer()) {\n\t indices.push(j);\n\t break;\n\t }\n\t }\n\t }\n\t return indices;\n\t }\n\n\t var DiagramElement = Observable.extend({\n\t init: function (options) {\n\t var that = this;\n\t that.dataItem = (options || {}).dataItem;\n\t Observable.fn.init.call(that);\n\t that.options = deepExtend({ id: diagram.randomId() }, that.options, options);\n\t that.isSelected = false;\n\t that.visual = new Group({\n\t id: that.options.id,\n\t autoSize: that.options.autoSize\n\t });\n\t that.id = that.options.id;\n\t that._template();\n\t },\n\n\t options: {\n\t hover: {},\n\t cursor: Cursors.grip,\n\t content: {\n\t align: \"center middle\"\n\t },\n\t selectable: true,\n\t serializable: true,\n\t enable: true\n\t },\n\n\t _getCursor: function (point) {\n\t if (this.adorner) {\n\t return this.adorner._getCursor(point);\n\t }\n\t return this.options.cursor;\n\t },\n\n\t visible: function (value) {\n\t if (isUndefined(value)) {\n\t return this.visual.visible();\n\t } else {\n\t this.visual.visible(value);\n\t }\n\t },\n\n\t bounds: function () {\n\t },\n\n\t refresh: function () {\n\t this.visual.redraw();\n\t },\n\n\t position: function (point) {\n\t this.options.x = point.x;\n\t this.options.y = point.y;\n\t this.visual.position(point);\n\t },\n\n\t toString: function () {\n\t return this.options.id;\n\t },\n\n\t serialize: function () {\n\t // the options json object describes the shape perfectly. So this object can serve as shape serialization.\n\t var json = deepExtend({}, {options: this.options});\n\t if (this.dataItem) {\n\t json.dataItem = this.dataItem.toString();\n\t }\n\t return json;\n\t },\n\n\t _content: function (content) {\n\t if (content !== undefined) {\n\t var options = this.options;\n\n\t if (diagram.Utils.isString(content)) {\n\t options.content.text = content;\n\t } else {\n\t deepExtend(options.content, content);\n\t }\n\n\t var contentOptions = options.content;\n\t var contentVisual = this._contentVisual;\n\n\t if (!contentVisual) {\n\t this._createContentVisual(contentOptions);\n\t } else {\n\t this._updateContentVisual(contentOptions);\n\t }\n\t }\n\n\t return this.options.content.text;\n\t },\n\n\t _createContentVisual: function(options) {\n\t if (options.text) {\n\t this._contentVisual = new TextBlock(options);\n\t this._contentVisual._includeInBBox = false;\n\t this.visual.append(this._contentVisual);\n\t }\n\t },\n\n\t _updateContentVisual: function(options) {\n\t this._contentVisual.redraw(options);\n\t },\n\n\t _hitTest: function (point) {\n\t var bounds = this.bounds();\n\t return this.visible() && bounds.contains(point) && this.options.enable;\n\t },\n\n\t _template: function () {\n\t var that = this;\n\t if (that.options.content.template) {\n\t var data = that.dataItem || {},\n\t elementTemplate = kendo.template(that.options.content.template, {\n\t paramName: \"dataItem\"\n\t });\n\n\t that.options.content.text = elementTemplate(data);\n\t }\n\t },\n\n\t _canSelect: function () {\n\t return this.options.selectable !== false;\n\t },\n\n\t toJSON: function() {\n\t return {\n\t id: this.options.id\n\t };\n\t }\n\t });\n\n\t var Connector = Class.extend({\n\t init: function (shape, options) {\n\t this.options = deepExtend({}, this.options, options);\n\t this.connections = [];\n\t this.shape = shape;\n\t },\n\t options: {\n\t width: 7,\n\t height: 7,\n\t fill: {\n\t color: DEFAULT_CONNECTION_BACKGROUND\n\t },\n\t hover: {}\n\t },\n\t position: function () {\n\t if (this.options.position) {\n\t return this.options.position(this.shape);\n\t } else {\n\t return this.shape.getPosition(this.options.name);\n\t }\n\t },\n\t toJSON: function () {\n\t return {\n\t shapeId: this.shape.toString(),\n\t connector: this.options.name\n\t };\n\t }\n\t });\n\n\t Connector.parse = function (diagram, str) {\n\t var tempStr = str.split(\":\"),\n\t id = tempStr[0],\n\t name = tempStr[1] || AUTO;\n\n\t for (var i = 0; i < diagram.shapes.length; i++) {\n\t var shape = diagram.shapes[i];\n\t if (shape.options.id == id) {\n\t return shape.getConnector(name.trim());\n\t }\n\t }\n\t };\n\n\t var Shape = DiagramElement.extend({\n\t init: function (options, diagram) {\n\t var that = this;\n\t DiagramElement.fn.init.call(that, options);\n\t this.diagram = diagram;\n\t this.updateOptionsFromModel();\n\t options = that.options;\n\t that.connectors = [];\n\t that.type = options.type;\n\t that.createShapeVisual();\n\t that.updateBounds();\n\t that.content(that.content());\n\n\t that._createConnectors();\n\t },\n\n\t options: diagram.shapeDefaults(),\n\n\t _setOptionsFromModel: function(model) {\n\t var modelOptions = filterShapeDataItem(model || this.dataItem);\n\t this.options = deepExtend({}, this.options, modelOptions);\n\n\t this.redrawVisual();\n\t },\n\n\t updateOptionsFromModel: function(model, field) {\n\t if (this.diagram && this.diagram._isEditable) {\n\t var modelOptions = filterShapeDataItem(model || this.dataItem);\n\n\t if (model && field) {\n\t if (!dataviz.inArray(field, [\"x\", \"y\", \"width\", \"height\"])) {\n\t if (this.options.visual) {\n\t this._redrawVisual();\n\t } else if (modelOptions.type) {\n\t this.options = deepExtend({}, this.options, modelOptions);\n\t this._redrawVisual();\n\t }\n\n\t if (this.options.content) {\n\t this._template();\n\t this.content(this.options.content);\n\t }\n\t } else {\n\t var bounds = this.bounds();\n\t bounds[field] = model[field];\n\t this.bounds(bounds);\n\t }\n\t } else {\n\t this.options = deepExtend({}, this.options, modelOptions);\n\t }\n\t }\n\t },\n\n\t _redrawVisual: function() {\n\t this.visual.clear();\n\t this._contentVisual = null;\n\t this.options.dataItem = this.dataItem;\n\t this.createShapeVisual();\n\t this.updateBounds();\n\t },\n\n\t redrawVisual: function() {\n\t this._redrawVisual();\n\t if (this.options.content) {\n\t this._template();\n\t this.content(this.options.content);\n\t }\n\t },\n\n\t updateModel: function(syncChanges) {\n\t var diagram = this.diagram;\n\t if (diagram && diagram._isEditable) {\n\t var bounds = this._bounds;\n\t var model = this.dataItem;\n\n\t if (model) {\n\t diagram._suspendModelRefresh();\n\t if (defined(model.x) && bounds.x !== model.x) {\n\t model.set(\"x\", bounds.x);\n\t }\n\n\t if (defined(model.y) && bounds.y !== model.y) {\n\t model.set(\"y\", bounds.y);\n\t }\n\n\t if (defined(model.width) && bounds.width !== model.width) {\n\t model.set(\"width\", bounds.width);\n\t }\n\n\t if (defined(model.height) && bounds.height !== model.height) {\n\t model.set(\"height\", bounds.height);\n\t }\n\n\t this.dataItem = model;\n\t diagram._resumeModelRefresh();\n\n\t if (syncChanges) {\n\t diagram._syncShapeChanges();\n\t }\n\t }\n\t }\n\t },\n\n\t updateBounds: function() {\n\t var bounds = this.visual._measure(true);\n\t var options = this.options;\n\t this.bounds(new Rect(options.x, options.y, bounds.width, bounds.height));\n\t this._rotate();\n\t this._alignContent();\n\t },\n\n\t content: function(content) {\n\t var result = this._content(content);\n\n\t this._alignContent();\n\n\t return result;\n\t },\n\n\t _alignContent: function() {\n\t var contentOptions = this.options.content || {};\n\t var contentVisual = this._contentVisual;\n\t if (contentVisual && contentOptions.align) {\n\t var containerRect = this.visual._measure();\n\t var aligner = new diagram.RectAlign(containerRect);\n\t var contentBounds = contentVisual.drawingElement.bbox(null);\n\n\t var contentRect = new Rect(0, 0, contentBounds.width(), contentBounds.height());\n\t var alignedBounds = aligner.align(contentRect, contentOptions.align);\n\n\t contentVisual.position(alignedBounds.topLeft());\n\t }\n\t },\n\n\t _createConnectors: function() {\n\t var options = this.options,\n\t length = options.connectors.length,\n\t connectorDefaults = options.connectorDefaults,\n\t connector, i;\n\n\t for (i = 0; i < length; i++) {\n\t connector = new Connector(\n\t this, deepExtend({},\n\t connectorDefaults,\n\t options.connectors[i]\n\t )\n\t );\n\t this.connectors.push(connector);\n\t }\n\t },\n\n\t bounds: function (value) {\n\t var bounds;\n\n\t if (value) {\n\t if (isString(value)) {\n\t switch (value) {\n\t case TRANSFORMED :\n\t bounds = this._transformedBounds();\n\t break;\n\t case ABSOLUTE :\n\t bounds = this._transformedBounds();\n\t var pan = this.diagram._pan;\n\t bounds.x += pan.x;\n\t bounds.y += pan.y;\n\t break;\n\t case ROTATED :\n\t bounds = this._rotatedBounds();\n\t break;\n\t default:\n\t bounds = this._bounds;\n\t }\n\t } else {\n\t this._setBounds(value);\n\t this._triggerBoundsChange();\n\t if (!(this.diagram && this.diagram._layouting)) {\n\t this.refreshConnections();\n\t }\n\t }\n\t } else {\n\t bounds = this._bounds;\n\t }\n\n\t return bounds;\n\t },\n\n\t _setBounds: function(rect) {\n\t var options = this.options;\n\t var topLeft = rect.topLeft();\n\t var x = options.x = topLeft.x;\n\t var y = options.y = topLeft.y;\n\t var width = options.width = math.max(rect.width, options.minWidth);\n\t var height = options.height = math.max(rect.height, options.minHeight);\n\n\t this._bounds = new Rect(x, y, width, height);\n\n\t this.visual.redraw({\n\t x: x,\n\t y: y,\n\t width: width,\n\t height: height\n\t });\n\t },\n\n\t position: function (point) {\n\t if (point) {\n\t this.bounds(new Rect(point.x, point.y, this._bounds.width, this._bounds.height));\n\t } else {\n\t return this._bounds.topLeft();\n\t }\n\t },\n\t /**\n\t * Returns a clone of this shape.\n\t * @returns {Shape}\n\t */\n\t clone: function () {\n\t var json = this.serialize();\n\n\t json.options.id = diagram.randomId();\n\n\t if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n\t json.options.dataItem = cloneDataItem(this.dataItem);\n\t }\n\n\t return new Shape(json.options);\n\t },\n\n\t select: function (value) {\n\t var diagram = this.diagram, selected, deselected;\n\t if (isUndefined(value)) {\n\t value = true;\n\t }\n\n\t if (this._canSelect()) {\n\t if (this.isSelected != value) {\n\t selected = [];\n\t deselected = [];\n\t this.isSelected = value;\n\t if (this.isSelected) {\n\t diagram._selectedItems.push(this);\n\t selected.push(this);\n\t } else {\n\t Utils.remove(diagram._selectedItems, this);\n\t deselected.push(this);\n\t }\n\n\t if (!diagram._internalSelection) {\n\t diagram._selectionChanged(selected, deselected);\n\t }\n\n\t return true;\n\t }\n\t }\n\t },\n\n\t rotate: function (angle, center, undoable) { // we assume the center is always the center of the shape.\n\t var rotate = this.visual.rotate();\n\t if (angle !== undefined) {\n\t if (undoable !== false && this.diagram && this.diagram.undoRedoService && angle !== rotate.angle) {\n\t this.diagram.undoRedoService.add(\n\t new diagram.RotateUnit(this.diagram._resizingAdorner, [this], [rotate.angle]), false);\n\t }\n\n\t var b = this.bounds(),\n\t sc = new Point(b.width / 2, b.height / 2),\n\t deltaAngle,\n\t newPosition;\n\n\t if (center) {\n\t deltaAngle = angle - rotate.angle;\n\t newPosition = b.center().rotate(center, 360 - deltaAngle).minus(sc);\n\t this._rotationOffset = this._rotationOffset.plus(newPosition.minus(b.topLeft()));\n\t this.position(newPosition);\n\t }\n\n\t this.visual.rotate(angle, sc);\n\t this.options.rotation.angle = angle;\n\n\t if (this.diagram && this.diagram._connectorsAdorner) {\n\t this.diagram._connectorsAdorner.refresh();\n\t }\n\n\t this.refreshConnections();\n\n\t if (this.diagram) {\n\t this.diagram.trigger(ITEMROTATE, { item: this });\n\t }\n\t }\n\n\t return rotate;\n\t },\n\n\t connections: function (type) { // in, out, undefined = both\n\t var result = [], i, j, con, cons, ctr;\n\n\t for (i = 0; i < this.connectors.length; i++) {\n\t ctr = this.connectors[i];\n\t cons = ctr.connections;\n\t for (j = 0, cons; j < cons.length; j++) {\n\t con = cons[j];\n\t if (type == \"out\") {\n\t var source = con.source();\n\t if (source.shape && source.shape == this) {\n\t result.push(con);\n\t }\n\t } else if (type == \"in\") {\n\t var target = con.target();\n\t if (target.shape && target.shape == this) {\n\t result.push(con);\n\t }\n\t } else {\n\t result.push(con);\n\t }\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t refreshConnections: function () {\n\t $.each(this.connections(), function () {\n\t this.refresh();\n\t });\n\t },\n\t /**\n\t * Gets a connector of this shape either by the connector's supposed name or\n\t * via a Point in which case the closest connector will be returned.\n\t * @param nameOrPoint The name of a Connector or a Point.\n\t * @returns {Connector}\n\t */\n\t getConnector: function (nameOrPoint) {\n\t var i, ctr;\n\t if (isString(nameOrPoint)) {\n\t nameOrPoint = nameOrPoint.toLocaleLowerCase();\n\t for (i = 0; i < this.connectors.length; i++) {\n\t ctr = this.connectors[i];\n\t if (ctr.options.name.toLocaleLowerCase() == nameOrPoint) {\n\t return ctr;\n\t }\n\t }\n\t } else if (nameOrPoint instanceof Point) {\n\t return closestConnector(nameOrPoint, this.connectors);\n\t } else {\n\t return this.connectors.length ? this.connectors[0] : null;\n\t }\n\t },\n\n\t getPosition: function (side) {\n\t var b = this.bounds(),\n\t fnName = side.charAt(0).toLowerCase() + side.slice(1);\n\n\t if (isFunction(b[fnName])) {\n\t return this._transformPoint(b[fnName]());\n\t }\n\n\t return b.center();\n\t },\n\n\t redraw: function (options) {\n\t if (options) {\n\t var shapeOptions = this.options;\n\t var boundsChange;\n\n\t this.shapeVisual.redraw(this._visualOptions(options));\n\n\t if (this._diffNumericOptions(options, [WIDTH, HEIGHT, X, Y])) {\n\t this.bounds(new Rect(shapeOptions.x, shapeOptions.y, shapeOptions.width, shapeOptions.height));\n\t boundsChange = true;\n\t }\n\n\t if (options.connectors) {\n\t shapeOptions.connectors = options.connectors;\n\t this._updateConnectors();\n\t }\n\n\t shapeOptions = deepExtend(shapeOptions, options);\n\n\t if (options.rotation || boundsChange) {\n\t this._rotate();\n\t }\n\n\t if (shapeOptions.content) {\n\t this.content(shapeOptions.content);\n\t }\n\t }\n\t },\n\n\t _updateConnectors: function() {\n\t var connections = this.connections();\n\t this.connectors = [];\n\t this._createConnectors();\n\t var connection;\n\t var source;\n\t var target;\n\n\t for (var idx = 0; idx < connections.length; idx++) {\n\t connection = connections[idx];\n\t source = connection.source();\n\t target = connection.target();\n\t if (source.shape && source.shape === this) {\n\t connection.source(this.getConnector(source.options.name) || null);\n\t } else if (target.shape && target.shape === this) {\n\t connection.target(this.getConnector(target.options.name) || null);\n\t }\n\t connection.updateModel();\n\t }\n\t },\n\n\t _diffNumericOptions: diagram.diffNumericOptions,\n\n\t _visualOptions: function(options) {\n\t return {\n\t data: options.path,\n\t source: options.source,\n\t hover: options.hover,\n\t fill: options.fill,\n\t stroke: options.stroke\n\t };\n\t },\n\n\t _triggerBoundsChange: function () {\n\t if (this.diagram) {\n\t this.diagram.trigger(ITEMBOUNDSCHANGE, {item: this, bounds: this._bounds.clone()}); // the trigger modifies the arguments internally.\n\t }\n\t },\n\n\t _transformPoint: function (point) {\n\t var rotate = this.rotate(),\n\t bounds = this.bounds(),\n\t tl = bounds.topLeft();\n\n\t if (rotate.angle) {\n\t point.rotate(rotate.center().plus(tl), 360 - rotate.angle);\n\t }\n\n\t return point;\n\t },\n\n\t _transformedBounds: function () {\n\t var bounds = this.bounds(),\n\t tl = bounds.topLeft(),\n\t br = bounds.bottomRight();\n\n\t return Rect.fromPoints(this.diagram.modelToView(tl), this.diagram.modelToView(br));\n\t },\n\n\t _rotatedBounds: function () {\n\t var bounds = this.bounds().rotatedBounds(this.rotate().angle),\n\t tl = bounds.topLeft(),\n\t br = bounds.bottomRight();\n\n\t return Rect.fromPoints(tl, br);\n\t },\n\n\t _rotate: function () {\n\t var rotation = this.options.rotation;\n\n\t if (rotation && rotation.angle) {\n\t this.rotate(rotation.angle);\n\t }\n\n\t this._rotationOffset = new Point();\n\t },\n\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 && isDefined(hover.stroke)) {\n\t stroke = deepExtend({}, stroke, hover.stroke);\n\t }\n\n\t if (value && isDefined(hover.fill)) {\n\t fill = hover.fill;\n\t }\n\n\t this.shapeVisual.redraw({\n\t stroke: stroke,\n\t fill: fill\n\t });\n\n\t if (options.editable && options.editable.connect) {\n\t this.diagram._showConnectors(this, value);\n\t }\n\t },\n\n\t _hitTest: function (value) {\n\t if (this.visible()) {\n\t var bounds = this.bounds(), rotatedPoint,\n\t angle = this.rotate().angle;\n\n\t if (value.isEmpty && !value.isEmpty()) { // rect selection\n\t return Intersect.rects(value, bounds, angle ? angle : 0);\n\t } else { // point\n\t rotatedPoint = value.clone().rotate(bounds.center(), angle); // cloning is important because rotate modifies the point inline.\n\t if (bounds.contains(rotatedPoint)) {\n\t return this;\n\t }\n\t }\n\t }\n\t },\n\n\t toJSON: function() {\n\t return {\n\t shapeId: this.options.id\n\t };\n\t },\n\n\t createShapeVisual: function() {\n\t var options = this.options;\n\t var visualOptions = this._visualOptions(options);\n\t var visualTemplate = options.visual;\n\t var type = (options.type + \"\").toLocaleLowerCase();\n\t var shapeVisual;\n\n\t visualOptions.width = options.width;\n\t visualOptions.height = options.height;\n\n\t if (isFunction(visualTemplate)) { // custom template\n\t shapeVisual = visualTemplate.call(this, options);\n\t } else if (visualOptions.data) {\n\t shapeVisual = new Path(visualOptions);\n\t translateToOrigin(shapeVisual);\n\t } else if (type == \"rectangle\"){\n\t shapeVisual = new Rectangle(visualOptions);\n\t } else if (type == \"circle\") {\n\t shapeVisual = new Circle(visualOptions);\n\t } else if (type == \"text\") {\n\t shapeVisual = new TextBlock(visualOptions);\n\t } else if (type == \"image\") {\n\t shapeVisual = new Image(visualOptions);\n\t } else {\n\t shapeVisual = new Path(visualOptions);\n\t }\n\n\t this.shapeVisual = shapeVisual;\n\t this.visual.append(this.shapeVisual);\n\t }\n\t });\n\n\t /**\n\t * The visual link between two Shapes through the intermediate of Connectors.\n\t */\n\t var Connection = DiagramElement.extend({\n\t init: function (from, to, options) {\n\t var that = this;\n\t DiagramElement.fn.init.call(that, options);\n\t this.updateOptionsFromModel();\n\t this._initRouter();\n\t that.path = new diagram.Polyline(that.options);\n\t that.path.fill(TRANSPARENT);\n\t that.visual.append(that.path);\n\t that._sourcePoint = that._targetPoint = new Point();\n\t that._setSource(from);\n\t that._setTarget(to);\n\t that.content(that.options.content);\n\t that.definers = [];\n\t if (defined(options) && options.points) {\n\t that.points(options.points);\n\t }\n\t },\n\n\t options: {\n\t hover: {\n\t stroke: {}\n\t },\n\t startCap: NONE,\n\t endCap: NONE,\n\t points: [],\n\t selectable: true,\n\t fromConnector: AUTO,\n\t toConnector: AUTO\n\t },\n\n\t _setOptionsFromModel: function(model) {\n\t this.updateOptionsFromModel(model || this.dataItem);\n\t },\n\n\t updateOptionsFromModel: function(model) {\n\t if (this.diagram && this.diagram._isEditable) {\n\t var dataMap = this.diagram._dataMap;\n\t var options = filterConnectionDataItem(model || this.dataItem);\n\n\t if (model) {\n\t if (defined(options.from)) {\n\t var from = dataMap[options.from];\n\t if (from && defined(options.fromConnector)) {\n\t from = from.getConnector(options.fromConnector);\n\t }\n\t this.source(from);\n\t } else if (defined(options.fromX) && defined(options.fromY)) {\n\t this.source(new Point(options.fromX, options.fromY));\n\t }\n\n\t if (defined(options.to)) {\n\t var to = dataMap[options.to];\n\t if (to && defined(options.toConnector)) {\n\t to = to.getConnector(options.toConnector);\n\t }\n\t this.target(to);\n\t } else if (defined(options.toX) && defined(options.toY)) {\n\t this.target(new Point(options.toX, options.toY));\n\t }\n\n\t if (defined(options.type) && this.type() !== options.type) {\n\t this.points([]);\n\t this.type(options.type);\n\t }\n\n\t this.dataItem = model;\n\n\t this._template();\n\t this.redraw(this.options);\n\t } else {\n\t this.options = deepExtend({}, options, this.options);\n\t }\n\t }\n\t },\n\n\t updateModel: function(syncChanges) {\n\t if (this.diagram && this.diagram._isEditable) {\n\t if (this.diagram.connectionsDataSource) {\n\t var model = this.diagram.connectionsDataSource.getByUid(this.dataItem.uid);\n\n\t if (model) {\n\t this.diagram._suspendModelRefresh();\n\t if (defined(this.options.fromX) && this.options.fromX !== null) {\n\t clearField(\"from\", model);\n\t clearField(\"fromConnector\", model);\n\t model.set(\"fromX\", this.options.fromX);\n\t model.set(\"fromY\", this.options.fromY);\n\t } else {\n\t model.set(\"from\", this.options.from);\n\t if (defined(model.fromConnector)) {\n\t model.set(\"fromConnector\", this.sourceConnector ? this.sourceConnector.options.name : null);\n\t }\n\t clearField(\"fromX\", model);\n\t clearField(\"fromY\", model);\n\t }\n\n\t if (defined(this.options.toX) && this.options.toX !== null) {\n\t clearField(\"to\", model);\n\t clearField(\"toConnector\", model);\n\t model.set(\"toX\", this.options.toX);\n\t model.set(\"toY\", this.options.toY);\n\t } else {\n\t model.set(\"to\", this.options.to);\n\t if (defined(model.toConnector)) {\n\t model.set(\"toConnector\", this.targetConnector ? this.targetConnector.options.name : null);\n\t }\n\t clearField(\"toX\", model);\n\t clearField(\"toY\", model);\n\t }\n\n\t if (defined(this.options.type) && defined(model.type)) {\n\t model.set(\"type\", this.options.type);\n\t }\n\n\t this.dataItem = model;\n\t this.diagram._resumeModelRefresh();\n\n\t if (syncChanges) {\n\t this.diagram._syncConnectionChanges();\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t /**\n\t * Gets the Point where the source of the connection resides.\n\t * If the endpoint in Auto-connector the location of the resolved connector will be returned.\n\t * If the endpoint is floating the location of the endpoint is returned.\n\t */\n\t sourcePoint: function () {\n\t return this._resolvedSourceConnector ? this._resolvedSourceConnector.position() : this._sourcePoint;\n\t },\n\n\t _setSource: function(source) {\n\t var shapeSource = source instanceof Shape;\n\t var defaultConnector = this.options.fromConnector || AUTO;\n\t var dataItem;\n\t if (shapeSource && !source.getConnector(defaultConnector)) {\n\t return;\n\t }\n\n\t if (source !== undefined) {\n\t this.from = source;\n\t }\n\n\t this._removeFromSourceConnector();\n\n\t if (source === null) { // detach\n\t if (this.sourceConnector) {\n\t this._sourcePoint = (this._resolvedSourceConnector || this.sourceConnector).position();\n\t this._clearSourceConnector();\n\t this._setFromOptions(null, this._sourcePoint);\n\t }\n\t } else if (source instanceof Connector) {\n\t dataItem = source.shape.dataItem;\n\t if (dataItem) {\n\t this._setFromOptions(dataItem.id);\n\t }\n\t this.sourceConnector = source;\n\t this.sourceConnector.connections.push(this);\n\t } else if (source instanceof Point) {\n\t this._setFromOptions(null, source);\n\t this._sourcePoint = source;\n\t if (this.sourceConnector) {\n\t this._clearSourceConnector();\n\t }\n\n\t } else if (shapeSource) {\n\t dataItem = source.dataItem;\n\t if (dataItem) {\n\t this._setFromOptions(dataItem.id);\n\t }\n\n\t this.sourceConnector = source.getConnector(defaultConnector);\n\t this.sourceConnector.connections.push(this);\n\t }\n\t },\n\n\t source: function (source, undoable) {\n\t if (isDefined(source)) {\n\t if (undoable && this.diagram) {\n\t this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, source));\n\t }\n\t this._setSource(source);\n\t this.refresh();\n\t }\n\t return this.sourceConnector ? this.sourceConnector : this._sourcePoint;\n\t },\n\n\t _setFromOptions: function(from, fromPoint) {\n\t this.options.from = from;\n\t if (fromPoint) {\n\t this.options.fromX = fromPoint.x;\n\t this.options.fromY = fromPoint.y;\n\t } else {\n\t this.options.fromX = null;\n\t this.options.fromY = null;\n\t }\n\t },\n\n\t /**\n\t * Gets or sets the PathDefiner of the sourcePoint.\n\t * The left part of this definer is always null since it defines the source tangent.\n\t * @param value\n\t * @returns {*}\n\t */\n\t sourceDefiner: function (value) {\n\t if (value) {\n\t if (value instanceof diagram.PathDefiner) {\n\t value.left = null;\n\t this._sourceDefiner = value;\n\t this.source(value.point); // refresh implicit here\n\t } else {\n\t throw \"The sourceDefiner needs to be a PathDefiner.\";\n\t }\n\t } else {\n\t if (!this._sourceDefiner) {\n\t this._sourceDefiner = new diagram.PathDefiner(this.sourcePoint(), null, null);\n\t }\n\t return this._sourceDefiner;\n\t }\n\t },\n\n\t /**\n\t * Gets the Point where the target of the connection resides.\n\t */\n\t targetPoint: function () {\n\t return this._resolvedTargetConnector ? this._resolvedTargetConnector.position() : this._targetPoint;\n\t },\n\n\t _setTarget: function(target) {\n\t var shapeTarget = target instanceof Shape;\n\t var defaultConnector = this.options.toConnector || AUTO;\n\t var dataItem;\n\n\t if (shapeTarget && !target.getConnector(defaultConnector)) {\n\t return;\n\t }\n\n\t if (target !== undefined) {\n\t this.to = target;\n\t }\n\n\t this._removeFromTargetConnector();\n\n\t if (target === null) { // detach\n\t if (this.targetConnector) {\n\t this._targetPoint = (this._resolvedTargetConnector || this.targetConnector).position();\n\t this._clearTargetConnector();\n\t this._setToOptions(null, this._targetPoint);\n\t }\n\t } else if (target instanceof Connector) {\n\t dataItem = target.shape.dataItem;\n\t if (dataItem) {\n\t this._setToOptions(dataItem.id);\n\t }\n\t this.targetConnector = target;\n\t this.targetConnector.connections.push(this);\n\t } else if (target instanceof Point) {\n\t this._setToOptions(null, target);\n\t this._targetPoint = target;\n\t if (this.targetConnector) {\n\t this._clearTargetConnector();\n\t }\n\t } else if (shapeTarget) {\n\t dataItem = target.dataItem;\n\t if (dataItem) {\n\t this._setToOptions(dataItem.id);\n\t }\n\t this.targetConnector = target.getConnector(defaultConnector);\n\t this.targetConnector.connections.push(this);\n\t }\n\t },\n\n\t target: function (target, undoable) {\n\t if (isDefined(target)) {\n\t if (undoable && this.diagram) {\n\t this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, undefined, target));\n\t }\n\t this._setTarget(target);\n\n\t this.refresh();\n\t }\n\t return this.targetConnector ? this.targetConnector : this._targetPoint;\n\t },\n\n\t _setToOptions: function(to, toPoint) {\n\t this.options.to = to;\n\t if (toPoint) {\n\t this.options.toX = toPoint.x;\n\t this.options.toY = toPoint.y;\n\t } else {\n\t this.options.toX = null;\n\t this.options.toY = null;\n\t }\n\t },\n\n\t /**\n\t * Gets or sets the PathDefiner of the targetPoint.\n\t * The right part of this definer is always null since it defines the target tangent.\n\t * @param value\n\t * @returns {*}\n\t */\n\t targetDefiner: function (value) {\n\t if (value) {\n\t if (value instanceof diagram.PathDefiner) {\n\t value.right = null;\n\t this._targetDefiner = value;\n\t this.target(value.point); // refresh implicit here\n\t } else {\n\t throw \"The sourceDefiner needs to be a PathDefiner.\";\n\t }\n\t } else {\n\t if (!this._targetDefiner) {\n\t this._targetDefiner = new diagram.PathDefiner(this.targetPoint(), null, null);\n\t }\n\t return this._targetDefiner;\n\t }\n\t },\n\n\t _updateConnectors: function() {\n\t this._updateConnector(this.source(), \"source\");\n\t this._updateConnector(this.target(), \"target\");\n\t },\n\n\t _updateConnector: function(instance, name) {\n\t var that = this;\n\t var diagram = that.diagram;\n\t if (instance instanceof Connector && !diagram.getShapeById(instance.shape.id)) {\n\t var dataItem = instance.shape.dataItem;\n\t var connectorName = instance.options.name;\n\t var setNewTarget = function() {\n\t var shape = diagram._dataMap[dataItem.id];\n\t instance = shape.getConnector(connectorName);\n\t that[name](instance, false);\n\t that.updateModel();\n\t };\n\t if (diagram._dataMap[dataItem.id]) {\n\t setNewTarget();\n\t } else {\n\t var inactiveItem = diagram._inactiveShapeItems.getByUid(dataItem.uid);\n\t if (inactiveItem) {\n\t diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(setNewTarget));\n\t }\n\t }\n\t } else {\n\t that[name](instance, false);\n\t }\n\t },\n\n\t content: function(content) {\n\t var result = this._content(content);\n\t if (defined(content)) {\n\t this._alignContent();\n\t }\n\t return result;\n\t },\n\n\t _createContentVisual: function(options) {\n\t var visual;\n\t if (isFunction(options.visual)) {\n\t visual = options.visual.call(this, options);\n\t } else if (options.text) {\n\t visual = new TextBlock(options);\n\t }\n\n\t if (visual) {\n\t this._contentVisual = visual;\n\t visual._includeInBBox = false;\n\t this.visual.append(visual);\n\t }\n\n\t return visual;\n\t },\n\n\t _updateContentVisual: function(options) {\n\t if (isFunction(options.visual)) {\n\t this.visual.remove(this._contentVisual);\n\t this._createContentVisual(options);\n\t } else {\n\t this._contentVisual.redraw(options);\n\t }\n\t },\n\n\t _alignContent: function() {\n\t if (this._contentVisual) {\n\t var offset = CONNECTION_CONTENT_OFFSET;\n\t var points = this.allPoints();\n\t var endIdx = math.floor(points.length / 2);\n\t var startIdx = endIdx - 1;\n\n\t while(startIdx > 0 && points[startIdx].equals(points[endIdx])) {\n\t startIdx--;\n\t endIdx++;\n\t }\n\n\t var endPoint = points[endIdx];\n\t var startPoint = points[startIdx];\n\n\t var boundingBox = this._contentVisual._measure();\n\t var width = boundingBox.width;\n\t var height = boundingBox.height;\n\t var alignToPath = points.length % 2 === 0;\n\t var distance = startPoint.distanceTo(endPoint);\n\n\t if (alignToPath && points.length > 2 && distance > 0 &&\n\t ((startPoint.y === endPoint.y && distance < width) || (startPoint.x === endPoint.x && distance < height))) {\n\t alignToPath = false;\n\t offset = 0;\n\t }\n\n\t var point;\n\n\t if (alignToPath) {\n\t var angle = draw.util.deg(math.atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x));\n\t point = new Point((endPoint.x - startPoint.x) / 2 + startPoint.x, (endPoint.y - startPoint.y) / 2 + startPoint.y);\n\n\t if (math.abs(angle) === 90) {\n\t point.x += offset;\n\t point.y-= height / 2;\n\t } else if (angle % 180 === 0) {\n\t point.x -= width / 2;\n\t point.y -= height + offset;\n\t } else if (angle < -90 || (0 < angle && angle < 90)) {\n\t point.y-= height;\n\t } else if (angle < 0 || angle > 90) {\n\t point.x -= width;\n\t point.y -= height;\n\t }\n\t } else {\n\t var midIdx = math.floor(points.length / 2);\n\t point = points[midIdx].clone();\n\t startPoint = points[midIdx - 1];\n\t endPoint = points[midIdx + 1];\n\n\t var offsetX = startPoint.x <= point.x && endPoint.x <= point.x ? offset : -boundingBox.width - offset;\n\t var offsetY = startPoint.y <= point.y && endPoint.y <= point.y ? offset : -boundingBox.height - offset;\n\n\t point.x += offsetX;\n\t point.y += offsetY;\n\t }\n\n\t this._contentVisual.position(point);\n\t }\n\t },\n\n\t /**\n\t * Selects or unselects this connections.\n\t * @param value True to select, false to unselect.\n\t */\n\t select: function (value) {\n\t var diagram = this.diagram, selected, deselected;\n\t if (this._canSelect()) {\n\t if (this.isSelected !== value) {\n\t this.isSelected = value;\n\t selected = [];\n\t deselected = [];\n\t if (this.isSelected) {\n\t this.adorner = new ConnectionEditAdorner(this, this.options.selection);\n\t diagram._adorn(this.adorner, true);\n\t diagram._selectedItems.push(this);\n\t selected.push(this);\n\t } else {\n\t if (this.adorner) {\n\t diagram._adorn(this.adorner, false);\n\t Utils.remove(diagram._selectedItems, this);\n\t this.adorner = undefined;\n\t deselected.push(this);\n\t }\n\t }\n\n\t if (this.adorner) {\n\t this.adorner.refresh();\n\t }\n\n\t if (!diagram._internalSelection) {\n\t diagram._selectionChanged(selected, deselected);\n\t }\n\t return true;\n\t }\n\t }\n\t },\n\t /**\n\t * Gets or sets the bounds of this connection.\n\t * @param value A Rect object.\n\t * @remark This is automatically set in the refresh().\n\t * @returns {Rect}\n\t */\n\t bounds: function (value) {\n\t if (value && !isString(value)) {\n\t this._bounds = value;\n\t } else {\n\t return this._bounds;\n\t }\n\t },\n\t /**\n\t * Gets or sets the connection type (see ConnectionType enumeration).\n\t * @param value A ConnectionType value.\n\t * @returns {ConnectionType}\n\t */\n\t type: function (value) {\n\t var options = this.options;\n\t if (value) {\n\t if (value !== options.type) {\n\t options.type = value;\n\t this._initRouter();\n\t this.refresh();\n\t }\n\t } else {\n\t return options.type;\n\t }\n\t },\n\n\t _initRouter: function() {\n\t var type = (this.options.type || \"\").toLowerCase();\n\t if (type == CASCADING) {\n\t this._router = new CascadingRouter(this);\n\t } else {\n\t this._router = new PolylineRouter(this);\n\t }\n\t },\n\t /**\n\t * Gets or sets the collection of *intermediate* points.\n\t * The 'allPoints()' property will return all the points.\n\t * The 'definers' property returns the definers of the intermediate points.\n\t * The 'sourceDefiner' and 'targetDefiner' return the definers of the endpoints.\n\t * @param value\n\t */\n\t points: function (value) {\n\t if (value) {\n\t this.definers = [];\n\t for (var i = 0; i < value.length; i++) {\n\t var definition = value[i];\n\t if (definition instanceof diagram.Point) {\n\t this.definers.push(new diagram.PathDefiner(definition));\n\t } else if (definition.hasOwnProperty(\"x\") && definition.hasOwnProperty(\"y\")) { // e.g. Clipboard does not preserve the Point definition and tunred into an Object\n\t this.definers.push(new diagram.PathDefiner(new Point(definition.x, definition.y)));\n\t } else {\n\t throw \"A Connection point needs to be a Point or an object with x and y properties.\";\n\t }\n\t }\n\n\t } else {\n\t var pts = [];\n\t if (isDefined(this.definers)) {\n\t for (var k = 0; k < this.definers.length; k++) {\n\t pts.push(this.definers[k].point);\n\t }\n\t }\n\t return pts;\n\t }\n\t },\n\t /**\n\t * Gets all the points of this connection. This is the combination of the sourcePoint, the points and the targetPoint.\n\t * @returns {Array}\n\t */\n\t allPoints: function () {\n\t var pts = [this.sourcePoint()];\n\t if (this.definers) {\n\t for (var k = 0; k < this.definers.length; k++) {\n\t pts.push(this.definers[k].point);\n\t }\n\t }\n\t pts.push(this.targetPoint());\n\t return pts;\n\t },\n\n\t refresh: function () {\n\t this._resolveConnectors();\n\t this._refreshPath();\n\t this._alignContent();\n\n\t if (this.adorner) {\n\t this.adorner.refresh();\n\t }\n\t },\n\n\t _resolveConnectors: function () {\n\t var connection = this,\n\t sourcePoint, targetPoint,\n\t sourceConnectors, targetConnectors,\n\t source = connection.source(),\n\t target = connection.target();\n\n\t if (source instanceof Point) {\n\t sourcePoint = source;\n\t } else if (source instanceof Connector) {\n\t if (isAutoConnector(source)) {\n\t sourceConnectors = source.shape.connectors;\n\t } else {\n\t sourceConnectors = [source];\n\t }\n\t }\n\n\t if (target instanceof Point) {\n\t targetPoint = target;\n\t } else if (target instanceof Connector) {\n\t if (isAutoConnector(target)) {\n\t targetConnectors = target.shape.connectors;\n\t } else {\n\t targetConnectors = [target];\n\t }\n\t }\n\n\t if (sourcePoint) {\n\t if (targetConnectors) {\n\t connection._resolvedTargetConnector = closestConnector(sourcePoint, targetConnectors);\n\t }\n\t } else if (sourceConnectors) {\n\t if (targetPoint) {\n\t connection._resolvedSourceConnector = closestConnector(targetPoint, sourceConnectors);\n\t } else if (targetConnectors) {\n\t this._resolveAutoConnectors(sourceConnectors, targetConnectors);\n\t }\n\t }\n\t },\n\n\t _resolveAutoConnectors: function(sourceConnectors, targetConnectors) {\n\t var minNonConflict = MAXINT;\n\t var minDist = MAXINT;\n\t var minNonConflictSource, minNonConflictTarget;\n\t var sourcePoint, targetPoint;\n\t var minSource, minTarget;\n\t var sourceConnector, targetConnector;\n\t var sourceIdx, targetIdx;\n\t var dist;\n\n\t for (sourceIdx = 0; sourceIdx < sourceConnectors.length; sourceIdx++) {\n\t sourceConnector = sourceConnectors[sourceIdx];\n\t if (!isAutoConnector(sourceConnector)) {\n\t sourcePoint = sourceConnector.position();\n\n\t for (targetIdx = 0; targetIdx < targetConnectors.length; targetIdx++) {\n\t targetConnector = targetConnectors[targetIdx];\n\t if (!isAutoConnector(targetConnector)) {\n\t targetPoint = targetConnector.position();\n\t dist = math.round(sourcePoint.distanceTo(targetPoint));\n\n\t if (dist < minNonConflict && this.diagram && this._testRoutePoints(sourcePoint, targetPoint, sourceConnector, targetConnector)) {\n\t minNonConflict = dist;\n\t minNonConflictSource = sourceConnector;\n\t minNonConflictTarget = targetConnector;\n\t }\n\n\t if (dist < minDist) {\n\t minSource = sourceConnector;\n\t minTarget = targetConnector;\n\t minDist = dist;\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t if (minNonConflictSource) {\n\t minSource = minNonConflictSource;\n\t minTarget = minNonConflictTarget;\n\t }\n\n\t this._resolvedSourceConnector = minSource;\n\t this._resolvedTargetConnector = minTarget;\n\t },\n\n\t _testRoutePoints: function(sourcePoint, targetPoint, sourceConnector, targetConnector) {\n\t var router = this._router;\n\t var passRoute = true;\n\t if (router instanceof CascadingRouter) {\n\t var points = router.routePoints(sourcePoint, targetPoint, sourceConnector, targetConnector),\n\t start, end,\n\t rect, exclude;\n\n\t exclude = this._getRouteExclude(sourcePoint, targetPoint, sourceConnector.shape, targetConnector.shape);\n\t points.unshift(sourcePoint);\n\t points.push(targetPoint);\n\n\n\t for (var idx = 1; idx < points.length; idx++) {\n\t start = points[idx - 1];\n\t end = points[idx];\n\t rect = new Rect(math.min(start.x, end.x), math.min(start.y, end.y),\n\t math.abs(start.x - end.x), math.abs(start.y - end.y));\n\t if (rect.width > 0) {\n\t rect.x++;\n\t rect.width-=2;\n\t }\n\t if (rect.height > 0) {\n\t rect.y++;\n\t rect.height-=2;\n\t }\n\n\t if (!rect.isEmpty() && this.diagram._shapesQuadTree.hitTestRect(rect, exclude)) {\n\t passRoute = false;\n\t break;\n\t }\n\t }\n\t }\n\t return passRoute;\n\t },\n\n\t _getRouteExclude: function(sourcePoint, targetPoint, sourceShape, targetShape) {\n\t var exclude = [];\n\t if (this._isPointInsideShape(sourcePoint, sourceShape)){\n\t exclude.push(sourceShape);\n\t }\n\t if (this._isPointInsideShape(targetPoint, targetShape)){\n\t exclude.push(targetShape);\n\t }\n\t return exclude;\n\t },\n\n\t _isPointInsideShape: function (point, shape) {\n\t var bounds = shape.bounds(), rotatedPoint,\n\t angle = shape.rotate().angle,\n\t pointX, pointY,\n\t boundsX = bounds.x,\n\t boundsY = bounds.y;\n\n\t rotatedPoint = point.clone().rotate(bounds.center(), angle);\n\t pointX = rotatedPoint.x;\n\t pointY = rotatedPoint.y;\n\t return pointX > boundsX && pointX < (boundsX + bounds.width) && pointY > boundsY && pointY < (boundsY + bounds.height);\n\t },\n\n\t redraw: function (options) {\n\t if (options) {\n\t this.options = deepExtend({}, this.options, options);\n\n\t var points = this.options.points;\n\n\t if (defined(points) && points.length > 0) {\n\t this.points(points);\n\t this._refreshPath();\n\t }\n\n\t if ((options && options.content) || options.text) {\n\t this.content(options.content);\n\t }\n\n\t this.path.redraw({\n\t fill: options.fill,\n\t stroke: options.stroke,\n\t startCap: options.startCap,\n\t endCap: options.endCap\n\t });\n\t }\n\t },\n\t /**\n\t * Returns a clone of this connection.\n\t * @returns {Connection}\n\t */\n\t clone: function () {\n\t var json = this.serialize();\n\n\t if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n\t json.options.dataItem = cloneDataItem(this.dataItem);\n\t }\n\n\t return new Connection(this.from, this.to, json.options);\n\t },\n\t /**\n\t * Returns a serialized connection in json format. Consist of the options and the dataItem.\n\t * @returns {Connection}\n\t */\n\t serialize: function () {\n\t var from = this.from.toJSON ? this.from.toJSON : this.from.toString(),\n\t to = this.to.toJSON ? this.to.toJSON : this.to.toString();\n\n\t var json = deepExtend({}, {\n\t options: this.options,\n\t from: from,\n\t to: to\n\t });\n\n\t if (defined(this.dataItem)) {\n\t json.dataItem = this.dataItem.toString();\n\t }\n\n\t json.options.points = this.points();\n\t return json;\n\t },\n\n\t /**\n\t * Returns whether the given Point or Rect hits this connection.\n\t * @param value\n\t * @returns {Connection}\n\t * @private\n\t */\n\t _hitTest: function (value) {\n\t if (this.visible()) {\n\t var p = new Point(value.x, value.y), from = this.sourcePoint(), to = this.targetPoint();\n\t if (value.isEmpty && !value.isEmpty() && value.contains(from) && value.contains(to)) {\n\t return this;\n\t }\n\t if (this._router.hitTest(p)) {\n\t return this;\n\t }\n\t }\n\t },\n\n\t _hover: function (value) {\n\t var color = (this.options.stroke || {}).color;\n\n\t if (value && isDefined(this.options.hover.stroke.color)) {\n\t color = this.options.hover.stroke.color;\n\t }\n\n\t this.path.redraw({\n\t stroke: {\n\t color: color\n\t }\n\t });\n\t },\n\n\t _refreshPath: function () {\n\t if (!defined(this.path)) {\n\t return;\n\t }\n\t this._drawPath();\n\t this.bounds(this._router.getBounds());\n\t },\n\n\t _drawPath: function () {\n\t if (this._router) {\n\t this._router.route(); // sets the intermediate points\n\t }\n\t var source = this.sourcePoint();\n\t var target = this.targetPoint();\n\t var points = this.points();\n\n\t this.path.redraw({\n\t points: [source].concat(points, [target])\n\t });\n\t },\n\n\t _clearSourceConnector: function () {\n\t this.sourceConnector = undefined;\n\t this._resolvedSourceConnector = undefined;\n\t },\n\n\t _clearTargetConnector: function () {\n\t this.targetConnector = undefined;\n\t this._resolvedTargetConnector = undefined;\n\t },\n\n\t _removeFromSourceConnector: function() {\n\t if (this.sourceConnector) {\n\t Utils.remove(this.sourceConnector.connections, this);\n\t }\n\t },\n\n\t _removeFromTargetConnector: function() {\n\t if (this.targetConnector) {\n\t Utils.remove(this.targetConnector.connections, this);\n\t }\n\t },\n\n\t toJSON: function() {\n\t var connection = this;\n\t var from, to, point;\n\t if (connection.from && connection.from.toJSON) {\n\t from = connection.from.toJSON();\n\t } else {\n\t point = connection._sourcePoint;\n\t from = {\n\t x: point.x,\n\t y: point.y\n\t };\n\t }\n\n\t if (connection.to && connection.to.toJSON) {\n\t to = connection.to.toJSON();\n\t } else {\n\t point = connection._targetPoint;\n\t to = {\n\t x: point.x,\n\t y: point.y\n\t };\n\t }\n\n\t return {\n\t from : from,\n\t to: to\n\t };\n\t }\n\t });\n\n\t var Diagram = Widget.extend({\n\t init: function (element, userOptions) {\n\t var that = this;\n\n\t kendo.destroy(element);\n\t Widget.fn.init.call(that, element, userOptions);\n\n\t that._initTheme();\n\n\t that._initElements();\n\t that._extendLayoutOptions(that.options);\n\t that._initDefaults(userOptions);\n\t that._interactionDefaults();\n\n\t that._initCanvas();\n\n\t that.mainLayer = new Group({\n\t id: \"main-layer\"\n\t });\n\t that.canvas.append(that.mainLayer);\n\n\t that._shapesQuadTree = new ShapesQuadTree(that);\n\n\t that._pan = new Point();\n\t that._adorners = [];\n\t that.adornerLayer = new Group({\n\t id: \"adorner-layer\"\n\t });\n\t that.canvas.append(that.adornerLayer);\n\n\t that._createHandlers();\n\n\t that._initialize();\n\n\t that._resizingAdorner = new ResizingAdorner(that, { editable: that.options.editable });\n\t that._connectorsAdorner = new ConnectorsAdorner(that);\n\n\t that._adorn(that._resizingAdorner, true);\n\t that._adorn(that._connectorsAdorner, true);\n\n\t that.selector = new Selector(that);\n\t // TODO: We may consider using real Clipboard API once is supported by the standard.\n\t that._clipboard = [];\n\n\t that.pauseMouseHandlers = false;\n\n\t that._fetchFreshData();\n\n\t that._createGlobalToolBar();\n\n\t that._createOptionElements();\n\n\t that.zoom(that.options.zoom);\n\n\t that.canvas.draw();\n\t },\n\n\t options: {\n\t name: \"Diagram\",\n\t theme: \"default\",\n\t layout: \"\",\n\t zoomRate: 0.1,\n\t zoom: 1,\n\t zoomMin: 0,\n\t zoomMax: 2,\n\t dataSource: {},\n\t draggable: true,\n\t template: \"\",\n\t autoBind: true,\n\t editable: {\n\t rotate: {},\n\t resize: {},\n\t text: true,\n\t tools: [],\n\t drag: {\n\t snap: {\n\t size: 10,\n\t angle: 10\n\t }\n\t },\n\t remove: true\n\t },\n\t pannable: {},\n\t selectable: {\n\t key: \"none\"\n\t },\n\t tooltip: { enabled: true, format: \"{0}\" },\n\t copy: {\n\t enabled: true,\n\t offsetX: 20,\n\t offsetY: 20\n\t },\n\t shapeDefaults: diagram.shapeDefaults({ undoable: true }),\n\t connectionDefaults: {\n\t editable: {\n\t tools: []\n\t },\n\t type: CASCADING\n\t },\n\t shapes: [],\n\t connections: []\n\t },\n\n\t events: [\n\t ZOOM_END,\n\t ZOOM_START,\n\t PAN, SELECT,\n\t ITEMROTATE,\n\t ITEMBOUNDSCHANGE,\n\t CHANGE,\n\t CLICK,\n\t MOUSE_ENTER,\n\t MOUSE_LEAVE,\n\t \"toolBarClick\",\n\t \"save\",\n\t \"cancel\",\n\t \"edit\",\n\t \"remove\",\n\t \"add\",\n\t \"dataBound\",\n\t DRAG_START,\n\t DRAG,\n\t DRAG_END\n\t ],\n\n\t items: function() {\n\t return $();\n\t },\n\n\t _createGlobalToolBar: function() {\n\t var editable = this.options.editable;\n\t if (editable) {\n\t var tools = editable.tools;\n\t if (this._isEditable && tools !== false && (!tools || tools.length === 0)) {\n\t tools = [\"createShape\", \"undo\", \"redo\", \"rotateClockwise\", \"rotateAnticlockwise\"];\n\t }\n\n\t if (tools && tools.length) {\n\t this.toolBar = new DiagramToolBar(this, {\n\t tools: tools || {},\n\t click: proxy(this._toolBarClick, this),\n\t modal: false\n\t });\n\n\t this.toolBar.element.css({\n\t textAlign: \"left\"\n\t });\n\n\t this.element.prepend(this.toolBar.element);\n\t this._resize();\n\t }\n\t }\n\t },\n\n\t createShape: function() {\n\t if ((this.editor && this.editor.end()) || !this.editor) {\n\t var dataSource = this.dataSource;\n\t var view = dataSource.view() || [];\n\t var index = view.length;\n\t var model = createModel(dataSource, {});\n\t var shape = this._createShape(model, {});\n\n\t if (!this.trigger(\"add\", { shape: shape })) {\n\t dataSource.insert(index, model);\n\t var inactiveItem = this._inactiveShapeItems.getByUid(model.uid);\n\t inactiveItem.element = shape;\n\t this.edit(shape);\n\t }\n\t }\n\t },\n\n\t _createShape: function(dataItem, options) {\n\t options = deepExtend({}, this.options.shapeDefaults, options);\n\t options.dataItem = dataItem;\n\t var shape = new Shape(options, this);\n\t return shape;\n\t },\n\n\t createConnection: function() {\n\t if (((this.editor && this.editor.end()) || !this.editor)) {\n\t var connectionsDataSource = this.connectionsDataSource;\n\t var view = connectionsDataSource.view() || [];\n\t var index = view.length;\n\t var model = createModel(connectionsDataSource, {});\n\t var connection = this._createConnection(model);\n\t if (!this.trigger(\"add\", { connection: connection })) {\n\t this._connectionsDataMap[model.uid] = connection;\n\t connectionsDataSource.insert(index, model);\n\t this.addConnection(connection, false);\n\t this.edit(connection);\n\t }\n\t }\n\t },\n\n\t _createConnection: function(dataItem, source, target) {\n\t var options = deepExtend({}, this.options.connectionDefaults);\n\t options.dataItem = dataItem;\n\n\t var connection = new Connection(source || new Point(), target || new Point(), options);\n\n\t return connection;\n\t },\n\n\t editModel: function(dataItem, editorType) {\n\t this.cancelEdit();\n\t var editors, template;\n\t var editable = this.options.editable;\n\n\t if (editorType == \"shape\") {\n\t editors = editable.shapeEditors;\n\t template = editable.shapeTemplate;\n\t } else if (editorType == \"connection\") {\n\t var connectionSelectorHandler = proxy(connectionSelector, this);\n\t editors = deepExtend({}, { from: connectionSelectorHandler, to: connectionSelectorHandler }, editable.connectionEditors);\n\t template = editable.connectionTemplate;\n\t } else {\n\t return;\n\t }\n\n\t this.editor = new PopupEditor(this.element, {\n\t update: proxy(this._update, this),\n\t cancel: proxy(this._cancel, this),\n\t model: dataItem,\n\t type: editorType,\n\t target: this,\n\t editors: editors,\n\t template: template\n\t });\n\n\t this.trigger(\"edit\", this._editArgs());\n\t },\n\n\t edit: function(item) {\n\t if (item.dataItem) {\n\t var editorType = item instanceof Shape ? \"shape\" : \"connection\";\n\t this.editModel(item.dataItem, editorType);\n\t }\n\t },\n\n\t cancelEdit: function() {\n\t if (this.editor) {\n\t this._getEditDataSource().cancelChanges(this.editor.model);\n\n\t this._destroyEditor();\n\t }\n\t },\n\n\t saveEdit: function() {\n\t if (this.editor && this.editor.end() &&\n\t !this.trigger(\"save\", this._editArgs())) {\n\t this._getEditDataSource().sync();\n\t }\n\t },\n\n\t _update: function() {\n\t if (this.editor && this.editor.end() &&\n\t !this.trigger(\"save\", this._editArgs())) {\n\t this._getEditDataSource().sync();\n\t this._destroyEditor();\n\t }\n\t },\n\n\t _cancel: function() {\n\t if (this.editor && !this.trigger(\"cancel\", this._editArgs())) {\n\t var model = this.editor.model;\n\t this._getEditDataSource().cancelChanges(model);\n\t var element = this._connectionsDataMap[model.uid] || this._dataMap[model.id];\n\t if (element) {\n\t element._setOptionsFromModel(model);\n\t }\n\t this._destroyEditor();\n\t }\n\t },\n\n\t _getEditDataSource: function() {\n\t return this.editor.options.type === \"shape\" ? this.dataSource : this.connectionsDataSource;\n\t },\n\n\t _editArgs: function() {\n\t var result = { container: this.editor.wrapper };\n\t result[this.editor.options.type] = this.editor.model;\n\t return result;\n\t },\n\n\t _destroyEditor: function() {\n\t if (this.editor) {\n\t this.editor.close();\n\t this.editor = null;\n\t }\n\t },\n\n\t _initElements: function() {\n\t this.wrapper = this.element.empty()\n\t .css(\"position\", \"relative\")\n\t .attr(\"tabindex\", 0)\n\t .addClass(\"k-widget k-diagram\");\n\n\t this.scrollable = $(\"
\").appendTo(this.element);\n\t },\n\n\t _initDefaults: function(userOptions) {\n\t var options = this.options;\n\t var editable = options.editable;\n\t var shapeDefaults = options.shapeDefaults;\n\t var connectionDefaults = options.connectionDefaults;\n\t var userShapeDefaults = (userOptions || {}).shapeDefaults;\n\t if (editable === false) {\n\t shapeDefaults.editable = false;\n\t connectionDefaults.editable = false;\n\t } else {\n\t copyDefaultOptions(editable, shapeDefaults.editable, [\"drag\", \"remove\", \"connect\"]);\n\t copyDefaultOptions(editable, connectionDefaults.editable, [\"drag\", \"remove\"]);\n\t }\n\n\t if (userShapeDefaults && userShapeDefaults.connectors) {\n\t options.shapeDefaults.connectors = userShapeDefaults.connectors;\n\t }\n\t },\n\n\t _interactionDefaults: function() {\n\t var options = this.options;\n\t var selectable = options.selectable;\n\t var pannable = options.pannable;\n\t var mobile = kendo.support.mobileOS;\n\n\t if (selectable && !defined(selectable.multiple)) {\n\t options.selectable = deepExtend({\n\t multiple: mobile ? false : true\n\t }, options.selectable);\n\t }\n\n\t if (pannable && !defined(pannable.key)) {\n\t options.pannable = deepExtend({\n\t key: mobile ? \"none\" : \"ctrl\"\n\t }, options.pannable);\n\t }\n\t },\n\n\t _initCanvas: function() {\n\t var canvasContainer = $(\"
\").appendTo(this.scrollable)[0];\n\t var viewPort = this.viewport();\n\t this.canvas = new Canvas(canvasContainer, {\n\t width: viewPort.width || DEFAULT_CANVAS_WIDTH,\n\t height: viewPort.height || DEFAULT_CANVAS_HEIGHT\n\t });\n\t },\n\n\t _createHandlers: function () {\n\t var that = this;\n\t var element = that.element;\n\n\t element.on(MOUSEWHEEL_NS, proxy(that._wheel, that))\n\t .on(\"keydown\" + NS, proxy(that._keydown, that));\n\n\t that._userEvents = new kendo.UserEvents(this.scrollable, {\n\t multiTouch: true,\n\t fastTap: true,\n\t tap: proxy(that._tap, that),\n\t start: proxy(that._dragStart, that),\n\t move: proxy(that._drag, that),\n\t end: proxy(that._dragEnd, that),\n\t gesturestart: proxy(that._gestureStart, that),\n\t gesturechange: proxy(that._gestureChange, that),\n\t gestureend: proxy(that._gestureEnd, that),\n\t doubleTap: proxy(that._doubleTap, that),\n\t supportDoubleTap: true\n\t });\n\n\t that.toolService = new ToolService(that);\n\n\t this.scrollable\n\t .on(\"mouseover\" + NS, proxy(that._mouseover, that))\n\t .on(\"mouseout\" + NS, proxy(that._mouseout, that))\n\t .on(\"mousemove\" + NS, proxy(that._mouseMove, that))\n\t .on(\"mousedown\" + NS, proxy(that._mouseDown, that))\n\t .on(\"mouseup\" + NS, proxy(that._mouseUp, that));\n\n\t this._syncHandler = proxy(that._syncChanges, that);\n\n\t that._resizeHandler = proxy(that.resize, that, false);\n\t kendo.onResize(that._resizeHandler);\n\n\t this.bind(ZOOM_START, proxy(that._destroyToolBar, that));\n\t this.bind(PAN, proxy(that._destroyToolBar, that));\n\t },\n\n\t _dragStart: function (e) {\n\t this._pauseMouseHandlers = true;\n\t var point = this._eventPositions(e, true);\n\n\t var event = e.event;\n\t if (this.toolService.start(point, this._meta(event))) {\n\t this._destroyToolBar();\n\t event.preventDefault();\n\t }\n\t },\n\n\t _drag: function (e) {\n\t var p = this._eventPositions(e);\n\t var event = e.event;\n\t if (this.toolService.move(p, this._meta(event))) {\n\t event.preventDefault();\n\t }\n\t },\n\n\t _dragEnd: function (e) {\n\t this._pauseMouseHandlers = false;\n\t var p = this._eventPositions(e);\n\t var event = e.event;\n\t if (this.toolService.end(p, this._meta(event))) {\n\t this._createToolBar();\n\t event.preventDefault();\n\t }\n\t },\n\n\t _mouseMove: function (e) {\n\t if (!this._pauseMouseHandlers) {\n\t var p = this._eventPositions(e);\n\t this.toolService._updateHoveredItem(p);\n\t this.toolService._updateCursor(p);\n\t }\n\t },\n\n\t _mouseDown: function () {\n\t this._pauseMouseHandlers = true;\n\t },\n\n\t _mouseUp: function () {\n\t this._pauseMouseHandlers = false;\n\t },\n\n\t _tap: function(e) {\n\t var toolService = this.toolService;\n\t var selectable = this.options.selectable;\n\t var point = this._eventPositions(e);\n\t var focused = this.focus();\n\n\t toolService._updateHoveredItem(point);\n\n\t if (toolService.hoveredItem) {\n\t var item = toolService.hoveredItem;\n\n\t this.trigger(\"click\", {\n\t item: item,\n\t point: point,\n\t meta: this._meta(e.event)\n\t });\n\n\t if (selectable && item.options.selectable !== false) {\n\t var multiple = selectable.multiple !== false;\n\t var ctrlPressed = kendo.support.mobileOS || this._meta(e.event).ctrlKey;\n\n\t if (item.isSelected) {\n\t if (ctrlPressed) {\n\t this._destroyToolBar();\n\t item.select(false);\n\t } else {\n\t this._createToolBar(focused);\n\t }\n\t } else {\n\t this._destroyToolBar();\n\t this.select(item, {\n\t addToSelection: multiple && ctrlPressed\n\t });\n\t this._createToolBar(focused);\n\t }\n\t }\n\t } else if (selectable) {\n\t this._destroyToolBar();\n\t this.deselect();\n\t }\n\t },\n\n\t _keydown: function (e) {\n\t if (this.toolService.keyDown(e.keyCode, this._meta(e))) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _wheel: function (e) {\n\t var delta = mwDelta(e),\n\t p = this._eventPositions(e),\n\t meta = deepExtend(this._meta(e), { delta: delta });\n\n\t if (this.toolService.wheel(p, meta)) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _meta: function (e) {\n\t return { ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey, shiftKey: e.shiftKey, type: e.type };\n\t },\n\n\t _eventPositions: function (e, start) {\n\t var point;\n\t if (e.touch) {\n\t var field = start ? \"startLocation\" : \"location\";\n\t point = new Point(e.x[field], e.y[field]);\n\t } else {\n\t var event = e.originalEvent;\n\t point = new Point(event.pageX, event.pageY);\n\t }\n\n\t return this.documentToModel(point);\n\t },\n\n\t _gestureStart: function(e) {\n\t this._destroyToolBar();\n\t this.scroller.disable();\n\t var initialCenter = this.documentToModel(new Point(e.center.x, e.center.y));\n\t var eventArgs = {\n\t point: initialCenter,\n\t zoom: this.zoom()\n\t };\n\n\t if (this.trigger(ZOOM_START, eventArgs)) {\n\t return;\n\t }\n\n\t this._gesture = e;\n\t this._initialCenter = initialCenter;\n\t },\n\n\t _gestureChange: function(e) {\n\t var previousGesture = this._gesture;\n\t var initialCenter = this._initialCenter;\n\t var center = this.documentToView(new Point(e.center.x, e.center.y));\n\t var scaleDelta = e.distance / previousGesture.distance;\n\t var zoom = this._zoom;\n\t var updateZoom = false;\n\n\t if (math.abs(scaleDelta - 1) >= MOBILE_ZOOM_RATE) {\n\t this._zoom = zoom = this._getValidZoom(zoom * scaleDelta);\n\t this.options.zoom = zoom;\n\t this._gesture = e;\n\t updateZoom = true;\n\t }\n\n\t var zoomedPoint = initialCenter.times(zoom);\n\t var pan = center.minus(zoomedPoint);\n\t if (updateZoom || this._pan.distanceTo(pan) >= MOBILE_PAN_DISTANCE) {\n\t this._panTransform(pan);\n\t this._updateAdorners();\n\t }\n\n\t e.preventDefault();\n\t },\n\n\t _doubleTap: function(e) {\n\t var diagram = this;\n\t var pointPosition = this._eventPositions(e);\n\t var options = diagram.options;\n\t var zoomRate = options.zoomRate;\n\t var zoom = diagram.zoom() + zoomRate;\n\t var meta = this._meta(e);\n\t var zoomOptions = { point: pointPosition, meta: meta, zoom: zoom };\n\n\n\t if (diagram.trigger(ZOOM_START, zoomOptions)) {\n\t return;\n\t }\n\n\t zoom = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, zoom)), 2);\n\t zoomOptions.zoom = zoom;\n\n\t diagram.zoom(zoom, zoomOptions);\n\t diagram.trigger(ZOOM_END, zoomOptions);\n\t },\n\n\t _gestureEnd: function() {\n\t if (this.options.pannable !== false) {\n\t this.scroller.enable();\n\t }\n\t this.trigger(ZOOM_END, {\n\t point: this._initialCenter,\n\t zoom: this.zoom()\n\t });\n\t },\n\n\t _resize: function() {\n\t var viewport = this.viewport();\n\t if (this.canvas) {\n\t this.canvas.size(viewport);\n\t }\n\n\t if (this.scrollable && this.toolBar) {\n\t this.scrollable.height(viewport.height);\n\t }\n\t },\n\n\t _mouseover: function(e) {\n\t var node = e.target._kendoNode;\n\t if (node && node.srcElement._hover) {\n\t node.srcElement._hover(true, node.srcElement);\n\t }\n\t },\n\n\t _mouseout: function(e) {\n\t var node = e.target._kendoNode;\n\t if (node && node.srcElement._hover) {\n\t node.srcElement._hover(false, node.srcElement);\n\t }\n\t },\n\n\t _initTheme: function() {\n\t var that = this;\n\t var themeName = ((that.options || {}).theme || \"\").toLowerCase();\n\t var themes = dataviz.ui.themes || {};\n\t var themeOptions;\n\n\t if(dataviz.SASS_THEMES.indexOf(themeName) != -1) {\n\t themeOptions = dataviz.autoTheme().diagram;\n\t }\n\t else {\n\t themeOptions = (themes[themeName] || {}).diagram;\n\t }\n\n\t that.options = deepExtend({}, themeOptions, that.options);\n\t if (that.options.editable === true) {\n\t deepExtend(that.options, {\n\t editable: (themeOptions || {}).editable\n\t });\n\t }\n\t },\n\n\t _createOptionElements: function() {\n\t var options = this.options;\n\t var shapesLength = options.shapes.length;\n\n\t if (shapesLength) {\n\t this._createShapes();\n\t }\n\n\t if (options.connections.length) {\n\t this._createConnections();\n\t }\n\n\t if (shapesLength && options.layout) {\n\t this.layout(options.layout);\n\t }\n\t },\n\n\t _createShapes: function() {\n\t var that = this,\n\t options = that.options,\n\t shapes = options.shapes,\n\t shape, i;\n\n\t for (i = 0; i < shapes.length; i++) {\n\t shape = shapes[i];\n\t that.addShape(shape);\n\t }\n\t },\n\n\t _createConnections: function() {\n\t var diagram = this,\n\t options = diagram.options,\n\t defaults = options.connectionDefaults,\n\t connections = options.connections,\n\t conn, source, target, i;\n\n\t for(i = 0; i < connections.length; i++) {\n\t conn = connections[i];\n\t source = diagram._findConnectionTarget(conn.from);\n\t target = diagram._findConnectionTarget(conn.to);\n\n\t diagram.connect(source, target, deepExtend({}, defaults, conn));\n\t }\n\t },\n\n\t _findConnectionTarget: function(options) {\n\t options = options || {};\n\t var diagram = this;\n\t var shapeId = isString(options) ? options : options.shapeId || options.id;\n\t var target;\n\t if (shapeId) {\n\t target = diagram.getShapeById(shapeId);\n\t if (options.connector) {\n\t target = target.getConnector(options.connector);\n\t }\n\t } else {\n\t target = new Point(options.x || 0, options.y || 0);\n\t }\n\n\t return target;\n\t },\n\n\t destroy: function () {\n\t var that = this;\n\t Widget.fn.destroy.call(that);\n\n\t if (this._userEvents) {\n\t this._userEvents.destroy();\n\t }\n\n\t kendo.unbindResize(that._resizeHandler);\n\n\t that.clear();\n\t that.element.off(NS);\n\t that.scroller.wrapper.off(NS);\n\t that.canvas.destroy(true);\n\t that.canvas = undefined;\n\n\t that._destroyEditor();\n\t that.destroyScroller();\n\t that._destroyGlobalToolBar();\n\t that._destroyToolBar();\n\t },\n\n\t destroyScroller: function () {\n\t var scroller = this.scroller;\n\n\t if (!scroller) {\n\t return;\n\t }\n\n\t scroller.destroy();\n\t scroller.element.remove();\n\t this.scroller = null;\n\t },\n\n\t save: function () {\n\t var json = {\n\t shapes: [],\n\t connections: []\n\t };\n\t var i, connection, shape;\n\n\t for (i = 0; i < this.shapes.length; i++) {\n\t shape = this.shapes[i];\n\t if (shape.options.serializable) {\n\t json.shapes.push(shape.options);\n\t }\n\t }\n\n\t for (i = 0; i < this.connections.length; i++) {\n\t connection = this.connections[i];\n\n\t json.connections.push(deepExtend({}, connection.options, connection.toJSON()));\n\t }\n\n\t return json;\n\t },\n\n\t focus: function() {\n\t if (!this.element.is(kendo._activeElement())) {\n\t var element = this.element,\n\t scrollContainer = element[0],\n\t containers = [],\n\t offsets = [],\n\t documentElement = document.documentElement,\n\t i;\n\n\t do {\n\t scrollContainer = scrollContainer.parentNode;\n\n\t if (scrollContainer.scrollHeight > scrollContainer.clientHeight) {\n\t containers.push(scrollContainer);\n\t offsets.push(scrollContainer.scrollTop);\n\t }\n\t } while (scrollContainer != documentElement);\n\n\t element.trigger(\"focus\");\n\n\t for (i = 0; i < containers.length; i++) {\n\t containers[i].scrollTop = offsets[i];\n\t }\n\t return true;\n\t }\n\t },\n\n\t load: function(options) {\n\t this.clear();\n\n\t this.setOptions(options);\n\t this._createShapes();\n\t this._createConnections();\n\t },\n\n\t setOptions: function(options) {\n\t deepExtend(this.options, options);\n\t },\n\n\t clear: function () {\n\t var that = this;\n\n\t that.select(false);\n\t that.mainLayer.clear();\n\t that._shapesQuadTree.clear();\n\t that._initialize();\n\t },\n\t /**\n\t * Connects two items.\n\t * @param source Shape, Connector, Point.\n\t * @param target Shape, Connector, Point.\n\t * @param options Connection options that will be passed to the newly created connection.\n\t * @returns The newly created connection.\n\t */\n\t connect: function (source, target, options) {\n\t var connection;\n\t if (this.connectionsDataSource && this._isEditable) {\n\t var dataItem = this.connectionsDataSource.add({});\n\t connection = this._connectionsDataMap[dataItem.uid];\n\t connection.source(source);\n\t connection.target(target);\n\t connection.redraw(options);\n\t connection.updateModel();\n\t } else {\n\t connection = new Connection(source, target,\n\t deepExtend({ }, this.options.connectionDefaults, options));\n\n\t this.addConnection(connection);\n\t }\n\n\t return connection;\n\t },\n\t /**\n\t * Determines whether the the two items are connected.\n\t * @param source Shape, Connector, Point.\n\t * @param target Shape, Connector, Point.\n\t * @returns true if the two items are connected.\n\t */\n\t connected: function (source, target) {\n\t for (var i = 0; i < this.connections.length; i++) {\n\t var c = this.connections[i];\n\t if (c.from == source && c.to == target) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t },\n\t /**\n\t * Adds connection to the diagram.\n\t * @param connection Connection.\n\t * @param undoable Boolean.\n\t * @returns The newly created connection.\n\t */\n\t addConnection: function (connection, undoable) {\n\t if (undoable !== false) {\n\t this.undoRedoService.add(\n\t new diagram.AddConnectionUnit(connection, this), false);\n\t }\n\n\t connection.diagram = this;\n\t connection._setOptionsFromModel();\n\t connection.refresh();\n\t this.mainLayer.append(connection.visual);\n\t this.connections.push(connection);\n\n\t this.trigger(CHANGE, {\n\t added: [connection],\n\t removed: []\n\t });\n\n\t return connection;\n\t },\n\n\t _addConnection: function (connection, undoable) {\n\t var connectionsDataSource = this.connectionsDataSource;\n\t var dataItem;\n\t if (connectionsDataSource && this._isEditable) {\n\t dataItem = createModel(connectionsDataSource, cloneDataItem(connection.dataItem));\n\t connection.dataItem = dataItem;\n\t connection.updateModel();\n\n\t if (!this.trigger(\"add\", { connection: connection })) {\n\t this._connectionsDataMap[dataItem.uid] = connection;\n\n\t connectionsDataSource.add(dataItem);\n\t this.addConnection(connection, undoable);\n\t connection._updateConnectors();\n\n\t return connection;\n\t }\n\t } else if (!this.trigger(\"add\", { connection: connection })) {\n\t this.addConnection(connection, undoable);\n\t connection._updateConnectors();\n\t return connection;\n\t }\n\t },\n\n\t /**\n\t * Adds shape to the diagram.\n\t * @param item Shape, Point. If point is passed it will be created new Shape and positioned at that point.\n\t * @param options. The options to be passed to the newly created Shape.\n\t * @returns The newly created shape.\n\t */\n\t addShape: function(item, undoable) {\n\t var shape,\n\t shapeDefaults = this.options.shapeDefaults;\n\n\t if (item instanceof Shape) {\n\t shape = item;\n\t } else if (!(item instanceof kendo.Class)) {\n\t shapeDefaults = deepExtend({}, shapeDefaults, item || {});\n\t shape = new Shape(shapeDefaults, this);\n\t } else {\n\t return;\n\t }\n\n\t if (undoable !== false) {\n\t this.undoRedoService.add(new diagram.AddShapeUnit(shape, this), false);\n\t }\n\n\t this.shapes.push(shape);\n\t if (shape.diagram !== this) {\n\t this._shapesQuadTree.insert(shape);\n\t shape.diagram = this;\n\t }\n\t this.mainLayer.append(shape.visual);\n\n\t this.trigger(CHANGE, {\n\t added: [shape],\n\t removed: []\n\t });\n\n\t return shape;\n\t },\n\n\t _addShape: function(shape, undoable) {\n\t var that = this;\n\t var dataSource = that.dataSource;\n\t var dataItem;\n\t if (dataSource && this._isEditable) {\n\t dataItem = createModel(dataSource, cloneDataItem(shape.dataItem));\n\t shape.dataItem = dataItem;\n\t shape.updateModel();\n\n\t if (!this.trigger(\"add\", { shape: shape })) {\n\t this.dataSource.add(dataItem);\n\t var inactiveItem = this._inactiveShapeItems.getByUid(dataItem.uid);\n\t inactiveItem.element = shape;\n\t inactiveItem.undoable = undoable;\n\t return shape;\n\t }\n\t } else if (!this.trigger(\"add\", { shape: shape })) {\n\t return this.addShape(shape, undoable);\n\t }\n\t },\n\t /**\n\t * Removes items (or single item) from the diagram.\n\t * @param items DiagramElement, Array of Items.\n\t * @param undoable.\n\t */\n\n\t remove: function(items, undoable) {\n\t items = isArray(items) ? items.slice(0) : [items];\n\t var elements = splitDiagramElements(items);\n\t var shapes = elements.shapes;\n\t var connections = elements.connections;\n\t var i;\n\n\t if (!defined(undoable)) {\n\t undoable = true;\n\t }\n\n\t if (undoable) {\n\t this.undoRedoService.begin();\n\t }\n\n\t this._suspendModelRefresh();\n\t for (i = shapes.length - 1; i >= 0; i--) {\n\t this._removeItem(shapes[i], undoable, connections);\n\t }\n\n\t for (i = connections.length - 1; i >= 0; i--) {\n\t this._removeItem(connections[i], undoable);\n\t }\n\n\t this._resumeModelRefresh();\n\n\t if (undoable) {\n\t this.undoRedoService.commit(false);\n\t }\n\n\t this.trigger(CHANGE, {\n\t added: [],\n\t removed: items\n\t });\n\t },\n\n\t _removeShapeDataItem: function(item) {\n\t if (this._isEditable) {\n\t this.dataSource.remove(item.dataItem);\n\t delete this._dataMap[item.dataItem.id];\n\t }\n\t },\n\n\t _removeConnectionDataItem: function(item) {\n\t if (this._isEditable) {\n\t this.connectionsDataSource.remove(item.dataItem);\n\t delete this._connectionsDataMap[item.dataItem.uid];\n\t }\n\t },\n\n\t _triggerRemove: function(items){\n\t var toRemove = [];\n\t var item, args, editable;\n\n\t for (var idx = 0; idx < items.length; idx++) {\n\t item = items[idx];\n\t editable = item.options.editable;\n\t if (item instanceof Shape) {\n\t args = { shape: item };\n\t } else {\n\t args = { connection: item };\n\t }\n\t if (editable && editable.remove !== false && !this.trigger(\"remove\", args)) {\n\t toRemove.push(item);\n\t }\n\t }\n\t return toRemove;\n\t },\n\n\t /**\n\t * Executes the next undoable action on top of the undo stack if any.\n\t */\n\t undo: function () {\n\t this.undoRedoService.undo();\n\t },\n\t /**\n\t * Executes the previous undoable action on top of the redo stack if any.\n\t */\n\t redo: function () {\n\t this.undoRedoService.redo();\n\t },\n\t /**\n\t * Selects items on the basis of the given input or returns the current selection if none.\n\t * @param itemsOrRect DiagramElement, Array of elements, \"All\", false or Rect. A value 'false' will deselect everything.\n\t * @param options\n\t * @returns {Array}\n\t */\n\t select: function (item, options) {\n\t if (isDefined(item)) {\n\t options = deepExtend({ addToSelection: false }, options);\n\n\t var addToSelection = options.addToSelection,\n\t items = [],\n\t selected = [],\n\t i, element;\n\n\t if (!addToSelection) {\n\t this.deselect();\n\t }\n\n\t this._internalSelection = true;\n\n\t if (item instanceof Array) {\n\t items = item;\n\t } else if (item instanceof DiagramElement) {\n\t items = [ item ];\n\t }\n\n\t for (i = 0; i < items.length; i++) {\n\t element = items[i];\n\t if (element.select(true)) {\n\t selected.push(element);\n\t }\n\t }\n\n\t this._selectionChanged(selected, []);\n\n\t this._internalSelection = false;\n\t } else {\n\t return this._selectedItems;\n\t }\n\t },\n\n\t selectAll: function() {\n\t this.select(this.shapes.concat(this.connections));\n\t },\n\n\t selectArea: function(rect) {\n\t var i, items, item;\n\t this._internalSelection = true;\n\t var selected = [];\n\t if (rect instanceof Rect) {\n\t items = this.shapes.concat(this.connections);\n\t for (i = 0; i < items.length; i++) {\n\t item = items[i];\n\t if ((!rect || item._hitTest(rect)) && item.options.enable) {\n\t if (item.select(true)) {\n\t selected.push(item);\n\t }\n\t }\n\t }\n\t }\n\n\t this._selectionChanged(selected, []);\n\t this._internalSelection = false;\n\t },\n\n\t deselect: function(item) {\n\t this._internalSelection = true;\n\t var deselected = [],\n\t items = [],\n\t element, i;\n\n\t if (item instanceof Array) {\n\t items = item;\n\t } else if (item instanceof DiagramElement) {\n\t items.push(item);\n\t } else if (!isDefined(item)) {\n\t items = this._selectedItems.slice(0);\n\t }\n\n\t for (i = 0; i < items.length; i++) {\n\t element = items[i];\n\t if (element.select(false)) {\n\t deselected.push(element);\n\t }\n\t }\n\n\t this._selectionChanged([], deselected);\n\t this._internalSelection = false;\n\t },\n\t /**\n\t * Brings to front the passed items.\n\t * @param items DiagramElement, Array of Items.\n\t * @param undoable. By default the action is undoable.\n\t */\n\t toFront: function (items, undoable) {\n\t if (!items) {\n\t items = this._selectedItems.slice();\n\t }\n\n\t var result = this._getDiagramItems(items), indices;\n\t if (!defined(undoable) || undoable) {\n\t indices = indicesOfItems(this.mainLayer, result.visuals);\n\t var unit = new ToFrontUnit(this, items, indices);\n\t this.undoRedoService.add(unit);\n\t } else {\n\t this.mainLayer.toFront(result.visuals);\n\t this._fixOrdering(result, true);\n\t }\n\t },\n\t /**\n\t * Sends to back the passed items.\n\t * @param items DiagramElement, Array of Items.\n\t * @param undoable. By default the action is undoable.\n\t */\n\t toBack: function (items, undoable) {\n\t if (!items) {\n\t items = this._selectedItems.slice();\n\t }\n\n\t var result = this._getDiagramItems(items), indices;\n\t if (!defined(undoable) || undoable) {\n\t indices = indicesOfItems(this.mainLayer, result.visuals);\n\t var unit = new ToBackUnit(this, items, indices);\n\t this.undoRedoService.add(unit);\n\t } else {\n\t this.mainLayer.toBack(result.visuals);\n\t this._fixOrdering(result, false);\n\t }\n\t },\n\t /**\n\t * Bring into view the passed item(s) or rectangle.\n\t * @param items DiagramElement, Array of Items, Rect.\n\t * @param options. align - controls the position of the calculated rectangle relative to the viewport.\n\t * \"Center middle\" will position the items in the center. animate - controls if the pan should be animated.\n\t */\n\t bringIntoView: function (item, options) { // jQuery|Item|Array|Rect\n\t var viewport = this.viewport();\n\t var aligner = new diagram.RectAlign(viewport);\n\t var current, rect, original, newPan;\n\n\t if (viewport.width === 0 || viewport.height === 0) {\n\t return;\n\t }\n\n\t options = deepExtend({animate: false, align: \"center middle\"}, options);\n\t if (options.align == \"none\") {\n\t options.align = \"center middle\";\n\t }\n\n\t if (item instanceof DiagramElement) {\n\t rect = item.bounds(TRANSFORMED);\n\t } else if (isArray(item)) {\n\t rect = this.boundingBox(item);\n\t } else if (item instanceof Rect) {\n\t rect = item.clone();\n\t }\n\n\t original = rect.clone();\n\n\t rect.zoom(this._zoom);\n\n\t if (rect.width > viewport.width || rect.height > viewport.height) {\n\t this._zoom = this._getValidZoom(math.min(viewport.width / original.width, viewport.height / original.height));\n\t rect = original.clone().zoom(this._zoom);\n\t }\n\n\t this._zoomMainLayer();\n\n\t current = rect.clone();\n\t aligner.align(rect, options.align);\n\n\t newPan = rect.topLeft().minus(current.topLeft());\n\t this.pan(newPan.times(-1), options.animate);\n\t },\n\n\t alignShapes: function (direction) {\n\t if (isUndefined(direction)) {\n\t direction = \"Left\";\n\t }\n\t var items = this.select(),\n\t val,\n\t item,\n\t i;\n\n\t if (items.length === 0) {\n\t return;\n\t }\n\n\t switch (direction.toLowerCase()) {\n\t case \"left\":\n\t case \"top\":\n\t val = MAX_VALUE;\n\t break;\n\t case \"right\":\n\t case \"bottom\":\n\t val = MIN_VALUE;\n\t break;\n\t }\n\n\t for (i = 0; i < items.length; i++) {\n\t item = items[i];\n\t if (item instanceof Shape) {\n\t switch (direction.toLowerCase()) {\n\t case \"left\":\n\t val = math.min(val, item.options.x);\n\t break;\n\t case \"top\":\n\t val = math.min(val, item.options.y);\n\t break;\n\t case \"right\":\n\t val = math.max(val, item.options.x);\n\t break;\n\t case \"bottom\":\n\t val = math.max(val, item.options.y);\n\t break;\n\t }\n\t }\n\t }\n\t var undoStates = [];\n\t var shapes = [];\n\t for (i = 0; i < items.length; i++) {\n\t item = items[i];\n\t if (item instanceof Shape) {\n\t shapes.push(item);\n\t undoStates.push(item.bounds());\n\t switch (direction.toLowerCase()) {\n\t case \"left\":\n\t case \"right\":\n\t item.position(new Point(val, item.options.y));\n\t break;\n\t case \"top\":\n\t case \"bottom\":\n\t item.position(new Point(item.options.x, val));\n\t break;\n\t }\n\t }\n\t }\n\t var unit = new diagram.TransformUnit(shapes, undoStates);\n\t this.undoRedoService.add(unit, false);\n\t },\n\n\t zoom: function (zoom, options) {\n\t if (zoom) {\n\t var staticPoint = options ? options.point : new diagram.Point(0, 0);\n\t // var meta = options ? options.meta : 0;\n\t zoom = this._zoom = this._getValidZoom(zoom);\n\n\t if (!isUndefined(staticPoint)) {//Viewpoint vector is constant\n\t staticPoint = new diagram.Point(math.round(staticPoint.x), math.round(staticPoint.y));\n\t var zoomedPoint = staticPoint.times(zoom);\n\t var viewportVector = this.modelToView(staticPoint);\n\t var raw = viewportVector.minus(zoomedPoint);//pan + zoomed point = viewpoint vector\n\t this._storePan(new diagram.Point(math.round(raw.x), math.round(raw.y)));\n\t }\n\n\t if (options) {\n\t options.zoom = zoom;\n\t }\n\n\t this._panTransform();\n\n\t this.canvas.surface.hideTooltip();\n\n\t this._updateAdorners();\n\t }\n\n\t return this._zoom;\n\t },\n\n\t _getPan: function(pan) {\n\t var canvas = this.canvas;\n\t if (!canvas.translate) {\n\t pan = pan.plus(this._pan);\n\t }\n\t return pan;\n\t },\n\n\t pan: function (pan, animate) {\n\t if (pan instanceof Point) {\n\t var that = this;\n\t var scroller = that.scroller;\n\t pan = that._getPan(pan);\n\t pan = pan.times(-1);\n\n\t if (animate) {\n\t scroller.animatedScrollTo(pan.x, pan.y, function() {\n\t that._updateAdorners();\n\t });\n\t } else {\n\t scroller.scrollTo(pan.x, pan.y);\n\t that._updateAdorners();\n\t }\n\t } else {\n\t return this._pan.times(-1);\n\t }\n\t },\n\n\t viewport: function () {\n\t var element = this.element;\n\t var width = element.width();\n\t var height = element.height();\n\n\t if (this.toolBar) {\n\t height -= outerHeight(this.toolBar.element);\n\t }\n\n\t return new Rect(0, 0, width, height);\n\t },\n\t copy: function () {\n\t if (this.options.copy.enabled) {\n\t this._clipboard = [];\n\t this._copyOffset = 1;\n\t for (var i = 0; i < this._selectedItems.length; i++) {\n\t var item = this._selectedItems[i];\n\t this._clipboard.push(item);\n\t }\n\t }\n\t },\n\t cut: function () {\n\t if (this.options.copy.enabled) {\n\t this._clipboard = [];\n\t this._copyOffset = 0;\n\t for (var i = 0; i < this._selectedItems.length; i++) {\n\t var item = this._selectedItems[i];\n\t this._clipboard.push(item);\n\t }\n\t this.remove(this._clipboard, true);\n\t }\n\t },\n\n\t paste: function () {\n\t if (this._clipboard.length > 0) {\n\t var item, copied, i;\n\t var mapping = {};\n\t var elements = splitDiagramElements(this._clipboard);\n\t var connections = elements.connections;\n\t var shapes = elements.shapes;\n\t var offset = {\n\t x: this._copyOffset * this.options.copy.offsetX,\n\t y: this._copyOffset * this.options.copy.offsetY\n\t };\n\t this.deselect();\n\t // first the shapes\n\t for (i = 0; i < shapes.length; i++) {\n\t item = shapes[i];\n\t copied = item.clone();\n\t mapping[item.id] = copied;\n\t copied.position(new Point(item.options.x + offset.x, item.options.y + offset.y));\n\t copied.diagram = this;\n\t copied = this._addShape(copied);\n\t if (copied) {\n\t copied.select();\n\t }\n\t }\n\t // then the connections\n\t for (i = 0; i < connections.length; i++) {\n\t item = connections[i];\n\t copied = this._addConnection(item.clone());\n\t if (copied) {\n\t this._updateCopiedConnection(copied, item, \"source\", mapping, offset);\n\t this._updateCopiedConnection(copied, item, \"target\", mapping, offset);\n\n\t copied.select(true);\n\t copied.updateModel();\n\t }\n\t }\n\n\t this._syncChanges();\n\n\t this._copyOffset += 1;\n\t }\n\t },\n\n\t _updateCopiedConnection: function(connection, sourceConnection, connectorName, mapping, offset) {\n\t var onActivate, inactiveItem, targetShape;\n\t var target = sourceConnection[connectorName]();\n\t var diagram = this;\n\t if (target instanceof Connector && mapping[target.shape.id]) {\n\t targetShape = mapping[target.shape.id];\n\t if (diagram.getShapeById(targetShape.id)) {\n\t connection[connectorName](targetShape.getConnector(target.options.name));\n\t } else {\n\t inactiveItem = diagram._inactiveShapeItems.getByUid(targetShape.dataItem.uid);\n\t if (inactiveItem) {\n\t onActivate = function(item) {\n\t targetShape = diagram._dataMap[item.id];\n\t connection[connectorName](targetShape.getConnector(target.options.name));\n\t connection.updateModel();\n\t };\n\t diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(onActivate));\n\t }\n\t }\n\t } else {\n\t connection[connectorName](new Point(sourceConnection[connectorName + \"Point\"]().x + offset.x, sourceConnection[connectorName + \"Point\"]().y + offset.y));\n\t }\n\t },\n\t /**\n\t * Gets the bounding rectangle of the given items.\n\t * @param items DiagramElement, Array of elements.\n\t * @param origin Boolean. Pass 'true' if you need to get the bounding box of the shapes without their rotation offset.\n\t * @returns {Rect}\n\t */\n\t boundingBox: function (items, origin) {\n\t var rect = Rect.empty(), temp,\n\t di = isDefined(items) ? this._getDiagramItems(items) : {shapes: this.shapes};\n\t if (di.shapes.length > 0) {\n\t var item = di.shapes[0];\n\t rect = item.bounds(ROTATED);\n\t for (var i = 1; i < di.shapes.length; i++) {\n\t item = di.shapes[i];\n\t temp = item.bounds(ROTATED);\n\t if (origin === true) {\n\t temp.x -= item._rotationOffset.x;\n\t temp.y -= item._rotationOffset.y;\n\t }\n\t rect = rect.union(temp);\n\t }\n\t }\n\t return rect;\n\t },\n\n\t _containerOffset: function() {\n\t var containerOffset = this.element.offset();\n\t if (this.toolBar) {\n\t containerOffset.top += outerHeight(this.toolBar.element);\n\t }\n\t return containerOffset;\n\t },\n\n\t documentToView: function(point) {\n\t var containerOffset = this._containerOffset();\n\n\t return new Point(point.x - containerOffset.left, point.y - containerOffset.top);\n\t },\n\t viewToDocument: function(point) {\n\t var containerOffset = this._containerOffset();\n\n\t return new Point(point.x + containerOffset.left, point.y + containerOffset.top);\n\t },\n\t viewToModel: function(point) {\n\t return this._transformWithMatrix(point, this._matrixInvert);\n\t },\n\t modelToView: function(point) {\n\t return this._transformWithMatrix(point, this._matrix);\n\t },\n\t modelToLayer: function(point) {\n\t return this._transformWithMatrix(point, this._layerMatrix);\n\t },\n\t layerToModel: function(point) {\n\t return this._transformWithMatrix(point, this._layerMatrixInvert);\n\t },\n\t documentToModel: function(point) {\n\t var viewPoint = this.documentToView(point);\n\t if (!this.canvas.translate) {\n\t viewPoint.x = viewPoint.x + this.scroller.scrollLeft;\n\t viewPoint.y = viewPoint.y + this.scroller.scrollTop;\n\t }\n\t return this.viewToModel(viewPoint);\n\t },\n\t modelToDocument: function(point) {\n\t return this.viewToDocument(this.modelToView(point));\n\t },\n\t _transformWithMatrix: function(point, matrix) {\n\t var result = point;\n\t if (point instanceof Point) {\n\t if (matrix) {\n\t result = matrix.apply(point);\n\t }\n\t }\n\t else {\n\t var tl = this._transformWithMatrix(point.topLeft(), matrix),\n\t br = this._transformWithMatrix(point.bottomRight(), matrix);\n\t result = Rect.fromPoints(tl, br);\n\t }\n\t return result;\n\t },\n\n\t setDataSource: function(dataSource) {\n\t this.options.dataSource = dataSource;\n\t this._dataSource();\n\t if (this.options.autoBind) {\n\t this.dataSource.fetch();\n\t }\n\t },\n\n\t setConnectionsDataSource: function(dataSource) {\n\t this.options.connectionsDataSource = dataSource;\n\t this._connectionDataSource();\n\t if (this.options.autoBind) {\n\t this.connectionsDataSource.fetch();\n\t }\n\t },\n\n\t /**\n\t * Performs a diagram layout of the given type.\n\t * @param layoutType The layout algorithm to be applied (TreeLayout, LayeredLayout, SpringLayout).\n\t * @param options Layout-specific options.\n\t */\n\t layout: function (options) {\n\t this._layouting = true;\n\t // TODO: raise layout event?\n\t var type;\n\t if(isUndefined(options)) {\n\t options = this.options.layout;\n\t }\n\t if (isUndefined(options) || isUndefined(options.type)) {\n\t type = \"Tree\";\n\t }\n\t else {\n\t type = options.type;\n\t }\n\t var l;\n\t switch (type.toLowerCase()) {\n\t case \"tree\":\n\t l = new diagram.TreeLayout(this);\n\t break;\n\n\t case \"layered\":\n\t l = new diagram.LayeredLayout(this);\n\t break;\n\n\t case \"forcedirected\":\n\t case \"force\":\n\t case \"spring\":\n\t case \"springembedder\":\n\t l = new diagram.SpringLayout(this);\n\t break;\n\t default:\n\t throw \"Layout algorithm '\" + type + \"' is not supported.\";\n\t }\n\t var initialState = new diagram.LayoutState(this);\n\t var finalState = l.layout(options);\n\t if (finalState) {\n\t var unit = new diagram.LayoutUndoUnit(initialState, finalState, options ? options.animate : null);\n\t this.undoRedoService.add(unit);\n\t }\n\t this._layouting = false;\n\t this._redrawConnections();\n\t },\n\t /**\n\t * Gets a shape on the basis of its identifier.\n\t * @param id (string) the identifier of a shape.\n\t * @returns {Shape}\n\t */\n\t getShapeById: function (id) {\n\t var found;\n\t found = Utils.first(this.shapes, function (s) {\n\t return s.visual.id === id;\n\t });\n\t if (found) {\n\t return found;\n\t }\n\t found = Utils.first(this.connections, function (c) {\n\t return c.visual.id === id;\n\t });\n\t return found;\n\t },\n\n\t getShapeByModelId: function (id) {\n\t var shape;\n\t if (this._isEditable) {\n\t shape = this._dataMap[id];\n\t } else {\n\t shape = Utils.first(this.shapes, function(shape) {\n\t return (shape.dataItem || {}).id === id;\n\t });\n\t }\n\t return shape;\n\t },\n\n\t getShapeByModelUid: function(uid) {\n\t var shape;\n\t if (this._isEditable) {\n\t shape = Utils.first(this.shapes, function(shape) {\n\t return (shape.dataItem || {}).uid === uid;\n\t });\n\t } else {\n\t shape = this._dataMap[uid];\n\t }\n\t return shape;\n\t },\n\n\t getConnectionByModelId: function(id) {\n\t var connection;\n\t if (this.connectionsDataSource) {\n\t connection = Utils.first(this.connections, function(connection) {\n\t return (connection.dataItem || {}).id === id;\n\t });\n\t }\n\t return connection;\n\t },\n\n\t getConnectionByModelUid: function(uid) {\n\t var connection;\n\t if (this.connectionsDataSource) {\n\t connection = this._connectionsDataMap[uid];\n\t }\n\t return connection;\n\t },\n\n\t _extendLayoutOptions: function(options) {\n\t if(options.layout) {\n\t options.layout = deepExtend({}, diagram.LayoutBase.fn.defaultOptions || {}, options.layout);\n\t }\n\t },\n\n\t _selectionChanged: function (selected, deselected) {\n\t if (selected.length || deselected.length) {\n\t this.trigger(SELECT, { selected: selected, deselected: deselected });\n\t }\n\t },\n\t _getValidZoom: function (zoom) {\n\t return math.min(math.max(zoom, this.options.zoomMin), this.options.zoomMax);\n\t },\n\t _panTransform: function (pos) {\n\t var diagram = this,\n\t pan = pos || diagram._pan;\n\n\t if (diagram.canvas.translate) {\n\t diagram.scroller.scrollTo(pan.x, pan.y);\n\t diagram._zoomMainLayer();\n\t } else {\n\t diagram._storePan(pan);\n\t diagram._transformMainLayer();\n\t }\n\t },\n\n\t _finishPan: function () {\n\t this.trigger(PAN, {total: this._pan, delta: Number.NaN});\n\t },\n\t _storePan: function (pan) {\n\t this._pan = pan;\n\t this._storeViewMatrix();\n\t },\n\t _zoomMainLayer: function () {\n\t var zoom = this._zoom;\n\n\t var transform = new CompositeTransform(0, 0, zoom, zoom);\n\t transform.render(this.mainLayer);\n\t this._storeLayerMatrix(transform);\n\t this._storeViewMatrix();\n\t },\n\t _transformMainLayer: function () {\n\t var pan = this._pan,\n\t zoom = this._zoom;\n\n\t var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n\t transform.render(this.mainLayer);\n\t this._storeLayerMatrix(transform);\n\t this._storeViewMatrix();\n\t },\n\t _storeLayerMatrix: function(canvasTransform) {\n\t this._layerMatrix = canvasTransform.toMatrix();\n\t this._layerMatrixInvert = canvasTransform.invert().toMatrix();\n\t },\n\t _storeViewMatrix: function() {\n\t var pan = this._pan,\n\t zoom = this._zoom;\n\n\t var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n\t this._matrix = transform.toMatrix();\n\t this._matrixInvert = transform.invert().toMatrix();\n\t },\n\t _toIndex: function (items, indices) {\n\t var result = this._getDiagramItems(items);\n\t this.mainLayer.toIndex(result.visuals, indices);\n\t this._fixOrdering(result, false);\n\t },\n\t _fixOrdering: function (result, toFront) {\n\t var shapePos = toFront ? this.shapes.length - 1 : 0,\n\t conPos = toFront ? this.connections.length - 1 : 0,\n\t i, item;\n\t for (i = 0; i < result.shapes.length; i++) {\n\t item = result.shapes[i];\n\t Utils.remove(this.shapes, item);\n\t Utils.insert(this.shapes, item, shapePos);\n\t }\n\t for (i = 0; i < result.cons.length; i++) {\n\t item = result.cons[i];\n\t Utils.remove(this.connections, item);\n\t Utils.insert(this.connections, item, conPos);\n\t }\n\t },\n\t _getDiagramItems: function (items) {\n\t var i, result = {}, args = items;\n\t result.visuals = [];\n\t result.shapes = [];\n\t result.cons = [];\n\n\t if (!items) {\n\t args = this._selectedItems.slice();\n\t } else if (!isArray(items)) {\n\t args = [items];\n\t }\n\n\t for (i = 0; i < args.length; i++) {\n\t var item = args[i];\n\t if (item instanceof Shape) {\n\t result.shapes.push(item);\n\t result.visuals.push(item.visual);\n\t } else if (item instanceof Connection) {\n\t result.cons.push(item);\n\t result.visuals.push(item.visual);\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t _removeItem: function (item, undoable, removedConnections) {\n\t item.select(false);\n\t if (item instanceof Shape) {\n\t this._removeShapeDataItem(item);\n\t this._removeShape(item, undoable, removedConnections);\n\t } else if (item instanceof Connection) {\n\t this._removeConnectionDataItem(item);\n\t this._removeConnection(item, undoable);\n\t }\n\n\t this.mainLayer.remove(item.visual);\n\t },\n\n\t _removeShape: function (shape, undoable, removedConnections) {\n\t var i, connection, connector,\n\t sources = [], targets = [];\n\t this.toolService._removeHover();\n\n\t if (undoable) {\n\t this.undoRedoService.addCompositeItem(new DeleteShapeUnit(shape));\n\t }\n\t Utils.remove(this.shapes, shape);\n\t this._shapesQuadTree.remove(shape);\n\n\t for (i = 0; i < shape.connectors.length; i++) {\n\t connector = shape.connectors[i];\n\t for (var j = 0; j < connector.connections.length; j++) {\n\t connection = connector.connections[j];\n\t if (!removedConnections || !dataviz.inArray(connection, removedConnections)) {\n\t if (connection.sourceConnector == connector) {\n\t sources.push(connection);\n\t } else if (connection.targetConnector == connector) {\n\t targets.push(connection);\n\t }\n\t }\n\t }\n\t }\n\n\t for (i = 0; i < sources.length; i++) {\n\t sources[i].source(null, undoable);\n\t sources[i].updateModel();\n\t }\n\t for (i = 0; i < targets.length; i++) {\n\t targets[i].target(null, undoable);\n\t targets[i].updateModel();\n\t }\n\t },\n\n\t _removeConnection: function (connection, undoable) {\n\t if (connection.sourceConnector) {\n\t Utils.remove(connection.sourceConnector.connections, connection);\n\t }\n\t if (connection.targetConnector) {\n\t Utils.remove(connection.targetConnector.connections, connection);\n\t }\n\t if (undoable) {\n\t this.undoRedoService.addCompositeItem(new DeleteConnectionUnit(connection));\n\t }\n\n\t Utils.remove(this.connections, connection);\n\t },\n\n\t _removeDataItems: function(items, recursive) {\n\t var item, children, shape, idx;\n\t items = isArray(items) ? items : [items];\n\n\t while (items.length) {\n\t item = items.shift();\n\t shape = this._dataMap[item.uid];\n\t if (shape) {\n\t this._removeShapeConnections(shape);\n\t this._removeItem(shape, false);\n\t delete this._dataMap[item.uid];\n\t if (recursive && item.hasChildren && item.loaded()) {\n\t children = item.children.data();\n\t for (idx = 0; idx < children.length; idx++) {\n\t items.push(children[idx]);\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t _removeShapeConnections: function(shape) {\n\t var connections = shape.connections();\n\t var idx;\n\n\t if (connections) {\n\t for (idx = 0; idx < connections.length; idx++) {\n\t this._removeItem(connections[idx], false);\n\t }\n\t }\n\t },\n\n\t _addDataItem: function(dataItem, undoable) {\n\t if (!defined(dataItem)) {\n\t return;\n\t }\n\n\t var shape = this._dataMap[dataItem.id];\n\t if (shape) {\n\t return shape;\n\t }\n\n\t var options = deepExtend({}, this.options.shapeDefaults);\n\t options.dataItem = dataItem;\n\t shape = new Shape(options, this);\n\t this.addShape(shape, undoable !== false);\n\t this._dataMap[dataItem.id] = shape;\n\t return shape;\n\t },\n\n\t _addDataItemByUid: function(dataItem) {\n\t if (!defined(dataItem)) {\n\t return;\n\t }\n\n\t var shape = this._dataMap[dataItem.uid];\n\t if (shape) {\n\t return shape;\n\t }\n\n\t var options = deepExtend({}, this.options.shapeDefaults);\n\t options.dataItem = dataItem;\n\t shape = new Shape(options, this);\n\t this.addShape(shape);\n\t this._dataMap[dataItem.uid] = shape;\n\t return shape;\n\t },\n\n\t _addDataItems: function(items, parent) {\n\t var item, idx, shape, parentShape, connection;\n\t for (idx = 0; idx < items.length; idx++) {\n\t item = items[idx];\n\t shape = this._addDataItemByUid(item);\n\t parentShape = this._addDataItemByUid(parent);\n\t if (parentShape && !this.connected(parentShape, shape)) { // check if connected to not duplicate connections.\n\t connection = this.connect(parentShape, shape);\n\t }\n\t }\n\t },\n\n\t _refreshSource: function (e) {\n\t var that = this,\n\t node = e.node,\n\t action = e.action,\n\t items = e.items,\n\t options = that.options,\n\t idx,\n\t dataBound;\n\n\t if (e.field) {\n\t for (idx = 0; idx < items.length; idx++) {\n\t if (this._dataMap[items[idx].uid]) {\n\t this._dataMap[items[idx].uid].redrawVisual();\n\t }\n\t }\n\t return;\n\t }\n\n\t if (action == \"remove\") {\n\t this._removeDataItems(e.items, true);\n\t } else {\n\n\t if ((!action || action === \"itemloaded\") && !this._bindingRoots) {\n\t this._bindingRoots = true;\n\t dataBound = true;\n\t }\n\n\t if (!action && !node) {\n\t that.clear();\n\t }\n\n\t this._addDataItems(items, node);\n\n\t for (idx = 0; idx < items.length; idx++) {\n\t items[idx].load();\n\t }\n\t }\n\n\t if (options.layout && (dataBound || action == \"remove\" || action == \"add\")) {\n\t that.layout(options.layout);\n\t }\n\n\t if (dataBound) {\n\t this.trigger(\"dataBound\");\n\t this._bindingRoots = false;\n\t }\n\t },\n\n\t _addItem: function (item) {\n\t if (item instanceof Shape) {\n\t this.addShape(item);\n\t } else if (item instanceof Connection) {\n\t this.addConnection(item);\n\t }\n\t },\n\n\t _createToolBar: function(preventClosing) {\n\t var diagram = this.toolService.diagram;\n\n\t if (!this.singleToolBar && diagram.select().length === 1) {\n\t var element = diagram.select()[0];\n\t if (element && element.options.editable !== false) {\n\t var editable = element.options.editable;\n\t var tools = editable.tools;\n\t if (this._isEditable && tools.length === 0) {\n\t if (element instanceof Shape) {\n\t tools = [\"edit\", \"rotateClockwise\", \"rotateAnticlockwise\"];\n\t } else if (element instanceof Connection) {\n\t tools = [\"edit\"];\n\t }\n\n\t if (editable && editable.remove !== false) {\n\t tools.push(\"delete\");\n\t }\n\t }\n\n\t if (tools && tools.length) {\n\t var padding = 20;\n\t var point;\n\t this.singleToolBar = new DiagramToolBar(diagram, {\n\t tools: tools,\n\t click: proxy(this._toolBarClick, this),\n\t modal: true,\n\t popupZIndex: parseInt(diagram.element.closest(\".k-window\").css(\"zIndex\"), 10) + 10\n\t });\n\t var popupWidth = outerWidth(this.singleToolBar._popup.element);\n\t var popupHeight = outerHeight(this.singleToolBar._popup.element);\n\t if (element instanceof Shape) {\n\t var shapeBounds = this.modelToView(element.bounds(ROTATED));\n\t point = new Point(shapeBounds.x, shapeBounds.y).minus(new Point(\n\t (popupWidth - shapeBounds.width) / 2,\n\t popupHeight + padding));\n\t } else if (element instanceof Connection) {\n\t var connectionBounds = this.modelToView(element.bounds());\n\n\t point = new Point(connectionBounds.x, connectionBounds.y)\n\t .minus(new Point(\n\t (popupWidth - connectionBounds.width - 20) / 2,\n\t popupHeight + padding\n\t ));\n\t }\n\n\t if (point) {\n\t if (!this.canvas.translate) {\n\t point = point.minus(new Point(this.scroller.scrollLeft, this.scroller.scrollTop));\n\t }\n\t point = this.viewToDocument(point);\n\t point = new Point(math.max(point.x, 0), math.max(point.y, 0));\n\t this.singleToolBar.showAt(point);\n\t if (preventClosing) {\n\t this.singleToolBar._popup.one(\"close\", preventDefault);\n\t }\n\t } else {\n\t this._destroyToolBar();\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t _toolBarClick: function(e) {\n\t this.trigger(\"toolBarClick\", e);\n\t this._destroyToolBar();\n\t },\n\n\t _normalizePointZoom: function (point) {\n\t return point.times(1 / this.zoom());\n\t },\n\n\t _initialize: function () {\n\t this.shapes = [];\n\t this._selectedItems = [];\n\t this.connections = [];\n\t this._dataMap = {};\n\t this._connectionsDataMap = {};\n\t this._inactiveShapeItems = new InactiveItemsCollection();\n\t this._deferredConnectionUpdates = [];\n\t this.undoRedoService = new UndoRedoService({\n\t undone: this._syncHandler,\n\t redone: this._syncHandler\n\t });\n\t this.id = diagram.randomId();\n\t },\n\n\t _fetchFreshData: function () {\n\t var that = this;\n\t that._dataSource();\n\n\t if (that._isEditable) {\n\t that._connectionDataSource();\n\t }\n\n\t if (that.options.autoBind) {\n\t if (that._isEditable) {\n\t this._loadingShapes = true;\n\t this._loadingConnections = true;\n\t that.dataSource.fetch();\n\t that.connectionsDataSource.fetch();\n\t } else {\n\t that.dataSource.fetch();\n\t }\n\t }\n\t },\n\n\t _dataSource: function() {\n\t if (defined(this.options.connectionsDataSource)) {\n\t this._isEditable = true;\n\t var dsOptions = this.options.dataSource || {};\n\t var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n\n\t if (this.dataSource && this._shapesRefreshHandler) {\n\t this.dataSource\n\t .unbind(\"change\", this._shapesRefreshHandler)\n\t .unbind(\"requestStart\", this._shapesRequestStartHandler)\n\t .unbind(\"error\", this._shapesErrorHandler);\n\t } else {\n\t this._shapesRefreshHandler = proxy(this._refreshShapes, this);\n\t this._shapesRequestStartHandler = proxy(this._shapesRequestStart, this);\n\t this._shapesErrorHandler = proxy(this._error, this);\n\t }\n\n\t this.dataSource = kendo.data.DataSource.create(ds)\n\t .bind(\"change\", this._shapesRefreshHandler)\n\t .bind(\"requestStart\", this._shapesRequestStartHandler)\n\t .bind(\"error\", this._shapesErrorHandler);\n\t } else {\n\t this._treeDataSource();\n\t this._isEditable = false;\n\t }\n\t },\n\n\t _connectionDataSource: function() {\n\t var dsOptions = this.options.connectionsDataSource;\n\t if (dsOptions) {\n\t var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n\n\t if (this.connectionsDataSource && this._connectionsRefreshHandler) {\n\t this.connectionsDataSource\n\t .unbind(\"change\", this._connectionsRefreshHandler)\n\t .unbind(\"requestStart\", this._connectionsRequestStartHandler)\n\t .unbind(\"error\", this._connectionsErrorHandler);\n\t } else {\n\t this._connectionsRefreshHandler = proxy(this._refreshConnections, this);\n\t this._connectionsRequestStartHandler = proxy(this._connectionsRequestStart, this);\n\t this._connectionsErrorHandler = proxy(this._connectionsError, this);\n\t }\n\n\t this.connectionsDataSource = kendo.data.DataSource.create(ds)\n\t .bind(\"change\", this._connectionsRefreshHandler)\n\t .bind(\"requestStart\", this._connectionsRequestStartHandler)\n\t .bind(\"error\", this._connectionsErrorHandler);\n\t }\n\t },\n\n\t _shapesRequestStart: function(e) {\n\t if (e.type == \"read\") {\n\t this._loadingShapes = true;\n\t }\n\t },\n\n\t _connectionsRequestStart: function(e) {\n\t if (e.type == \"read\") {\n\t this._loadingConnections = true;\n\t }\n\t },\n\n\t _error: function () {\n\t this._loadingShapes = false;\n\t },\n\n\t _connectionsError: function() {\n\t this._loadingConnections = false;\n\t },\n\n\t _refreshShapes: function(e) {\n\t if (e.action === \"remove\") {\n\t if (this._shouldRefresh()) {\n\t this._removeShapes(e.items);\n\t }\n\t } else if (e.action === \"itemchange\") {\n\t if (this._shouldRefresh()) {\n\t this._updateShapes(e.items, e.field);\n\t }\n\t } else if (e.action === \"add\") {\n\t this._inactiveShapeItems.add(e.items);\n\t } else if (e.action === \"sync\") {\n\t this._syncShapes(e.items);\n\t } else {\n\t this.refresh();\n\t }\n\t },\n\n\t _shouldRefresh: function() {\n\t return !this._suspended;\n\t },\n\n\t _suspendModelRefresh: function() {\n\t this._suspended = (this._suspended || 0) + 1;\n\t },\n\n\t _resumeModelRefresh: function() {\n\t this._suspended = math.max((this._suspended || 0) - 1, 0);\n\t },\n\n\t refresh: function() {\n\t this._loadingShapes = false;\n\t if (!this._loadingConnections) {\n\t this._rebindShapesAndConnections();\n\t }\n\t },\n\n\t _rebindShapesAndConnections: function() {\n\t this.clear();\n\t this._addShapes(this.dataSource.view());\n\t if (this.connectionsDataSource) {\n\t this._addConnections(this.connectionsDataSource.view(), false);\n\t }\n\n\t if (this.options.layout) {\n\t this.layout(this.options.layout);\n\t } else {\n\t this._redrawConnections();\n\t }\n\t this.trigger(\"dataBound\");\n\t },\n\n\t refreshConnections: function() {\n\t this._loadingConnections = false;\n\t if (!this._loadingShapes) {\n\t this._rebindShapesAndConnections();\n\t }\n\t },\n\n\t _redrawConnections: function() {\n\t var connections = this.connections;\n\t for (var idx = 0; idx < connections.length; idx++) {\n\t connections[idx].refresh();\n\t }\n\t },\n\n\t _removeShapes: function(items) {\n\t var dataMap = this._dataMap;\n\t var item, i;\n\t for (i = 0; i < items.length; i++) {\n\t item = items[i];\n\t if (dataMap[item.id]) {\n\t this.remove(dataMap[item.id], false);\n\t dataMap[item.id] = null;\n\t }\n\t }\n\t },\n\n\t _syncShapes: function() {\n\t var diagram = this;\n\t var inactiveItems = diagram._inactiveShapeItems;\n\t inactiveItems.forEach(function(inactiveItem) {\n\t var dataItem = inactiveItem.dataItem;\n\t var shape = inactiveItem.element;\n\t if (!dataItem.isNew()) {\n\t if (shape) {\n\t shape._setOptionsFromModel();\n\t diagram.addShape(shape, inactiveItem.undoable);\n\t diagram._dataMap[dataItem.id] = shape;\n\t } else {\n\t diagram._addDataItem(dataItem);\n\t }\n\t inactiveItem.activate();\n\t inactiveItems.remove(dataItem);\n\t }\n\t });\n\t },\n\n\t _updateShapes: function(items, field) {\n\t for (var i = 0; i < items.length; i++) {\n\t var dataItem = items[i];\n\n\t var shape = this._dataMap[dataItem.id];\n\t if (shape) {\n\t shape.updateOptionsFromModel(dataItem, field);\n\t }\n\t }\n\t },\n\n\t _addShapes: function(dataItems) {\n\t for (var i = 0; i < dataItems.length; i++) {\n\t this._addDataItem(dataItems[i], false);\n\t }\n\t },\n\n\t _refreshConnections: function(e) {\n\t if (e.action === \"remove\") {\n\t if (this._shouldRefresh()) {\n\t this._removeConnections(e.items);\n\t }\n\t } else if (e.action === \"add\") {\n\t this._addConnections(e.items);\n\t } else if (e.action === \"sync\") {\n\t //TO DO: include logic to update the connections with different values returned from the server.\n\t } else if (e.action === \"itemchange\") {\n\t if (this._shouldRefresh()) {\n\t this._updateConnections(e.items);\n\t }\n\t } else {\n\t this.refreshConnections();\n\t }\n\t },\n\n\t _removeConnections: function(items) {\n\t for (var i = 0; i < items.length; i++) {\n\t this.remove(this._connectionsDataMap[items[i].uid], false);\n\t this._connectionsDataMap[items[i].uid] = null;\n\t }\n\t },\n\n\t _updateConnections: function(items) {\n\t for (var i = 0; i < items.length; i++) {\n\t var dataItem = items[i];\n\n\t var connection = this._connectionsDataMap[dataItem.uid];\n\t connection.updateOptionsFromModel(dataItem);\n\t }\n\t },\n\n\t _addConnections: function(connections, undoable) {\n\t var length = connections.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var dataItem = connections[i];\n\t this._addConnectionDataItem(dataItem, undoable);\n\t }\n\t },\n\n\t _addConnectionDataItem: function(dataItem, undoable) {\n\t if (!this._connectionsDataMap[dataItem.uid]) {\n\t var from = this._validateConnector(dataItem.from);\n\t if (!defined(from) || from === null) {\n\t from = new Point(dataItem.fromX, dataItem.fromY);\n\t }\n\n\t var to = this._validateConnector(dataItem.to);\n\t if (!defined(to) || to === null) {\n\t to = new Point(dataItem.toX, dataItem.toY);\n\t }\n\n\t if (defined(from) && defined(to)) {\n\t var options = deepExtend({}, this.options.connectionDefaults);\n\t options.dataItem = dataItem;\n\t var connection = new Connection(from, to, options);\n\n\t this._connectionsDataMap[dataItem.uid] = connection;\n\t this.addConnection(connection, undoable);\n\t }\n\t }\n\t },\n\n\t _validateConnector: function(value) {\n\t var connector;\n\n\t if (defined(value) && value !== null) {\n\t connector = this._dataMap[value];\n\t }\n\n\t return connector;\n\t },\n\n\t _treeDataSource: function () {\n\t var that = this,\n\t options = that.options,\n\t dataSource = options.dataSource;\n\n\t dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n\n\t if (dataSource instanceof kendo.data.DataSource && !(dataSource instanceof kendo.data.HierarchicalDataSource)) {\n\t throw new Error(\"Incorrect DataSource type. If a single dataSource instance is set to the diagram then it should be a HierarchicalDataSource. You should set only the options instead of an instance or a HierarchicalDataSource instance or supply connectionsDataSource as well.\");\n\t }\n\n\t if (!dataSource.fields) {\n\t dataSource.fields = [\n\t { field: \"text\" },\n\t { field: \"url\" },\n\t { field: \"spriteCssClass\" },\n\t { field: \"imageUrl\" }\n\t ];\n\t }\n\t if (that.dataSource && that._refreshHandler) {\n\t that._unbindDataSource();\n\t }\n\n\t that._refreshHandler = proxy(that._refreshSource, that);\n\t that._errorHandler = proxy(that._error, that);\n\n\t that.dataSource = HierarchicalDataSource.create(dataSource)\n\t .bind(CHANGE, that._refreshHandler)\n\t .bind(ERROR, that._errorHandler);\n\t },\n\n\t _unbindDataSource: function () {\n\t var that = this;\n\n\t that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(ERROR, that._errorHandler);\n\t },\n\n\t _adorn: function (adorner, isActive) {\n\t if (isActive !== undefined && adorner) {\n\t if (isActive) {\n\t this._adorners.push(adorner);\n\t this.adornerLayer.append(adorner.visual);\n\t }\n\t else {\n\t Utils.remove(this._adorners, adorner);\n\t this.adornerLayer.remove(adorner.visual);\n\t }\n\t }\n\t },\n\n\t _showConnectors: function (shape, value) {\n\t if (value) {\n\t this._connectorsAdorner.show(shape);\n\t } else {\n\t this._connectorsAdorner.destroy();\n\t }\n\t },\n\n\t _updateAdorners: function() {\n\t var adorners = this._adorners;\n\n\t for(var i = 0; i < adorners.length; i++) {\n\t var adorner = adorners[i];\n\n\t if (adorner.refreshBounds) {\n\t adorner.refreshBounds();\n\t }\n\t adorner.refresh();\n\t }\n\t },\n\n\t _refresh: function () {\n\t for (var i = 0; i < this.connections.length; i++) {\n\t this.connections[i].refresh();\n\t }\n\t },\n\n\t _destroyToolBar: function() {\n\t if (this.singleToolBar) {\n\t this.singleToolBar.hide();\n\t this.singleToolBar.destroy();\n\t this.singleToolBar = null;\n\t }\n\t },\n\n\t _destroyGlobalToolBar: function() {\n\t if (this.toolBar) {\n\t this.toolBar.hide();\n\t this.toolBar.destroy();\n\t this.toolBar = null;\n\t }\n\t },\n\n\t exportDOMVisual: function() {\n\t var viewBox = this.canvas._viewBox;\n\t var scrollOffset = geom.transform()\n\t .translate(-viewBox.x, -viewBox.y);\n\n\t var viewRect = new geom.Rect([0, 0], [viewBox.width, viewBox.height]);\n\t var clipPath = draw.Path.fromRect(viewRect);\n\t var wrap = new draw.Group({ transform: scrollOffset });\n\t var clipWrap = new draw.Group({ clip: clipPath });\n\t var root = this.canvas.drawingElement.children[0];\n\n\t clipWrap.append(wrap);\n\n\t // Don't reparent the root\n\t wrap.children.push(root);\n\n\t return clipWrap;\n\t },\n\n\t exportVisual: function() {\n\t var scale = geom.transform().scale(1 / this._zoom);\n\t var wrap = new draw.Group({\n\t transform: scale\n\t });\n\n\t var root = this.mainLayer.drawingElement;\n\t wrap.children.push(root);\n\n\t return wrap;\n\t },\n\n\t _syncChanges: function() {\n\t this._syncShapeChanges();\n\t this._syncConnectionChanges();\n\t },\n\n\t _syncShapeChanges: function() {\n\t if (this.dataSource && this._isEditable) {\n\t this.dataSource.sync();\n\t }\n\t },\n\n\t _syncConnectionChanges: function() {\n\t var that = this;\n\t if (that.connectionsDataSource && that._isEditable) {\n\t $.when.apply($, that._deferredConnectionUpdates).then(function() {\n\t that.connectionsDataSource.sync();\n\t });\n\t that.deferredConnectionUpdates = [];\n\t }\n\t }\n\t });\n\n\t dataviz.ExportMixin.extend(Diagram.fn, true);\n\n\t if (kendo.PDFMixin) {\n\t kendo.PDFMixin.extend(Diagram.fn);\n\t }\n\n\t function filterShapeDataItem(dataItem) {\n\t var result = {};\n\n\t dataItem = dataItem || {};\n\n\t if (defined(dataItem.text) && dataItem.text !== null) {\n\t result.text = dataItem.text;\n\t }\n\n\t if (defined(dataItem.x) && dataItem.x !== null) {\n\t result.x = dataItem.x;\n\t }\n\n\t if (defined(dataItem.y) && dataItem.y !== null) {\n\t result.y = dataItem.y;\n\t }\n\n\t if (defined(dataItem.width) && dataItem.width !== null) {\n\t result.width = dataItem.width;\n\t }\n\n\t if (defined(dataItem.height) && dataItem.height !== null) {\n\t result.height = dataItem.height;\n\t }\n\n\t if (defined(dataItem.type) && dataItem.type !== null) {\n\t result.type = dataItem.type;\n\t }\n\n\t return result;\n\t }\n\n\t function filterConnectionDataItem(dataItem) {\n\t var result = {};\n\n\t dataItem = dataItem || {};\n\n\t if (defined(dataItem.text) && dataItem.text !== null) {\n\t result.content = dataItem.text;\n\t }\n\n\t if (defined(dataItem.type) && dataItem.type !== null) {\n\t result.type = dataItem.type;\n\t }\n\n\t if (defined(dataItem.from) && dataItem.from !== null) {\n\t result.from = dataItem.from;\n\t }\n\n\t if (defined(dataItem.fromConnector) && dataItem.fromConnector !== null) {\n\t result.fromConnector = dataItem.fromConnector;\n\t }\n\n\t if (defined(dataItem.fromX) && dataItem.fromX !== null) {\n\t result.fromX = dataItem.fromX;\n\t }\n\n\t if (defined(dataItem.fromY) && dataItem.fromY !== null) {\n\t result.fromY = dataItem.fromY;\n\t }\n\n\t if (defined(dataItem.to) && dataItem.to !== null) {\n\t result.to = dataItem.to;\n\t }\n\n\t if (defined(dataItem.toConnector) && dataItem.toConnector !== null) {\n\t result.toConnector = dataItem.toConnector;\n\t }\n\n\t if (defined(dataItem.toX) && dataItem.toX !== null) {\n\t result.toX = dataItem.toX;\n\t }\n\n\t if (defined(dataItem.toY) && dataItem.toY !== null) {\n\t result.toY = dataItem.toY;\n\t }\n\n\t return result;\n\t }\n\n\n\t var DiagramToolBar = kendo.Observable.extend({\n\t init: function(diagram, options) {\n\t kendo.Observable.fn.init.call(this);\n\t this.diagram = diagram;\n\t this.options = deepExtend({}, this.options, options);\n\t this._tools = [];\n\t this.createToolBar();\n\t this.createTools();\n\t this.appendTools();\n\n\t if (this.options.modal) {\n\t this.createPopup();\n\t }\n\n\t this.bind(this.events, options);\n\t },\n\n\t events: [\"click\"],\n\n\t createPopup: function() {\n\t this.container = $(\"
\").append(this.element);\n\t this._popup = this.container.kendoPopup({}).getKendoPopup();\n\t },\n\n\t appendTools: function() {\n\t for (var i = 0; i < this._tools.length; i++) {\n\t var tool = this._tools[i];\n\t if (tool.buttons && tool.buttons.length || !defined(tool.buttons)) {\n\t this._toolBar.add(tool);\n\t }\n\t }\n\t },\n\n\t createToolBar: function() {\n\t this.element = $(\"
\");\n\t this._toolBar = this.element\n\t .kendoToolBar({\n\t click: proxy(this.click, this),\n\t resizable: false\n\t }).getKendoToolBar();\n\n\t this.element.css(\"border\", \"none\");\n\t },\n\n\t createTools: function() {\n\t for (var i = 0; i < this.options.tools.length; i++) {\n\t this.createTool(this.options.tools[i]);\n\t }\n\t },\n\n\t createTool: function(tool) {\n\t if (!isPlainObject(tool)) {\n\t tool = {\n\t name: tool\n\t };\n\t }\n\t var toolName = tool.name + \"Tool\";\n\t if (this[toolName]) {\n\t this[toolName](tool);\n\t } else {\n\t this._tools.push(deepExtend({}, tool, {\n\t attributes: this._setAttributes({action: tool.name})\n\t }));\n\t }\n\t },\n\n\t showAt: function(point) {\n\t var popupZIndex = parseInt(this.options.popupZIndex, 10);\n\n\t if (this._popup) {\n\t this._popup.open(point.x, point.y);\n\n\t if (popupZIndex) {\n\t this._popup.wrapper.css(\"zIndex\", popupZIndex);\n\t }\n\t }\n\t },\n\n\t hide: function() {\n\t if (this._popup) {\n\t this._popup.close();\n\t }\n\t },\n\n\t newGroup: function() {\n\t return {\n\t type: \"buttonGroup\",\n\t buttons: []\n\t };\n\t },\n\n\t editTool: function() {\n\t this._tools.push({\n\t icon: \"edit\",\n\t showText: \"overflow\",\n\t type: \"button\",\n\t text: \"Edit\",\n\t attributes: this._setAttributes({ action: \"edit\" })\n\t });\n\t },\n\n\t deleteTool: function() {\n\t this._tools.push({\n\t icon: \"close\",\n\t showText: \"overflow\",\n\t type: \"button\",\n\t text: \"Delete\",\n\t attributes: this._setAttributes({ action: \"delete\" })\n\t });\n\t },\n\n\t rotateAnticlockwiseTool: function(options) {\n\t this._appendGroup(\"rotate\");\n\t this._rotateGroup.buttons.push({\n\t icon: \"rotate-left\",\n\t showText: \"overflow\",\n\t text: \"RotateAnticlockwise\",\n\t group: \"rotate\",\n\t attributes: this._setAttributes({ action: \"rotateAnticlockwise\", step: options.step })\n\t });\n\t },\n\n\t rotateClockwiseTool: function(options) {\n\t this._appendGroup(\"rotate\");\n\t this._rotateGroup.buttons.push({\n\t icon: \"rotate-right\",\n\t attributes: this._setAttributes({ action: \"rotateClockwise\", step: options.step }),\n\t showText: \"overflow\",\n\t text: \"RotateClockwise\",\n\t group: \"rotate\"\n\t });\n\t },\n\n\t createShapeTool: function() {\n\t this._appendGroup(\"create\");\n\t this._createGroup.buttons.push({\n\t icon: \"shape\",\n\t showText: \"overflow\",\n\t text: \"CreateShape\",\n\t group: \"create\",\n\t attributes: this._setAttributes({ action: \"createShape\" })\n\t });\n\t },\n\n\t createConnectionTool: function() {\n\t this._appendGroup(\"create\");\n\t this._createGroup.buttons.push({\n\t icon: \"connector\",\n\t showText: \"overflow\",\n\t text: \"CreateConnection\",\n\t group: \"create\",\n\t attributes: this._setAttributes({ action: \"createConnection\" })\n\t });\n\t },\n\n\t undoTool: function() {\n\t this._appendGroup(\"history\");\n\t this._historyGroup.buttons.push({\n\t icon: \"undo\",\n\t showText: \"overflow\",\n\t text: \"Undo\",\n\t group: \"history\",\n\t attributes: this._setAttributes({ action: \"undo\" })\n\t });\n\t },\n\n\t redoTool: function() {\n\t this._appendGroup(\"history\");\n\t this._historyGroup.buttons.push({\n\t icon: \"redo\",\n\t showText: \"overflow\",\n\t text: \"Redo\",\n\t group: \"history\",\n\t attributes: this._setAttributes({ action: \"redo\" })\n\t });\n\t },\n\n\t _appendGroup: function(name) {\n\t var prop = \"_\" + name + \"Group\";\n\t if (!this[prop]) {\n\t this[prop] = this.newGroup();\n\t this._tools.push(this[prop]);\n\t }\n\t },\n\n\t _setAttributes: function(attributes) {\n\t var attr = {};\n\n\t if (attributes.action) {\n\t attr[kendo.attr(\"action\")] = attributes.action;\n\t }\n\n\t if (attributes.step) {\n\t attr[kendo.attr(\"step\")] = attributes.step;\n\t }\n\n\t return attr;\n\t },\n\n\t _getAttributes: function(element) {\n\t var attr = {};\n\n\t var action = element.attr(kendo.attr(\"action\"));\n\t if (action) {\n\t attr.action = action;\n\t }\n\n\t var step = element.attr(kendo.attr(\"step\"));\n\t if (step) {\n\t attr.step = step;\n\t }\n\n\t return attr;\n\t },\n\n\t click: function(e) {\n\t var attributes = this._getAttributes($(e.target));\n\t var action = attributes.action;\n\n\t if (action && this[action]) {\n\t this[action](attributes);\n\t }\n\n\t this.trigger(\"click\", this.eventData(action, e.target));\n\t },\n\n\t eventData: function(action, target) {\n\t var elements = this.selectedElements(),\n\t length = elements.length,\n\t shapes = [], connections = [], element;\n\n\t for (var idx = 0; idx < length; idx++) {\n\t element = elements[idx];\n\t if (element instanceof Shape) {\n\t shapes.push(element);\n\t } else {\n\t connections.push(element);\n\t }\n\t }\n\n\t return {\n\t shapes: shapes,\n\t connections: connections,\n\t action: action,\n\t target: target\n\t };\n\t },\n\n\t \"delete\": function() {\n\t var diagram = this.diagram;\n\t var toRemove = diagram._triggerRemove(this.selectedElements());\n\t if (toRemove.length) {\n\t this.diagram.remove(toRemove, true);\n\t this.diagram._syncChanges();\n\t }\n\t },\n\n\t edit: function() {\n\t var selectedElemens = this.selectedElements();\n\t if (selectedElemens.length === 1) {\n\t this.diagram.edit(selectedElemens[0]);\n\t }\n\t },\n\n\t rotateClockwise: function(options) {\n\t var angle = parseFloat(options.step || 90);\n\t this._rotate(angle);\n\t },\n\n\t rotateAnticlockwise: function(options) {\n\t var angle = parseFloat(options.step || 90);\n\t this._rotate(-angle);\n\t },\n\n\t _rotate: function(angle) {\n\t var adorner = this.diagram._resizingAdorner;\n\t adorner.angle(adorner.angle() + angle);\n\t adorner.rotate();\n\t },\n\n\t selectedElements: function() {\n\t return this.diagram.select();\n\t },\n\n\t createShape: function() {\n\t this.diagram.createShape();\n\t },\n\n\t createConnection: function() {\n\t this.diagram.createConnection();\n\t },\n\n\t undo: function() {\n\t this.diagram.undo();\n\t },\n\n\t redo: function() {\n\t this.diagram.redo();\n\t },\n\n\t destroy: function() {\n\t this.diagram = null;\n\t this.element = null;\n\t this.options = null;\n\n\t if (this._toolBar) {\n\t this._toolBar.destroy();\n\t }\n\n\t if (this._popup) {\n\t this._popup.destroy();\n\t }\n\t }\n\t });\n\n\t var Editor = kendo.Observable.extend({\n\t init: function(element, options) {\n\t kendo.Observable.fn.init.call(this);\n\n\t this.options = extend(true, {}, this.options, options);\n\t this.element = element;\n\t this.model = this.options.model;\n\t this.fields = this._getFields();\n\t this._initContainer();\n\t this.createEditable();\n\t },\n\n\t options: {\n\t editors: {}\n\t },\n\n\t _initContainer: function() {\n\t this.wrapper = this.element;\n\t },\n\n\t createEditable: function() {\n\t var options = this.options;\n\n\t this.editable = new kendo.ui.Editable(this.wrapper, {\n\t fields: this.fields,\n\t target: options.target,\n\t clearContainer: false,\n\t model: this.model\n\t });\n\t },\n\n\t _isEditable: function(field) {\n\t return this.model.editable && this.model.editable(field);\n\t },\n\n\t _getFields: function() {\n\t var fields = [];\n\t var modelFields = this.model.fields;\n\n\t for (var field in modelFields) {\n\t var result = {};\n\t if (this._isEditable(field)) {\n\t var editor = this.options.editors[field];\n\t if (editor) {\n\t result.editor = editor;\n\t }\n\t result.field = field;\n\t fields.push(result);\n\t }\n\t }\n\n\t return fields;\n\t },\n\n\t end: function() {\n\t return this.editable.end();\n\t },\n\n\t destroy: function() {\n\t this.editable.destroy();\n\t this.editable.element.find(\"[\" + kendo.attr(\"container-for\") + \"]\").empty();\n\t this.model = this.wrapper = this.element = this.columns = this.editable = null;\n\t }\n\t });\n\n\t var PopupEditor = Editor.extend({\n\t init: function(element, options) {\n\t Editor.fn.init.call(this, element, options);\n\t this.bind(this.events, this.options);\n\n\t this.open();\n\t },\n\n\t events: [ \"update\", \"cancel\" ],\n\n\t options: {\n\t window: {\n\t modal: true,\n\t resizable: false,\n\t draggable: true,\n\t title: \"Edit\",\n\t visible: false\n\t }\n\t },\n\n\t _initContainer: function() {\n\t var that = this;\n\t this.wrapper = $('
')\n\t .attr(kendo.attr(\"uid\"), this.model.uid);\n\n\t var formContent = \"\";\n\n\t if (this.options.template) {\n\t formContent += this._renderTemplate();\n\t this.fields = [];\n\t } else {\n\t formContent += this._renderFields();\n\t }\n\n\t formContent += this._renderButtons();\n\n\t this.wrapper.append(\n\t $('
').append(formContent));\n\n\t this.window = new kendo.ui.Window(this.wrapper.appendTo(this.element), this.options.window);\n\t this.window.bind(\"close\", function(e) {\n\t //The bellow line is required due to: draggable window in IE, change event will be triggered while the window is closing\n\t if (e.userTriggered) {\n\t e.sender.element.trigger(\"focus\");\n\t that._cancelClick(e);\n\t }\n\t });\n\n\t this._attachButtonEvents();\n\t },\n\n\t _renderTemplate: function() {\n\t var template = this.options.template;\n\n\t if (typeof template === \"string\") {\n\t template = kendo.unescape(template);\n\t }\n\n\t template = kendo.template(template)(this.model);\n\n\t return template;\n\t },\n\n\t _renderFields: function() {\n\t var form = \"\";\n\t for (var i = 0; i < this.fields.length; i++) {\n\t var field = this.fields[i];\n\n\t form += '
';\n\n\t if (this._isEditable(field.field)) {\n\t form += '
';\n\t }\n\t }\n\n\t return form;\n\t },\n\n\t _renderButtons: function() {\n\t var form = '
';\n\t form += this._createButton(\"update\");\n\t form += this._createButton(\"cancel\");\n\t form += '
';\n\t return form;\n\t },\n\n\t _createButton: function(name) {\n\t return kendo.template(BUTTON_TEMPLATE)(defaultButtons[name]);\n\t },\n\n\t _attachButtonEvents: function() {\n\t this._cancelClickHandler = proxy(this._cancelClick, this);\n\t this.window.element.on(CLICK + NS, \"a.k-diagram-cancel\", this._cancelClickHandler);\n\n\t this._updateClickHandler = proxy(this._updateClick, this);\n\t this.window.element.on(CLICK + NS, \"a.k-diagram-update\", this._updateClickHandler);\n\t },\n\n\t _updateClick: function(e) {\n\t e.preventDefault();\n\t this.trigger(\"update\");\n\t },\n\n\t _cancelClick: function (e) {\n\t e.preventDefault();\n\t this.trigger(\"cancel\");\n\t },\n\n\t open: function() {\n\t this.window.center().open();\n\t },\n\n\t close: function() {\n\t this.window.bind(\"deactivate\", proxy(this.destroy, this)).close();\n\t },\n\n\t destroy: function() {\n\t this.window.close().destroy();\n\t this.window.element.off(CLICK + NS, \"a.k-diagram-cancel\", this._cancelClickHandler);\n\t this.window.element.off(CLICK + NS, \"a.k-diagram-update\", this._updateClickHandler);\n\t this._cancelClickHandler = null;\n\t this._editUpdateClickHandler = null;\n\t this.window = null;\n\t Editor.fn.destroy.call(this);\n\t }\n\t });\n\n\t function connectionSelector(container, options) {\n\t var model = this.dataSource.reader.model;\n\t if (model) {\n\t var textField = model.fn.fields.text ? \"text\": model.idField;\n\t $(\"\")\n\t .appendTo(container).kendoDropDownList({\n\t dataValueField: model.idField,\n\t dataTextField: textField,\n\t dataSource: this.dataSource.data().toJSON(),\n\t optionLabel: \" \",\n\t valuePrimitive: true\n\t });\n\t }\n\t }\n\n\t function InactiveItem(dataItem) {\n\t this.dataItem = dataItem;\n\t this.callbacks = [];\n\t }\n\n\t InactiveItem.fn = InactiveItem.prototype = {\n\t onActivate: function(callback) {\n\t var deffered = $.Deferred();\n\t this.callbacks.push({\n\t callback: callback,\n\t deferred: deffered\n\t });\n\t return deffered;\n\t },\n\n\t activate: function() {\n\t var callbacks = this.callbacks;\n\t var item;\n\t for (var idx = 0; idx < callbacks.length; idx++) {\n\t item = this.callbacks[idx];\n\t item.callback(this.dataItem);\n\t item.deferred.resolve();\n\t }\n\t this.callbacks = [];\n\t }\n\t };\n\n\t function InactiveItemsCollection() {\n\t this.items = {};\n\t }\n\n\t InactiveItemsCollection.fn = InactiveItemsCollection.prototype = {\n\t add: function(items) {\n\t for(var idx = 0; idx < items.length; idx++) {\n\t this.items[items[idx].uid] = new InactiveItem(items[idx]);\n\t }\n\t },\n\n\t forEach: function(callback){\n\t for (var uid in this.items) {\n\t callback(this.items[uid]);\n\t }\n\t },\n\n\t getByUid: function(uid) {\n\t return this.items[uid];\n\t },\n\n\t remove: function(item) {\n\t delete this.items[item.uid];\n\t }\n\t };\n\n\t var QuadRoot = Class.extend({\n\t init: function() {\n\t this.shapes = [];\n\t },\n\n\t _add: function(shape, bounds) {\n\t this.shapes.push({\n\t bounds: bounds,\n\t shape: shape\n\t });\n\t shape._quadNode = this;\n\t },\n\n\t insert: function(shape, bounds) {\n\t this._add(shape, bounds);\n\t },\n\n\t remove: function(shape) {\n\t var shapes = this.shapes;\n\t var length = shapes.length;\n\n\t for (var idx = 0; idx < length; idx++) {\n\t if (shapes[idx].shape === shape) {\n\t shapes.splice(idx, 1);\n\t break;\n\t }\n\t }\n\t },\n\n\t hitTestRect: function(rect, exclude) {\n\t var shapes = this.shapes;\n\t var length = shapes.length;\n\n\t for (var i = 0; i < length; i++) {\n\t if (this._testRect(shapes[i].shape, rect) && !dataviz.inArray(shapes[i].shape, exclude)) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t _testRect: function(shape, rect) {\n\t var angle = shape.rotate().angle;\n\t var bounds = shape.bounds();\n\t var hit;\n\t if (!angle) {\n\t hit = bounds.overlaps(rect);\n\t } else {\n\t hit = Intersect.rects(rect, bounds, -angle);\n\t }\n\t return hit;\n\t }\n\t });\n\n\t var QuadNode = QuadRoot.extend({\n\t init: function(rect) {\n\t QuadRoot.fn.init.call(this);\n\t this.children = [];\n\t this.rect = rect;\n\t },\n\n\t inBounds: function(rect) {\n\t var nodeRect = this.rect;\n\t var nodeBottomRight = nodeRect.bottomRight();\n\t var bottomRight = rect.bottomRight();\n\t var inBounds = nodeRect.x <= rect.x && nodeRect.y <= rect.y && bottomRight.x <= nodeBottomRight.x &&\n\t bottomRight.y <= nodeBottomRight.y;\n\t return inBounds;\n\t },\n\n\t overlapsBounds: function(rect) {\n\t return this.rect.overlaps(rect);\n\t },\n\n\t insert: function (shape, bounds) {\n\t var inserted = false;\n\t var children = this.children;\n\t var length = children.length;\n\t if (this.inBounds(bounds)) {\n\t if (!length && this.shapes.length < 4) {\n\t this._add(shape, bounds);\n\t } else {\n\t if (!length) {\n\t this._initChildren();\n\t }\n\n\t for (var idx = 0; idx < children.length; idx++) {\n\t if (children[idx].insert(shape, bounds)) {\n\t inserted = true;\n\t break;\n\t }\n\t }\n\n\t if (!inserted) {\n\t this._add(shape, bounds);\n\t }\n\t }\n\t inserted = true;\n\t }\n\n\t return inserted;\n\t },\n\n\t _initChildren: function() {\n\t var rect = this.rect,\n\t children = this.children,\n\t shapes = this.shapes,\n\t center = rect.center(),\n\t halfWidth = rect.width / 2,\n\t halfHeight = rect.height / 2,\n\t childIdx, shapeIdx;\n\n\t children.push(\n\t new QuadNode(new Rect(rect.x, rect.y, halfWidth, halfHeight)),\n\t new QuadNode(new Rect(center.x, rect.y, halfWidth, halfHeight)),\n\t new QuadNode(new Rect(rect.x, center.y, halfWidth, halfHeight)),\n\t new QuadNode(new Rect(center.x, center.y, halfWidth, halfHeight))\n\t );\n\t for (shapeIdx = shapes.length - 1; shapeIdx >= 0; shapeIdx--) {\n\t for (childIdx = 0; childIdx < children.length; childIdx++) {\n\t if (children[childIdx].insert(shapes[shapeIdx].shape, shapes[shapeIdx].bounds)) {\n\t shapes.splice(shapeIdx, 1);\n\t break;\n\t }\n\t }\n\t }\n\t },\n\n\t hitTestRect: function(rect, exclude) {\n\t var idx;\n\t var children = this.children;\n\t var length = children.length;\n\t var hit = false;\n\n\t if (this.overlapsBounds(rect)) {\n\t if (QuadRoot.fn.hitTestRect.call(this, rect, exclude)) {\n\t hit = true;\n\t } else {\n\t for (idx = 0; idx < length; idx++) {\n\t if (children[idx].hitTestRect(rect, exclude)) {\n\t hit = true;\n\t break;\n\t }\n\t }\n\t }\n\t }\n\n\t return hit;\n\t }\n\t });\n\n\t var ShapesQuadTree = Class.extend({\n\t ROOT_SIZE: 1000,\n\n\t init: function(diagram) {\n\t var boundsChangeHandler = proxy(this._boundsChange, this);\n\t diagram.bind(ITEMBOUNDSCHANGE, boundsChangeHandler);\n\t diagram.bind(ITEMROTATE, boundsChangeHandler);\n\t this.initRoots();\n\t },\n\n\t initRoots: function() {\n\t this.rootMap = {};\n\t this.root = new QuadRoot();\n\t },\n\n\t clear: function() {\n\t this.initRoots();\n\t },\n\n\t _boundsChange: function(e) {\n\t if (e.item._quadNode) {\n\t e.item._quadNode.remove(e.item);\n\t }\n\t this.insert(e.item);\n\t },\n\n\t insert: function(shape) {\n\t var bounds = shape.bounds(ROTATED);\n\t var rootSize = this.ROOT_SIZE;\n\t var sectors = this.getSectors(bounds);\n\t var x = sectors[0][0];\n\t var y = sectors[1][0];\n\n\t if (this.inRoot(sectors)) {\n\t this.root.insert(shape, bounds);\n\t } else {\n\t if (!this.rootMap[x]) {\n\t this.rootMap[x] = {};\n\t }\n\n\t if (!this.rootMap[x][y]) {\n\t this.rootMap[x][y] = new QuadNode(\n\t new Rect(x * rootSize, y * rootSize, rootSize, rootSize)\n\t );\n\t }\n\n\t this.rootMap[x][y].insert(shape, bounds);\n\t }\n\t },\n\n\t remove: function(shape) {\n\t if (shape._quadNode) {\n\t shape._quadNode.remove(shape);\n\t }\n\t },\n\n\t inRoot: function(sectors) {\n\t return sectors[0].length > 1 || sectors[1].length > 1;\n\t },\n\n\t getSectors: function(rect) {\n\t var rootSize = this.ROOT_SIZE;\n\t var bottomRight = rect.bottomRight();\n\t var bottomX = math.floor(bottomRight.x / rootSize);\n\t var bottomY = math.floor(bottomRight.y / rootSize);\n\t var sectors = [[],[]];\n\t for (var x = math.floor(rect.x / rootSize); x <= bottomX; x++) {\n\t sectors[0].push(x);\n\t }\n\t for (var y = math.floor(rect.y / rootSize); y <= bottomY; y++) {\n\t sectors[1].push(y);\n\t }\n\t return sectors;\n\t },\n\n\t hitTestRect: function(rect, exclude) {\n\t var sectors = this.getSectors(rect);\n\t var xIdx, yIdx, x, y;\n\t var root;\n\n\t if (this.root.hitTestRect(rect, exclude)) {\n\t return true;\n\t }\n\n\t for (xIdx = 0; xIdx < sectors[0].length; xIdx++) {\n\t x = sectors[0][xIdx];\n\t for (yIdx = 0; yIdx < sectors[1].length; yIdx++) {\n\t y = sectors[1][yIdx];\n\t root = (this.rootMap[x] || {})[y];\n\t if (root && root.hitTestRect(rect, exclude)) {\n\t return true;\n\t }\n\t }\n\t }\n\n\t return false;\n\t }\n\t });\n\n\t function cloneDataItem(dataItem) {\n\t var result = dataItem;\n\t if (dataItem instanceof kendo.data.Model) {\n\t result = dataItem.toJSON();\n\t result[dataItem.idField] = dataItem._defaultId;\n\t }\n\t return result;\n\t }\n\n\t function splitDiagramElements(elements) {\n\t var connections = [];\n\t var shapes = [];\n\t var element, idx;\n\t for (idx = 0; idx < elements.length; idx++) {\n\t element = elements[idx];\n\t if (element instanceof Shape) {\n\t shapes.push(element);\n\t } else {\n\t connections.push(element);\n\t }\n\t }\n\t return {\n\t shapes: shapes,\n\t connections: connections\n\t };\n\t }\n\n\t function createModel(dataSource, model) {\n\t if (dataSource.reader.model) {\n\t return new dataSource.reader.model(model);\n\t }\n\n\t return new kendo.data.ObservableObject(model);\n\t }\n\n\t function clearField(field, model) {\n\t if (defined(model[field])) {\n\t model.set(field, null);\n\t }\n\t }\n\n\t function copyDefaultOptions(mainOptions, elementOptions, fields) {\n\t var field;\n\t for (var idx = 0; idx < fields.length; idx++) {\n\t field = fields[idx];\n\t if (elementOptions && !defined(elementOptions[field])) {\n\t elementOptions[field] = mainOptions[field];\n\t }\n\t }\n\t }\n\n\t function translateToOrigin(visual) {\n\t var bbox = visual.drawingContainer().clippedBBox(null);\n\t if (bbox.origin.x !== 0 || bbox.origin.y !== 0) {\n\t visual.position(-bbox.origin.x, -bbox.origin.y);\n\t }\n\t }\n\n\t function preventDefault(e) {\n\t e.preventDefault();\n\t }\n\n\t dataviz.ui.plugin(Diagram);\n\n\t deepExtend(diagram, {\n\t Shape: Shape,\n\t Connection: Connection,\n\t Connector: Connector,\n\t DiagramToolBar: DiagramToolBar,\n\t QuadNode: QuadNode,\n\t QuadRoot: QuadRoot,\n\t ShapesQuadTree: ShapesQuadTree,\n\t PopupEditor: PopupEditor\n\t });\n\t})(window.kendo.jQuery);\n\n\t}, __webpack_require__(3));\n\n\n/***/ }),\n\n/***/ 901:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.dropdownlist\");\n\n/***/ }),\n\n/***/ 902:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.draganddrop\");\n\n/***/ }),\n\n/***/ 903:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.toolbar\");\n\n/***/ }),\n\n/***/ 904:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.editable\");\n\n/***/ }),\n\n/***/ 905:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.window\");\n\n/***/ }),\n\n/***/ 906:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./svg\");\n\n/***/ }),\n\n/***/ 907:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./services\");\n\n/***/ }),\n\n/***/ 908:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./layout\");\n\n/***/ })\n\n/******/ });"],"sourceRoot":""}