{"version":3,"file":"kendo.dataviz.diagram.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendodataviz","diagram","js","this","$","undefined$1","kendo","window","dataviz","deepExtend","isArray","Array","Utils","isNearZero","num","Math","abs","isDefined","obj","isUndefined","isObject","Object","has","key","hasOwnProperty","call","isString","prototype","toString","isBoolean","isType","type","isNumber","isNaN","parseFloat","isFinite","isEmpty","length","simpleExtend","destination","source","name","initArray","size","value","array","i","serializePoints","points","res","p","push","x","y","join","deserializePoints","s","v","split","Point","parseInt","randomInteger","lower","upper","floor","random","DFT","el","func","childNodes","item","getMatrixAngle","m","d","atan2","b","PI","getMatrixScaling","sqrt","a","c","sign","number","findAngle","center","end","start","sngXComp","sngYComp","atan","findRadian","forEach","arr","iterator","thisRef","any","predicate","remove","what","ax","indexOf","splice","contains","inArray","fold","list","acc","context","initial","arguments","find","result","index","first","constraint","insert","element","position","all","clear","bisort","sortfunc","sort","n","addRange","range","apply","Easing","pos","cos","Ticker","Class","extend","init","adapters","target","tick","interval","duration","lastTime","handlers","_this","transition","timerDelegate","onTimerEvent","addAdapter","onComplete","handler","removeHandler","grep","h","trigger","caller","onStep","seekTo","to","seekFromTo","from","max","min","Date","getTime","intervalId","setInterval","stop","clearInterval","play","origin","initState","reverse","propagate","update","now","timePassed","movement","ui","Range","step","Infinity","j","k","rangeIntegerScale","jQuery","Point2D","isFunction","map","EPSILON","fn","plus","minus","offset","times","normalize","lengthSquared","middleOf","q","toPolar","useDegrees","factor","halfpi","len","Polar","isOnLine","temp","o1","u1","r1","Rect","inflate","r2","union","height","width","parse","str","xy","slice","PathDefiner","left","right","point","dx","dy","r","x1","y1","x2","y2","top","bottom","topLeft","topRight","bottomLeft","bottomRight","clone","equals","rect","rotatedBounds","angle","rotatedPoints","tl","tr","br","bl","rotate","delimiter","scale","scaleX","scaleY","staicPoint","adornerCenter","thisCenter","delta","scaled","zoom","overlaps","rectBottomRight","Size","intersectLine","start1","end1","start2","end2","isSegment","tangensdiff","Empty","toRect","empty","fromPoints","Intersect","lines","segments","rectWithLine","rects","rect1","rect2","intersect","reverseAngle","RectAlign","container","align","content","alignment","alignValues","toLowerCase","_singleAlign","_align","_left","_center","_right","stretch","_stretch","_top","middle","_middle","_bottom","alignCalc","Matrix","e","f","applyRect","fromSVGMatrix","vm","fromMatrixVector","fromList","translation","unit","rotation","sin","scaling","parts","nums","trim","substr","MatrixVector","fromMatrix","randomId","chars","charAt","round","Geometry","_distanceToLineSquared","d2","pt1","pt2","vx","vy","dot","distanceToLine","distanceToPolyline","minimum","Number","MAX_VALUE","p1","p2","HashTable","_buckets","add","_createGetBucket","get","_bucketExists","set","containsKey","hashId","_hash","hashes","_hashes","hash","bucket","ht","_hashString","_objectHashId","charCodeAt","id","_hashId","Dictionary","Observable","dictionary","_hashTable","entry","Error","forEachValue","forEachKey","keys","Queue","_tail","_head","enqueue","next","dequeue","current","Set","resource","kv","toArray","Node","shape","links","outgoing","incoming","weight","associatedShape","bounds","data","shortForm","isVirtual","isIsolated","isLinkedTo","node","that","link","getComplement","getChildren","children","getParents","parents","copy","balance","owner","adjacentTo","removeLink","hasLinkTo","degree","incidentWith","getLinksWith","getNeighbors","neighbors","Link","connection","sourceFound","targetFound","associatedConnection","getCommonNode","isBridging","v1","v2","getNodes","changeSource","changeTarget","changesNodes","w","oldSource","oldTarget","directTo","createReverseEdge","reversed","Graph","idOrDiagram","nodes","_nodeMap","_root","_hasCachedRelationships","cacheRelationships","forceRebuild","assignLevels","startNode","visited","level","child","root","found","getConnectedComponents","componentIndex","setItemIndices","componentId","_collectConnectedNodes","components","addNodeAndOutgoings","setIds","nodeIndex","nextId","calcBounds","getSpanningTree","tree","remaining","_addNode","levelCount","pop","ni","cn","newLink","addLink","treeLevels","takeRandomNode","excludedNodes","incidenceLessThan","pool","isHealthy","hasNode","sourceOrLink","addExistingLink","foundSource","getNode","addNode","foundTarget","removeAllLinks","hasLink","t","linkOrId","nodeOrId","_removeNode","removeNode","areConnected","n1","n2","layoutRect","newNode","newLinks","saveMapping","save","nodeMap","linkMap","nOriginal","nCopy","linkOriginal","linkCopy","linearize","addIds","depthFirstTraversal","action","foundNode","_dftIterator","breadthFirstTraversal","queue","_stronglyConnectedComponents","excludeSingleItems","indices","lowLinks","connected","stack","component","findCycles","isAcyclic","isSubGraph","other","otherArray","thisArray","makeAcyclic","oneNode","rev","N","intensityCatalog","flowIntensity","catalogEqualIntensity","intensity","sourceStack","targetStack","targets","li","targetLink","unshift","sources","si","sourceLink","ri","ril","u","concat","vertexOrder","kk","reversedEdges","Predefined","EightGraph","Mindmap","ThreeGraph","BinaryTree","levels","createBalancedTree","Linear","Tree","siblingsCount","Forest","trees","createBalancedForest","Workflow","Grid","g","previous","graphString","previousLink","graph","part","lin","_addShape","kendoDiagram","shapeDefaults","radius","fill","undoable","addShape","_addConnection","options","connect","createDiagramFromGraph","doLayout","randomSize","clientWidth","clientHeight","opt","color","gli","sourceShape","targetShape","SpringLayout","layoutGraph","limitToView","shi","news","counter","lastAdded","parent","treeCount","createRandomConnectedGraph","nodeCount","maxIncidence","isTree","poolNode","randomAdditions","randomDiagram","shapeCount","normalVariable","mean","deviation","log","geometry","drawing","defined","util","TRANSPARENT","Markers","none","arrowStart","filledCircle","arrowEnd","START","END","WIDTH","HEIGHT","diffNumericOptions","fields","field","elementOptions","hasChanges","Scale","toMatrix","format","invert","Translation","toMatrixVector","Length","Rotation","ZERO","create","values","CompositeTransform","translate","transform","render","visual","_transform","_renderTransform","rotateMatrix","scaleMatrix","translatePoint","AutoSizeableMixin","_setScale","originWidth","_originWidth","originHeight","_originHeight","_setTranslate","_initSize","autoSize","_measure","_updateSize","_diffNumericOptions","Element","_originSize","visible","drawingContainer","redraw","drawingElement","matrix","_hover","force","_measured","box","_boundingBox","startPoint","rawBBox","VisualBase","normalizeDrawingOptions","stroke","opacity","_fill","getColor","_stroke","show","hover","strokeOptions","dashType","fillOptions","gradient","GradientClass","RadialGradient","LinearGradient","TextBlock","_textColor","_font","_initText","fontSize","fontFamily","Text","text","font","fontOptions","fontStyle","fontWeight","sizeChanged","textOptions","Rectangle","_initPath","_setPosition","_drawPath","Path","closed","sizeOptions","sizeOptionsOrDefault","elements","createSegment","MarkerBase","anchor","createElement","_transformToPath","path","transformCopy","CircleMarker","Circle","positionMarker","targetSegment","ArrowMarker","xDiff","yDiff","_linePoints","deg","endPoint","controlOut","nextSegment","controlIn","prevSegment","MarkerPathMixin","_getPath","MultiPath","paths","_normalizeMarkerOptions","startCap","endCap","_removeMarker","marker","_markers","_createMarkers","_createMarker","markerType","append","_positionMarker","_capMap","_redrawMarker","pathChange","pathOptions","cap","pathCapType","optionsCap","created","_redrawMarkers","Group","_createElements","_setData","multipath","Line","Polyline","_updatePath","_pointsDiffer","currentPoints","differ","Image","_initImage","src","_rect","_childrenChange","_remove","removeAt","toFront","visuals","toBack","_reorderChildren","toIndex","group","drawingChildren","fixedPosition","boundingBox","childBoundingBox","_includeInBBox","clippedBBox","Layout","toDrawingRect","drawingRect","reflow","_initCircle","circleOptions","move","_circle","setRadius","Canvas","surface","Surface","_translate","_viewBox","viewBox","setSize","draw","insertBefore","destroy","clearHtml","drawingOptions","Color","toHex","Segment","Movable","Cursors","arrow","grip","cross","select","south","east","west","north","rowresize","colresize","HIT_TEST_DISTANCE","AUTO","TOP","RIGHT","LEFT","BOTTOM","DRAG_START","DRAG","DRAG_END","ITEMBOUNDSCHANGE","ROTATED","TARGET","HANDLE_NAMES","PositionAdapter","layoutState","froms","tos","subjects","getShapeById","LayoutUndoUnit","initialState","finalState","animate","_initialState","_finalState","title","undo","setState","redo","state","conn","ticker","CompositeUnit","units","undoUnit","ConnectionEditUnit","redoSource","redoTarget","_redoSource","_redoTarget","_undoSource","_undoTarget","_updateConnector","updateModel","ConnectionEditUndoUnit","undoSource","undoTarget","DeleteConnectionUnit","targetConnector","DeleteShapeUnit","TransformUnit","shapes","undoStates","adorner","redoStates","layout","refreshBounds","refresh","AddConnectionUnit","AddShapeUnit","deselect","PanUndoUnit","initialPosition","finalPosition","finalPos","pan","RotateUnit","undoRotates","redoRotates","redoAngle","_angle","_innerBounds","_initialize","ToFrontUnit","items","initialIndices","_toIndex","ToBackUnit","UndoRedoService","bind","events","capacity","begin","composite","cancel","commit","execute","_restart","addCompositeItem","count","EmptyTool","toolService","tryActivate","getCursor","ScrollerTool","tool","friction","support","mobileOS","canvas","scroller","scrollable","kendoMobileScroller","velocityMultiplier","mousewheelScrolling","scroll","_move","movableCanvas","virtualScroll","dimension","makeVirtual","virtualSize","dimensions","disable","meta","pannable","enabled","ctrlKey","noMeta","hoveredItem","hoveredAdorner","_hoveredConnector","enable","args","scrollPos","scrollLeft","scrollTop","_storePan","moveTo","_pan","PointerTool","selectSingle","handle","_hitTest","_resizingAdorner","isDragHandle","connections","undoRedoService","_getCursor","SelectionTool","selectable","multiple","selector","isSelected","selectArea","ConnectionTool","connector","_createConnection","_c","canDrag","connectionHandle","_connectionManipulation","_removeHover","activeConnection","_cachedTouchTarget","cachedTouchTarget","sourceConnector","Shape","getConnector","_syncConnectionChanges","_connectorsAdorner","ConnectionEditTool","isActive","handleName","testKey","toUpperCase","ToolService","tools","activeTool","_updateHoveredItem","_activateTool","_updateCursor","focus","suspendTracking","updateHovered","resumeTracking","keyDown","metaKey","altKey","toRemove","_triggerRemove","_syncChanges","_destroyToolBar","_discardNewConnection","selectAll","cut","paste","wheel","z","zoomRate","zoomOptions","zoomMin","zoomMax","setTool","addToSelection","newConnection","cursor","css","disabledShape","isNew","hit","_visible","selectedConnections","_selectedItems","Connection","_hitTestItems","_hitTestElements","shapeHit","connectionHit","idx","connectors","hitTestShapeConnectors","mainLayer","ConnectionRouterBase","LinearConnectionRouter","hitTest","getBounds","allPoints","PolylineRouter","route","CascadingRouter","SAME_SIDE_DISTANCE_RATIO","routePoints","_connectorPoints","_floatingPoints","_resolvedSourceConnector","_resolvedTargetConnector","sourcePoint","targetPoint","_connectorSides","axis","boundsPoint","secondarySign","_connectorSide","sideDistance","minSide","side","shapeBounds","sides","MAX_NUM","_sameSideDistance","pointX","pointY","sourceConnectorSide","targetConnectorSide","deltaX","deltaY","sameSideDistance","shiftX","shiftY","cascadeStartHorizontal","_startHorizontal","sourceSide","AdornerBase","_adorners","ConnectionEditAdorner","_ts","sp","tp","spVisual","handles","epVisual","_initialSource","_initialTarget","ts","radiusX","radiusY","sourcePointDistance","distanceTo","targetPointDistance","sourceHandle","targetHandle","modelToLayer","ConnectorsAdorner","_refreshHandler","ctr","_clearVisual","ConnectorVisual","_keepCachedTouchTarget","visualChildren","childrenCount","unbind","each","ResizingAdorner","_manipulating","_initSelection","_createHandles","selected","_internalChange","_rotatedHandler","_resizable","editable","resize","_handleOptions","_bounds","handleBounds","handlesCount","_getHandleBounds","_rotationOffset","_startAngle","_rotates","_positions","initialRotates","initialStates","handleOptions","_sp","_cp","_lp","shapeStates","visibleHandles","currentAngle","dragging","newBounds","staticPoint","dtl","dbr","changed","_truncateAngle","_rotating","shouldSnap","thr","_truncateDistance","hitToOppositeSide","_displaceBounds","newCenter","minWidth","minHeight","oldBounds","states","_truncatePositionToGuides","ruler","truncatePositionToGuides","_truncateSizeToGuides","truncateSizeToGuides","snap","snapOptions","snapAngle","snapSize","drag","_diffStates","_syncShapeChanges","rotationThumb","thumb","_rotationThumbBounds","Selector","_ep","_adorn","visualBounds","modelToView","relative","_visualBounds","shiftKey","HyperTree","DEG_TO_RAD","LayoutBase","defaultOptions","subtype","roots","nodeDistance","iterations","horizontalSeparation","verticalSeparation","underneathVerticalTopOffset","underneathHorizontalOffset","underneathVerticalSeparation","grid","offsetX","offsetY","componentSpacingX","componentSpacingY","layerSeparation","layeredIterations","startRadialAngle","endRadialAngle","radialSeparation","radialFirstLevelSeparation","keepComponentsInOneRadialLayout","ignoreContainers","layoutContainerChildren","ignoreInvisible","animateTransitions","gridLayoutComponents","maxWidth","startX","resultLinkSet","resultNodeSet","moveToOffset","boundingRect","currentHeight","currentWidth","deltax","deltay","nodeBounds","newpoints","pt","currentHorizontalOffset","transferOptions","DiagramToHyperTreeAdapter","shapeMap","edges","edgeMap","finalNodes","finalLinks","ignoredConnections","ignoredShapes","hyperMap","hyperTree","finalGraph","convert","_renormalizeShapes","_renormalizeConnections","l","mapConnection","mapShape","getEdge","listToRoot","containerGraph","parentContainer","firstNonIgnorableContainer","isContainer","_isIgnorableItem","isContainerConnection","isDescendantOf","scope","containers","isIgnorableItem","isCollapsed","_isVisible","_isTop","isShapeMapped","leastCommonAncestor","al","xa","xb","_isCollapsed","sink","sourceNode","sinkNode","areConnectedAlready","newEdge","finalNodeSet","LayoutState","initialTemperature","temperature","guessBounds","_expectedBounds","refineStage","_repulsion","_attraction","_shake","rho","alpha","_InverseSquareForce","wn","hn","wm","hm","pow","_SquareForce","distance","squareSize","area","ceil","TreeLayoutProcessor","treeGraph","layoutSwitch","layoutLeft","setChildrenDirection","setChildrenLayout","TreeDirection","measure","Width","arrange","layoutRight","layoutUp","up","layoutDown","down","treeDirection","layoutRadialTree","previousRoot","startAngle","endAngle","maxDepth","calculateAngularWidth","radialLayout","Angle","tipOverTree","startFromLevel","aw","diameter","sectorAngle","sortChildren","basevalue","pl","nl","normalizeAngle","col","deltaTheta","deltaThetaHalf","parentSector","fraction","sorted","childNode","cp","childAngleFraction","setPolarLocation","BoundingRectangle","direction","includeStart","rootDirection","rootLayout","childrenLayout","givenSize","shapeWidth","shapeHeight","AngleToParent","SectorAngle","pp","childrenwidth","selfLocation","single","male","female","leftcount","tipOverTreeStartLevel","TreeLayout","adapter","layoutComponents","getTree","getTreeForRoot","LayeredLayout","_initRuntimeProperties","layer","downstreamLinkCount","upstreamLinkCount","uBaryCenter","dBaryCenter","upstreamPriority","downstreamPriority","gridPosition","_prepare","targetLayer","layerMap","layerCount","shift","sortedNodes","o2","o1layer","o2layer","minLayer","layers","linksTo","_dummify","_optimizeCrossings","_swapPairs","arrangeNodes","_moveThingsAround","_dedummify","setMinDist","minDist","layerIndex","minDistances","getMinDist","dist","i1","i2","placeLeftToRight","leftClasses","leftPos","classNodes","placeLeft","POSITIVE_INFINITY","rightSibling","nodeLeftClass","D","upNodes","downNodes","neighbor","intDiv","placeRightToLeft","rightClasses","rightPos","placeRight","NEGATIVE_INFINITY","leftSibling","nodeRightClass","_getLeftWing","leftWing","computeClasses","_getRightWing","rightWing","wingPair","currentWing","wing","ndsinl","_nodesInLink","vnode","wings","classIndex","_isVerticalLayout","_isHorizontalLayout","_isIncreasingLayout","_gridPositionComparer","dest","currentNode","currDown","downNode","order","placed","sequenceStart","virtualStartIndex","_firstVirtualNode","virtualStart","sequence","_sequencer","virtualEnd","nextVirtualNode","virtualEndIndex","adjustDirections","ctx","fromLayerIndex","layerIncrement","maximumHeight","MIN_VALUE","prevBridge","prevBridgeTarget","nextBridge","nextBridgeTarget","getNeighborOnLayer","clayer","j1","j2","dir","_sequenceSingle","combineSequences","pair","leftHeap","_positionDescendingComparer","rightHeap","_positionAscendingComparer","leftRes","rightRes","leftClass","_getComposite","rightClass","it","layoutLayer","gridPos","iconsidered","considered","n1Priority","n2Priority","nodeGridPos","nodeBaryCenter","calcBaryCenter","nodePriority","moveRight","moveLeft","calcDownData","calcUpData","priority","rightNode","rightNodePriority","leftNode","leftNodePriority","mapVirtualNode","nodeToLinkMap","linkToNodeMap","addLinkBetweenLayers","upLayer","downLayer","o","oLayer","dLayer","oPos","dPos","depthOfDumminess","dedum","prevLink","moves","iter","optimizeLayerCrossings","sum","total","presorted","n1BaryCenter","n2BaryCenter","compareByIndex","compareValue","inode","maxIterations","downwards","secondPass","hasSwapped","calcCrossings","memCrossings","crossBefore","countLinksCrossingBetweenTwoLayers","node1","node2","node1GridPos","node2GridPos","crossAfter","ulayer","dlayer","link1","link2","n11","n12","n21","n22","l1","l2","crossings","n11gp","n12gp","numerator","denominator","graphOrNodes","capture","diagramOrGraphOrNodes","GraphAdapter","geom","Widget","outerWidth","_outerWidth","outerHeight","_outerHeight","HierarchicalDataSource","isPlainObject","math","NS","CASCADING","CHANGE","CLICK","ERROR","MAXINT","SELECT","ITEMROTATE","PAN","ZOOM_START","ZOOM_END","NONE","TRANSFORMED","MOUSEWHEEL_NS","BUTTON_TEMPLATE","ref","className","icon","themeColor","html","renderButton","DefaultConnectors","getPosition","defaultButtons","imageClass","isAutoConnector","closestConnector","resCtr","minimumDistance","indicesOfItems","extra","defaults","DiagramElement","dataItem","_template","serializable","serialize","json","_content","contentOptions","_contentVisual","_updateContentVisual","_createContentVisual","template","elementTemplate","paramName","_canSelect","toJSON","Connector","shapeId","tempStr","updateOptionsFromModel","createShapeVisual","updateBounds","_createConnectors","_setOptionsFromModel","model","modelOptions","filterShapeDataItem","redrawVisual","_isEditable","_redrawVisual","syncChanges","_suspendModelRefresh","_resumeModelRefresh","_rotate","_alignContent","contentVisual","containerRect","aligner","contentBounds","bbox","contentRect","alignedBounds","connectorDefaults","_transformedBounds","_rotatedBounds","_setBounds","_triggerBoundsChange","_layouting","refreshConnections","cloneDataItem","deselected","_internalSelection","_selectionChanged","deltaAngle","newPosition","sc","con","cons","nameOrPoint","toLocaleLowerCase","fnName","_transformPoint","boundsChange","shapeOptions","shapeVisual","_visualOptions","_updateConnectors","_showConnectors","rotatedPoint","visualOptions","visualTemplate","_initRouter","_sourcePoint","_targetPoint","_setSource","_setTarget","definers","fromConnector","toConnector","dataMap","_dataMap","fromX","fromY","toX","toY","filterConnectionDataItem","connectionsDataSource","getByUid","uid","clearField","shapeSource","defaultConnector","_removeFromSourceConnector","_clearSourceConnector","_setFromOptions","fromPoint","sourceDefiner","_sourceDefiner","shapeTarget","_removeFromTargetConnector","_clearTargetConnector","_setToOptions","toPoint","targetDefiner","_targetDefiner","instance","connectorName","setNewTarget","inactiveItem","_inactiveShapeItems","_deferredConnectionUpdates","onActivate","endIdx","startIdx","alignToPath","midIdx","selection","_router","pts","definition","_resolveConnectors","_refreshPath","sourceConnectors","targetConnectors","_resolveAutoConnectors","minNonConflictSource","minNonConflictTarget","minSource","minTarget","sourceIdx","targetIdx","minNonConflict","_testRoutePoints","router","passRoute","exclude","_getRouteExclude","_shapesQuadTree","hitTestRect","_isPointInsideShape","boundsX","boundsY","Diagram","userOptions","_initTheme","_initElements","_extendLayoutOptions","_initDefaults","_interactionDefaults","_initCanvas","ShapesQuadTree","adornerLayer","_createHandlers","_clipboard","pauseMouseHandlers","_fetchFreshData","_createGlobalToolBar","_createOptionElements","theme","dataSource","draggable","autoBind","tooltip","connectionDefaults","toolBar","DiagramToolBar","click","_toolBarClick","modal","textAlign","prepend","_resize","createShape","editor","view","createModel","_createShape","edit","createConnection","_connectionsDataMap","addConnection","editModel","editorType","editors","cancelEdit","shapeEditors","shapeTemplate","connectionSelectorHandler","connectionSelector","connectionEditors","connectionTemplate","PopupEditor","_update","_cancel","_editArgs","_getEditDataSource","cancelChanges","_destroyEditor","saveEdit","sync","wrapper","close","attr","addClass","appendTo","userShapeDefaults","copyDefaultOptions","mobile","canvasContainer","viewPort","viewport","on","_wheel","_keydown","_userEvents","UserEvents","multiTouch","fastTap","tap","_tap","_dragStart","_drag","_dragEnd","gesturestart","_gestureStart","gesturechange","_gestureChange","gestureend","_gestureEnd","doubleTap","_doubleTap","supportDoubleTap","_mouseover","_mouseout","_mouseMove","_mouseDown","_mouseUp","_syncHandler","_resizeHandler","onResize","_pauseMouseHandlers","_eventPositions","event","_meta","preventDefault","_createToolBar","focused","ctrlPressed","keyCode","origEvent","originalEvent","wheelDelta","detail","mwDelta","touch","pageX","pageY","documentToModel","initialCenter","eventArgs","_gesture","_initialCenter","previousGesture","documentToView","scaleDelta","_zoom","updateZoom","_getValidZoom","zoomedPoint","_panTransform","_updateAdorners","pointPosition","_kendoNode","srcElement","themeOptions","themeName","themes","SASS_THEMES","autoTheme","shapesLength","_createShapes","_createConnections","_findConnectionTarget","unbindResize","off","destroyScroller","_destroyGlobalToolBar","is","_activeElement","scrollContainer","offsets","documentElement","document","parentNode","scrollHeight","load","setOptions","added","removed","_parseBounds","splitDiagramElements","_removeItem","_removeShapeDataItem","_removeConnectionDataItem","_getDiagramItems","_fixOrdering","bringIntoView","original","newPan","_zoomMainLayer","alignShapes","val","raw","hideTooltip","_getPan","animatedScrollTo","scrollTo","_copyOffset","copied","mapping","_updateCopiedConnection","sourceConnection","di","_containerOffset","containerOffset","viewToDocument","viewToModel","_transformWithMatrix","_matrixInvert","_matrix","_layerMatrix","layerToModel","_layerMatrixInvert","viewPoint","modelToDocument","setDataSource","_dataSource","fetch","setConnectionsDataSource","_connectionDataSource","_redrawConnections","getShapeByModelId","getShapeByModelUid","getConnectionByModelId","getConnectionByModelUid","_transformMainLayer","_finishPan","NaN","_storeViewMatrix","_storeLayerMatrix","canvasTransform","shapePos","conPos","removedConnections","_removeShape","_removeConnection","_removeDataItems","recursive","_removeShapeConnections","hasChildren","loaded","_addDataItem","_addDataItemByUid","_addDataItems","parentShape","_refreshSource","dataBound","_bindingRoots","_addItem","preventClosing","singleToolBar","popupZIndex","closest","popupWidth","_popup","popupHeight","connectionBounds","showAt","one","_normalizePointZoom","InactiveItemsCollection","undone","redone","_loadingShapes","_loadingConnections","dsOptions","ds","_shapesRefreshHandler","_shapesRequestStartHandler","_shapesErrorHandler","_refreshShapes","_shapesRequestStart","_error","DataSource","_treeDataSource","_connectionsRefreshHandler","_connectionsRequestStartHandler","_connectionsErrorHandler","_refreshConnections","_connectionsRequestStart","_connectionsError","_shouldRefresh","_removeShapes","_updateShapes","_syncShapes","_suspended","_rebindShapesAndConnections","_addShapes","_addConnections","inactiveItems","activate","dataItems","_removeConnections","_updateConnections","_addConnectionDataItem","_validateConnector","_unbindDataSource","_errorHandler","adorners","_refresh","hide","exportDOMVisual","scrollOffset","viewRect","clipPath","fromRect","wrap","clipWrap","clip","exportVisual","when","then","deferredConnectionUpdates","ExportMixin","PDFMixin","_tools","createToolBar","createTools","appendTools","createPopup","kendoPopup","getKendoPopup","buttons","_toolBar","kendoToolBar","resizable","getKendoToolBar","createTool","toolName","attributes","_setAttributes","open","newGroup","editTool","showText","deleteTool","rotateAnticlockwiseTool","_appendGroup","_rotateGroup","rotateClockwiseTool","createShapeTool","_createGroup","createConnectionTool","undoTool","_historyGroup","redoTool","prop","_getAttributes","eventData","selectedElements","delete","selectedElemens","rotateClockwise","rotateAnticlockwise","Editor","_getFields","_initContainer","createEditable","Editable","clearContainer","modelFields","columns","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","callback","deffered","Deferred","deferred","resolve","QuadRoot","_add","_quadNode","_testRect","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","plugin"],"sources":["kendo.dataviz.diagram.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.data.js'), require('kendo.draganddrop.js'), require('kendo.userevents.js'), require('kendo.mobile.scroller.js'), require('kendo.drawing.js'), require('kendo.core.js'), require('kendo.dataviz.core.js'), require('kendo.toolbar.js'), require('kendo.editable.js'), require('kendo.window.js'), require('kendo.dropdownlist.js'), require('kendo.dataviz.themes.js'), require('kendo.html.button.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.data', 'kendo.draganddrop', 'kendo.userevents', 'kendo.mobile.scroller', 'kendo.drawing', 'kendo.core', 'kendo.dataviz.core', 'kendo.toolbar', 'kendo.editable', 'kendo.window', 'kendo.dropdownlist', 'kendo.dataviz.themes', 'kendo.html.button'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendodataviz = global.kendodataviz || {}, global.kendodataviz.diagram = global.kendodataviz.diagram || {}, global.kendodataviz.diagram.js = factory()));\n})(this, (function () {\n (function($, undefined$1) {\n var kendo = window.kendo,\n diagram = kendo.dataviz.diagram = {},\n deepExtend = kendo.deepExtend,\n isArray = Array.isArray,\n EPSILON = 1e-06;\n\n /*-------------------Diverse utilities----------------------------*/\n var Utils = {\n };\n\n deepExtend(Utils, {\n isNearZero: function(num) {\n return Math.abs(num) < EPSILON;\n },\n isDefined: function(obj) {\n return typeof obj !== 'undefined';\n },\n\n isUndefined: function(obj) {\n return (typeof obj === 'undefined') || obj === null;\n },\n /**\n * Returns whether the given object is an object or a value.\n */\n isObject: function(obj) {\n return obj === Object(obj);\n },\n /**\n * Returns whether the object has a property with the given name.\n */\n has: function(obj, key) {\n return Object.hasOwnProperty.call(obj, key);\n },\n /**\n * Returns whether the given object is a string.\n */\n isString: function(obj) {\n return Object.prototype.toString.call(obj) == '[object String]';\n },\n isBoolean: function(obj) {\n return Object.prototype.toString.call(obj) == '[object Boolean]';\n },\n isType: function(obj, type) {\n return Object.prototype.toString.call(obj) == '[object ' + type + ']';\n },\n /**\n * Returns whether the given object is a number.\n */\n isNumber: function(obj) {\n return !isNaN(parseFloat(obj)) && isFinite(obj);\n },\n /**\n * Return whether the given object (array or dictionary).\n */\n isEmpty: function(obj) {\n if (obj === null) {\n return true;\n }\n if (isArray(obj) || Utils.isString(obj)) {\n return obj.length === 0;\n }\n for (var key in obj) {\n if (Utils.has(obj, key)) {\n return false;\n }\n }\n return true;\n },\n simpleExtend: function(destination, source) {\n if (!Utils.isObject(source)) {\n return;\n }\n\n for (var name in source) {\n destination[name] = source[name];\n }\n },\n /**\n * Returns an array of the specified size and with each entry set to the given value.\n * @param size\n * @param value\n * @returns {Array}\n */\n initArray: function createIdArray(size, value) {\n var array = [];\n for (var i = 0; i < size; ++i) {\n array[i] = value;\n }\n return array;\n },\n serializePoints: function(points) {\n var res = [];\n for (var i = 0; i < points.length; i++) {\n var p = points[i];\n res.push(p.x + \";\" + p.y);\n }\n return res.join(\";\");\n },\n deserializePoints: function(s) {\n var v = s.split(\";\"), points = [];\n if (v.length % 2 !== 0) {\n throw \"Not an array of points.\";\n }\n for (var i = 0; i < v.length; i += 2) {\n points.push(new diagram.Point(\n parseInt(v[i], 10),\n parseInt(v[i + 1], 10)\n ));\n }\n return points;\n },\n /**\n * Returns an integer within the given bounds.\n * @param lower The inclusive lower bound.\n * @param upper The exclusive upper bound.\n * @returns {number}\n */\n randomInteger: function(lower, upper) {\n return parseInt(Math.floor(Math.random() * upper) + lower, 10);\n } ,\n /*\n Depth-first traversal of the given node.\n */\n DFT: function(el, func) {\n func(el);\n if (el.childNodes) {\n for (var i = 0; i < el.childNodes.length; i++) {\n var item = el.childNodes[i];\n this.DFT(item, func);\n }\n }\n },\n /*\n Returns the angle in degrees for the given matrix\n */\n getMatrixAngle: function(m) {\n if (m === null || m.d === 0) {\n return 0;\n }\n return Math.atan2(m.b, m.d) * 180 / Math.PI;\n },\n\n /*\n Returns the scaling factors for the given matrix.\n */\n getMatrixScaling: function(m) {\n var sX = Math.sqrt(m.a * m.a + m.c * m.c);\n var sY = Math.sqrt(m.b * m.b + m.d * m.d);\n return [sX, sY];\n }\n\n });\n\n /**\n * The Range defines an array of equally separated numbers.\n * @param start The start-value of the Range.\n * @param stop The end-value of the Range.\n * @param step The separation between the values (default:1).\n * @returns {Array}\n */\n function Range(start, stop, step) {\n if (typeof start == 'undefined' || typeof stop == 'undefined') {\n return [];\n }\n if (step && Utils.sign(stop - start) != Utils.sign(step)) {\n throw \"The sign of the increment should allow to reach the stop-value.\";\n }\n step = step || 1;\n start = start || 0;\n stop = stop || start;\n if ((stop - start) / step === Infinity) {\n throw \"Infinite range defined.\";\n }\n var range = [], i = -1, j;\n\n function rangeIntegerScale(x) {\n var k = 1;\n while (x * k % 1) {\n k *= 10;\n }\n return k;\n }\n\n var k = rangeIntegerScale(Math.abs(step));\n start *= k;\n stop *= k;\n step *= k;\n if (start > stop && step > 0) {\n step = -step;\n }\n if (step < 0) {\n while ((j = start + step * ++i) >= stop) {\n range.push(j / k);\n }\n }\n else {\n while ((j = start + step * ++i) <= stop) {\n range.push(j / k);\n }\n }\n return range;\n }\n\n /*-------------------Diverse math functions----------------------------*/\n\n function findRadian(start, end) {\n if (start == end) {\n return 0;\n }\n var sngXComp = end.x - start.x,\n sngYComp = start.y - end.y,\n atan = Math.atan(sngXComp / sngYComp);\n if (sngYComp >= 0) {\n return sngXComp < 0 ? atan + (2 * Math.PI) : atan;\n }\n return atan + Math.PI;\n }\n\n Utils.sign = function(number) {\n return number ? number < 0 ? -1 : 1 : 0;\n };\n\n Utils.findAngle = function(center, end) {\n return findRadian(center, end) * 180 / Math.PI;\n };\n\n /*-------------------Array Helpers ----------------------------*/\n\n Utils.forEach = function(arr, iterator, thisRef) {\n for (var i = 0; i < arr.length; i++) {\n iterator.call(thisRef, arr[i], i, arr);\n }\n };\n\n Utils.any = function(arr, predicate) {\n for (var i = 0; i < arr.length; ++i) {\n if (predicate(arr[i])) {\n return arr[i];\n }\n }\n return null;\n };\n\n Utils.remove = function(arr, what) {\n var ax;\n while ((ax = Utils.indexOf(arr, what)) !== -1) {\n arr.splice(ax, 1);\n }\n return arr;\n };\n\n Utils.contains = function(arr, obj) {\n return Utils.indexOf(arr, obj) !== -1;\n };\n\n Utils.indexOf = function(arr, what) {\n return $.inArray(what, arr);\n };\n\n Utils.fold = function(list, iterator, acc, context) {\n var initial = arguments.length > 2;\n\n for (var i = 0; i < list.length; i++) {\n var value = list[i];\n if (!initial) {\n acc = value;\n initial = true;\n }\n else {\n acc = iterator.call(context, acc, value, i, list);\n }\n }\n\n if (!initial) {\n throw 'Reduce of empty array with no initial value';\n }\n\n return acc;\n };\n\n Utils.find = function(arr, iterator, context) {\n var result;\n Utils.any(arr, function(value, index, list) {\n if (iterator.call(context, value, index, list)) {\n result = value;\n return true;\n }\n return false;\n });\n return result;\n };\n\n Utils.first = function(arr, constraint, context) {\n if (arr.length === 0) {\n return null;\n }\n if (Utils.isUndefined(constraint)) {\n return arr[0];\n }\n\n return Utils.find(arr, constraint, context);\n };\n\n /**\n * Inserts the given element at the specified position and returns the result.\n */\n Utils.insert = function(arr, element, position) {\n arr.splice(position, 0, element);\n return arr;\n };\n\n Utils.all = function(arr, iterator, context) {\n var result = true;\n var value;\n\n for (var i = 0; i < arr.length; i++) {\n value = arr[i];\n result = result && iterator.call(context, value, i, arr);\n\n if (!result) {\n break;\n }\n }\n\n return result;\n };\n\n Utils.clear = function(arr) {\n arr.splice(0, arr.length);\n };\n\n /**\n * Sort the arrays on the basis of the first one (considered as keys and the other array as values).\n * @param a\n * @param b\n * @param sortfunc (optiona) sorting function for the values in the first array\n */\n Utils.bisort = function(a, b, sortfunc) {\n if (Utils.isUndefined(a)) {\n throw \"First array is not specified.\";\n }\n if (Utils.isUndefined(b)) {\n throw \"Second array is not specified.\";\n }\n if (a.length != b.length) {\n throw \"The two arrays should have equal length\";\n }\n\n var all = [], i;\n\n for (i = 0; i < a.length; i++) {\n all.push({ 'x': a[i], 'y': b[i] });\n }\n if (Utils.isUndefined(sortfunc)) {\n all.sort(function(m, n) {\n return m.x - n.x;\n });\n }\n else {\n all.sort(function(m, n) {\n return sortfunc(m.x, n.x);\n });\n }\n\n Utils.clear(a);\n Utils.clear(b);\n\n for (i = 0; i < all.length; i++) {\n a.push(all[i].x);\n b.push(all[i].y);\n }\n };\n\n Utils.addRange = function(arr, range) {\n arr.push.apply(arr, range);\n };\n\n var Easing = {\n easeInOut: function(pos) {\n return ((-Math.cos(pos * Math.PI) / 2) + 0.5);\n }\n };\n\n /**\n * An animation ticker driving an adapter which sets a particular\n * property in function of the tick.\n * @type {*}\n */\n var Ticker = kendo.Class.extend({\n init: function() {\n this.adapters = [];\n this.target = 0;\n this.tick = 0;\n this.interval = 20;\n this.duration = 800;\n this.lastTime = null;\n this.handlers = [];\n var _this = this;\n this.transition = Easing.easeInOut;\n this.timerDelegate = function() {\n _this.onTimerEvent();\n };\n },\n addAdapter: function(a) {\n this.adapters.push(a);\n },\n onComplete: function(handler) {\n this.handlers.push(handler);\n },\n removeHandler: function(handler) {\n this.handlers = $.grep(this.handlers, function(h) {\n return h !== handler;\n });\n },\n trigger: function() {\n var _this = this;\n if (this.handlers) {\n Utils.forEach(this.handlers, function(h) {\n return h.call(_this.caller !== null ? _this.caller : _this);\n });\n }\n },\n onStep: function() {\n },\n seekTo: function(to) {\n this.seekFromTo(this.tick, to);\n },\n seekFromTo: function(from, to) {\n this.target = Math.max(0, Math.min(1, to));\n this.tick = Math.max(0, Math.min(1, from));\n this.lastTime = new Date().getTime();\n if (!this.intervalId) {\n this.intervalId = window.setInterval(this.timerDelegate, this.interval);\n }\n },\n stop: function() {\n if (this.intervalId) {\n window.clearInterval(this.intervalId);\n this.intervalId = null;\n\n //this.trigger.call(this);\n this.trigger();\n // this.next();\n }\n },\n play: function(origin) {\n if (this.adapters.length === 0) {\n return;\n }\n if (origin !== null) {\n this.caller = origin;\n }\n this.initState();\n this.seekFromTo(0, 1);\n },\n reverse: function() {\n this.seekFromTo(1, 0);\n },\n initState: function() {\n if (this.adapters.length === 0) {\n return;\n }\n for (var i = 0; i < this.adapters.length; i++) {\n this.adapters[i].initState();\n }\n },\n propagate: function() {\n var value = this.transition(this.tick);\n\n for (var i = 0; i < this.adapters.length; i++) {\n this.adapters[i].update(value);\n }\n },\n onTimerEvent: function() {\n var now = new Date().getTime();\n var timePassed = now - this.lastTime;\n this.lastTime = now;\n var movement = (timePassed / this.duration) * (this.tick < this.target ? 1 : -1);\n if (Math.abs(movement) >= Math.abs(this.tick - this.target)) {\n this.tick = this.target;\n } else {\n this.tick += movement;\n }\n\n try {\n this.propagate();\n } finally {\n this.onStep.call(this);\n if (this.target == this.tick) {\n this.stop();\n }\n }\n }\n });\n\n kendo.deepExtend(diagram, {\n init: function(element) {\n kendo.init(element, diagram.ui);\n },\n\n Utils: Utils,\n Range: Range,\n Ticker: Ticker\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n // Imports ================================================================\n var kendo = window.kendo,\n diagram = kendo.dataviz.diagram,\n Class = kendo.Class,\n deepExtend = kendo.deepExtend,\n dataviz = kendo.dataviz,\n Utils = diagram.Utils,\n Point = dataviz.Point2D,\n isFunction = kendo.isFunction,\n contains = Utils.contains,\n map = $.map;\n\n // Constants ==============================================================\n var HITTESTAREA = 3,\n EPSILON = 1e-06;\n\n deepExtend(Point.fn, {\n plus: function(p) {\n return new Point(this.x + p.x, this.y + p.y);\n },\n minus: function(p) {\n return new Point(this.x - p.x, this.y - p.y);\n },\n offset: function(value) {\n return new Point(this.x - value, this.y - value);\n },\n times: function(s) {\n return new Point(this.x * s, this.y * s);\n },\n normalize: function() {\n if (this.length() === 0) {\n return new Point();\n }\n return this.times(1 / this.length());\n },\n length: function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n toString: function() {\n return \"(\" + this.x + \",\" + this.y + \")\";\n },\n lengthSquared: function() {\n return (this.x * this.x + this.y * this.y);\n },\n middleOf: function MiddleOf(p, q) {\n return new Point(q.x - p.x, q.y - p.y).times(0.5).plus(p);\n },\n toPolar: function(useDegrees) {\n var factor = 1;\n if (useDegrees) {\n factor = 180 / Math.PI;\n }\n var a = Math.atan2(Math.abs(this.y), Math.abs(this.x));\n var halfpi = Math.PI / 2;\n var len = this.length();\n if (this.x === 0) {\n // note that the angle goes down and not the usual mathematical convention\n\n if (this.y === 0) {\n return new Polar(0, 0);\n }\n if (this.y > 0) {\n return new Polar(len, factor * halfpi);\n }\n if (this.y < 0) {\n return new Polar(len, factor * 3 * halfpi);\n }\n }\n else if (this.x > 0) {\n if (this.y === 0) {\n return new Polar(len, 0);\n }\n if (this.y > 0) {\n return new Polar(len, factor * a);\n }\n if (this.y < 0) {\n return new Polar(len, factor * (4 * halfpi - a));\n }\n }\n else {\n if (this.y === 0) {\n return new Polar(len, 2 * halfpi);\n }\n if (this.y > 0) {\n return new Polar(len, factor * (2 * halfpi - a));\n }\n if (this.y < 0) {\n return new Polar(len, factor * (2 * halfpi + a));\n }\n }\n },\n isOnLine: function(from, to) {\n if (from.x > to.x) { // from must be the leftmost point\n var temp = to;\n to = from;\n from = temp;\n }\n var r1 = new Rect(from.x, from.y).inflate(HITTESTAREA, HITTESTAREA),\n r2 = new Rect(to.x, to.y).inflate(HITTESTAREA, HITTESTAREA), o1, u1;\n if (r1.union(r2).contains(this)) {\n if (from.x === to.x || from.y === to.y) {\n return true;\n }\n else if (from.y < to.y) {\n o1 = r1.x + (((r2.x - r1.x) * (this.y - (r1.y + r1.height))) / ((r2.y + r2.height) - (r1.y + r1.height)));\n u1 = (r1.x + r1.width) + ((((r2.x + r2.width) - (r1.x + r1.width)) * (this.y - r1.y)) / (r2.y - r1.y));\n }\n else {\n o1 = r1.x + (((r2.x - r1.x) * (this.y - r1.y)) / (r2.y - r1.y));\n u1 = (r1.x + r1.width) + ((((r2.x + r2.width) - (r1.x + r1.width)) * (this.y - (r1.y + r1.height))) / ((r2.y + r2.height) - (r1.y + r1.height)));\n }\n return (this.x > o1 && this.x < u1);\n }\n return false;\n }\n });\n\n deepExtend(Point, {\n parse: function(str) {\n var tempStr = str.slice(1, str.length - 1),\n xy = tempStr.split(\",\"),\n x = parseInt(xy[0], 10),\n y = parseInt(xy[1], 10);\n if (!isNaN(x) && !isNaN(y)) {\n return new Point(x, y);\n }\n }\n });\n\n /**\n * Structure combining a Point with two additional points representing the handles or tangents attached to the first point.\n * If the additional points are null or equal to the first point the path will be sharp.\n * Left and right correspond to the direction of the underlying path.\n */\n var PathDefiner = Class.extend(\n {\n init: function(p, left, right) {\n this.point = p;\n this.left = left;\n this.right = right;\n }\n }\n );\n\n /**\n * Defines a rectangular region.\n */\n var Rect = Class.extend({\n init: function(x, y, width, height) {\n this.x = x || 0;\n this.y = y || 0;\n this.width = width || 0;\n this.height = height || 0;\n },\n contains: function(point) {\n return ((point.x >= this.x) && (point.x <= (this.x + this.width)) && (point.y >= this.y) && (point.y <= (this.y + this.height)));\n },\n inflate: function(dx, dy) {\n if (dy === undefined$1) {\n dy = dx;\n }\n\n this.x -= dx;\n this.y -= dy;\n this.width += 2 * dx + 1;\n this.height += 2 * dy + 1;\n return this;\n },\n offset: function(dx, dy) {\n var x = dx, y = dy;\n if (dx instanceof Point) {\n x = dx.x;\n y = dx.y;\n }\n this.x += x;\n this.y += y;\n return this;\n },\n union: function(r) {\n var x1 = Math.min(this.x, r.x);\n var y1 = Math.min(this.y, r.y);\n var x2 = Math.max((this.x + this.width), (r.x + r.width));\n var y2 = Math.max((this.y + this.height), (r.y + r.height));\n return new Rect(x1, y1, x2 - x1, y2 - y1);\n },\n center: function() {\n return new Point(this.x + this.width / 2, this.y + this.height / 2);\n },\n top: function() {\n return new Point(this.x + this.width / 2, this.y);\n },\n right: function() {\n return new Point(this.x + this.width, this.y + this.height / 2);\n },\n bottom: function() {\n return new Point(this.x + this.width / 2, this.y + this.height);\n },\n left: function() {\n return new Point(this.x, this.y + this.height / 2);\n },\n topLeft: function() {\n return new Point(this.x, this.y);\n },\n topRight: function() {\n return new Point(this.x + this.width, this.y);\n },\n bottomLeft: function() {\n return new Point(this.x, this.y + this.height);\n },\n bottomRight: function() {\n return new Point(this.x + this.width, this.y + this.height);\n },\n clone: function() {\n return new Rect(this.x, this.y, this.width, this.height);\n },\n isEmpty: function() {\n return !this.width && !this.height;\n },\n equals: function(rect) {\n return this.x === rect.x && this.y === rect.y && this.width === rect.width && this.height === rect.height;\n },\n rotatedBounds: function(angle) {\n var rect = this.clone(),\n points = this.rotatedPoints(angle),\n tl = points[0],\n tr = points[1],\n br = points[2],\n bl = points[3];\n\n rect.x = Math.min(br.x, tl.x, tr.x, bl.x);\n rect.y = Math.min(br.y, tl.y, tr.y, bl.y);\n rect.width = Math.max(br.x, tl.x, tr.x, bl.x) - rect.x;\n rect.height = Math.max(br.y, tl.y, tr.y, bl.y) - rect.y;\n\n return rect;\n },\n rotatedPoints: function(angle) {\n var rect = this,\n c = rect.center(),\n br = rect.bottomRight().rotate(c, 360 - angle),\n tl = rect.topLeft().rotate(c, 360 - angle),\n tr = rect.topRight().rotate(c, 360 - angle),\n bl = rect.bottomLeft().rotate(c, 360 - angle);\n\n return [tl, tr, br, bl];\n },\n toString: function(delimiter) {\n delimiter = delimiter || \" \";\n\n return this.x + delimiter + this.y + delimiter + this.width + delimiter + this.height;\n },\n scale: function(scaleX, scaleY, staicPoint, adornerCenter, angle) {\n var tl = this.topLeft();\n var thisCenter = this.center();\n tl.rotate(thisCenter, 360 - angle).rotate(adornerCenter, angle);\n\n var delta = staicPoint.minus(tl);\n var scaled = new Point(delta.x * scaleX, delta.y * scaleY);\n var position = delta.minus(scaled);\n tl = tl.plus(position);\n tl.rotate(adornerCenter, 360 - angle).rotate(thisCenter, angle);\n\n this.x = tl.x;\n this.y = tl.y;\n\n this.width *= scaleX;\n this.height *= scaleY;\n },\n\n zoom: function(zoom) {\n this.x *= zoom;\n this.y *= zoom;\n this.width *= zoom;\n this.height *= zoom;\n return this;\n },\n\n overlaps: function(rect) {\n var bottomRight = this.bottomRight();\n var rectBottomRight = rect.bottomRight();\n var overlaps = !(bottomRight.x < rect.x || bottomRight.y < rect.y ||\n rectBottomRight.x < this.x || rectBottomRight.y < this.y);\n return overlaps;\n }\n });\n\n var Size = Class.extend({\n init: function(width, height) {\n this.width = width;\n this.height = height;\n }\n });\n\n Size.prototype.Empty = new Size(0, 0);\n\n Rect.toRect = function(rect) {\n if (!(rect instanceof Rect)) {\n rect = new Rect(rect.x, rect.y, rect.width, rect.height);\n }\n\n return rect;\n };\n\n Rect.empty = function() {\n return new Rect(0, 0, 0, 0);\n };\n\n Rect.fromPoints = function(p, q) {\n if (isNaN(p.x) || isNaN(p.y) || isNaN(q.x) || isNaN(q.y)) {\n throw \"Some values are NaN.\";\n }\n return new Rect(Math.min(p.x, q.x), Math.min(p.y, q.y), Math.abs(p.x - q.x), Math.abs(p.y - q.y));\n };\n\n function isNearZero(num) {\n return Math.abs(num) < EPSILON;\n }\n\n function intersectLine(start1, end1, start2, end2, isSegment) {\n var tangensdiff = ((end1.x - start1.x) * (end2.y - start2.y)) - ((end1.y - start1.y) * (end2.x - start2.x));\n if (isNearZero(tangensdiff)) {\n //parallel lines\n return;\n }\n\n var num1 = ((start1.y - start2.y) * (end2.x - start2.x)) - ((start1.x - start2.x) * (end2.y - start2.y));\n var num2 = ((start1.y - start2.y) * (end1.x - start1.x)) - ((start1.x - start2.x) * (end1.y - start1.y));\n var r = num1 / tangensdiff;\n var s = num2 / tangensdiff;\n\n if (isSegment && (r < 0 || r > 1 || s < 0 || s > 1)) {\n //r < 0 => line 1 is below line 2\n //r > 1 => line 1 is above line 2\n //s < 0 => line 2 is below line 1\n //s > 1 => line 2 is above line 1\n return;\n }\n\n return new Point(start1.x + (r * (end1.x - start1.x)), start1.y + (r * (end1.y - start1.y)));\n }\n\n var Intersect = {\n lines: function(start1, end1, start2, end2) {\n return intersectLine(start1, end1, start2, end2);\n },\n segments: function(start1, end1, start2, end2) {\n return intersectLine(start1, end1, start2, end2, true);\n },\n rectWithLine: function(rect, start, end) {\n return Intersect.segments(start, end, rect.topLeft(), rect.topRight()) ||\n Intersect.segments(start, end, rect.topRight(), rect.bottomRight()) ||\n Intersect.segments(start, end, rect.bottomLeft(), rect.bottomRight()) ||\n Intersect.segments(start, end, rect.topLeft(), rect.bottomLeft());\n },\n rects: function(rect1, rect2, angle) {\n var tl = rect2.topLeft(),\n tr = rect2.topRight(),\n bl = rect2.bottomLeft(),\n br = rect2.bottomRight();\n var center = rect2.center();\n if (angle) {\n tl = tl.rotate(center, angle);\n tr = tr.rotate(center, angle);\n bl = bl.rotate(center, angle);\n br = br.rotate(center, angle);\n }\n\n var intersect = rect1.contains(tl) ||\n rect1.contains(tr) ||\n rect1.contains(bl) ||\n rect1.contains(br) ||\n Intersect.rectWithLine(rect1, tl, tr) ||\n Intersect.rectWithLine(rect1, tl, bl) ||\n Intersect.rectWithLine(rect1, tr, br) ||\n Intersect.rectWithLine(rect1, bl, br);\n\n if (!intersect) {//last possible case is rect1 to be completely within rect2\n tl = rect1.topLeft();\n tr = rect1.topRight();\n bl = rect1.bottomLeft();\n br = rect1.bottomRight();\n\n if (angle) {\n var reverseAngle = 360 - angle;\n tl = tl.rotate(center, reverseAngle);\n tr = tr.rotate(center, reverseAngle);\n bl = bl.rotate(center, reverseAngle);\n br = br.rotate(center, reverseAngle);\n }\n\n intersect = rect2.contains(tl) ||\n rect2.contains(tr) ||\n rect2.contains(bl) ||\n rect2.contains(br);\n }\n\n return intersect;\n }\n };\n\n /**\n * Aligns two rectangles, where one is the container and the other is content.\n */\n var RectAlign = Class.extend({\n init: function(container) {\n this.container = Rect.toRect(container);\n },\n\n align: function(content, alignment) {\n var alignValues = alignment.toLowerCase().split(\" \");\n\n for (var i = 0; i < alignValues.length; i++) {\n content = this._singleAlign(content, alignValues[i]);\n }\n\n return content;\n },\n _singleAlign: function(content, alignment) {\n if (isFunction(this[alignment])) {\n return this[alignment](content);\n }\n else {\n return content;\n }\n },\n\n left: function(content) {\n return this._align(content, this._left);\n },\n center: function(content) {\n return this._align(content, this._center);\n },\n right: function(content) {\n return this._align(content, this._right);\n },\n stretch: function(content) {\n return this._align(content, this._stretch);\n },\n top: function(content) {\n return this._align(content, this._top);\n },\n middle: function(content) {\n return this._align(content, this._middle);\n },\n bottom: function(content) {\n return this._align(content, this._bottom);\n },\n\n _left: function(container, content) {\n content.x = container.x;\n },\n _center: function(container, content) {\n content.x = ((container.width - content.width) / 2) || 0;\n },\n _right: function(container, content) {\n content.x = container.width - content.width;\n },\n _top: function(container, content) {\n content.y = container.y;\n },\n _middle: function(container, content) {\n content.y = ((container.height - content.height) / 2) || 0;\n },\n _bottom: function(container, content) {\n content.y = container.height - content.height;\n },\n _stretch: function(container, content) {\n content.x = 0;\n content.y = 0;\n content.height = container.height;\n content.width = container.width;\n },\n _align: function(content, alignCalc) {\n content = Rect.toRect(content);\n alignCalc(this.container, content);\n\n return content;\n }\n });\n\n var Polar = Class.extend({\n init: function(r, a) {\n this.r = r;\n this.angle = a;\n }\n });\n\n /**\n * SVG transformation matrix.\n */\n var Matrix = Class.extend({\n init: function(a, b, c, d, e, f) {\n this.a = a || 0;\n this.b = b || 0;\n this.c = c || 0;\n this.d = d || 0;\n this.e = e || 0;\n this.f = f || 0;\n },\n plus: function(m) {\n this.a += m.a;\n this.b += m.b;\n this.c += m.c;\n this.d += m.d;\n this.e += m.e;\n this.f += m.f;\n },\n minus: function(m) {\n this.a -= m.a;\n this.b -= m.b;\n this.c -= m.c;\n this.d -= m.d;\n this.e -= m.e;\n this.f -= m.f;\n },\n times: function(m) {\n return new Matrix(\n this.a * m.a + this.c * m.b,\n this.b * m.a + this.d * m.b,\n this.a * m.c + this.c * m.d,\n this.b * m.c + this.d * m.d,\n this.a * m.e + this.c * m.f + this.e,\n this.b * m.e + this.d * m.f + this.f\n );\n },\n apply: function(p) {\n return new Point(this.a * p.x + this.c * p.y + this.e, this.b * p.x + this.d * p.y + this.f);\n },\n applyRect: function(r) {\n return Rect.fromPoints(this.apply(r.topLeft()), this.apply(r.bottomRight()));\n },\n toString: function() {\n return \"matrix(\" + this.a + \" \" + this.b + \" \" + this.c + \" \" + this.d + \" \" + this.e + \" \" + this.f + \")\";\n }\n });\n\n deepExtend(Matrix, {\n fromSVGMatrix: function(vm) {\n var m = new Matrix();\n m.a = vm.a;\n m.b = vm.b;\n m.c = vm.c;\n m.d = vm.d;\n m.e = vm.e;\n m.f = vm.f;\n return m;\n },\n fromMatrixVector: function(v) {\n var m = new Matrix();\n m.a = v.a;\n m.b = v.b;\n m.c = v.c;\n m.d = v.d;\n m.e = v.e;\n m.f = v.f;\n return m;\n },\n fromList: function(v) {\n if (v.length !== 6) {\n throw \"The given list should consist of six elements.\";\n }\n var m = new Matrix();\n m.a = v[0];\n m.b = v[1];\n m.c = v[2];\n m.d = v[3];\n m.e = v[4];\n m.f = v[5];\n return m;\n },\n translation: function(x, y) {\n var m = new Matrix();\n m.a = 1;\n m.b = 0;\n m.c = 0;\n m.d = 1;\n m.e = x;\n m.f = y;\n return m;\n },\n unit: function() {\n return new Matrix(1, 0, 0, 1, 0, 0);\n },\n rotation: function(angle, x, y) {\n var m = new Matrix();\n m.a = Math.cos(angle * Math.PI / 180);\n m.b = Math.sin(angle * Math.PI / 180);\n m.c = -m.b;\n m.d = m.a;\n m.e = (x - x * m.a + y * m.b) || 0;\n m.f = (y - y * m.a - x * m.b) || 0;\n return m;\n },\n scaling: function(scaleX, scaleY) {\n var m = new Matrix();\n m.a = scaleX;\n m.b = 0;\n m.c = 0;\n m.d = scaleY;\n m.e = 0;\n m.f = 0;\n return m;\n },\n parse: function(v) {\n var parts, nums;\n if (v) {\n v = v.trim();\n // of the form \"matrix(...)\"\n if (v.slice(0, 6).toLowerCase() === \"matrix\") {\n nums = v.slice(7, v.length - 1).trim();\n parts = nums.split(\",\");\n if (parts.length === 6) {\n return Matrix.fromList(map(parts, function(p) {\n return parseFloat(p);\n }));\n }\n parts = nums.split(\" \");\n if (parts.length === 6) {\n return Matrix.fromList(map(parts, function(p) {\n return parseFloat(p);\n }));\n }\n }\n // of the form \"(...)\"\n if (v.slice(0, 1) === \"(\" && v.slice(v.length - 1) === \")\") {\n v = v.substr(1, v.length - 1);\n }\n if (v.indexOf(\",\") > 0) {\n parts = v.split(\",\");\n if (parts.length === 6) {\n return Matrix.fromList(map(parts, function(p) {\n return parseFloat(p);\n }));\n }\n }\n if (v.indexOf(\" \") > 0) {\n parts = v.split(\" \");\n if (parts.length === 6) {\n return Matrix.fromList(map(parts, function(p) {\n return parseFloat(p);\n }));\n }\n }\n }\n return parts;\n }\n });\n\n /**\n * SVG transformation represented as a vector.\n */\n var MatrixVector = Class.extend({\n init: function(a, b, c, d, e, f) {\n this.a = a || 0;\n this.b = b || 0;\n this.c = c || 0;\n this.d = d || 0;\n this.e = e || 0;\n this.f = f || 0;\n },\n fromMatrix: function FromMatrix(m) {\n var v = new MatrixVector();\n v.a = m.a;\n v.b = m.b;\n v.c = m.c;\n v.d = m.d;\n v.e = m.e;\n v.f = m.f;\n return v;\n }\n });\n\n /**\n * Returns a value with Gaussian (normal) distribution.\n * @param mean The mean value of the distribution.\n * @param deviation The deviation (spreading at half-height) of the distribution.\n * @returns {number}\n */\n function normalVariable(mean, deviation) {\n var x, y, r;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n r = x * x + y * y;\n }\n while (!r || r > 1);\n return mean + deviation * x * Math.sqrt(-2 * Math.log(r) / r);\n }\n\n /**\n * Returns a random identifier which can be used as an ID of objects, eventually augmented with a prefix.\n * @returns {string}\n */\n function randomId(length) {\n if (Utils.isUndefined(length)) {\n length = 10;\n }\n // old version return Math.floor((1 + Math.random()) * 0x1000000).toString(16).substring(1);\n var result = '';\n var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n for (var i = length; i > 0; --i) {\n result += chars.charAt(Math.round(Math.random() * (chars.length - 1)));\n }\n return result;\n }\n\n var Geometry = {\n\n /**\n * Returns the squared distance to the line defined by the two given Points.\n * @param p An arbitrary Point.\n * @param a An endpoint of the line or segment.\n * @param b The complementary endpoint of the line or segment.\n */\n _distanceToLineSquared: function(p, a, b) {\n function d2(pt1, pt2) {\n return (pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y);\n }\n\n if (a === b) { // returns the distance of p to a\n return d2(p, a);\n }\n\n var vx = b.x - a.x,\n vy = b.y - a.y,\n dot = (p.x - a.x) * vx + (p.y - a.y) * vy;\n if (dot < 0) {\n return d2(a, p); // sits on side of a\n }\n\n dot = (b.x - p.x) * vx + (b.y - p.y) * vy;\n if (dot < 0) {\n return d2(b, p); // sits on side of b\n }\n // regular case, use crossproduct to get the sine out\n dot = (b.x - p.x) * vy - (b.y - p.y) * vx;\n return dot * dot / (vx * vx + vy * vy);\n },\n\n /**\n * Returns the distance to the line defined by the two given Points.\n * @param p An arbitrary Point.\n * @param a An endpoint of the line or segment.\n * @param b The complementary endpoint of the line or segment.\n */\n distanceToLine: function(p, a, b) {\n return Math.sqrt(this._distanceToLineSquared(p, a, b));\n },\n\n /**\n * Returns the distance of the given points to the polyline defined by the points.\n * @param p An arbitrary point.\n * @param points The points defining the polyline.\n * @returns {Number}\n */\n distanceToPolyline: function(p, points) {\n var minimum = Number.MAX_VALUE;\n if (Utils.isUndefined(points) || points.length === 0) {\n return Number.MAX_VALUE;\n }\n for (var s = 0; s < points.length - 1; s++) {\n var p1 = points[s];\n var p2 = points[s + 1];\n\n var d = this._distanceToLineSquared(p, p1, p2);\n if (d < minimum) {\n minimum = d;\n }\n }\n return Math.sqrt(minimum);\n }\n };\n\n /*---------------The HashTable structure--------------------------------*/\n\n /**\n * Represents a collection of key-value pairs that are organized based on the hash code of the key.\n * _buckets[hashId] = {key: key, value:...}\n * Important: do not use the standard Array access method, use the get/set methods instead.\n * See http://en.wikipedia.org/wiki/Hash_table\n */\n var HashTable = kendo.Class.extend({\n init: function() {\n this._buckets = [];\n this.length = 0;\n },\n\n /**\n * Adds the literal object with the given key (of the form {key: key,....}).\n */\n add: function(key, value) {\n\n var obj = this._createGetBucket(key);\n if (Utils.isDefined(value)) {\n obj.value = value;\n }\n return obj;\n },\n\n /**\n * Gets the literal object with the given key.\n */\n get: function(key) {\n if (this._bucketExists(key)) {\n return this._createGetBucket(key);\n }\n return null;\n },\n\n /**\n * Set the key-value pair.\n * @param key The key of the entry.\n * @param value The value to set. If the key already exists the value will be overwritten.\n */\n set: function(key, value) {\n this.add(key, value);\n },\n\n /**\n * Determines whether the HashTable contains a specific key.\n */\n containsKey: function(key) {\n return this._bucketExists(key);\n },\n\n /**\n * Removes the element with the specified key from the hashtable.\n * Returns the removed bucket.\n */\n remove: function(key) {\n if (this._bucketExists(key)) {\n var hashId = this._hash(key);\n delete this._buckets[hashId];\n this.length--;\n return key;\n }\n },\n\n /**\n * Foreach with an iterator working on the key-value pairs.\n * @param func\n */\n forEach: function(func) {\n var hashes = this._hashes();\n for (var i = 0, len = hashes.length; i < len; i++) {\n var hash = hashes[i];\n var bucket = this._buckets[hash];\n if (Utils.isUndefined(bucket)) {\n continue;\n }\n func(bucket);\n }\n },\n\n /**\n * Returns a (shallow) clone of the current HashTable.\n * @returns {HashTable}\n */\n clone: function() {\n var ht = new HashTable();\n var hashes = this._hashes();\n for (var i = 0, len = hashes.length; i < len; i++) {\n var hash = hashes[i];\n var bucket = this._buckets[hash];\n if (Utils.isUndefined(bucket)) {\n continue;\n }\n ht.add(bucket.key, bucket.value);\n }\n return ht;\n },\n\n /**\n * Returns the hashes of the buckets.\n * @returns {Array}\n * @private\n */\n _hashes: function() {\n var hashes = [];\n for (var hash in this._buckets) {\n if (this._buckets.hasOwnProperty(hash)) {\n hashes.push(hash);\n }\n }\n return hashes;\n },\n\n _bucketExists: function(key) {\n var hashId = this._hash(key);\n return Utils.isDefined(this._buckets[hashId]);\n },\n\n /**\n * Returns-adds the createGetBucket with the given key. If not present it will\n * be created and returned.\n * A createGetBucket is a literal object of the form {key: key, ...}.\n */\n _createGetBucket: function(key) {\n var hashId = this._hash(key);\n var bucket = this._buckets[hashId];\n if (Utils.isUndefined(bucket)) {\n bucket = { key: key };\n this._buckets[hashId] = bucket;\n this.length++;\n }\n return bucket;\n },\n\n /**\n * Hashing of the given key.\n */\n _hash: function(key) {\n if (Utils.isNumber(key)) {\n return key;\n }\n if (Utils.isString(key)) {\n return this._hashString(key);\n }\n if (Utils.isObject(key)) {\n return this._objectHashId(key);\n }\n throw \"Unsupported key type.\";\n },\n\n /**\n * Hashing of a string.\n */\n _hashString: function(s) {\n // see for example http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery\n var result = 0;\n if (s.length === 0) {\n return result;\n }\n for (var i = 0; i < s.length; i++) {\n var ch = s.charCodeAt(i);\n result = ((result * 32) - result) + ch;\n }\n return result;\n },\n\n /**\n * Returns the unique identifier for an object. This is automatically assigned and add on the object.\n */\n _objectHashId: function(key) {\n var id = key._hashId;\n if (Utils.isUndefined(id)) {\n id = randomId();\n key._hashId = id;\n }\n return id;\n }\n });\n\n /*---------------The Dictionary structure--------------------------------*/\n\n /**\n * Represents a collection of key-value pairs.\n * Important: do not use the standard Array access method, use the get/Set methods instead.\n */\n var Dictionary = kendo.Observable.extend({\n /**\n * Initializes a new instance of the Dictionary class.\n * @param dictionary Loads the content of the given dictionary into this new one.\n */\n init: function(dictionary) {\n var that = this;\n kendo.Observable.fn.init.call(that);\n this._hashTable = new HashTable();\n this.length = 0;\n if (Utils.isDefined(dictionary)) {\n if (Array.isArray(dictionary)) {\n for (var i = 0; i < dictionary.length; i++) {\n this.add(dictionary[i]);\n }\n } else {\n dictionary.forEach(function(k, v) {\n this.add(k, v);\n }, this);\n }\n }\n },\n\n /**\n * Adds a key-value to the dictionary.\n * If the key already exists this will assign the given value to the existing entry.\n */\n add: function(key, value) {\n var entry = this._hashTable.get(key);\n if (!entry) {\n entry = this._hashTable.add(key);\n this.length++;\n this.trigger('changed');\n }\n entry.value = value;\n },\n\n /**\n * Set the key-value pair.\n * @param key The key of the entry.\n * @param value The value to set. If the key already exists the value will be overwritten.\n */\n set: function(key, value) {\n this.add(key, value);\n },\n\n /**\n * Gets the value associated with the given key in the dictionary.\n */\n get: function(key) {\n var entry = this._hashTable.get(key);\n if (entry) {\n return entry.value;\n }\n throw new Error(\"Cannot find key \" + key);\n },\n\n /**\n * Returns whether the dictionary contains the given key.\n */\n containsKey: function(key) {\n return this._hashTable.containsKey(key);\n },\n\n /**\n * Removes the element with the specified key from the dictionary.\n */\n remove: function(key) {\n if (this.containsKey(key)) {\n this.trigger(\"changed\");\n this.length--;\n return this._hashTable.remove(key);\n }\n },\n\n /**\n * The functional gets the key and value as parameters.\n */\n forEach: function(func, thisRef) {\n this._hashTable.forEach(function(entry) {\n func.call(thisRef, entry.key, entry.value);\n });\n },\n\n /**\n * Same as forEach except that only the value is passed to the functional.\n */\n forEachValue: function(func, thisRef) {\n this._hashTable.forEach(function(entry) {\n func.call(thisRef, entry.value);\n });\n },\n\n /**\n * Calls a defined callback function for each key in the dictionary.\n */\n forEachKey: function(func, thisRef) {\n this._hashTable.forEach(function(entry) {\n func.call(thisRef, entry.key);\n });\n },\n\n /**\n * Gets an array with all keys in the dictionary.\n */\n keys: function() {\n var keys = [];\n this.forEachKey(function(key) {\n keys.push(key);\n });\n return keys;\n }\n });\n\n /*---------------Queue structure--------------------------------*/\n\n var Queue = kendo.Class.extend({\n\n init: function() {\n this._tail = null;\n this._head = null;\n this.length = 0;\n },\n\n /**\n * Enqueues an object to the end of the queue.\n */\n enqueue: function(value) {\n var entry = { value: value, next: null };\n if (!this._head) {\n this._head = entry;\n this._tail = this._head;\n }\n else {\n this._tail.next = entry;\n this._tail = this._tail.next;\n }\n this.length++;\n },\n\n /**\n * Removes and returns the object at top of the queue.\n */\n dequeue: function() {\n if (this.length < 1) {\n throw new Error(\"The queue is empty.\");\n }\n var value = this._head.value;\n this._head = this._head.next;\n this.length--;\n return value;\n },\n\n contains: function(item) {\n var current = this._head;\n while (current) {\n if (current.value === item) {\n return true;\n }\n current = current.next;\n }\n return false;\n }\n });\n\n\n /**\n * While other data structures can have multiple times the same item a Set owns only\n * once a particular item.\n * @type {*}\n */\n var Set = kendo.Observable.extend({\n init: function(resource) {\n var that = this;\n kendo.Observable.fn.init.call(that);\n this._hashTable = new HashTable();\n this.length = 0;\n if (Utils.isDefined(resource)) {\n if (resource instanceof HashTable) {\n resource.forEach(function(d) {\n this.add(d);\n });\n }\n else if (resource instanceof Dictionary) {\n resource.forEach(function(k, v) {\n this.add({ key: k, value: v });\n }, this);\n }\n }\n },\n\n contains: function(item) {\n return this._hashTable.containsKey(item);\n },\n\n add: function(item) {\n var entry = this._hashTable.get(item);\n if (!entry) {\n this._hashTable.add(item, item);\n this.length++;\n this.trigger('changed');\n }\n },\n\n get: function(item) {\n if (this.contains(item)) {\n return this._hashTable.get(item).value;\n }\n else {\n return null;\n }\n },\n\n /**\n * Returns the hash of the item.\n * @param item\n * @returns {*}\n */\n hash: function(item) {\n return this._hashTable._hash(item);\n },\n\n /**\n * Removes the given item from the set. No exception is thrown if the item is not in the Set.\n * @param item\n */\n remove: function(item) {\n if (this.contains(item)) {\n this._hashTable.remove(item);\n this.length--;\n this.trigger('changed');\n }\n },\n /**\n * Foreach with an iterator working on the key-value pairs.\n * @param func\n */\n forEach: function(func, context) {\n this._hashTable.forEach(function(kv) {\n func(kv.value);\n }, context);\n },\n toArray: function() {\n var r = [];\n this.forEach(function(d) {\n r.push(d);\n });\n return r;\n }\n });\n\n /*----------------Node-------------------------------*/\n\n /**\n * Defines the node (vertex) of a Graph.\n */\n var Node = kendo.Class.extend({\n\n init: function(id, shape) {\n\n /**\n * Holds all the links incident with the current node.\n * Do not use this property to manage the incoming links, use the appropriate add/remove methods instead.\n */\n this.links = [];\n\n /**\n * Holds the links from the current one to another Node .\n * Do not use this property to manage the incoming links, use the appropriate add/remove methods instead.\n */\n this.outgoing = [];\n\n /**\n * Holds the links from another Node to the current one.\n * Do not use this property to manage the incoming links, use the appropriate add/remove methods instead.\n */\n this.incoming = [];\n\n /**\n * Holds the weight of this Node.\n */\n this.weight = 1;\n\n if (Utils.isDefined(id)) {\n this.id = id;\n }\n else {\n this.id = randomId();\n }\n if (Utils.isDefined(shape)) {\n this.associatedShape = shape;\n // transfer the shape's bounds to the runtime props\n var b = shape.bounds();\n this.width = b.width;\n this.height = b.height;\n this.x = b.x;\n this.y = b.y;\n }\n else {\n this.associatedShape = null;\n }\n /**\n * The payload of the node.\n * @type {null}\n */\n this.data = null;\n this.type = \"Node\";\n this.shortForm = \"Node '\" + this.id + \"'\";\n /**\n * Whether this is an injected node during the analysis or layout process.\n * @type {boolean}\n */\n this.isVirtual = false;\n },\n\n /**\n * Returns whether this node has no links attached.\n */\n isIsolated: function() {\n return Utils.isEmpty(this.links);\n },\n\n /**\n * Gets or sets the bounding rectangle of this node.\n * This should be considered as runtime data, the property is not hotlinked to a SVG item.\n */\n bounds: function(r) {\n if (!Utils.isDefined(r)) {\n return new diagram.Rect(this.x, this.y, this.width, this.height);\n }\n\n this.x = r.x;\n this.y = r.y;\n this.width = r.width;\n this.height = r.height;\n },\n\n /**\n * Returns whether there is at least one link with the given (complementary) node. This can be either an\n * incoming or outgoing link.\n */\n isLinkedTo: function(node) {\n var that = this;\n return Utils.any(that.links, function(link) {\n return link.getComplement(that) === node;\n });\n },\n\n /**\n * Gets the children of this node, defined as the adjacent nodes with a link from this node to the adjacent one.\n * @returns {Array}\n */\n getChildren: function() {\n if (this.outgoing.length === 0) {\n return [];\n }\n var children = [];\n for (var i = 0, len = this.outgoing.length; i < len; i++) {\n var link = this.outgoing[i];\n children.push(link.getComplement(this));\n }\n return children;\n },\n\n /**\n * Gets the parents of this node, defined as the adjacent nodes with a link from the adjacent node to this one.\n * @returns {Array}\n */\n getParents: function() {\n if (this.incoming.length === 0) {\n return [];\n }\n var parents = [];\n for (var i = 0, len = this.incoming.length; i < len; i++) {\n var link = this.incoming[i];\n parents.push(link.getComplement(this));\n }\n return parents;\n },\n\n /**\n * Returns a clone of the Node. Note that the identifier is not cloned since it's a different Node instance.\n * @returns {Node}\n */\n clone: function() {\n var copy = new Node();\n if (Utils.isDefined(this.weight)) {\n copy.weight = this.weight;\n }\n if (Utils.isDefined(this.balance)) {\n copy.balance = this.balance;\n }\n if (Utils.isDefined(this.owner)) {\n copy.owner = this.owner;\n }\n copy.associatedShape = this.associatedShape;\n copy.x = this.x;\n copy.y = this.y;\n copy.width = this.width;\n copy.height = this.height;\n return copy;\n },\n\n /**\n * Returns whether there is a link from the current node to the given node.\n */\n adjacentTo: function(node) {\n return this.isLinkedTo(node) !== null;\n },\n\n /**\n * Removes the given link from the link collection this node owns.\n * @param link\n */\n removeLink: function(link) {\n if (link.source === this) {\n Utils.remove(this.links, link);\n Utils.remove(this.outgoing, link);\n link.source = null;\n }\n\n if (link.target === this) {\n Utils.remove(this.links, link);\n Utils.remove(this.incoming, link);\n link.target = null;\n }\n },\n\n /**\n * Returns whether there is a (outgoing) link from the current node to the given one.\n */\n hasLinkTo: function(node) {\n return Utils.any(this.outgoing, function(link) {\n return link.target === node;\n });\n },\n\n /**\n * Returns the degree of this node, i.e. the sum of incoming and outgoing links.\n */\n degree: function() {\n return this.links.length;\n },\n\n /**\n * Returns whether this node is either the source or the target of the given link.\n */\n incidentWith: function(link) {\n return contains(this.links, link);\n },\n\n /**\n * Returns the links between this node and the given one.\n */\n getLinksWith: function(node) {\n return Utils.all(this.links, function(link) {\n return link.getComplement(this) === node;\n }, this);\n },\n\n /**\n * Returns the nodes (either parent or child) which are linked to the current one.\n */\n getNeighbors: function() {\n var neighbors = [];\n Utils.forEach(this.incoming, function(e) {\n neighbors.push(e.getComplement(this));\n }, this);\n Utils.forEach(this.outgoing, function(e) {\n neighbors.push(e.getComplement(this));\n }, this);\n return neighbors;\n }\n });\n\n /**\n * Defines a directed link (edge, connection) of a Graph.\n */\n var Link = kendo.Class.extend({\n\n init: function(source, target, id, connection) {\n if (Utils.isUndefined(source)) {\n throw \"The source of the new link is not set.\";\n }\n if (Utils.isUndefined(target)) {\n throw \"The target of the new link is not set.\";\n }\n var sourceFound, targetFound;\n if (Utils.isString(source)) {\n sourceFound = new Node(source);\n }\n else {\n sourceFound = source;\n }\n if (Utils.isString(target)) {\n targetFound = new Node(target);\n }\n else {\n targetFound = target;\n }\n\n this.source = sourceFound;\n this.target = targetFound;\n this.source.links.push(this);\n this.target.links.push(this);\n this.source.outgoing.push(this);\n this.target.incoming.push(this);\n if (Utils.isDefined(id)) {\n this.id = id;\n }\n else {\n this.id = randomId();\n }\n if (Utils.isDefined(connection)) {\n this.associatedConnection = connection;\n }\n else {\n this.associatedConnection = null;\n }\n this.type = \"Link\";\n this.shortForm = \"Link '\" + this.source.id + \"->\" + this.target.id + \"'\";\n },\n\n /**\n * Returns the complementary node of the given one, if any.\n */\n getComplement: function(node) {\n if (this.source !== node && this.target !== node) {\n throw \"The given node is not incident with this link.\";\n }\n return this.source === node ? this.target : this.source;\n },\n\n /**\n * Returns the overlap of the current link with the given one, if any.\n */\n getCommonNode: function(link) {\n if (this.source === link.source || this.source === link.target) {\n return this.source;\n }\n if (this.target === link.source || this.target === link.target) {\n return this.target;\n }\n return null;\n },\n\n /**\n * Returns whether the current link is bridging the given nodes.\n */\n isBridging: function(v1, v2) {\n return this.source === v1 && this.target === v2 || this.source === v2 && this.target === v1;\n },\n\n /**\n * Returns the source and target of this link as a tuple.\n */\n getNodes: function() {\n return [this.source, this.target];\n },\n\n /**\n * Returns whether the given node is either the source or the target of the current link.\n */\n incidentWith: function(node) {\n return this.source === node || this.target === node;\n },\n\n /**\n * Returns whether the given link is a continuation of the current one. This can be both\n * via an incoming or outgoing link.\n */\n adjacentTo: function(link) {\n return contains(this.source.links, link) || contains(this.target.links, link);\n },\n\n /**\n * Changes the source-node of this link.\n */\n changeSource: function(node) {\n Utils.remove(this.source.links, this);\n Utils.remove(this.source.outgoing, this);\n\n node.links.push(this);\n node.outgoing.push(this);\n\n this.source = node;\n },\n\n /**\n * Changes the target-node of this link.\n * @param node\n */\n changeTarget: function(node) {\n Utils.remove(this.target.links, this);\n Utils.remove(this.target.incoming, this);\n\n node.links.push(this);\n node.incoming.push(this);\n\n this.target = node;\n },\n\n /**\n * Changes both the source and the target nodes of this link.\n */\n changesNodes: function(v, w) {\n if (this.source === v) {\n this.changeSource(w);\n }\n else if (this.target === v) {\n this.changeTarget(w);\n }\n },\n\n /**\n * Reverses the direction of this link.\n */\n reverse: function() {\n var oldSource = this.source;\n var oldTarget = this.target;\n\n this.source = oldTarget;\n Utils.remove(oldSource.outgoing, this);\n this.source.outgoing.push(this);\n\n this.target = oldSource;\n Utils.remove(oldTarget.incoming, this);\n this.target.incoming.push(this);\n return this;\n },\n\n /**\n * Ensures that the given target defines the endpoint of this link.\n */\n directTo: function(target) {\n if (this.source !== target && this.target !== target) {\n throw \"The given node is not incident with this link.\";\n }\n if (this.target !== target) {\n this.reverse();\n }\n },\n\n /**\n * Returns a reversed clone of this link.\n */\n createReverseEdge: function() {\n var r = this.clone();\n r.reverse();\n r.reversed = true;\n return r;\n },\n\n /**\n * Returns a clone of this link.\n */\n clone: function() {\n var clone = new Link(this.source, this.target);\n return clone;\n }\n });\n\n /*--------------Graph structure---------------------------------*/\n /**\n * Defines a directed graph structure.\n * Note that the incidence structure resides in the nodes through the incoming and outgoing links collection, rahter than\n * inside the Graph.\n */\n var Graph = kendo.Class.extend({\n init: function(idOrDiagram) {\n /**\n * The links or edge collection of this Graph.\n * @type {Array}\n */\n this.links = [];\n /**\n * The node or vertex collection of this Graph.\n * @type {Array}\n */\n this.nodes = [];\n\n this._nodeMap = new Dictionary();\n /**\n * The optional reference to the Diagram on which this Graph is based.\n * @type {null}\n */\n this.diagram = null;\n\n /**\n * The root of this Graph. If not set explicitly the first Node with zero incoming links will be taken.\n * @type {null}\n * @private\n */\n this._root = null;\n if (Utils.isDefined(idOrDiagram)) {\n if (Utils.isString(idOrDiagram)) {\n this.id = idOrDiagram;\n }\n else {\n this.diagram = idOrDiagram;\n this.id = idOrDiagram.id;\n }\n }\n else {\n this.id = randomId();\n }\n\n /**\n * The bounds of this graph if the nodes have spatial extension defined.\n * @type {Rect}\n */\n this.bounds = new Rect();\n // keeps track whether the children & parents have been created\n this._hasCachedRelationships = false;\n this.type = \"Graph\";\n },\n /**\n * Caches the relational information of parents and children in the 'parents' and 'children'\n * properties.\n * @param forceRebuild If set to true the relational info will be rebuild even if already present.\n */\n cacheRelationships: function(forceRebuild) {\n if (Utils.isUndefined(forceRebuild)) {\n forceRebuild = false;\n }\n if (this._hasCachedRelationships && !forceRebuild) {\n return;\n }\n for (var i = 0, len = this.nodes.length; i < len; i++) {\n var node = this.nodes[i];\n node.children = this.getChildren(node);\n node.parents = this.getParents(node);\n }\n this._hasCachedRelationships = true;\n },\n\n /**\n * Assigns tree-levels to the nodes assuming this is a tree graph.\n * If not connected or not a tree the process will succeed but\n * will have little meaning.\n * @param startNode The node from where the level numbering starts, usually the root of the tree.\n * @param visited The collection of visited nodes.\n * @param offset The offset or starting counter of the level info.\n */\n assignLevels: function(startNode, offset, visited) {\n if (!startNode) {\n throw \"Start node not specified.\";\n }\n if (Utils.isUndefined(offset)) {\n offset = 0;\n }\n // if not done before, cache the parents and children\n this.cacheRelationships();\n if (Utils.isUndefined(visited)) {\n visited = new Dictionary();\n Utils.forEach(this.nodes, function(n) {\n visited.add(n, false);\n });\n }\n visited.set(startNode, true);\n startNode.level = offset;\n var children = startNode.children;\n for (var i = 0, len = children.length; i < len; i++) {\n var child = children[i];\n if (!child || visited.get(child)) {\n continue;\n }\n this.assignLevels(child, offset + 1, visited);\n }\n },\n\n /**\n * Gets or set the root of this graph.\n * If not set explicitly the first Node with zero incoming links will be taken.\n * @param value\n * @returns {*}\n */\n root: function(value) {\n if (Utils.isUndefined(value)) {\n if (!this._root) {\n // TODO: better to use the longest path for the most probable root?\n var found = Utils.first(this.nodes, function(n) {\n return n.incoming.length === 0;\n });\n if (found) {\n return found;\n }\n return Utils.first(this.nodes);\n }\n else {\n return this._root;\n }\n }\n else {\n this._root = value;\n }\n },\n\n /**\n * Returns the connected components of this graph.\n * Note that the returned graphs are made up of the nodes and links of this graph, i.e. a pointer to the items of this graph.\n * If you alter the items of the components you'll alter the original graph and vice versa.\n * @returns {Array}\n */\n getConnectedComponents: function() {\n this.componentIndex = 0;\n this.setItemIndices();\n var componentId = Utils.initArray(this.nodes.length, -1);\n\n for (var v = 0; v < this.nodes.length; v++) {\n if (componentId[v] === -1) {\n this._collectConnectedNodes(componentId, v);\n this.componentIndex++;\n }\n }\n\n var components = [], i;\n for (i = 0; i < this.componentIndex; ++i) {\n components[i] = new Graph();\n }\n for (i = 0; i < componentId.length; ++i) {\n var graph = components[componentId[i]];\n graph.addNodeAndOutgoings(this.nodes[i]);\n }\n // sorting the components in decreasing order of node count\n components.sort(function(a, b) {\n return b.nodes.length - a.nodes.length;\n });\n return components;\n },\n\n _collectConnectedNodes: function(setIds, nodeIndex) {\n setIds[nodeIndex] = this.componentIndex; // part of the current component\n var node = this.nodes[nodeIndex];\n Utils.forEach(node.links,\n function(link) {\n var next = link.getComplement(node);\n var nextId = next.index;\n if (setIds[nextId] === -1) {\n this._collectConnectedNodes(setIds, nextId);\n }\n }, this);\n },\n\n /**\n * Calculates the bounds of this Graph if the Nodes have spatial dimensions defined.\n * @returns {Rect}\n */\n calcBounds: function() {\n if (this.isEmpty()) {\n this.bounds = new Rect();\n return this.bounds;\n }\n var b = null;\n for (var i = 0, len = this.nodes.length; i < len; i++) {\n var node = this.nodes[i];\n if (!b) {\n b = node.bounds();\n }\n else {\n b = b.union(node.bounds());\n }\n }\n this.bounds = b;\n return this.bounds;\n },\n\n /**\n * Creates a spanning tree for the current graph.\n * Important: this will not return a spanning forest if the graph is disconnected.\n * Prim's algorithm finds a minimum-cost spanning tree of an edge-weighted, connected, undirected graph;\n * see http://en.wikipedia.org/wiki/Prim%27s_algorithm .\n * @param root The root of the spanning tree.\n * @returns {Graph}\n */\n getSpanningTree: function(root) {\n var tree = new Graph();\n var map = new Dictionary(), source, target;\n tree.root = root.clone();\n tree.root.level = 0;\n tree.root.id = root.id;\n map.add(root, tree.root);\n root.level = 0;\n\n var visited = [];\n var remaining = [];\n tree._addNode(tree.root);\n visited.push(root);\n remaining.push(root);\n\n var levelCount = 1;\n while (remaining.length > 0) {\n var next = remaining.pop();\n for (var ni = 0; ni < next.links.length; ni++) {\n var link = next.links[ni];\n var cn = link.getComplement(next);\n if (contains(visited, cn)) {\n continue;\n }\n\n cn.level = next.level + 1;\n if (levelCount < cn.level + 1) {\n levelCount = cn.level + 1;\n }\n if (!contains(remaining, cn)) {\n remaining.push(cn);\n }\n if (!contains(visited, cn)) {\n visited.push(cn);\n }\n if (map.containsKey(next)) {\n source = map.get(next);\n }\n else {\n source = next.clone();\n source.level = next.level;\n source.id = next.id;\n map.add(next, source);\n }\n if (map.containsKey(cn)) {\n target = map.get(cn);\n }\n else {\n target = cn.clone();\n target.level = cn.level;\n target.id = cn.id;\n map.add(cn, target);\n }\n var newLink = new Link(source, target);\n tree.addLink(newLink);\n }\n\n }\n\n var treeLevels = [];\n for (var i = 0; i < levelCount; i++) {\n treeLevels.push([]);\n }\n\n Utils.forEach(tree.nodes, function(node) {\n treeLevels[node.level].push(node);\n });\n\n tree.treeLevels = treeLevels;\n tree.cacheRelationships();\n return tree;\n },\n\n /**\n * Returns a random node in this graph.\n * @param excludedNodes The collection of nodes which should not be considered.\n * @param incidenceLessThan The maximum degree or incidence the random node should have.\n * @returns {*}\n */\n takeRandomNode: function(excludedNodes, incidenceLessThan) {\n if (Utils.isUndefined(excludedNodes)) {\n excludedNodes = [];\n }\n if (Utils.isUndefined(incidenceLessThan)) {\n incidenceLessThan = 4;\n }\n if (this.nodes.length === 0) {\n return null;\n }\n if (this.nodes.length === 1) {\n return contains(excludedNodes, this.nodes[0]) ? null : this.nodes[0];\n }\n var pool = $.grep(this.nodes, function(node) {\n return !contains(excludedNodes, node) && node.degree() <= incidenceLessThan;\n });\n if (Utils.isEmpty(pool)) {\n return null;\n }\n return pool[Utils.randomInteger(0, pool.length)];\n },\n\n /**\n * Returns whether this is an empty graph.\n */\n isEmpty: function() {\n return Utils.isEmpty(this.nodes);\n },\n\n /**\n * Checks whether the endpoints of the links are all in the nodes collection.\n */\n isHealthy: function() {\n return Utils.all(this.links, function(link) {\n return contains(this.nodes, link.source) && contains(this.nodes, link.target);\n }, this);\n },\n\n /**\n * Gets the parents of this node, defined as the adjacent nodes with a link from the adjacent node to this one.\n * @returns {Array}\n */\n getParents: function(n) {\n if (!this.hasNode(n)) {\n throw \"The given node is not part of this graph.\";\n }\n return n.getParents();\n },\n\n /**\n * Gets the children of this node, defined as the adjacent nodes with a link from this node to the adjacent one.\n * @returns {Array}\n */\n getChildren: function(n) {\n if (!this.hasNode(n)) {\n throw \"The given node is not part of this graph.\";\n }\n return n.getChildren();\n },\n\n /**\n * Adds a new link to the graph between the given nodes.\n */\n addLink: function(sourceOrLink, target, owner) {\n\n if (Utils.isUndefined(sourceOrLink)) {\n throw \"The source of the link is not defined.\";\n }\n if (Utils.isUndefined(target)) {\n // can only be undefined if the first one is a Link\n if (Utils.isDefined(sourceOrLink.type) && sourceOrLink.type === \"Link\") {\n this.addExistingLink(sourceOrLink);\n return;\n }\n else {\n throw \"The target of the link is not defined.\";\n }\n }\n\n var foundSource = this.getNode(sourceOrLink);\n if (Utils.isUndefined(foundSource)) {\n foundSource = this.addNode(sourceOrLink);\n }\n var foundTarget = this.getNode(target);\n if (Utils.isUndefined(foundTarget)) {\n foundTarget = this.addNode(target);\n }\n\n var newLink = new Link(foundSource, foundTarget);\n\n if (Utils.isDefined(owner)) {\n newLink.owner = owner;\n }\n\n /*newLink.source.outgoing.push(newLink);\n newLink.source.links.push(newLink);\n newLink.target.incoming.push(newLink);\n newLink.target.links.push(newLink);*/\n\n this.links.push(newLink);\n\n return newLink;\n },\n\n /**\n * Removes all the links in this graph.\n */\n removeAllLinks: function() {\n while (this.links.length > 0) {\n var link = this.links[0];\n this.removeLink(link);\n }\n },\n\n /**\n * Adds the given link to the current graph.\n */\n addExistingLink: function(link) {\n\n if (this.hasLink(link)) {\n return;\n }\n this.links.push(link);\n if (this.hasNode(link.source.id)) {\n // priority to the existing node with the id even if other props are different\n var s = this.getNode(link.source.id);\n link.changeSource(s);\n }\n else {\n this.addNode(link.source);\n }\n\n if (this.hasNode(link.target.id)) {\n var t = this.getNode(link.target.id);\n link.changeTarget(t);\n }\n else {\n this.addNode(link.target);\n }\n\n /* if (!link.source.outgoing.contains(link)) {\n link.source.outgoing.push(link);\n }\n if (!link.source.links.contains(link)) {\n link.source.links.push(link);\n }\n if (!link.target.incoming.contains(link)) {\n link.target.incoming.push(link);\n }\n if (!link.target.links.contains(link)) {\n link.target.links.push(link);\n }*/\n },\n\n /**\n * Returns whether the given identifier or Link is part of this graph.\n * @param linkOrId An identifier or a Link object.\n * @returns {*}\n */\n hasLink: function(linkOrId) {\n if (Utils.isString(linkOrId)) {\n return Utils.any(this.links, function(link) {\n return link.id === linkOrId;\n });\n }\n if (linkOrId.type === \"Link\") {\n return contains(this.links, linkOrId);\n }\n throw \"The given object is neither an identifier nor a Link.\";\n },\n /**\n * Gets the node with the specified Id or null if not part of this graph.\n */\n getNode: function(nodeOrId) {\n var id = nodeOrId.id || nodeOrId;\n if (this._nodeMap.containsKey(id)) {\n return this._nodeMap.get(id);\n }\n },\n\n /**\n * Returns whether the given node or node Id is part of this graph.\n */\n hasNode: function(nodeOrId) {\n var id = nodeOrId.id || nodeOrId;\n return this._nodeMap.containsKey(id);\n },\n\n _addNode: function(node) {\n this.nodes.push(node);\n this._nodeMap.add(node.id, node);\n },\n\n _removeNode: function(node) {\n Utils.remove(this.nodes, node);\n this._nodeMap.remove(node.id);\n },\n\n /**\n * Removes the given node from this graph.\n * The node can be specified as an object or as an identifier (string).\n */\n removeNode: function(nodeOrId) {\n var n = nodeOrId;\n if (Utils.isString(nodeOrId)) {\n n = this.getNode(nodeOrId);\n }\n\n if (Utils.isDefined(n)) {\n var links = n.links;\n n.links = [];\n for (var i = 0, len = links.length; i < len; i++) {\n var link = links[i];\n this.removeLink(link);\n }\n this._removeNode(n);\n }\n else {\n throw \"The identifier should be a Node or the Id (string) of a node.\";\n }\n },\n\n /**\n * Returns whether the given nodes are connected with a least one link independently of the direction.\n */\n areConnected: function(n1, n2) {\n return Utils.any(this.links, function(link) {\n return link.source == n1 && link.target == n2 || link.source == n2 && link.target == n1;\n });\n },\n\n /**\n * Removes the given link from this graph.\n */\n removeLink: function(link) {\n /* if (!this.links.contains(link)) {\n throw \"The given link is not part of the Graph.\";\n }\n */\n Utils.remove(this.links, link);\n\n Utils.remove(link.source.outgoing, link);\n Utils.remove(link.source.links, link);\n Utils.remove(link.target.incoming, link);\n Utils.remove(link.target.links, link);\n },\n\n /**\n * Adds a new node to this graph, if not already present.\n * The node can be an existing Node or the identifier of a new node.\n * No error is thrown if the node is already there and the existing one is returned.\n */\n addNode: function(nodeOrId, layoutRect, owner) {\n\n var newNode = null;\n\n if (!Utils.isDefined(nodeOrId)) {\n throw \"No Node or identifier for a new Node is given.\";\n }\n\n if (Utils.isString(nodeOrId)) {\n if (this.hasNode(nodeOrId)) {\n return this.getNode(nodeOrId);\n }\n newNode = new Node(nodeOrId);\n }\n else {\n if (this.hasNode(nodeOrId)) {\n return this.getNode(nodeOrId);\n }\n // todo: ensure that the param is a Node?\n newNode = nodeOrId;\n }\n\n if (Utils.isDefined(layoutRect)) {\n newNode.bounds(layoutRect);\n }\n\n if (Utils.isDefined(owner)) {\n newNode.owner = owner;\n }\n this._addNode(newNode);\n return newNode;\n },\n\n /**\n * Adds the given Node and its outgoing links.\n */\n addNodeAndOutgoings: function(node) {\n if (!this.hasNode(node)) {\n this._addNode(node);\n }\n\n var newLinks = node.outgoing;\n node.outgoing = [];\n Utils.forEach(newLinks, function(link) {\n this.addExistingLink(link);\n }, this);\n },\n\n /**\n * Sets the 'index' property on the links and nodes of this graph.\n */\n setItemIndices: function() {\n var i;\n for (i = 0; i < this.nodes.length; ++i) {\n this.nodes[i].index = i;\n }\n\n for (i = 0; i < this.links.length; ++i) {\n this.links[i].index = i;\n }\n },\n\n /**\n * Returns a clone of this graph.\n */\n clone: function(saveMapping) {\n var copy = new Graph();\n var save = Utils.isDefined(saveMapping) && saveMapping === true;\n if (save) {\n copy.nodeMap = new Dictionary();\n copy.linkMap = new Dictionary();\n }\n // we need a map even if the saveMapping is not set\n var map = new Dictionary();\n Utils.forEach(this.nodes, function(nOriginal) {\n var nCopy = nOriginal.clone();\n map.set(nOriginal, nCopy);\n copy._addNode(nCopy);\n\n if (save) {\n copy.nodeMap.set(nCopy, nOriginal);\n }\n });\n\n Utils.forEach(this.links, function(linkOriginal) {\n if (map.containsKey(linkOriginal.source) && map.containsKey(linkOriginal.target)) {\n var linkCopy = copy.addLink(map.get(linkOriginal.source), map.get(linkOriginal.target));\n if (save) {\n copy.linkMap.set(linkCopy, linkOriginal);\n }\n }\n });\n\n return copy;\n },\n\n /**\n * The parsing allows a quick way to create graphs.\n * - [\"n1->n2\", \"n2->n3\"]: creates the three nodes and adds the links\n * - [\"n1->n2\", {id: \"QSDF\"}, \"n2->n3\"]: same as previous but also performs a deep extend of the link between n1 and n2 with the given object.\n */\n linearize: function(addIds) {\n return Graph.Utils.linearize(this, addIds);\n },\n\n /**\n * Performs a depth-first traversal starting at the given node.\n * @param startNode a node or id of a node in this graph\n * @param action\n */\n depthFirstTraversal: function(startNode, action) {\n if (Utils.isUndefined(startNode)) {\n throw \"You need to supply a starting node.\";\n }\n if (Utils.isUndefined(action)) {\n throw \"You need to supply an action.\";\n }\n if (!this.hasNode(startNode)) {\n throw \"The given start-node is not part of this graph\";\n }\n var foundNode = this.getNode(startNode);// case the given one is an Id\n var visited = [];\n this._dftIterator(foundNode, action, visited);\n },\n\n _dftIterator: function(node, action, visited) {\n\n action(node);\n visited.push(node);\n var children = node.getChildren();\n for (var i = 0, len = children.length; i < len; i++) {\n var child = children[i];\n if (contains(visited, child)) {\n continue;\n }\n this._dftIterator(child, action, visited);\n }\n },\n\n /**\n * Performs a breadth-first traversal starting at the given node.\n * @param startNode a node or id of a node in this graph\n * @param action\n */\n breadthFirstTraversal: function(startNode, action) {\n\n if (Utils.isUndefined(startNode)) {\n throw \"You need to supply a starting node.\";\n }\n if (Utils.isUndefined(action)) {\n throw \"You need to supply an action.\";\n }\n\n if (!this.hasNode(startNode)) {\n throw \"The given start-node is not part of this graph\";\n }\n var foundNode = this.getNode(startNode);// case the given one is an Id\n var queue = new Queue();\n var visited = [];\n queue.enqueue(foundNode);\n\n while (queue.length > 0) {\n var node = queue.dequeue();\n action(node);\n visited.push(node);\n var children = node.getChildren();\n for (var i = 0, len = children.length; i < len; i++) {\n var child = children[i];\n if (contains(visited, child) || contains(queue, child)) {\n continue;\n }\n queue.enqueue(child);\n }\n }\n },\n\n /**\n * This is the classic Tarjan algorithm for strongly connected components.\n * See e.g. http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm\n * @param excludeSingleItems Whether isolated nodes should be excluded from the analysis.\n * @param node The start node from which the analysis starts.\n * @param indices Numbers the nodes consecutively in the order in which they are discovered.\n * @param lowLinks The smallest index of any node known to be reachable from the node, including the node itself\n * @param connected The current component.\n * @param stack The bookkeeping stack of things to visit.\n * @param index The counter of visited nodes used to assign the indices.\n * @private\n */\n _stronglyConnectedComponents: function(excludeSingleItems, node, indices, lowLinks, connected, stack, index) {\n indices.add(node, index);\n lowLinks.add(node, index);\n index++;\n\n stack.push(node);\n\n var children = node.getChildren(), next;\n for (var i = 0, len = children.length; i < len; i++) {\n next = children[i];\n if (!indices.containsKey(next)) {\n this._stronglyConnectedComponents(excludeSingleItems, next, indices, lowLinks, connected, stack, index);\n lowLinks.add(node, Math.min(lowLinks.get(node), lowLinks.get(next)));\n }\n else if (contains(stack, next)) {\n lowLinks.add(node, Math.min(lowLinks.get(node), indices.get(next)));\n }\n }\n // If v is a root node, pop the stack and generate a strong component\n if (lowLinks.get(node) === indices.get(node)) {\n var component = [];\n do {\n next = stack.pop();\n component.push(next);\n }\n while (next !== node);\n if (!excludeSingleItems || (component.length > 1)) {\n connected.push(component);\n }\n }\n },\n\n /**\n * Returns the cycles found in this graph.\n * The returned arrays consist of the nodes which are strongly coupled.\n * @param excludeSingleItems Whether isolated nodes should be excluded.\n * @returns {Array} The array of cycles found.\n */\n findCycles: function(excludeSingleItems) {\n if (Utils.isUndefined(excludeSingleItems)) {\n excludeSingleItems = true;\n }\n var indices = new Dictionary();\n var lowLinks = new Dictionary();\n var connected = [];\n var stack = [];\n for (var i = 0, len = this.nodes.length; i < len; i++) {\n var node = this.nodes[i];\n if (indices.containsKey(node)) {\n continue;\n }\n this._stronglyConnectedComponents(excludeSingleItems, node, indices, lowLinks, connected, stack, 0);\n }\n return connected;\n },\n\n /**\n * Returns whether this graph is acyclic.\n * @returns {*}\n */\n isAcyclic: function() {\n return Utils.isEmpty(this.findCycles());\n },\n\n /**\n * Returns whether the given graph is a subgraph of this one.\n * @param other Another graph instance.\n */\n isSubGraph: function(other) {\n var otherArray = other.linearize();\n var thisArray = this.linearize();\n return Utils.all(otherArray, function(s) {\n return contains(thisArray, s);\n });\n },\n\n /**\n * Makes an acyclic graph from the current (connected) one.\n * * @returns {Array} The reversed links.\n */\n makeAcyclic: function() {\n // if empty or almost empty\n if (this.isEmpty() || this.nodes.length <= 1 || this.links.length <= 1) {\n return [];\n }\n // singular case of just two nodes\n if (this.nodes.length == 2) {\n var result = [];\n if (this.links.length > 1) {\n var oneLink = this.links[0];\n var oneNode = oneLink.source;\n for (var i = 0, len = this.links.length; i < len; i++) {\n var link = this.links[i];\n if (link.source == oneNode) {\n continue;\n }\n var rev = link.reverse();\n result.push(rev);\n }\n }\n return result;\n }\n\n var copy = this.clone(true); // copy.nodeMap tells you the mapping\n var N = this.nodes.length;\n\n var intensityCatalog = new Dictionary();\n\n /**\n * If there are both incoming and outgoing links this will return the flow intensity (out-in).\n * Otherwise the node acts as a flow source with N specifying the (equal) intensity.\n * @param node\n * @returns {number}\n */\n var flowIntensity = function(node) {\n if (node.outgoing.length === 0) {\n return (2 - N);\n }\n else if (node.incoming.length === 0) {\n return (N - 2);\n }\n else {\n return node.outgoing.length - node.incoming.length;\n }\n };\n\n /**\n * Collects the nodes with the same intensity.\n * @param node\n * @param intensityCatalog\n */\n var catalogEqualIntensity = function(node, intensityCatalog) {\n var intensity = flowIntensity(node, N);\n if (!intensityCatalog.containsKey(intensity)) {\n intensityCatalog.set(intensity, []);\n }\n intensityCatalog.get(intensity).push(node);\n };\n\n Utils.forEach(copy.nodes, function(v) {\n catalogEqualIntensity(v, intensityCatalog);\n });\n\n var sourceStack = [];\n var targetStack = [];\n\n while (copy.nodes.length > 0) {\n var source, target, intensity;\n if (intensityCatalog.containsKey(2 - N)) {\n var targets = intensityCatalog.get(2 - N); // nodes without outgoings\n while (targets.length > 0) {\n target = targets.pop();\n for (var li = 0; li < target.links.length; li++) {\n var targetLink = target.links[li];\n source = targetLink.getComplement(target);\n intensity = flowIntensity(source, N);\n Utils.remove(intensityCatalog.get(intensity), source);\n source.removeLink(targetLink);\n catalogEqualIntensity(source, intensityCatalog);\n }\n copy._removeNode(target);\n targetStack.unshift(target);\n }\n }\n\n // move sources to sourceStack\n if (intensityCatalog.containsKey(N - 2)) {\n var sources = intensityCatalog.get(N - 2); // nodes without incomings\n while (sources.length > 0) {\n source = sources.pop();\n for (var si = 0; si < source.links.length; si++) {\n var sourceLink = source.links[si];\n target = sourceLink.getComplement(source);\n intensity = flowIntensity(target, N);\n Utils.remove(intensityCatalog.get(intensity), target);\n target.removeLink(sourceLink);\n catalogEqualIntensity(target, intensityCatalog);\n }\n sourceStack.push(source);\n copy._removeNode(source);\n }\n }\n\n if (copy.nodes.length > 0) {\n for (var k = N - 3; k > 2 - N; k--) {\n if (intensityCatalog.containsKey(k) &&\n intensityCatalog.get(k).length > 0) {\n var maxdiff = intensityCatalog.get(k);\n var v = maxdiff.pop();\n for (var ri = 0; ri < v.links.length; ri++) {\n var ril = v.links[ri];\n var u = ril.getComplement(v);\n intensity = flowIntensity(u, N);\n Utils.remove(intensityCatalog.get(intensity), u);\n u.removeLink(ril);\n catalogEqualIntensity(u, intensityCatalog);\n }\n sourceStack.push(v);\n copy._removeNode(v);\n break;\n }\n }\n }\n }\n\n sourceStack = sourceStack.concat(targetStack);\n\n var vertexOrder = new Dictionary();\n for (var kk = 0; kk < this.nodes.length; kk++) {\n vertexOrder.set(copy.nodeMap.get(sourceStack[kk]), kk);\n }\n\n var reversedEdges = [];\n Utils.forEach(this.links, function(link) {\n if (vertexOrder.get(link.source) > vertexOrder.get(link.target)) {\n link.reverse();\n reversedEdges.push(link);\n }\n });\n return reversedEdges;\n }\n });\n\n /**\n * A collection of predefined graphs for demo and testing purposes.\n */\n Graph.Predefined = {\n /**\n * Eight-shapes graph all connected in a cycle.\n * @returns {*}\n * @constructor\n */\n EightGraph: function() {\n return Graph.Utils.parse([ \"1->2\", \"2->3\", \"3->4\", \"4->1\", \"3->5\", \"5->6\", \"6->7\", \"7->3\"]);\n },\n\n /**\n * Creates a typical mindmap diagram.\n * @returns {*}\n * @constructor\n */\n Mindmap: function() {\n return Graph.Utils.parse([\"0->1\", \"0->2\", \"0->3\", \"0->4\", \"0->5\", \"1->6\", \"1->7\", \"7->8\", \"2->9\", \"9->10\", \"9->11\", \"3->12\",\n \"12->13\", \"13->14\", \"4->15\", \"4->16\", \"15->17\", \"15->18\", \"18->19\", \"18->20\", \"14->21\", \"14->22\", \"5->23\", \"23->24\", \"23->25\", \"6->26\"]);\n },\n\n /**\n * Three nodes connected in a cycle.\n * @returns {*}\n * @constructor\n */\n ThreeGraph: function() {\n return Graph.Utils.parse([ \"1->2\", \"2->3\", \"3->1\"]);\n },\n\n /**\n * A tree with each node having two children.\n * @param levels How many levels the binary tree should have.\n * @returns {diagram.Graph}\n * @constructor\n */\n BinaryTree: function(levels) {\n if (Utils.isUndefined(levels)) {\n levels = 5;\n }\n return Graph.Utils.createBalancedTree(levels, 2);\n },\n\n /**\n * A linear graph (discrete line segment).\n * @param length How many segments (the node count is hence (length+1)).\n * @returns {diagram.Graph}\n * @constructor\n */\n Linear: function(length) {\n if (Utils.isUndefined(length)) {\n length = 10;\n }\n return Graph.Utils.createBalancedTree(length, 1);\n },\n\n /**\n * A standard tree-graph with the specified levels and children (siblings) count.\n * Note that for a balanced tree of level N and sibling count s, counting the root as level zero:\n * - NodeCount = (1-s^(N+1))/(1-s)]\n * - LinkCount = s.(1-s^N)/(1-s)\n * @param levels How many levels the tree should have.\n * @param siblingsCount How many siblings each level should have.\n * @returns {diagram.Graph}\n * @constructor\n */\n Tree: function(levels, siblingsCount) {\n return Graph.Utils.createBalancedTree(levels, siblingsCount);\n },\n\n /**\n * Creates a forest.\n * Note that for a balanced forest of level N, sibling count s and tree count t, counting the root as level zero:\n * - NodeCount = t.(1-s^(N+1))/(1-s)]\n * - LinkCount = t.s.(1-s^N)/(1-s)\n * @param levels How many levels the tree should have.\n * @param siblingsCount How many siblings each level should have.\n * @param trees The amount of trees the forest should have.\n * @returns {diagram.Graph}\n * @constructor\n */\n Forest: function(levels, siblingsCount, trees) {\n return Graph.Utils.createBalancedForest(levels, siblingsCount, trees);\n },\n\n /**\n * A workflow-like graph with cycles.\n * @returns {*}\n * @constructor\n */\n Workflow: function() {\n return Graph.Utils.parse(\n [\"0->1\", \"1->2\", \"2->3\", \"1->4\", \"4->3\", \"3->5\", \"5->6\", \"6->3\", \"6->7\", \"5->4\"]\n );\n },\n\n /**\n * A grid graph with the direction of the links avoiding cycles.\n * Node count: (n+1).(m+1)\n * Link count: n.(m+1) + m.(n+1)\n * @param n Horizontal count of grid cells. If zero this will result in a linear graph.\n * @param m Vertical count of grid cells. If zero this will result in a linear graph.\n * @constructor\n */\n Grid: function(n, m) {\n var g = new diagram.Graph();\n if (n <= 0 && m <= 0) {\n return g;\n }\n\n for (var i = 0; i < n + 1; i++) {\n var previous = null;\n for (var j = 0; j < m + 1; j++) {\n // using x-y coordinates to name the nodes\n var node = new Node(i.toString() + \".\" + j.toString());\n g.addNode(node);\n if (previous) {\n g.addLink(previous, node);\n }\n if (i > 0) {\n var left = g.getNode((i - 1).toString() + \".\" + j.toString());\n g.addLink(left, node);\n }\n previous = node;\n }\n }\n return g;\n }\n\n };\n\n /**\n * Graph generation and other utilities.\n */\n Graph.Utils = {\n /**\n * The parsing allows a quick way to create graphs.\n * - [\"n1->n2\", \"n2->n3\"]: creates the three nodes and adds the links\n * - [\"n1->n2\", {id: \"id177\"}, \"n2->n3\"]: same as previous but also performs a deep extend of the link between n1 and n2 with the given object.\n */\n parse: function(graphString) {\n\n var previousLink, graph = new diagram.Graph(), parts = graphString.slice();\n for (var i = 0, len = parts.length; i < len; i++) {\n var part = parts[i];\n if (Utils.isString(part)) // link spec\n {\n if (part.indexOf(\"->\") < 0) {\n throw \"The link should be specified as 'a->b'.\";\n }\n var p = part.split(\"->\");\n if (p.length != 2) {\n throw \"The link should be specified as 'a->b'.\";\n }\n previousLink = new Link(p[0], p[1]);\n graph.addLink(previousLink);\n }\n if (Utils.isObject(part)) {\n if (!previousLink) {\n throw \"Specification found before Link definition.\";\n }\n kendo.deepExtend(previousLink, part);\n }\n }\n return graph;\n },\n\n /**\n * Returns a linearized representation of the given Graph.\n * See also the Graph.Utils.parse method for the inverse operation.\n */\n linearize: function(graph, addIds) {\n if (Utils.isUndefined(graph)) {\n throw \"Expected an instance of a Graph object in slot one.\";\n }\n if (Utils.isUndefined(addIds)) {\n addIds = false;\n }\n var lin = [];\n for (var i = 0, len = graph.links.length; i < len; i++) {\n var link = graph.links[i];\n lin.push(link.source.id + \"->\" + link.target.id);\n if (addIds) {\n lin.push({ id: link.id });\n }\n }\n return lin;\n },\n\n /**\n * The method used by the diagram creation to instantiate a shape.\n * @param kendoDiagram The Kendo diagram where the diagram will be created.\n * @param p The position at which to place the shape.\n * @param shapeDefaults Optional Shape options.\n * @param id Optional identifier of the shape.\n * @returns {*}\n * @private\n */\n _addShape: function(kendoDiagram, p, id, shapeDefaults) {\n if (Utils.isUndefined(p)) {\n p = new diagram.Point(0, 0);\n }\n\n if (Utils.isUndefined(id)) {\n id = randomId();\n }\n\n shapeDefaults = kendo.deepExtend({\n width: 20,\n height: 20,\n id: id,\n radius: 10,\n fill: \"#778899\",\n data: \"circle\",\n undoable: false,\n x: p.x,\n y: p.y\n }, shapeDefaults);\n\n return kendoDiagram.addShape(shapeDefaults);\n },\n /**\n * The method used by the diagram creation to instantiate a connection.\n * @param diagram he Kendo diagram where the diagram will be created.\n * @param from The source shape.\n * @param to The target shape.\n * @param options Optional Connection options.\n * @returns {*}\n * @private\n */\n _addConnection: function(diagram, from, to, options) {\n return diagram.connect(from, to, options);\n },\n\n /**\n * Creates a diagram from the given Graph.\n * @param diagram The Kendo diagram where the diagram will be created.\n * @param graph The graph structure defining the diagram.\n */\n createDiagramFromGraph: function(diagram, graph, doLayout, randomSize) {\n\n if (Utils.isUndefined(diagram)) {\n throw \"The diagram surface is undefined.\";\n }\n if (Utils.isUndefined(graph)) {\n throw \"No graph specification defined.\";\n }\n if (Utils.isUndefined(doLayout)) {\n doLayout = true;\n }\n if (Utils.isUndefined(randomSize)) {\n randomSize = false;\n }\n\n var width = diagram.element.clientWidth || 200;\n var height = diagram.element.clientHeight || 200;\n var map = [], node, shape;\n for (var i = 0, len = graph.nodes.length; i < len; i++) {\n node = graph.nodes[i];\n var p = node.position;\n if (Utils.isUndefined(p)) {\n if (Utils.isDefined(node.x) && Utils.isDefined(node.y)) {\n p = new Point(node.x, node.y);\n }\n else {\n p = new Point(Utils.randomInteger(10, width - 20), Utils.randomInteger(10, height - 20));\n }\n }\n var opt = {};\n\n if (node.id === \"0\") {\n /* kendo.deepExtend(opt,\n {\n fill: \"Orange\",\n data: 'circle',\n width: 100,\n height: 100,\n center: new Point(50, 50)\n });*/\n }\n else if (randomSize) {\n kendo.deepExtend(opt, {\n width: Math.random() * 150 + 20,\n height: Math.random() * 80 + 50,\n data: 'rectangle',\n fill: {\n color: \"#778899\"\n }\n });\n }\n\n shape = this._addShape(diagram, p, node.id, opt);\n //shape.content(node.id);\n\n var bounds = shape.bounds();\n if (Utils.isDefined(bounds)) {\n node.x = bounds.x;\n node.y = bounds.y;\n node.width = bounds.width;\n node.height = bounds.height;\n }\n map[node.id] = shape;\n }\n for (var gli = 0; gli < graph.links.length; gli++) {\n var link = graph.links[gli];\n var sourceShape = map[link.source.id];\n if (Utils.isUndefined(sourceShape)) {\n continue;\n }\n var targetShape = map[link.target.id];\n if (Utils.isUndefined(targetShape)) {\n continue;\n }\n this._addConnection(diagram, sourceShape, targetShape, { id: link.id });\n\n }\n if (doLayout) {\n var l = new diagram.SpringLayout(diagram);\n l.layoutGraph(graph, { limitToView: false });\n for (var shi = 0; shi < graph.nodes.length; shi++) {\n node = graph.nodes[shi];\n shape = map[node.id];\n shape.bounds(new Rect(node.x, node.y, node.width, node.height));\n }\n }\n },\n\n /**\n * Creates a balanced tree with the specified number of levels and siblings count.\n * Note that for a balanced tree of level N and sibling count s, counting the root as level zero:\n * - NodeCount = (1-s^(N+1))/(1-s)]\n * - LinkCount = s.(1-s^N)/(1-s)\n * @param levels How many levels the tree should have.\n * @param siblingsCount How many siblings each level should have.\n * @returns {diagram.Graph}\n */\n createBalancedTree: function(levels, siblingsCount) {\n if (Utils.isUndefined(levels)) {\n levels = 3;\n }\n if (Utils.isUndefined(siblingsCount)) {\n siblingsCount = 3;\n }\n\n var g = new diagram.Graph(), counter = -1, lastAdded = [], news;\n if (levels <= 0 || siblingsCount <= 0) {\n return g;\n }\n var root = new Node((++counter).toString());\n g.addNode(root);\n g.root = root;\n lastAdded.push(root);\n for (var i = 0; i < levels; i++) {\n news = [];\n for (var j = 0; j < lastAdded.length; j++) {\n var parent = lastAdded[j];\n for (var k = 0; k < siblingsCount; k++) {\n var item = new Node((++counter).toString());\n g.addLink(parent, item);\n news.push(item);\n }\n }\n lastAdded = news;\n }\n return g;\n },\n\n /**\n * Creates a balanced tree with the specified number of levels and siblings count.\n * Note that for a balanced forest of level N, sibling count s and tree count t, counting the root as level zero:\n * - NodeCount = t.(1-s^(N+1))/(1-s)]\n * - LinkCount = t.s.(1-s^N)/(1-s)\n * @param levels How many levels the tree should have.\n * @param siblingsCount How many siblings each level should have.\n * @returns {diagram.Graph}\n * @param treeCount The number of trees the forest should have.\n */\n createBalancedForest: function(levels, siblingsCount, treeCount) {\n if (Utils.isUndefined(levels)) {\n levels = 3;\n }\n if (Utils.isUndefined(siblingsCount)) {\n siblingsCount = 3;\n }\n if (Utils.isUndefined(treeCount)) {\n treeCount = 5;\n }\n var g = new diagram.Graph(), counter = -1, lastAdded = [], news;\n if (levels <= 0 || siblingsCount <= 0 || treeCount <= 0) {\n return g;\n }\n\n for (var t = 0; t < treeCount; t++) {\n var root = new Node((++counter).toString());\n g.addNode(root);\n lastAdded = [root];\n for (var i = 0; i < levels; i++) {\n news = [];\n for (var j = 0; j < lastAdded.length; j++) {\n var parent = lastAdded[j];\n for (var k = 0; k < siblingsCount; k++) {\n var item = new Node((++counter).toString());\n g.addLink(parent, item);\n news.push(item);\n }\n }\n lastAdded = news;\n }\n }\n return g;\n },\n\n /**\n * Creates a random graph (uniform distribution) with the specified amount of nodes.\n * @param nodeCount The amount of nodes the random graph should have.\n * @param maxIncidence The maximum allowed degree of the nodes.\n * @param isTree Whether the return graph should be a tree (default: false).\n * @returns {diagram.Graph}\n */\n createRandomConnectedGraph: function(nodeCount, maxIncidence, isTree) {\n\n /* Swa's Mathematica export of random Bernoulli graphs\n gr[n_,p_]:=Module[{g=RandomGraph[BernoulliGraphDistribution[n,p],VertexLabels->\"Name\",DirectedEdges->True]},\n While[Not[ConnectedGraphQ[g]],g=RandomGraph[BernoulliGraphDistribution[n,p],VertexLabels->\"Name\",DirectedEdges->True]];g];\n project[a_]:=(\"\\\"\"<>ToString[Part[#,1]]<>\"->\"<>ToString[Part[#,2]]<>\"\\\"\")& @ a;\n export[g_]:=project/@ EdgeList[g]\n g = gr[12,.1]\n export [g]\n */\n\n if (Utils.isUndefined(nodeCount)) {\n nodeCount = 40;\n }\n if (Utils.isUndefined(maxIncidence)) {\n maxIncidence = 4;\n }\n if (Utils.isUndefined(isTree)) {\n isTree = false;\n }\n\n var g = new diagram.Graph(), counter = -1;\n if (nodeCount <= 0) {\n return g;\n }\n\n var root = new Node((++counter).toString());\n g.addNode(root);\n if (nodeCount === 1) {\n return g;\n }\n if (nodeCount > 1) {\n // random tree\n for (var i = 1; i < nodeCount; i++) {\n var poolNode = g.takeRandomNode([], maxIncidence);\n if (!poolNode) {\n //failed to find one so the graph will have less nodes than specified\n break;\n }\n var newNode = g.addNode(i.toString());\n g.addLink(poolNode, newNode);\n }\n if (!isTree && nodeCount > 1) {\n var randomAdditions = Utils.randomInteger(1, nodeCount);\n for (var ri = 0; ri < randomAdditions; ri++) {\n var n1 = g.takeRandomNode([], maxIncidence);\n var n2 = g.takeRandomNode([], maxIncidence);\n if (n1 && n2 && !g.areConnected(n1, n2)) {\n g.addLink(n1, n2);\n }\n }\n }\n return g;\n }\n },\n\n /**\n * Generates a random diagram.\n * @param diagram The host diagram.\n * @param shapeCount The number of shapes the random diagram should contain.\n * @param maxIncidence The maximum degree the shapes can have.\n * @param isTree Whether the generated diagram should be a tree\n * @param layoutType The optional layout type to apply after the diagram is generated.\n */\n randomDiagram: function(diagram, shapeCount, maxIncidence, isTree, randomSize) {\n var g = kendo.dataviz.diagram.Graph.Utils.createRandomConnectedGraph(shapeCount, maxIncidence, isTree);\n Graph.Utils.createDiagramFromGraph(diagram, g, false, randomSize);\n }\n };\n\n kendo.deepExtend(diagram, {\n init: function(element) {\n kendo.init(element, diagram.ui);\n },\n\n Point: Point,\n Intersect: Intersect,\n Geometry: Geometry,\n Rect: Rect,\n Size: Size,\n RectAlign: RectAlign,\n Matrix: Matrix,\n MatrixVector: MatrixVector,\n normalVariable: normalVariable,\n randomId: randomId,\n Dictionary: Dictionary,\n HashTable: HashTable,\n Queue: Queue,\n Set: Set,\n Node: Node,\n Link: Link,\n Graph: Graph,\n PathDefiner: PathDefiner\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n // Imports ================================================================\n var kendo = window.kendo,\n diagram = kendo.dataviz.diagram,\n Class = kendo.Class,\n deepExtend = kendo.deepExtend,\n Point = diagram.Point,\n Rect = diagram.Rect,\n Matrix = diagram.Matrix,\n Utils = diagram.Utils,\n isNumber = Utils.isNumber,\n isString = Utils.isString,\n MatrixVector = diagram.MatrixVector,\n\n g = kendo.geometry,\n d = kendo.drawing,\n\n defined = d.util.defined,\n\n inArray = $.inArray;\n\n // Constants ==============================================================\n var TRANSPARENT = \"transparent\",\n Markers = {\n none: \"none\",\n arrowStart: \"ArrowStart\",\n filledCircle: \"FilledCircle\",\n arrowEnd: \"ArrowEnd\"\n },\n FULL_CIRCLE_ANGLE = 360,\n START = \"start\",\n END = \"end\",\n WIDTH = \"width\",\n HEIGHT = \"height\",\n X = \"x\",\n Y = \"y\";\n\n diagram.Markers = Markers;\n\n function diffNumericOptions(options, fields) {\n var elementOptions = this.options;\n var hasChanges = false;\n var value, field;\n for (var i = 0; i < fields.length; i++) {\n field = fields[i];\n value = options[field];\n if (isNumber(value) && elementOptions[field] !== value) {\n elementOptions[field] = value;\n hasChanges = true;\n }\n }\n\n return hasChanges;\n }\n\n var Scale = Class.extend({\n init: function(x, y) {\n this.x = x;\n this.y = y;\n },\n toMatrix: function() {\n return Matrix.scaling(this.x, this.y);\n },\n toString: function() {\n return kendo.format(\"scale({0},{1})\", this.x, this.y);\n },\n invert: function() {\n return new Scale(1 / this.x, 1 / this.y);\n }\n });\n\n var Translation = Class.extend({\n init: function(x, y) {\n this.x = x;\n this.y = y;\n },\n toMatrixVector: function() {\n return new MatrixVector(0, 0, 0, 0, this.x, this.y);\n },\n toMatrix: function() {\n return Matrix.translation(this.x, this.y);\n },\n toString: function() {\n return kendo.format(\"translate({0},{1})\", this.x, this.y);\n },\n plus: function(delta) {\n this.x += delta.x;\n this.y += delta.y;\n },\n times: function(factor) {\n this.x *= factor;\n this.y *= factor;\n },\n length: function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n normalize: function() {\n if (this.Length === 0) {\n return;\n }\n this.times(1 / this.length());\n },\n invert: function() {\n return new Translation(-this.x, -this.y);\n }\n });\n\n var Rotation = Class.extend({\n init: function(angle, x, y) {\n this.x = x || 0;\n this.y = y || 0;\n this.angle = angle;\n },\n toString: function() {\n if (this.x && this.y) {\n return kendo.format(\"rotate({0},{1},{2})\", this.angle, this.x, this.y);\n } else {\n return kendo.format(\"rotate({0})\", this.angle);\n }\n },\n toMatrix: function() {\n return Matrix.rotation(this.angle, this.x, this.y); // T*R*T^-1\n },\n center: function() {\n return new Point(this.x, this.y);\n },\n invert: function() {\n return new Rotation(FULL_CIRCLE_ANGLE - this.angle, this.x, this.y);\n }\n });\n\n Rotation.ZERO = new Rotation(0);\n\n Rotation.create = function(rotation) {\n return new Rotation(rotation.angle, rotation.x, rotation.y);\n };\n\n Rotation.parse = function(str) {\n var values = str.slice(1, str.length - 1).split(\",\"),\n angle = values[0],\n x = values[1],\n y = values[2];\n var rotation = new Rotation(angle, x, y);\n return rotation;\n };\n\n var CompositeTransform = Class.extend({\n init: function(x, y, scaleX, scaleY, angle, center) {\n this.translate = new Translation(x, y);\n if (scaleX !== undefined$1 && scaleY !== undefined$1) {\n this.scale = new Scale(scaleX, scaleY);\n }\n if (angle !== undefined$1) {\n this.rotate = center ? new Rotation(angle, center.x, center.y) : new Rotation(angle);\n }\n },\n toString: function() {\n var toString = function(transform) {\n return transform ? transform.toString() : \"\";\n };\n\n return toString(this.translate) +\n toString(this.rotate) +\n toString(this.scale);\n },\n\n render: function(visual) {\n visual._transform = this;\n visual._renderTransform();\n },\n\n toMatrix: function() {\n var m = Matrix.unit();\n\n if (this.translate) {\n m = m.times(this.translate.toMatrix());\n }\n if (this.rotate) {\n m = m.times(this.rotate.toMatrix());\n }\n if (this.scale) {\n m = m.times(this.scale.toMatrix());\n }\n return m;\n },\n invert: function() {\n var rotate = this.rotate ? this.rotate.invert() : undefined$1,\n rotateMatrix = rotate ? rotate.toMatrix() : Matrix.unit(),\n scale = this.scale ? this.scale.invert() : undefined$1,\n scaleMatrix = scale ? scale.toMatrix() : Matrix.unit();\n\n var translatePoint = new Point(-this.translate.x, -this.translate.y);\n translatePoint = rotateMatrix.times(scaleMatrix).apply(translatePoint);\n var translate = new Translation(translatePoint.x, translatePoint.y);\n\n var transform = new CompositeTransform();\n transform.translate = translate;\n transform.rotate = rotate;\n transform.scale = scale;\n\n return transform;\n }\n });\n\n var AutoSizeableMixin = {\n _setScale: function() {\n var options = this.options;\n var originWidth = this._originWidth;\n var originHeight = this._originHeight;\n var scaleX = options.width / originWidth;\n var scaleY = options.height / originHeight;\n\n if (!isNumber(scaleX)) {\n scaleX = 1;\n }\n if (!isNumber(scaleY)) {\n scaleY = 1;\n }\n\n this._transform.scale = new Scale(scaleX, scaleY);\n },\n\n _setTranslate: function() {\n var options = this.options;\n var x = options.x || 0;\n var y = options.y || 0;\n this._transform.translate = new Translation(x, y);\n },\n\n _initSize: function() {\n var options = this.options;\n var transform = false;\n if (options.autoSize !== false && (defined(options.width) || defined(options.height))) {\n this._measure(true);\n this._setScale();\n transform = true;\n }\n\n if (defined(options.x) || defined(options.y)) {\n this._setTranslate();\n transform = true;\n }\n\n if (transform) {\n this._renderTransform();\n }\n },\n\n _updateSize: function(options) {\n var update = false;\n\n if (this.options.autoSize !== false && this._diffNumericOptions(options, [WIDTH, HEIGHT])) {\n update = true;\n this._measure(true);\n this._setScale();\n }\n\n if (this._diffNumericOptions(options, [X, Y])) {\n update = true;\n this._setTranslate();\n }\n\n if (update) {\n this._renderTransform();\n }\n\n return update;\n }\n };\n\n var Element = Class.extend({\n init: function(options) {\n var element = this;\n element.options = deepExtend({}, element.options, options);\n element.id = element.options.id;\n element._originSize = Rect.empty();\n element._transform = new CompositeTransform();\n },\n\n visible: function(value) {\n return this.drawingContainer().visible(value);\n },\n\n redraw: function(options) {\n if (options && options.id) {\n this.id = options.id;\n }\n },\n\n position: function(x, y) {\n var options = this.options;\n if (!defined(x)) {\n return new Point(options.x, options.y);\n }\n\n if (defined(y)) {\n options.x = x;\n options.y = y;\n } else if (x instanceof Point) {\n options.x = x.x;\n options.y = x.y;\n }\n\n this._transform.translate = new Translation(options.x, options.y);\n this._renderTransform();\n },\n\n rotate: function(angle, center) {\n if (defined(angle)) {\n this._transform.rotate = new Rotation(angle, center.x, center.y);\n this._renderTransform();\n }\n return this._transform.rotate || Rotation.ZERO;\n },\n\n drawingContainer: function() {\n return this.drawingElement;\n },\n\n _renderTransform: function() {\n var matrix = this._transform.toMatrix();\n this.drawingContainer().transform(new g.Matrix(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f));\n },\n\n _hover: function() {},\n\n _diffNumericOptions: diffNumericOptions,\n\n _measure: function(force) {\n var rect;\n if (!this._measured || force) {\n var box = this._boundingBox() || new g.Rect();\n var startPoint = box.topLeft();\n rect = new Rect(startPoint.x, startPoint.y, box.width(), box.height());\n this._originSize = rect;\n this._originWidth = rect.width;\n this._originHeight = rect.height;\n this._measured = true;\n } else {\n rect = this._originSize;\n }\n return rect;\n },\n\n _boundingBox: function() {\n return this.drawingElement.rawBBox();\n }\n });\n\n var VisualBase = Element.extend({\n init: function(options) {\n Element.fn.init.call(this, options);\n\n options = this.options;\n options.fill = normalizeDrawingOptions(options.fill);\n options.stroke = normalizeDrawingOptions(options.stroke);\n },\n\n options: {\n stroke: {\n color: \"gray\",\n width: 1\n },\n fill: {\n color: TRANSPARENT\n }\n },\n\n fill: function(color, opacity) {\n this._fill({\n color: getColor(color),\n opacity: opacity\n });\n },\n\n stroke: function(color, width, opacity) {\n this._stroke({\n color: getColor(color),\n width: width,\n opacity: opacity\n });\n },\n\n redraw: function(options) {\n if (options) {\n var stroke = options.stroke;\n var fill = options.fill;\n if (stroke) {\n this._stroke(normalizeDrawingOptions(stroke));\n }\n if (fill) {\n this._fill(normalizeDrawingOptions(fill));\n }\n\n Element.fn.redraw.call(this, options);\n }\n },\n\n _hover: function(show) {\n var drawingElement = this.drawingElement;\n var options = this.options;\n var hover = options.hover;\n\n if (hover && hover.fill) {\n var fill = show ? normalizeDrawingOptions(hover.fill) : options.fill;\n drawingElement.fill(fill.color, fill.opacity);\n }\n },\n\n _stroke: function(strokeOptions) {\n var options = this.options;\n deepExtend(options, {\n stroke: strokeOptions\n });\n\n strokeOptions = options.stroke;\n\n var stroke = null;\n if (strokeOptions.width > 0) {\n stroke = {\n color: strokeOptions.color,\n width: strokeOptions.width,\n opacity: strokeOptions.opacity,\n dashType: strokeOptions.dashType\n };\n }\n\n this.drawingElement.options.set(\"stroke\", stroke);\n },\n\n _fill: function(fillOptions) {\n var options = this.options;\n deepExtend(options, {\n fill: fillOptions || {}\n });\n var fill = options.fill;\n\n if (fill.gradient) {\n var gradient = fill.gradient;\n var GradientClass = (gradient.type === \"radial\" ? d.RadialGradient : d.LinearGradient);\n this.drawingElement.fill(new GradientClass(gradient));\n } else {\n this.drawingElement.fill(fill.color, fill.opacity);\n }\n }\n });\n\n var TextBlock = VisualBase.extend({\n init: function(options) {\n options = this._textColor(options);\n VisualBase.fn.init.call(this, options);\n\n this._font();\n this._initText();\n this._initSize();\n },\n\n options: {\n fontSize: 15,\n fontFamily: \"sans-serif\",\n stroke: {\n width: 0\n },\n fill: {\n color: \"black\"\n },\n autoSize: true\n },\n\n _initText: function() {\n var options = this.options;\n\n this.drawingElement = new d.Text(defined(options.text) ? options.text : \"\", new g.Point(), {\n font: options.font\n });\n\n this._fill();\n this._stroke();\n },\n\n _textColor: function(options) {\n if (options && options.color) {\n options = deepExtend({}, options, {\n fill: {\n color: options.color\n }\n });\n }\n return options;\n },\n\n _font: function() {\n var options = this.options;\n if (options.fontFamily && defined(options.fontSize)) {\n var fontOptions = [];\n\n if (options.fontStyle) {\n fontOptions.push(options.fontStyle);\n }\n\n if (options.fontWeight) {\n fontOptions.push(options.fontWeight);\n }\n\n fontOptions.push(options.fontSize + (isNumber(options.fontSize) ? \"px\" : \"\"));\n fontOptions.push(options.fontFamily);\n\n options.font = fontOptions.join(\" \");\n } else {\n delete options.font;\n }\n },\n\n content: function(text) {\n return this.drawingElement.content(text);\n },\n\n redraw: function(options) {\n if (options) {\n var sizeChanged = false;\n var textOptions = this.options;\n\n options = this._textColor(options);\n\n VisualBase.fn.redraw.call(this, options);\n\n if (options.fontFamily || defined(options.fontSize) || options.fontStyle || options.fontWeight) {\n deepExtend(textOptions, {\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontStyle: options.fontStyle,\n fontWeight: options.fontWeight\n });\n this._font();\n this.drawingElement.options.set(\"font\", textOptions.font);\n sizeChanged = true;\n }\n\n if (options.text) {\n this.content(options.text);\n sizeChanged = true;\n }\n\n if (!this._updateSize(options) && sizeChanged) {\n this._initSize();\n }\n }\n }\n });\n\n deepExtend(TextBlock.fn, AutoSizeableMixin);\n\n var Rectangle = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n this._initPath();\n this._setPosition();\n },\n\n _setPosition: function() {\n var options = this.options;\n var x = options.x;\n var y = options.y;\n if (defined(x) || defined(y)) {\n this.position(x || 0, y || 0);\n }\n },\n\n redraw: function(options) {\n if (options) {\n VisualBase.fn.redraw.call(this, options);\n if (this._diffNumericOptions(options, [WIDTH, HEIGHT])) {\n this._drawPath();\n }\n if (this._diffNumericOptions(options, [X, Y])) {\n this._setPosition();\n }\n }\n },\n\n _initPath: function() {\n var options = this.options;\n this.drawingElement = new d.Path({\n stroke: options.stroke,\n closed: true\n });\n\n this._fill();\n this._drawPath();\n },\n\n _drawPath: function() {\n var drawingElement = this.drawingElement;\n var sizeOptions = sizeOptionsOrDefault(this.options);\n var width = sizeOptions.width;\n var height = sizeOptions.height;\n\n drawingElement.segments.elements([\n createSegment(0, 0),\n createSegment(width, 0),\n createSegment(width, height),\n createSegment(0, height)\n ]);\n }\n });\n\n var MarkerBase = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n var anchor = this.options.anchor;\n this.anchor = new g.Point(anchor.x, anchor.y);\n this.createElement();\n },\n\n options: {\n stroke: {\n color: TRANSPARENT,\n width: 0\n },\n fill: {\n color: \"black\"\n }\n },\n\n _transformToPath: function(point, path) {\n var transform = path.transform();\n if (point && transform) {\n point = point.transformCopy(transform);\n }\n return point;\n },\n\n redraw: function(options) {\n if (options) {\n if (options.position) {\n this.options.position = options.position;\n }\n\n VisualBase.fn.redraw.call(this, options);\n }\n }\n });\n\n var CircleMarker = MarkerBase.extend({\n options: {\n radius: 4,\n anchor: {\n x: 0,\n y: 0\n }\n },\n\n createElement: function() {\n var options = this.options;\n this.drawingElement = new d.Circle(new g.Circle(this.anchor, options.radius), {\n fill: options.fill,\n stroke: options.stroke\n });\n },\n\n positionMarker: function(path) {\n var options = this.options;\n var position = options.position;\n var segments = path.segments;\n var targetSegment;\n var point;\n\n if (position == START) {\n targetSegment = segments[0];\n } else {\n targetSegment = segments[segments.length - 1];\n }\n if (targetSegment) {\n point = this._transformToPath(targetSegment.anchor(), path);\n this.drawingElement.transform(g.transform().translate(point.x, point.y));\n }\n }\n });\n\n var ArrowMarker = MarkerBase.extend({\n options: {\n path: \"M 0 0 L 10 5 L 0 10 L 3 5 z\" ,\n anchor: {\n x: 10,\n y: 5\n }\n },\n\n createElement: function() {\n var options = this.options;\n this.drawingElement = d.Path.parse(options.path, {\n fill: options.fill,\n stroke: options.stroke\n });\n },\n\n positionMarker: function(path) {\n var points = this._linePoints(path);\n var start = points.start;\n var end = points.end;\n var transform = g.transform();\n if (start) {\n transform.rotate(lineAngle(start, end), end);\n }\n\n if (end) {\n var anchor = this.anchor;\n var translate = end.clone().translate(-anchor.x, -anchor.y);\n transform.translate(translate.x, translate.y);\n }\n this.drawingElement.transform(transform);\n },\n\n _linePoints: function(path) {\n var options = this.options;\n var segments = path.segments;\n var startPoint, endPoint, targetSegment;\n if (options.position == START) {\n targetSegment = segments[0];\n if (targetSegment) {\n endPoint = targetSegment.anchor();\n startPoint = targetSegment.controlOut();\n var nextSegment = segments[1];\n if (!startPoint && nextSegment) {\n startPoint = nextSegment.anchor();\n }\n }\n } else {\n targetSegment = segments[segments.length - 1];\n if (targetSegment) {\n endPoint = targetSegment.anchor();\n startPoint = targetSegment.controlIn();\n var prevSegment = segments[segments.length - 2];\n if (!startPoint && prevSegment) {\n startPoint = prevSegment.anchor();\n }\n }\n }\n if (endPoint) {\n return {\n start: this._transformToPath(startPoint, path),\n end: this._transformToPath(endPoint, path)\n };\n }\n }\n });\n\n var MarkerPathMixin = {\n _getPath: function(position) {\n var path = this.drawingElement;\n if (path instanceof d.MultiPath) {\n if (position == START) {\n path = path.paths[0];\n } else {\n path = path.paths[path.paths.length - 1];\n }\n }\n if (path && path.segments.length) {\n return path;\n }\n },\n\n _normalizeMarkerOptions: function(options) {\n var startCap = options.startCap;\n var endCap = options.endCap;\n\n if (isString(startCap)) {\n options.startCap = {\n type: startCap\n };\n }\n\n if (isString(endCap)) {\n options.endCap = {\n type: endCap\n };\n }\n },\n\n _removeMarker: function(position) {\n var marker = this._markers[position];\n if (marker) {\n this.drawingContainer().remove(marker.drawingElement);\n delete this._markers[position];\n }\n },\n\n _createMarkers: function() {\n var options = this.options;\n this._normalizeMarkerOptions(options);\n\n this._markers = {};\n this._markers[START] = this._createMarker(options.startCap, START);\n this._markers[END] = this._createMarker(options.endCap, END);\n },\n\n _createMarker: function(options, position) {\n var type = (options || {}).type;\n var path = this._getPath(position);\n var markerType, marker;\n if (!path) {\n this._removeMarker(position);\n return;\n }\n\n if (type == Markers.filledCircle) {\n markerType = CircleMarker;\n } else if (type == Markers.arrowStart || type == Markers.arrowEnd) {\n markerType = ArrowMarker;\n } else {\n this._removeMarker(position);\n }\n if (markerType) {\n marker = new markerType(deepExtend({}, options, {\n position: position\n }));\n marker.positionMarker(path);\n this.drawingContainer().append(marker.drawingElement);\n\n return marker;\n }\n },\n\n _positionMarker: function(position) {\n var marker = this._markers[position];\n\n if (marker) {\n var path = this._getPath(position);\n if (path) {\n marker.positionMarker(path);\n } else {\n this._removeMarker(position);\n }\n }\n },\n\n _capMap: {\n start: \"startCap\",\n end: \"endCap\"\n },\n\n _redrawMarker: function(pathChange, position, options) {\n this._normalizeMarkerOptions(options);\n\n var pathOptions = this.options;\n var cap = this._capMap[position];\n var pathCapType = (pathOptions[cap] || {}).type;\n var optionsCap = options[cap];\n var created = false;\n if (optionsCap) {\n pathOptions[cap] = deepExtend({}, pathOptions[cap], optionsCap);\n if (optionsCap.type && pathCapType != optionsCap.type) {\n this._removeMarker(position);\n this._markers[position] = this._createMarker(pathOptions[cap], position);\n created = true;\n } else if (this._markers[position]) {\n this._markers[position].redraw(optionsCap);\n }\n } else if (pathChange && !this._markers[position] && pathOptions[cap]) {\n this._markers[position] = this._createMarker(pathOptions[cap], position);\n created = true;\n }\n return created;\n },\n\n _redrawMarkers: function(pathChange, options) {\n if (!this._redrawMarker(pathChange, START, options) && pathChange) {\n this._positionMarker(START);\n }\n if (!this._redrawMarker(pathChange, END, options) && pathChange) {\n this._positionMarker(END);\n }\n }\n };\n\n var Path = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n this.container = new d.Group();\n this._createElements();\n this._initSize();\n },\n\n options: {\n autoSize: true\n },\n\n drawingContainer: function() {\n return this.container;\n },\n\n data: function(value) {\n var options = this.options;\n if (value) {\n if (options.data != value) {\n options.data = value;\n this._setData(value);\n this._initSize();\n this._redrawMarkers(true, {});\n }\n } else {\n return options.data;\n }\n },\n\n redraw: function(options) {\n if (options) {\n VisualBase.fn.redraw.call(this, options);\n\n var pathOptions = this.options;\n var data = options.data;\n\n if (defined(data) && pathOptions.data != data) {\n pathOptions.data = data;\n this._setData(data);\n if (!this._updateSize(options)) {\n this._initSize();\n }\n this._redrawMarkers(true, options);\n } else {\n this._updateSize(options);\n this._redrawMarkers(false, options);\n }\n }\n },\n\n _createElements: function() {\n var options = this.options;\n\n this.drawingElement = d.Path.parse(options.data || \"\", {\n stroke: options.stroke\n });\n\n this._fill();\n this.container.append(this.drawingElement);\n this._createMarkers();\n },\n\n _setData: function(data) {\n var drawingElement = this.drawingElement;\n var multipath = d.Path.parse(data || \"\");\n var paths = multipath.paths.slice(0);\n multipath.paths.elements([]);\n drawingElement.paths.elements(paths);\n }\n });\n\n deepExtend(Path.fn, AutoSizeableMixin);\n deepExtend(Path.fn, MarkerPathMixin);\n\n var Line = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n this.container = new d.Group();\n this._initPath();\n this._createMarkers();\n },\n\n drawingContainer: function() {\n return this.container;\n },\n\n redraw: function(options) {\n if (options) {\n options = options || {};\n var from = options.from;\n var to = options.to;\n if (from) {\n this.options.from = from;\n }\n\n if (to) {\n this.options.to = to;\n }\n\n if (from || to) {\n this._drawPath();\n this._redrawMarkers(true, options);\n } else {\n this._redrawMarkers(false, options);\n }\n\n VisualBase.fn.redraw.call(this, options);\n }\n },\n\n _initPath: function() {\n var options = this.options;\n var drawingElement = this.drawingElement = new d.Path({\n stroke: options.stroke\n });\n\n this._fill();\n this._drawPath();\n this.container.append(drawingElement);\n },\n\n _drawPath: function() {\n var options = this.options;\n var drawingElement = this.drawingElement;\n var from = options.from || new Point();\n var to = options.to || new Point();\n\n drawingElement.segments.elements([\n createSegment(from.x, from.y),\n createSegment(to.x, to.y)\n ]);\n }\n });\n\n deepExtend(Line.fn, MarkerPathMixin);\n\n var Polyline = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n this.container = new d.Group();\n this._initPath();\n this._createMarkers();\n },\n\n drawingContainer: function() {\n return this.container;\n },\n\n points: function(points) {\n var options = this.options;\n if (points) {\n options.points = points;\n this._updatePath();\n } else {\n return options.points;\n }\n },\n\n redraw: function(options) {\n if (options) {\n var points = options.points;\n VisualBase.fn.redraw.call(this, options);\n\n if (points && this._pointsDiffer(points)) {\n this.points(points);\n this._redrawMarkers(true, options);\n } else {\n this._redrawMarkers(false, options);\n }\n }\n },\n\n _initPath: function() {\n var options = this.options;\n this.drawingElement = new d.Path({\n stroke: options.stroke\n });\n\n this._fill();\n this.container.append(this.drawingElement);\n\n if (options.points) {\n this._updatePath();\n }\n },\n\n _pointsDiffer: function(points) {\n var currentPoints = this.options.points;\n var differ = currentPoints.length !== points.length;\n if (!differ) {\n for (var i = 0; i < points.length; i++) {\n if (currentPoints[i].x !== points[i].x || currentPoints[i].y !== points[i].y) {\n differ = true;\n break;\n }\n }\n }\n\n return differ;\n },\n\n _updatePath: function() {\n var drawingElement = this.drawingElement;\n var options = this.options;\n var points = options.points;\n var segments = [];\n var point;\n for (var i = 0; i < points.length; i++) {\n point = points[i];\n segments.push(createSegment(point.x, point.y));\n }\n\n drawingElement.segments.elements(segments);\n },\n\n options: {\n points: []\n }\n });\n\n deepExtend(Polyline.fn, MarkerPathMixin);\n\n var Image = Element.extend({\n init: function(options) {\n Element.fn.init.call(this, options);\n\n this._initImage();\n },\n\n redraw: function(options) {\n if (options) {\n if (options.source) {\n this.drawingElement.src(options.source);\n }\n\n if (this._diffNumericOptions(options, [WIDTH, HEIGHT, X, Y])) {\n this.drawingElement.rect(this._rect());\n }\n\n Element.fn.redraw.call(this, options);\n }\n },\n\n _initImage: function() {\n var options = this.options;\n var rect = this._rect();\n\n this.drawingElement = new d.Image(options.source, rect, {});\n },\n\n _rect: function() {\n var sizeOptions = sizeOptionsOrDefault(this.options);\n var origin = new g.Point(sizeOptions.x, sizeOptions.y);\n var size = new g.Size(sizeOptions.width, sizeOptions.height);\n\n return new g.Rect(origin, size);\n }\n });\n\n var Group = Element.extend({\n init: function(options) {\n this.children = [];\n Element.fn.init.call(this, options);\n this.drawingElement = new d.Group();\n this._initSize();\n },\n\n options: {\n autoSize: false\n },\n\n append: function(visual) {\n this.drawingElement.append(visual.drawingContainer());\n this.children.push(visual);\n this._childrenChange = true;\n },\n\n remove: function(visual) {\n if (this._remove(visual)) {\n this._childrenChange = true;\n }\n },\n\n _remove: function(visual) {\n var index = inArray(visual, this.children);\n if (index >= 0) {\n this.drawingElement.removeAt(index);\n this.children.splice(index, 1);\n return true;\n }\n },\n\n clear: function() {\n this.drawingElement.clear();\n this.children = [];\n this._childrenChange = true;\n },\n\n toFront: function(visuals) {\n var visual;\n\n for (var i = 0; i < visuals.length; i++) {\n visual = visuals[i];\n if (this._remove(visual)) {\n this.append(visual);\n }\n }\n },\n //TO DO: add drawing group support for moving and inserting children\n toBack: function(visuals) {\n this._reorderChildren(visuals, 0);\n },\n\n toIndex: function(visuals, indices) {\n this._reorderChildren(visuals, indices);\n },\n\n _reorderChildren: function(visuals, indices) {\n var group = this.drawingElement;\n var drawingChildren = group.children.slice(0);\n var children = this.children;\n var fixedPosition = isNumber(indices);\n var i, index, toIndex, drawingElement, visual;\n\n for (i = 0; i < visuals.length; i++) {\n visual = visuals[i];\n drawingElement = visual.drawingContainer();\n\n index = inArray(visual, children);\n if (index >= 0) {\n drawingChildren.splice(index, 1);\n children.splice(index, 1);\n\n toIndex = fixedPosition ? indices : indices[i];\n\n drawingChildren.splice(toIndex, 0, drawingElement);\n children.splice(toIndex, 0, visual);\n }\n }\n group.clear();\n group.append.apply(group, drawingChildren);\n },\n\n redraw: function(options) {\n if (options) {\n if (this._childrenChange) {\n this._childrenChange = false;\n if (!this._updateSize(options)) {\n this._initSize();\n }\n } else {\n this._updateSize(options);\n }\n\n Element.fn.redraw.call(this, options);\n }\n },\n\n _boundingBox: function() {\n var children = this.children;\n var boundingBox;\n var visual, childBoundingBox;\n for (var i = 0; i < children.length; i++) {\n visual = children[i];\n if (visual.visible() && visual._includeInBBox !== false) {\n childBoundingBox = visual.drawingContainer().clippedBBox(null);\n if (childBoundingBox) {\n if (boundingBox) {\n boundingBox = g.Rect.union(boundingBox, childBoundingBox);\n } else {\n boundingBox = childBoundingBox;\n }\n }\n }\n }\n\n return boundingBox;\n }\n });\n\n deepExtend(Group.fn, AutoSizeableMixin);\n\n var Layout = Group.extend({\n init: function(rect, options) {\n this.children = [];\n Element.fn.init.call(this, options);\n this.drawingElement = new d.Layout(toDrawingRect(rect), options);\n this._initSize();\n },\n\n rect: function(rect) {\n if (rect) {\n this.drawingElement.rect(toDrawingRect(rect));\n } else {\n var drawingRect = this.drawingElement.rect();\n if (drawingRect) {\n return new Rect(drawingRect.origin.x, drawingRect.origin.y, drawingRect.size.width, drawingRect.size.height);\n }\n }\n },\n\n reflow: function() {\n this.drawingElement.reflow();\n },\n\n redraw: function(options) {\n kendo.deepExtend(this.drawingElement.options, options);\n Group.fn.redraw.call(this, options);\n }\n });\n\n var Circle = VisualBase.extend({\n init: function(options) {\n VisualBase.fn.init.call(this, options);\n this._initCircle();\n this._initSize();\n },\n\n redraw: function(options) {\n if (options) {\n var circleOptions = this.options;\n\n if (options.center) {\n deepExtend(circleOptions, {\n center: options.center\n });\n this._center.move(circleOptions.center.x, circleOptions.center.y);\n }\n\n if (this._diffNumericOptions(options, [\"radius\"])) {\n this._circle.setRadius(circleOptions.radius);\n }\n\n this._updateSize(options);\n\n VisualBase.fn.redraw.call(this, options);\n }\n },\n\n _initCircle: function() {\n var options = this.options;\n var width = options.width;\n var height = options.height;\n var radius = options.radius;\n if (!defined(radius)) {\n if (!defined(width)) {\n width = height;\n }\n if (!defined(height)) {\n height = width;\n }\n options.radius = radius = Math.min(width, height) / 2;\n }\n\n var center = options.center || { x: radius, y: radius };\n this._center = new g.Point(center.x, center.y);\n this._circle = new g.Circle(this._center, radius);\n this.drawingElement = new d.Circle(this._circle, {\n stroke: options.stroke\n });\n\n this._fill();\n }\n });\n deepExtend(Circle.fn, AutoSizeableMixin);\n\n var Canvas = Class.extend({\n init: function(element, options) {\n options = options || {};\n this.element = element;\n this.surface = d.Surface.create(element, options);\n if (kendo.isFunction(this.surface.translate)) {\n this.translate = this._translate;\n }\n\n this.drawingElement = new d.Group();\n this._viewBox = new Rect(0, 0, options.width, options.height);\n this.size(this._viewBox);\n },\n\n bounds: function() {\n var box = this.drawingElement.clippedBBox();\n return new Rect(0, 0, box.width(), box.height());\n },\n\n size: function(size) {\n var viewBox = this._viewBox;\n if (defined(size)) {\n viewBox.width = size.width;\n viewBox.height = size.height;\n this.surface.setSize(size);\n }\n return {\n width: viewBox.width,\n height: viewBox.height\n };\n },\n\n _translate: function(x, y) {\n var viewBox = this._viewBox;\n if (defined(x) && defined(y)) {\n viewBox.x = x;\n viewBox.y = y;\n this.surface.translate({ x: x, y: y });\n }\n return {\n x: viewBox.x,\n y: viewBox.y\n };\n },\n\n draw: function() {\n this.surface.draw(this.drawingElement);\n },\n\n append: function(visual) {\n this.drawingElement.append(visual.drawingContainer());\n return this;\n },\n\n remove: function(visual) {\n this.drawingElement.remove(visual.drawingContainer());\n },\n\n insertBefore: function() {\n\n },\n\n clear: function() {\n this.drawingElement.clear();\n },\n\n destroy: function(clearHtml) {\n this.surface.destroy();\n if (clearHtml) {\n $(this.element).remove();\n }\n }\n });\n\n // Helper functions ===========================================\n\n function sizeOptionsOrDefault(options) {\n return {\n x: options.x || 0,\n y: options.y || 0,\n width: options.width || 0,\n height: options.height || 0\n };\n }\n\n function normalizeDrawingOptions(options) {\n if (options) {\n var drawingOptions = options;\n\n if (isString(drawingOptions)) {\n drawingOptions = {\n color: drawingOptions\n };\n }\n\n if (drawingOptions.color) {\n drawingOptions.color = getColor(drawingOptions.color);\n }\n return drawingOptions;\n }\n }\n\n function getColor(value) {\n var color;\n if (value != TRANSPARENT) {\n color = new d.Color(value).toHex();\n } else {\n color = value;\n }\n return color;\n }\n\n function lineAngle(p1, p2) {\n var xDiff = p2.x - p1.x;\n var yDiff = p2.y - p1.y;\n var angle = d.util.deg(Math.atan2(yDiff, xDiff));\n return angle;\n }\n\n function createSegment(x, y) {\n return new d.Segment(new g.Point(x, y));\n }\n\n function toDrawingRect(rect) {\n if (rect) {\n return new g.Rect([rect.x, rect.y], [rect.width, rect.height]);\n }\n }\n\n // Exports ================================================================\n kendo.deepExtend(diagram, {\n init: function(element) {\n kendo.init(element, diagram.ui);\n },\n diffNumericOptions: diffNumericOptions,\n Element: Element,\n Scale: Scale,\n Translation: Translation,\n Rotation: Rotation,\n Circle: Circle,\n Group: Group,\n Rectangle: Rectangle,\n Canvas: Canvas,\n Path: Path,\n Layout: Layout,\n Line: Line,\n MarkerBase: MarkerBase,\n ArrowMarker: ArrowMarker,\n CircleMarker: CircleMarker,\n Polyline: Polyline,\n CompositeTransform: CompositeTransform,\n TextBlock: TextBlock,\n Image: Image,\n VisualBase: VisualBase\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n // Imports ================================================================\n var kendo = window.kendo,\n dataviz = kendo.dataviz,\n diagram = dataviz.diagram,\n Class = kendo.Class,\n Group = diagram.Group,\n Rect = diagram.Rect,\n Rectangle = diagram.Rectangle,\n Utils = diagram.Utils,\n isUndefined = Utils.isUndefined,\n Point = diagram.Point,\n Circle = diagram.Circle,\n Ticker = diagram.Ticker,\n deepExtend = kendo.deepExtend,\n Movable = kendo.ui.Movable,\n util = kendo.drawing.util,\n defined = util.defined,\n inArray = $.inArray;\n\n // Constants ==============================================================\n var Cursors = {\n arrow: \"default\",\n grip: \"pointer\",\n cross: \"pointer\",\n add: \"pointer\",\n move: \"move\",\n select: \"pointer\",\n south: \"s-resize\",\n east: \"e-resize\",\n west: \"w-resize\",\n north: \"n-resize\",\n rowresize: \"row-resize\",\n colresize: \"col-resize\"\n },\n HIT_TEST_DISTANCE = 10,\n AUTO = \"Auto\",\n TOP = \"Top\",\n RIGHT = \"Right\",\n LEFT = \"Left\",\n BOTTOM = \"Bottom\",\n DEFAULT_SNAP_SIZE = 10,\n DEFAULT_SNAP_ANGLE = 10,\n DRAG_START = \"dragStart\",\n DRAG = \"drag\",\n DRAG_END = \"dragEnd\",\n ITEMROTATE = \"itemRotate\",\n ITEMBOUNDSCHANGE = \"itemBoundsChange\",\n MIN_SNAP_SIZE = 5,\n MIN_SNAP_ANGLE = 5,\n MOUSE_ENTER = \"mouseEnter\",\n MOUSE_LEAVE = \"mouseLeave\",\n ZOOM_START = \"zoomStart\",\n ZOOM_END = \"zoomEnd\",\n SCROLL_MIN = -20000,\n SCROLL_MAX = 20000,\n FRICTION = 0.90,\n FRICTION_MOBILE = 0.93,\n VELOCITY_MULTIPLIER = 5,\n TRANSPARENT = \"transparent\",\n PAN = \"pan\",\n ROTATED = \"rotated\",\n SOURCE = \"source\",\n TARGET = \"target\",\n HANDLE_NAMES = {\n \"-1\": SOURCE,\n \"1\": TARGET\n };\n\n diagram.Cursors = Cursors;\n\n var PositionAdapter = kendo.Class.extend({\n init: function(layoutState) {\n this.layoutState = layoutState;\n this.diagram = layoutState.diagram;\n },\n initState: function() {\n this.froms = [];\n this.tos = [];\n this.subjects = [];\n function pusher(id, bounds) {\n var shape = this.diagram.getShapeById(id);\n if (shape) {\n this.subjects.push(shape);\n this.froms.push(shape.bounds().topLeft());\n this.tos.push(bounds.topLeft());\n }\n }\n\n this.layoutState.nodeMap.forEach(pusher, this);\n },\n update: function(tick) {\n if (this.subjects.length <= 0) {\n return;\n }\n for (var i = 0; i < this.subjects.length; i++) {\n //todo: define a Lerp function instead\n this.subjects[i].position(\n new Point(this.froms[i].x + (this.tos[i].x - this.froms[i].x) * tick, this.froms[i].y + (this.tos[i].y - this.froms[i].y) * tick)\n );\n }\n }\n });\n\n var LayoutUndoUnit = Class.extend({\n init: function(initialState, finalState, animate) {\n if (isUndefined(animate)) {\n this.animate = false;\n }\n else {\n this.animate = animate;\n }\n this._initialState = initialState;\n this._finalState = finalState;\n this.title = \"Diagram layout\";\n },\n undo: function() {\n this.setState(this._initialState);\n },\n redo: function() {\n this.setState(this._finalState);\n },\n setState: function(state) {\n var diagram = state.diagram;\n if (this.animate) {\n state.linkMap.forEach(\n function(id, points) {\n var conn = diagram.getShapeById(id);\n conn.visible(false);\n if (conn) {\n conn.points(points);\n }\n }\n );\n var ticker = new Ticker();\n ticker.addAdapter(new PositionAdapter(state));\n ticker.onComplete(function() {\n state.linkMap.forEach(\n function(id) {\n var conn = diagram.getShapeById(id);\n conn.visible(true);\n }\n );\n });\n ticker.play();\n }\n else {\n state.nodeMap.forEach(function(id, bounds) {\n var shape = diagram.getShapeById(id);\n if (shape) {\n shape.position(bounds.topLeft());\n }\n });\n state.linkMap.forEach(\n function(id, points) {\n var conn = diagram.getShapeById(id);\n if (conn) {\n conn.points(points);\n }\n }\n );\n }\n }\n });\n\n var CompositeUnit = Class.extend({\n init: function(unit) {\n this.units = [];\n this.title = \"Composite unit\";\n if (unit !== undefined$1) {\n this.units.push(unit);\n }\n },\n add: function(undoUnit) {\n this.units.push(undoUnit);\n },\n undo: function() {\n for (var i = 0; i < this.units.length; i++) {\n this.units[i].undo();\n }\n },\n redo: function() {\n for (var i = 0; i < this.units.length; i++) {\n this.units[i].redo();\n }\n }\n });\n\n var ConnectionEditUnit = Class.extend({\n init: function(item, redoSource, redoTarget) {\n this.item = item;\n this._redoSource = redoSource;\n this._redoTarget = redoTarget;\n if (defined(redoSource)) {\n this._undoSource = item.source();\n }\n\n if (defined(redoTarget)) {\n this._undoTarget = item.target();\n }\n this.title = \"Connection Editing\";\n },\n undo: function() {\n if (this._undoSource !== undefined$1) {\n this.item._updateConnector(this._undoSource, \"source\");\n }\n\n if (this._undoTarget !== undefined$1) {\n this.item._updateConnector(this._undoTarget, \"target\");\n }\n\n this.item.updateModel();\n },\n redo: function() {\n if (this._redoSource !== undefined$1) {\n this.item._updateConnector(this._redoSource, \"source\");\n }\n\n if (this._redoTarget !== undefined$1) {\n this.item._updateConnector(this._redoTarget, \"target\");\n }\n\n this.item.updateModel();\n }\n });\n\n var ConnectionEditUndoUnit = Class.extend({\n init: function(item, undoSource, undoTarget) {\n this.item = item;\n this._undoSource = undoSource;\n this._undoTarget = undoTarget;\n this._redoSource = item.source();\n this._redoTarget = item.target();\n this.title = \"Connection Editing\";\n },\n undo: function() {\n this.item._updateConnector(this._undoSource, \"source\");\n this.item._updateConnector(this._undoTarget, \"target\");\n this.item.updateModel();\n },\n redo: function() {\n this.item._updateConnector(this._redoSource, \"source\");\n this.item._updateConnector(this._redoTarget, \"target\");\n this.item.updateModel();\n }\n });\n\n var DeleteConnectionUnit = Class.extend({\n init: function(connection) {\n this.connection = connection;\n this.diagram = connection.diagram;\n this.targetConnector = connection.targetConnector;\n this.title = \"Delete connection\";\n },\n undo: function() {\n this.diagram._addConnection(this.connection, false);\n },\n redo: function() {\n this.diagram.remove(this.connection, false);\n }\n });\n\n var DeleteShapeUnit = Class.extend({\n init: function(shape) {\n this.shape = shape;\n this.diagram = shape.diagram;\n this.title = \"Deletion\";\n },\n undo: function() {\n this.diagram._addShape(this.shape, false);\n this.shape.select(false);\n },\n redo: function() {\n this.shape.select(false);\n this.diagram.remove(this.shape, false);\n }\n });\n /**\n * Holds the undoredo state when performing a rotation, translation or scaling. The adorner is optional.\n * @type {*}\n */\n var TransformUnit = Class.extend({\n init: function(shapes, undoStates, adorner) {\n this.shapes = shapes;\n this.undoStates = undoStates;\n this.title = \"Transformation\";\n this.redoStates = [];\n this.adorner = adorner;\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n this.redoStates.push(shape.bounds());\n }\n },\n undo: function() {\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n shape.bounds(this.undoStates[i]);\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape, this.redoStates[i], this.undoStates[i]);\n }\n shape.updateModel();\n }\n if (this.adorner) {\n this.adorner.refreshBounds();\n this.adorner.refresh();\n }\n },\n redo: function() {\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n shape.bounds(this.redoStates[i]);\n // the 'layout' property, if implemented, lets the shape itself work out what to do with the new bounds\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape, this.undoStates[i], this.redoStates[i]);\n }\n shape.updateModel();\n }\n\n if (this.adorner) {\n this.adorner.refreshBounds();\n this.adorner.refresh();\n }\n }\n });\n\n var AddConnectionUnit = Class.extend({\n init: function(connection, diagram) {\n this.connection = connection;\n this.diagram = diagram;\n this.title = \"New connection\";\n },\n\n undo: function() {\n this.diagram.remove(this.connection, false);\n },\n\n redo: function() {\n this.diagram._addConnection(this.connection, false);\n }\n });\n\n var AddShapeUnit = Class.extend({\n init: function(shape, diagram) {\n this.shape = shape;\n this.diagram = diagram;\n this.title = \"New shape\";\n },\n\n undo: function() {\n this.diagram.deselect();\n this.diagram.remove(this.shape, false);\n },\n\n redo: function() {\n this.diagram._addShape(this.shape, false);\n }\n });\n\n var PanUndoUnit = Class.extend({\n init: function(initialPosition, finalPosition, diagram) {\n this.initial = initialPosition;\n this.finalPos = finalPosition;\n this.diagram = diagram;\n this.title = \"Pan Unit\";\n },\n undo: function() {\n this.diagram.pan(this.initial);\n },\n redo: function() {\n this.diagram.pan(this.finalPos);\n }\n });\n\n var RotateUnit = Class.extend({\n init: function(adorner, shapes, undoRotates) {\n this.shapes = shapes;\n this.undoRotates = undoRotates;\n this.title = \"Rotation\";\n this.redoRotates = [];\n this.redoAngle = adorner._angle;\n this.adorner = adorner;\n this.center = adorner._innerBounds.center();\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n this.redoRotates.push(shape.rotate().angle);\n }\n },\n undo: function() {\n var i, shape;\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n shape.rotate(this.undoRotates[i], this.center, false);\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape);\n }\n shape.updateModel();\n }\n if (this.adorner) {\n this.adorner._initialize();\n this.adorner.refresh();\n }\n },\n redo: function() {\n var i, shape;\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n shape.rotate(this.redoRotates[i], this.center, false);\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape);\n }\n shape.updateModel();\n }\n if (this.adorner) {\n this.adorner._initialize();\n this.adorner.refresh();\n }\n }\n });\n\n var ToFrontUnit = Class.extend({\n init: function(diagram, items, initialIndices) {\n this.diagram = diagram;\n this.indices = initialIndices;\n this.items = items;\n this.title = \"Rotate Unit\";\n },\n undo: function() {\n this.diagram._toIndex(this.items, this.indices);\n },\n redo: function() {\n this.diagram.toFront(this.items, false);\n }\n });\n\n var ToBackUnit = Class.extend({\n init: function(diagram, items, initialIndices) {\n this.diagram = diagram;\n this.indices = initialIndices;\n this.items = items;\n this.title = \"Rotate Unit\";\n },\n undo: function() {\n this.diagram._toIndex(this.items, this.indices);\n },\n redo: function() {\n this.diagram.toBack(this.items, false);\n }\n });\n\n /**\n * Undo-redo service.\n */\n var UndoRedoService = kendo.Observable.extend({\n init: function(options) {\n kendo.Observable.fn.init.call(this, options);\n this.bind(this.events, options);\n this.stack = [];\n this.index = 0;\n this.capacity = 100;\n },\n\n events: [\"undone\", \"redone\"],\n\n /**\n * Starts the collection of units. Add those with\n * the addCompositeItem method and call commit. Or cancel to forget about it.\n */\n begin: function() {\n this.composite = new CompositeUnit();\n },\n\n /**\n * Cancels the collection process of unit started with 'begin'.\n */\n cancel: function() {\n this.composite = undefined$1;\n },\n\n /**\n * Commits a batch of units.\n */\n commit: function(execute) {\n if (this.composite.units.length > 0) {\n this._restart(this.composite, execute);\n }\n this.composite = undefined$1;\n },\n\n /**\n * Adds a unit as part of the begin-commit batch.\n * @param undoUnit\n */\n addCompositeItem: function(undoUnit) {\n if (this.composite) {\n this.composite.add(undoUnit);\n } else {\n this.add(undoUnit);\n }\n },\n\n /**\n * Standard addition of a unit. See also the batch version; begin-addCompositeUnit-commit methods.\n * @param undoUnit The unit to be added.\n * @param execute If false, the unit will be added but not executed.\n */\n add: function(undoUnit, execute) {\n this._restart(undoUnit, execute);\n },\n\n /**\n * Returns the number of undoable unit in the stack.\n * @returns {Number}\n */\n\n pop: function() {\n if (this.index > 0) {\n this.stack.pop();\n this.index--;\n }\n },\n\n count: function() {\n return this.stack.length;\n },\n\n /**\n * Rollback of the unit on top of the stack.\n */\n undo: function() {\n if (this.index > 0) {\n this.index--;\n this.stack[this.index].undo();\n this.trigger(\"undone\");\n }\n },\n\n /**\n * Redo of the last undone action.\n */\n redo: function() {\n if (this.stack.length > 0 && this.index < this.stack.length) {\n this.stack[this.index].redo();\n this.index++;\n this.trigger(\"redone\");\n }\n },\n\n _restart: function(composite, execute) {\n // throw away anything beyond this point if this is a new branch\n this.stack.splice(this.index, this.stack.length - this.index);\n this.stack.push(composite);\n if (execute !== false) {\n this.redo();\n } else {\n this.index++;\n }\n // check the capacity\n if (this.stack.length > this.capacity) {\n this.stack.splice(0, this.stack.length - this.capacity);\n this.index = this.capacity; //points to the end of the stack\n }\n },\n\n /**\n * Clears the stack.\n */\n clear: function() {\n this.stack = [];\n this.index = 0;\n }\n });\n\n // Tools =========================================\n\n var EmptyTool = Class.extend({\n init: function(toolService) {\n this.toolService = toolService;\n },\n start: function() {\n },\n move: function() {\n },\n end: function() {\n },\n tryActivate: function() {\n return false;\n },\n getCursor: function() {\n return Cursors.arrow;\n }\n });\n\n var ScrollerTool = EmptyTool.extend({\n init: function(toolService) {\n var tool = this;\n var friction = kendo.support.mobileOS ? FRICTION_MOBILE : FRICTION;\n EmptyTool.fn.init.call(tool, toolService);\n\n var diagram = tool.toolService.diagram,\n canvas = diagram.canvas;\n\n var scroller = diagram.scroller = tool.scroller = $(diagram.scrollable).kendoMobileScroller({\n friction: friction,\n velocityMultiplier: VELOCITY_MULTIPLIER,\n mousewheelScrolling: false,\n zoom: false,\n scroll: tool._move.bind(tool)\n }).data(\"kendoMobileScroller\");\n\n if (canvas.translate) {\n tool.movableCanvas = new Movable(canvas.element);\n }\n\n var virtualScroll = function(dimension, min, max) {\n dimension.makeVirtual();\n dimension.virtualSize(min || SCROLL_MIN, max || SCROLL_MAX);\n };\n\n virtualScroll(scroller.dimensions.x);\n virtualScroll(scroller.dimensions.y);\n scroller.disable();\n },\n\n tryActivate: function(p, meta) {\n var toolService = this.toolService;\n var options = toolService.diagram.options.pannable;\n var enabled = meta.ctrlKey;\n\n if (defined(options.key)) {\n if (!options.key || options.key == \"none\") {\n enabled = noMeta(meta) && !defined(toolService.hoveredItem);\n } else {\n enabled = meta[options.key + \"Key\"];\n }\n }\n\n return options !== false && enabled && !defined(toolService.hoveredAdorner) && !defined(toolService._hoveredConnector);\n },\n\n start: function() {\n this.scroller.enable();\n },\n move: function() {\n },//the tool itself should not handle the scrolling. Let kendo scroller take care of this part. Check _move\n _move: function(args) {\n var tool = this,\n diagram = tool.toolService.diagram,\n canvas = diagram.canvas,\n scrollPos = new Point(args.scrollLeft, args.scrollTop);\n\n if (canvas.translate) {\n diagram._storePan(scrollPos.times(-1));\n tool.movableCanvas.moveTo(scrollPos);\n canvas.translate(scrollPos.x, scrollPos.y);\n } else {\n scrollPos = scrollPos.plus(diagram._pan.times(-1));\n }\n\n diagram.trigger(PAN, { pan: scrollPos });\n },\n end: function() {\n this.scroller.disable();\n },\n getCursor: function() {\n return Cursors.move;\n }\n });\n\n /**\n * The tool handling the transformations via the adorner.\n * @type {*}\n */\n var PointerTool = Class.extend({\n init: function(toolService) {\n this.toolService = toolService;\n },\n tryActivate: function() {\n return true; // the pointer tool is last and handles all others requests.\n },\n start: function(p, meta) {\n var toolService = this.toolService,\n diagram = toolService.diagram,\n hoveredItem = toolService.hoveredItem;\n\n if (hoveredItem) {\n toolService.selectSingle(hoveredItem, meta);\n if (hoveredItem.adorner) { //connection\n this.adorner = hoveredItem.adorner;\n this.handle = this.adorner._hitTest(p);\n }\n }\n\n if (!this.handle) {\n this.handle = diagram._resizingAdorner._hitTest(p);\n if (this.handle) {\n this.adorner = diagram._resizingAdorner;\n }\n }\n\n if (this.adorner) {\n if (!this.adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_START, { shapes: this.adorner.shapes, connections: [] })) {\n this.adorner.start(p);\n } else {\n toolService.startPoint = p;\n toolService.end(p);\n }\n }\n },\n\n move: function(p) {\n if (this.adorner) {\n this.adorner.move(this.handle, p);\n if (this.adorner.isDragHandle(this.handle)) {\n this.toolService.diagram.trigger(DRAG, { shapes: this.adorner.shapes, connections: [] });\n }\n }\n },\n\n end: function() {\n var diagram = this.toolService.diagram,\n adorner = this.adorner,\n unit;\n\n if (adorner) {\n if (!adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_END, { shapes: adorner.shapes, connections: [] })) {\n unit = adorner.stop();\n if (unit) {\n diagram.undoRedoService.add(unit, false);\n }\n } else {\n adorner.cancel();\n }\n }\n\n this.adorner = undefined$1;\n this.handle = undefined$1;\n },\n getCursor: function(p) {\n return this.toolService.hoveredItem ? this.toolService.hoveredItem._getCursor(p) : Cursors.arrow;\n }\n });\n\n var SelectionTool = Class.extend({\n init: function(toolService) {\n this.toolService = toolService;\n },\n tryActivate: function(p, meta) {\n var toolService = this.toolService;\n var selectable = toolService.diagram.options.selectable;\n var enabled = selectable && selectable.multiple !== false;\n\n if (enabled) {\n if (selectable.key && selectable.key != \"none\") {\n enabled = meta[selectable.key + \"Key\"];\n } else {\n enabled = noMeta(meta);\n }\n }\n\n return enabled && !defined(toolService.hoveredItem) && !defined(toolService.hoveredAdorner);\n },\n start: function(p) {\n var diagram = this.toolService.diagram;\n diagram.deselect();\n diagram.selector.start(p);\n },\n move: function(p) {\n var diagram = this.toolService.diagram;\n diagram.selector.move(p);\n },\n end: function(p, meta) {\n var diagram = this.toolService.diagram, hoveredItem = this.toolService.hoveredItem;\n var rect = diagram.selector.bounds();\n if ((!hoveredItem || !hoveredItem.isSelected) && !meta.ctrlKey) {\n diagram.deselect();\n }\n if (!rect.isEmpty()) {\n diagram.selectArea(rect);\n }\n diagram.selector.end();\n },\n getCursor: function() {\n return Cursors.arrow;\n }\n });\n\n var ConnectionTool = Class.extend({\n init: function(toolService) {\n this.toolService = toolService;\n this.type = \"ConnectionTool\";\n },\n tryActivate: function() {\n return this.toolService._hoveredConnector;\n },\n start: function(p, meta) {\n var toolService = this.toolService,\n diagram = toolService.diagram,\n connector = toolService._hoveredConnector,\n connection = diagram._createConnection({}, connector._c, p);\n\n if (canDrag(connection) && !diagram.trigger(DRAG_START, { shapes: [], connections: [connection], connectionHandle: TARGET }) && diagram._addConnection(connection)) {\n toolService._connectionManipulation(connection, connector._c.shape, true);\n toolService._removeHover();\n toolService.selectSingle(toolService.activeConnection, meta);\n if (meta.type == \"touchmove\") {\n diagram._cachedTouchTarget = connector.visual;\n }\n } else {\n connection.source(null);\n toolService.end(p);\n }\n },\n\n move: function(p) {\n var toolService = this.toolService;\n var connection = toolService.activeConnection;\n\n connection.target(p);\n toolService.diagram.trigger(DRAG, { shapes: [], connections: [connection], connectionHandle: TARGET });\n return true;\n },\n\n end: function(p) {\n var toolService = this.toolService,\n d = toolService.diagram,\n connection = toolService.activeConnection,\n hoveredItem = toolService.hoveredItem,\n connector = toolService._hoveredConnector,\n target,\n cachedTouchTarget = d._cachedTouchTarget;\n\n if (!connection) {\n return;\n }\n\n if (connector && connector._c != connection.sourceConnector) {\n target = connector._c;\n } else if (hoveredItem && hoveredItem instanceof diagram.Shape) {\n target = hoveredItem.getConnector(AUTO) || hoveredItem.getConnector(p);\n } else {\n target = p;\n }\n\n connection.target(target);\n\n if (!d.trigger(DRAG_END, { shapes: [], connections: [connection], connectionHandle: TARGET })) {\n connection.updateModel();\n d._syncConnectionChanges();\n } else {\n d.remove(connection, false);\n d.undoRedoService.pop();\n }\n toolService._connectionManipulation();\n\n if (cachedTouchTarget) {\n d._connectorsAdorner.visual.remove(cachedTouchTarget);\n d._cachedTouchTarget = null;\n }\n },\n\n getCursor: function() {\n return Cursors.arrow;\n }\n });\n\n var ConnectionEditTool = Class.extend({\n init: function(toolService) {\n this.toolService = toolService;\n this.type = \"ConnectionTool\";\n },\n\n tryActivate: function(p, meta) {\n var toolService = this.toolService,\n diagram = toolService.diagram,\n selectable = diagram.options.selectable,\n item = toolService.hoveredItem,\n isActive = selectable !== false &&\n item && item.path && !(item.isSelected && meta.ctrlKey);\n\n if (isActive) {\n this._c = item;\n }\n\n return isActive;\n },\n\n start: function(p, meta) {\n var toolService = this.toolService;\n var connection = this._c;\n\n toolService.selectSingle(connection, meta);\n\n var adorner = connection.adorner;\n\n var handle, name;\n if (adorner) {\n handle = adorner._hitTest(p);\n name = HANDLE_NAMES[handle];\n }\n\n if (canDrag(connection) && adorner && !toolService.diagram.trigger(DRAG_START, { shapes: [], connections: [connection], connectionHandle: name })) {\n this.handle = handle;\n this.handleName = name;\n adorner.start(p);\n } else {\n toolService.startPoint = p;\n toolService.end(p);\n }\n },\n\n move: function(p) {\n var adorner = this._c.adorner;\n if (canDrag(this._c) && adorner) {\n adorner.move(this.handle, p);\n this.toolService.diagram.trigger(DRAG, { shapes: [], connections: [this._c], connectionHandle: this.handleName });\n\n return true;\n }\n },\n\n end: function(p) {\n var connection = this._c;\n var adorner = connection.adorner;\n var toolService = this.toolService;\n var diagram = toolService.diagram;\n\n if (adorner) {\n if (canDrag(connection)) {\n var unit = adorner.stop(p);\n if (!diagram.trigger(DRAG_END, { shapes: [], connections: [connection], connectionHandle: this.handleName })) {\n diagram.undoRedoService.add(unit, false);\n connection.updateModel();\n diagram._syncConnectionChanges();\n } else {\n unit.undo();\n }\n }\n }\n },\n\n getCursor: function() {\n return Cursors.move;\n }\n });\n\n function testKey(key, str) {\n return str.charCodeAt(0) == key || str.toUpperCase().charCodeAt(0) == key;\n }\n\n /**\n * The service managing the tools.\n * @type {*}\n */\n var ToolService = Class.extend({\n init: function(diagram) {\n this.diagram = diagram;\n this.tools = [\n new ScrollerTool(this),\n new ConnectionEditTool(this),\n new ConnectionTool(this),\n new SelectionTool(this),\n new PointerTool(this)\n ]; // the order matters.\n\n this.activeTool = undefined$1;\n },\n\n start: function(p, meta) {\n meta = deepExtend({}, meta);\n if (this.activeTool) {\n this.activeTool.end(p, meta);\n }\n this._updateHoveredItem(p);\n this._activateTool(p, meta);\n this.activeTool.start(p, meta);\n this._updateCursor(p);\n this.diagram.focus();\n this.diagram.canvas.surface.suspendTracking();\n this.startPoint = p;\n return true;\n },\n\n move: function(p, meta) {\n meta = deepExtend({}, meta);\n var updateHovered = true;\n if (this.activeTool) {\n updateHovered = this.activeTool.move(p, meta);\n }\n if (updateHovered) {\n this._updateHoveredItem(p);\n }\n this._updateCursor(p);\n return true;\n },\n\n end: function(p, meta) {\n meta = deepExtend({}, meta);\n if (this.activeTool) {\n this.activeTool.end(p, meta);\n }\n this.diagram.canvas.surface.resumeTracking();\n this.activeTool = undefined$1;\n this._updateCursor(p);\n return true;\n },\n\n keyDown: function(key, meta) {\n var diagram = this.diagram;\n meta = deepExtend({ ctrlKey: false, metaKey: false, altKey: false }, meta);\n if ((meta.ctrlKey || meta.metaKey) && !meta.altKey) {// ctrl or option\n if (testKey(key, \"a\")) {// A: select all\n diagram.selectAll();\n diagram._destroyToolBar();\n return true;\n } else if (testKey(key, \"z\")) {// Z: undo\n diagram.undo();\n diagram._destroyToolBar();\n return true;\n } else if (testKey(key, \"y\")) {// y: redo\n diagram.redo();\n diagram._destroyToolBar();\n return true;\n } else if (testKey(key, \"c\")) {\n diagram.copy();\n diagram._destroyToolBar();\n } else if (testKey(key, \"x\")) {\n diagram.cut();\n diagram._destroyToolBar();\n } else if (testKey(key, \"v\")) {\n diagram.paste();\n diagram._destroyToolBar();\n } else if (testKey(key, \"l\")) {\n diagram.layout();\n diagram._destroyToolBar();\n } else if (testKey(key, \"d\")) {\n diagram._destroyToolBar();\n diagram.copy();\n diagram.paste();\n }\n } else if (key === 46 || key === 8) {// del: deletion\n var toRemove = this.diagram._triggerRemove(diagram.select());\n if (toRemove.length) {\n this.diagram.remove(toRemove, true);\n this.diagram._syncChanges();\n this.diagram._destroyToolBar();\n }\n\n return true;\n } else if (key === 27) {// ESC: stop any action\n this._discardNewConnection();\n diagram.deselect();\n diagram._destroyToolBar();\n return true;\n }\n\n },\n wheel: function(p, meta) {\n var diagram = this.diagram,\n delta = meta.delta,\n z = diagram.zoom(),\n options = diagram.options,\n zoomRate = options.zoomRate,\n zoomOptions = { point: p, meta: meta, zoom: z };\n\n if (diagram.trigger(ZOOM_START, zoomOptions)) {\n return;\n }\n\n if (delta < 0) {\n z += zoomRate;\n } else {\n z -= zoomRate;\n }\n\n z = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, z)), 2);\n zoomOptions.zoom = z;\n\n diagram.zoom(z, zoomOptions);\n diagram.trigger(ZOOM_END, zoomOptions);\n\n return true;\n },\n setTool: function(tool, index) {\n tool.toolService = this;\n this.tools[index] = tool;\n },\n\n selectSingle: function(item, meta) {\n var diagram = this.diagram;\n var selectable = diagram.options.selectable;\n if (selectable && !item.isSelected && item.options.selectable !== false) {\n var addToSelection = meta.ctrlKey && selectable.multiple !== false;\n diagram.select(item, { addToSelection: addToSelection });\n }\n },\n\n _discardNewConnection: function() {\n if (this.newConnection) {\n this.diagram.remove(this.newConnection);\n this.newConnection = undefined$1;\n }\n },\n _activateTool: function(p, meta) {\n for (var i = 0; i < this.tools.length; i++) {\n var tool = this.tools[i];\n if (tool.tryActivate(p, meta)) {\n this.activeTool = tool;\n break; // activating the first available tool in the loop.\n }\n }\n },\n _updateCursor: function(p) {\n var element = this.diagram.element;\n var cursor = this.activeTool ? this.activeTool.getCursor(p) : (this.hoveredAdorner ? this.hoveredAdorner._getCursor(p) : (this.hoveredItem ? this.hoveredItem._getCursor(p) : Cursors.arrow));\n\n element.css({ cursor: cursor });\n },\n _connectionManipulation: function(connection, disabledShape, isNew) {\n this.activeConnection = connection;\n this.disabledShape = disabledShape;\n if (isNew) {\n this.newConnection = this.activeConnection;\n } else {\n this.newConnection = undefined$1;\n }\n },\n _updateHoveredItem: function(p) {\n var hit = this._hitTest(p);\n var diagram = this.diagram;\n\n if (hit != this.hoveredItem && (!this.disabledShape || hit != this.disabledShape)) {\n if (this.hoveredItem) {\n diagram.trigger(MOUSE_LEAVE, { item: this.hoveredItem });\n this.hoveredItem._hover(false);\n }\n\n if (hit && hit.options.enable) {\n diagram.trigger(MOUSE_ENTER, { item: hit });\n\n this.hoveredItem = hit; // Shape, connection or connector\n this.hoveredItem._hover(true);\n } else {\n this.hoveredItem = undefined$1;\n }\n }\n },\n _removeHover: function() {\n if (this.hoveredItem) {\n this.hoveredItem._hover(false);\n this.hoveredItem = undefined$1;\n }\n },\n _hitTest: function(point) {\n var hit, d = this.diagram, item, i;\n\n // connectors\n if (this._hoveredConnector) {\n this._hoveredConnector._hover(false);\n this._hoveredConnector = undefined$1;\n }\n if (d._connectorsAdorner._visible) {\n hit = d._connectorsAdorner._hitTest(point);\n if (hit) {\n return hit;\n }\n }\n\n hit = this.diagram._resizingAdorner._hitTest(point);\n if (hit) {\n this.hoveredAdorner = d._resizingAdorner;\n if (hit.x !== 0 || hit.y !== 0) { // hit testing for resizers or rotator, otherwise if (0,0) than pass through.\n return;\n }\n hit = undefined$1;\n } else {\n this.hoveredAdorner = undefined$1;\n }\n\n if (!this.activeTool || this.activeTool.type !== \"ConnectionTool\") {\n var selectedConnections = []; // only the connections should have higher presence because the connection edit point is on top of connector.\n // TODO: This should be reworked. The connection adorner should be one for all selected connections and should be hit tested prior the connections and shapes itself.\n for (i = 0; i < d._selectedItems.length; i++) {\n item = d._selectedItems[i];\n if (item instanceof diagram.Connection) {\n selectedConnections.push(item);\n }\n }\n hit = this._hitTestItems(selectedConnections, point);\n }\n\n return hit || this._hitTestElements(point);\n },\n\n _hitTestElements: function(point) {\n var diagram = this.diagram;\n var shapeHit = this._hitTestItems(diagram.shapes, point);\n var connectionHit = this._hitTestItems(diagram.connections, point);\n var hit;\n\n if ((!this.activeTool || this.activeTool.type != \"ConnectionTool\") && shapeHit && connectionHit && !hitTestShapeConnectors(shapeHit, point)) {\n var mainLayer = diagram.mainLayer;\n var shapeIdx = inArray(shapeHit.visual, mainLayer.children);\n var connectionIdx = inArray(connectionHit.visual, mainLayer.children);\n hit = shapeIdx > connectionIdx ? shapeHit : connectionHit;\n }\n return hit || shapeHit || connectionHit;\n },\n\n _hitTestItems: function(array, point) {\n var i, item, hit;\n for (i = array.length - 1; i >= 0; i--) {\n item = array[i];\n hit = item._hitTest(point);\n if (hit) {\n return hit;\n }\n }\n }\n });\n\n // Routing =========================================\n\n /**\n * Base class for connection routers.\n */\n var ConnectionRouterBase = kendo.Class.extend({\n init: function() {\n }\n /*route: function (connection) {\n },\n hitTest: function (p) {\n\n },\n getBounds: function () {\n\n }*/\n });\n\n /**\n * Base class for polyline and cascading routing.\n */\n var LinearConnectionRouter = ConnectionRouterBase.extend({\n init: function(connection) {\n var that = this;\n ConnectionRouterBase.fn.init.call(that);\n this.connection = connection;\n },\n /**\n * Hit testing for polyline paths.\n */\n hitTest: function(p) {\n var rec = this.getBounds().inflate(HIT_TEST_DISTANCE);\n if (!rec.contains(p)) {\n return false;\n }\n return diagram.Geometry.distanceToPolyline(p, this.connection.allPoints()) < HIT_TEST_DISTANCE;\n },\n\n /**\n * Bounds of a polyline.\n * @returns {kendo.dataviz.diagram.Rect}\n */\n getBounds: function() {\n var points = this.connection.allPoints(),\n s = points[0],\n e = points[points.length - 1],\n right = Math.max(s.x, e.x),\n left = Math.min(s.x, e.x),\n top = Math.min(s.y, e.y),\n bottom = Math.max(s.y, e.y);\n\n for (var i = 1; i < points.length - 1; ++i) {\n right = Math.max(right, points[i].x);\n left = Math.min(left, points[i].x);\n top = Math.min(top, points[i].y);\n bottom = Math.max(bottom, points[i].y);\n }\n\n return new Rect(left, top, right - left, bottom - top);\n }\n });\n\n /**\n * A simple poly-linear routing which does not alter the intermediate points.\n * Does hold the underlying hit, bounds....logic.\n * @type {*|Object|void|extend|Zepto.extend|b.extend}\n */\n var PolylineRouter = LinearConnectionRouter.extend({\n init: function(connection) {\n var that = this;\n LinearConnectionRouter.fn.init.call(that);\n this.connection = connection;\n },\n route: function() {\n // just keep the points as is\n }\n });\n\n var CascadingRouter = LinearConnectionRouter.extend({\n SAME_SIDE_DISTANCE_RATIO: 5,\n\n init: function(connection) {\n var that = this;\n LinearConnectionRouter.fn.init.call(that);\n this.connection = connection;\n },\n\n routePoints: function(start, end, sourceConnector, targetConnector) {\n var result;\n\n if (sourceConnector && targetConnector) {\n result = this._connectorPoints(start, end, sourceConnector, targetConnector);\n } else {\n result = this._floatingPoints(start, end, sourceConnector);\n }\n return result;\n },\n\n route: function() {\n var sourceConnector = this.connection._resolvedSourceConnector;\n var targetConnector = this.connection._resolvedTargetConnector;\n var start = this.connection.sourcePoint();\n var end = this.connection.targetPoint();\n var points = this.routePoints(start, end, sourceConnector, targetConnector);\n this.connection.points(points);\n },\n\n _connectorSides: [{\n name: \"Top\",\n axis: \"y\",\n boundsPoint: \"topLeft\",\n secondarySign: 1\n }, {\n name: \"Left\",\n axis: \"x\",\n boundsPoint: \"topLeft\",\n secondarySign: 1\n }, {\n name: \"Bottom\",\n axis: \"y\",\n boundsPoint: \"bottomRight\",\n secondarySign: -1\n }, {\n name: \"Right\",\n axis: \"x\",\n boundsPoint: \"bottomRight\",\n secondarySign: -1\n }],\n\n _connectorSide: function(connector, targetPoint) {\n var position = connector.position();\n var shapeBounds = connector.shape.bounds(ROTATED);\n var bounds = {\n topLeft: shapeBounds.topLeft(),\n bottomRight: shapeBounds.bottomRight()\n };\n var sides = this._connectorSides;\n var min = util.MAX_NUM;\n var sideDistance;\n var minSide;\n var axis;\n var side;\n for (var idx = 0; idx < sides.length; idx++) {\n side = sides[idx];\n axis = side.axis;\n sideDistance = Math.round(Math.abs(position[axis] - bounds[side.boundsPoint][axis]));\n if (sideDistance < min) {\n min = sideDistance;\n minSide = side;\n } else if (sideDistance === min &&\n (position[axis] - targetPoint[axis]) * side.secondarySign > (position[minSide.axis] - targetPoint[minSide.axis]) * minSide.secondarySign) {\n minSide = side;\n }\n }\n return minSide.name;\n },\n\n _sameSideDistance: function(connector) {\n var bounds = connector.shape.bounds(ROTATED);\n return Math.min(bounds.width, bounds.height) / this.SAME_SIDE_DISTANCE_RATIO;\n },\n\n _connectorPoints: function(start, end, sourceConnector, targetConnector) {\n var sourceConnectorSide = this._connectorSide(sourceConnector, end);\n var targetConnectorSide = this._connectorSide(targetConnector, start);\n var deltaX = end.x - start.x;\n var deltaY = end.y - start.y;\n var sameSideDistance = this._sameSideDistance(sourceConnector);\n var result = [];\n var pointX, pointY;\n\n if (sourceConnectorSide === TOP || sourceConnectorSide == BOTTOM) {\n if (targetConnectorSide == TOP || targetConnectorSide == BOTTOM) {\n if (sourceConnectorSide == targetConnectorSide) {\n if (sourceConnectorSide == TOP) {\n pointY = Math.min(start.y, end.y) - sameSideDistance;\n } else {\n pointY = Math.max(start.y, end.y) + sameSideDistance;\n }\n result = [new Point(start.x, pointY), new Point(end.x, pointY)];\n } else {\n result = [new Point(start.x, start.y + deltaY / 2), new Point(end.x, start.y + deltaY / 2)];\n }\n } else {\n result = [new Point(start.x, end.y)];\n }\n } else {\n if (targetConnectorSide == LEFT || targetConnectorSide == RIGHT) {\n if (sourceConnectorSide == targetConnectorSide) {\n if (sourceConnectorSide == LEFT) {\n pointX = Math.min(start.x, end.x) - sameSideDistance;\n } else {\n pointX = Math.max(start.x, end.x) + sameSideDistance;\n }\n result = [new Point(pointX, start.y), new Point(pointX, end.y)];\n } else {\n result = [new Point(start.x + deltaX / 2, start.y), new Point(start.x + deltaX / 2, start.y + deltaY)];\n }\n } else {\n result = [new Point(end.x, start.y)];\n }\n }\n return result;\n },\n\n _floatingPoints: function(start, end, sourceConnector) {\n var sourceConnectorSide = sourceConnector ? this._connectorSide(sourceConnector, end) : null;\n var cascadeStartHorizontal = this._startHorizontal(start, end, sourceConnectorSide);\n var points = [start, start, end, end];\n var deltaX = end.x - start.x;\n var deltaY = end.y - start.y;\n var length = points.length;\n var shiftX;\n var shiftY;\n\n // note that this is more generic than needed for only two intermediate points.\n for (var idx = 1; idx < length - 1; ++idx) {\n if (cascadeStartHorizontal) {\n if (idx % 2 !== 0) {\n shiftX = deltaX / (length / 2);\n shiftY = 0;\n }\n else {\n shiftX = 0;\n shiftY = deltaY / ((length - 1) / 2);\n }\n }\n else {\n if (idx % 2 !== 0) {\n shiftX = 0;\n shiftY = deltaY / (length / 2);\n }\n else {\n shiftX = deltaX / ((length - 1) / 2);\n shiftY = 0;\n }\n }\n points[idx] = new Point(points[idx - 1].x + shiftX, points[idx - 1].y + shiftY);\n }\n // need to fix the wrong 1.5 factor of the last intermediate point\n idx--;\n if ((cascadeStartHorizontal && (idx % 2 !== 0)) || (!cascadeStartHorizontal && (idx % 2 === 0))) {\n points[length - 2] = new Point(points[length - 1].x, points[length - 2].y);\n } else {\n points[length - 2] = new Point(points[length - 2].x, points[length - 1].y);\n }\n\n return [points[1], points[2]];\n },\n\n _startHorizontal: function(start, end, sourceSide) {\n var horizontal;\n if (sourceSide !== null && (sourceSide === RIGHT || sourceSide === LEFT)) {\n horizontal = true;\n } else {\n horizontal = Math.abs(start.x - end.x) > Math.abs(start.y - end.y);\n }\n\n return horizontal;\n }\n });\n\n // Adorners =========================================\n\n var AdornerBase = Class.extend({\n init: function(diagram, options) {\n var that = this;\n that.diagram = diagram;\n that.options = deepExtend({}, that.options, options);\n that.visual = new Group();\n that.diagram._adorners.push(that);\n },\n refresh: function() {\n\n }\n });\n\n var ConnectionEditAdorner = AdornerBase.extend({\n init: function(connection, options) {\n var that = this, diagram;\n that.connection = connection;\n diagram = that.connection.diagram;\n that._ts = diagram.toolService;\n AdornerBase.fn.init.call(that, diagram, options);\n var sp = that.connection.sourcePoint();\n var tp = that.connection.targetPoint();\n that.spVisual = new Circle(deepExtend(that.options.handles, { center: sp }));\n that.epVisual = new Circle(deepExtend(that.options.handles, { center: tp }));\n that.visual.append(that.spVisual);\n that.visual.append(that.epVisual);\n },\n\n options: {\n handles: {}\n },\n\n _getCursor: function() {\n return Cursors.move;\n },\n\n start: function(p) {\n this.handle = this._hitTest(p);\n this.startPoint = p;\n this._initialSource = this.connection.source();\n this._initialTarget = this.connection.target();\n switch (this.handle) {\n case -1:\n if (this.connection.targetConnector) {\n this._ts._connectionManipulation(this.connection, this.connection.targetConnector.shape);\n }\n break;\n case 1:\n if (this.connection.sourceConnector) {\n this._ts._connectionManipulation(this.connection, this.connection.sourceConnector.shape);\n }\n break;\n }\n },\n\n move: function(handle, p) {\n switch (handle) {\n case -1:\n this.connection.source(p);\n break;\n case 1:\n this.connection.target(p);\n break;\n default:\n var delta = p.minus(this.startPoint);\n this.startPoint = p;\n if (!this.connection.sourceConnector) {\n this.connection.source(this.connection.sourcePoint().plus(delta));\n }\n if (!this.connection.targetConnector) {\n this.connection.target(this.connection.targetPoint().plus(delta));\n }\n break;\n }\n this.refresh();\n return true;\n },\n\n stop: function(p) {\n var ts = this.diagram.toolService, item = ts.hoveredItem, target;\n if (ts._hoveredConnector) {\n target = ts._hoveredConnector._c;\n } else if (item && item instanceof diagram.Shape) {\n target = item.getConnector(AUTO) || item.getConnector(p);\n } else {\n target = p;\n }\n\n if (this.handle === -1) {\n this.connection.source(target);\n } else if (this.handle === 1) {\n this.connection.target(target);\n }\n\n this.handle = undefined$1;\n this._ts._connectionManipulation();\n return new ConnectionEditUndoUnit(this.connection, this._initialSource, this._initialTarget);\n },\n\n _hitTest: function(point) {\n var sourcePoint = this.connection.sourcePoint();\n var targetPoint = this.connection.targetPoint();\n var radiusX = this.options.handles.width / 2 + HIT_TEST_DISTANCE;\n var radiusY = this.options.handles.height / 2 + HIT_TEST_DISTANCE;\n var sourcePointDistance = sourcePoint.distanceTo(point);\n var targetPointDistance = targetPoint.distanceTo(point);\n var sourceHandle = new Rect(sourcePoint.x, sourcePoint.y).inflate(radiusX, radiusY).contains(point);\n var targetHandle = new Rect(targetPoint.x, targetPoint.y).inflate(radiusX, radiusY).contains(point);\n var handle = 0;\n\n if (sourceHandle && (!targetHandle || sourcePointDistance < targetPointDistance)) {\n handle = -1;\n } else if (targetHandle && (!sourceHandle || targetPointDistance < sourcePointDistance)) {\n handle = 1;\n }\n\n return handle;\n },\n\n refresh: function() {\n this.spVisual.redraw({ center: this.diagram.modelToLayer(this.connection.sourcePoint()) });\n this.epVisual.redraw({ center: this.diagram.modelToLayer(this.connection.targetPoint()) });\n }\n });\n\n var ConnectorsAdorner = AdornerBase.extend({\n init: function(diagram, options) {\n var that = this;\n AdornerBase.fn.init.call(that, diagram, options);\n that._refreshHandler = function(e) {\n if (e.item == that.shape) {\n that.refresh();\n }\n };\n },\n\n show: function(shape) {\n var that = this, len, i, ctr;\n that._visible = true;\n that.shape = shape;\n that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler);\n len = shape.connectors.length;\n that.connectors = [];\n that._clearVisual();\n for (i = 0; i < len; i++) {\n ctr = new ConnectorVisual(shape.connectors[i]);\n that.connectors.push(ctr);\n that.visual.append(ctr.visual);\n }\n that.visual.visible(true);\n that.refresh();\n },\n\n _clearVisual: function() {\n var that = this;\n if (that.diagram._cachedTouchTarget) {\n that._keepCachedTouchTarget();\n } else {\n that.visual.clear();\n }\n },\n\n _keepCachedTouchTarget: function() {\n var that = this,\n visualChildren = that.visual.children;\n var childrenCount = visualChildren.length;\n var index = inArray(that.diagram._cachedTouchTarget, visualChildren);\n for (var i = childrenCount - 1; i >= 0; i--) {\n if (i == index) {\n continue;\n }\n that.visual.remove(visualChildren[i]);\n }\n },\n\n destroy: function() {\n var that = this;\n that.diagram.unbind(ITEMBOUNDSCHANGE, that._refreshHandler);\n that.shape = undefined$1;\n that._visible = undefined$1;\n that.visual.visible(false);\n },\n\n _hitTest: function(p) {\n var ctr, i;\n for (i = 0; i < this.connectors.length; i++) {\n ctr = this.connectors[i];\n if (ctr._hitTest(p)) {\n ctr._hover(true);\n this.diagram.toolService._hoveredConnector = ctr;\n break;\n }\n }\n },\n\n refresh: function() {\n if (this.shape) {\n var bounds = this.shape.bounds();\n bounds = this.diagram.modelToLayer(bounds);\n this.visual.position(bounds.topLeft());\n $.each(this.connectors, function() {\n this.refresh();\n });\n }\n }\n });\n\n function hitToOppositeSide(hit, bounds) {\n var result;\n\n if (hit.x == -1 && hit.y == -1) {\n result = bounds.bottomRight();\n } else if (hit.x == 1 && hit.y == 1) {\n result = bounds.topLeft();\n } else if (hit.x == -1 && hit.y == 1) {\n result = bounds.topRight();\n } else if (hit.x == 1 && hit.y == -1) {\n result = bounds.bottomLeft();\n } else if (hit.x === 0 && hit.y == -1) {\n result = bounds.bottom();\n } else if (hit.x === 0 && hit.y == 1) {\n result = bounds.top();\n } else if (hit.x == 1 && hit.y === 0) {\n result = bounds.left();\n } else if (hit.x == -1 && hit.y === 0) {\n result = bounds.right();\n }\n\n return result;\n }\n\n var ResizingAdorner = AdornerBase.extend({\n init: function(diagram, options) {\n var that = this;\n AdornerBase.fn.init.call(that, diagram, options);\n that._manipulating = false;\n that.map = [];\n that.shapes = [];\n\n that._initSelection();\n that._createHandles();\n that.redraw();\n that.diagram.bind(\"select\", function(e) {\n that._initialize(e.selected);\n });\n\n that._refreshHandler = function() {\n if (!that._internalChange) {\n that.refreshBounds();\n that.refresh();\n }\n };\n\n that._rotatedHandler = function() {\n if (that.shapes.length == 1) {\n that._angle = that.shapes[0].rotate().angle;\n }\n that._refreshHandler();\n };\n\n that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler).bind(ITEMROTATE, that._rotatedHandler);\n that.refreshBounds();\n that.refresh();\n },\n\n options: {\n handles: {\n fill: {\n color: \"#fff\"\n },\n stroke: {\n color: \"#282828\"\n },\n height: 7,\n width: 7,\n hover: {\n fill: {\n color: \"#282828\"\n },\n stroke: {\n color: \"#282828\"\n }\n }\n },\n selectable: {\n stroke: {\n color: \"#778899\",\n width: 1,\n dashType: \"dash\"\n },\n fill: {\n color: TRANSPARENT\n }\n },\n offset: 10\n },\n\n _initSelection: function() {\n var that = this;\n var diagram = that.diagram;\n var selectable = diagram.options.selectable;\n var options = deepExtend({}, that.options.selectable, selectable);\n that.rect = new Rectangle(options);\n that.visual.append(that.rect);\n },\n\n _resizable: function() {\n return this.options.editable && this.options.editable.resize !== false;\n },\n\n _handleOptions: function() {\n return (this.options.editable.resize || {}).handles || this.options.handles;\n },\n\n _createHandles: function() {\n var handles, item, y, x;\n\n if (this._resizable()) {\n handles = this._handleOptions();\n for (x = -1; x <= 1; x++) {\n for (y = -1; y <= 1; y++) {\n if ((x !== 0) || (y !== 0)) { // (0, 0) element, (-1, -1) top-left, (+1, +1) bottom-right\n item = new Rectangle(handles);\n item.drawingElement._hover = this._hover.bind(this);\n this.map.push({ x: x, y: y, visual: item });\n this.visual.append(item);\n }\n }\n }\n }\n },\n\n bounds: function(value) {\n if (value) {\n this._innerBounds = value.clone();\n this._bounds = this.diagram.modelToLayer(value).inflate(this.options.offset, this.options.offset);\n } else {\n return this._bounds;\n }\n },\n\n _hitTest: function(p) {\n var tp = this.diagram.modelToLayer(p),\n i, hit, handleBounds, handlesCount = this.map.length, handle;\n\n if (this._angle) {\n tp = tp.clone().rotate(this._bounds.center(), this._angle);\n }\n\n if (this._resizable()) {\n for (i = 0; i < handlesCount; i++) {\n handle = this.map[i];\n hit = new Point(handle.x, handle.y);\n handleBounds = this._getHandleBounds(hit); //local coordinates\n handleBounds.offset(this._bounds.x, this._bounds.y);\n if (handleBounds.contains(tp)) {\n return hit;\n }\n }\n }\n\n if (this._bounds.contains(tp)) {\n return new Point(0, 0);\n }\n },\n\n _getHandleBounds: function(p) {\n if (this._resizable()) {\n var handles = this._handleOptions(),\n w = handles.width,\n h = handles.height,\n r = new Rect(0, 0, w, h);\n\n if (p.x < 0) {\n r.x = - w / 2;\n } else if (p.x === 0) {\n r.x = Math.floor(this._bounds.width / 2) - w / 2;\n } else if (p.x > 0) {\n r.x = this._bounds.width + 1.0 - w / 2;\n } if (p.y < 0) {\n r.y = - h / 2;\n } else if (p.y === 0) {\n r.y = Math.floor(this._bounds.height / 2) - h / 2;\n } else if (p.y > 0) {\n r.y = this._bounds.height + 1.0 - h / 2;\n }\n\n return r;\n }\n },\n\n _getCursor: function(point) {\n var hit = this._hitTest(point);\n if (hit && (hit.x >= -1) && (hit.x <= 1) && (hit.y >= -1) && (hit.y <= 1) && this._resizable()) {\n var angle = this._angle;\n if (angle) {\n angle = 360 - angle;\n hit.rotate(new Point(0, 0), angle);\n hit = new Point(Math.round(hit.x), Math.round(hit.y));\n }\n\n if (hit.x == -1 && hit.y == -1) {\n return \"nw-resize\";\n }\n if (hit.x == 1 && hit.y == 1) {\n return \"se-resize\";\n }\n if (hit.x == -1 && hit.y == 1) {\n return \"sw-resize\";\n }\n if (hit.x == 1 && hit.y == -1) {\n return \"ne-resize\";\n }\n if (hit.x === 0 && hit.y == -1) {\n return \"n-resize\";\n }\n if (hit.x === 0 && hit.y == 1) {\n return \"s-resize\";\n }\n if (hit.x == 1 && hit.y === 0) {\n return \"e-resize\";\n }\n if (hit.x == -1 && hit.y === 0) {\n return \"w-resize\";\n }\n }\n return this._manipulating ? Cursors.move : Cursors.select;\n },\n\n _initialize: function() {\n var that = this, i, item,\n items = that.diagram.select();\n\n that.shapes = [];\n for (i = 0; i < items.length; i++) {\n item = items[i];\n if (item instanceof diagram.Shape) {\n that.shapes.push(item);\n item._rotationOffset = new Point();\n }\n }\n\n that._angle = that.shapes.length == 1 ? that.shapes[0].rotate().angle : 0;\n that._startAngle = that._angle;\n that._rotates();\n that._positions();\n that.refreshBounds();\n that.refresh();\n that.redraw();\n },\n\n _rotates: function() {\n var that = this, i, shape;\n that.initialRotates = [];\n for (i = 0; i < that.shapes.length; i++) {\n shape = that.shapes[i];\n that.initialRotates.push(shape.rotate().angle);\n }\n },\n\n _positions: function() {\n var that = this, i, shape;\n that.initialStates = [];\n for (i = 0; i < that.shapes.length; i++) {\n shape = that.shapes[i];\n that.initialStates.push(shape.bounds());\n }\n },\n\n _hover: function(value, element) {\n if (this._resizable()) {\n var handleOptions = this._handleOptions(),\n hover = handleOptions.hover,\n stroke = handleOptions.stroke,\n fill = handleOptions.fill;\n\n if (value && Utils.isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\n }\n\n if (value && Utils.isDefined(hover.fill)) {\n fill = hover.fill;\n }\n element.stroke(stroke.color, stroke.width, stroke.opacity);\n element.fill(fill.color, fill.opacity);\n }\n },\n\n start: function(p) {\n this._sp = p;\n this._cp = p;\n this._lp = p;\n this._manipulating = true;\n this._internalChange = true;\n this.shapeStates = [];\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n this.shapeStates.push(shape.bounds());\n }\n },\n\n redraw: function() {\n var i, handle,\n visibleHandles = this._resizable();\n\n for (i = 0; i < this.map.length; i++) {\n handle = this.map[i];\n handle.visual.visible(visibleHandles);\n }\n },\n\n angle: function(value) {\n if (defined(value)) {\n this._angle = value;\n }\n\n return this._angle;\n },\n\n rotate: function() {\n var center = this._innerBounds.center();\n var currentAngle = this.angle();\n this._internalChange = true;\n for (var i = 0; i < this.shapes.length; i++) {\n var shape = this.shapes[i];\n currentAngle = (currentAngle + this.initialRotates[i] - this._startAngle) % 360;\n shape.rotate(currentAngle, center);\n }\n this.refresh();\n },\n\n move: function(handle, p) {\n var delta, dragging,\n dtl = new Point(),\n dbr = new Point(),\n bounds, center, shape,\n i, angle, newBounds,\n changed = 0, staticPoint,\n scaleX, scaleY;\n\n if (handle.y === -2 && handle.x === -1) {\n center = this._innerBounds.center();\n this._angle = this._truncateAngle(Utils.findAngle(center, p));\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n angle = (this._angle + this.initialRotates[i] - this._startAngle) % 360;\n shape.rotate(angle, center);\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape);\n }\n this._rotating = true;\n }\n this.refresh();\n } else {\n if (this.shouldSnap()) {\n var thr = this._truncateDistance(p.minus(this._lp));\n // threshold\n if (thr.x === 0 && thr.y === 0) {\n this._cp = p;\n return;\n }\n delta = thr;\n this._lp = new Point(this._lp.x + thr.x, this._lp.y + thr.y);\n } else {\n delta = p.minus(this._cp);\n }\n\n if (this.isDragHandle(handle)) {\n dbr = dtl = delta; // dragging\n dragging = true;\n } else {\n if (this._angle) { // adjust the delta so that resizers resize in the correct direction after rotation.\n delta.rotate(new Point(0, 0), this._angle);\n }\n if (handle.x == -1) {\n dtl.x = delta.x;\n } else if (handle.x == 1) {\n dbr.x = delta.x;\n }\n if (handle.y == -1) {\n dtl.y = delta.y;\n } else if (handle.y == 1) {\n dbr.y = delta.y;\n }\n }\n\n if (!dragging) {\n staticPoint = hitToOppositeSide(handle, this._innerBounds);\n scaleX = (this._innerBounds.width + delta.x * handle.x) / this._innerBounds.width;\n scaleY = (this._innerBounds.height + delta.y * handle.y) / this._innerBounds.height;\n }\n\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n bounds = shape.bounds();\n if (dragging) {\n if (!canDrag(shape)) {\n continue;\n }\n newBounds = this._displaceBounds(bounds, dtl, dbr, dragging);\n } else {\n newBounds = bounds.clone();\n newBounds.scale(scaleX, scaleY, staticPoint, this._innerBounds.center(), shape.rotate().angle);\n var newCenter = newBounds.center(); // fixes the new rotation center.\n newCenter.rotate(bounds.center(), -this._angle);\n newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n }\n if (newBounds.width >= shape.options.minWidth && newBounds.height >= shape.options.minHeight) { // if we up-size very small shape\n var oldBounds = bounds;\n shape.bounds(newBounds);\n if (shape.hasOwnProperty(\"layout\")) {\n shape.layout(shape, oldBounds, newBounds);\n }\n if (oldBounds.width !== newBounds.width || oldBounds.height !== newBounds.height) {\n shape.rotate(shape.rotate().angle); // forces the rotation to update it's rotation center\n }\n changed += 1;\n }\n }\n\n if (changed) {\n if (changed == i) {\n newBounds = this._displaceBounds(this._innerBounds, dtl, dbr, dragging);\n this.bounds(newBounds);\n } else {\n this.refreshBounds();\n }\n this.refresh();\n }\n\n this._positions();\n }\n\n this._cp = p;\n },\n\n isDragHandle: function(handle) {\n return handle.x === 0 && handle.y === 0;\n },\n\n cancel: function() {\n var shapes = this.shapes;\n var states = this.shapeStates;\n for (var idx = 0; idx < shapes.length; idx++) {\n shapes[idx].bounds(states[idx]);\n }\n this.refreshBounds();\n this.refresh();\n this._manipulating = undefined$1;\n this._internalChange = undefined$1;\n this._rotating = undefined$1;\n },\n\n _truncatePositionToGuides: function(bounds) {\n if (this.diagram.ruler) {\n return this.diagram.ruler.truncatePositionToGuides(bounds);\n }\n return bounds;\n },\n\n _truncateSizeToGuides: function(bounds) {\n if (this.diagram.ruler) {\n return this.diagram.ruler.truncateSizeToGuides(bounds);\n }\n return bounds;\n },\n\n _truncateAngle: function(a) {\n var snap = this.snapOptions();\n var snapAngle = Math.max(snap.angle || DEFAULT_SNAP_ANGLE, MIN_SNAP_ANGLE);\n return snap ? Math.floor((a % 360) / snapAngle) * snapAngle : (a % 360);\n },\n\n _truncateDistance: function(d) {\n if (d instanceof diagram.Point) {\n return new diagram.Point(this._truncateDistance(d.x), this._truncateDistance(d.y));\n } else {\n var snap = this.snapOptions() || {};\n var snapSize = Math.max(snap.size || DEFAULT_SNAP_SIZE, MIN_SNAP_SIZE);\n return snap ? Math.floor(d / snapSize) * snapSize : d;\n }\n },\n\n snapOptions: function() {\n var editable = this.diagram.options.editable;\n var snap = ((editable || {}).drag || {}).snap || {};\n return snap;\n },\n\n shouldSnap: function() {\n var editable = this.diagram.options.editable;\n var drag = (editable || {}).drag;\n var snap = (drag || {}).snap;\n return editable !== false && drag !== false && snap !== false;\n },\n\n _displaceBounds: function(bounds, dtl, dbr, dragging) {\n var tl = bounds.topLeft().plus(dtl),\n br = bounds.bottomRight().plus(dbr),\n newBounds = Rect.fromPoints(tl, br),\n newCenter;\n if (!dragging) {\n newCenter = newBounds.center();\n newCenter.rotate(bounds.center(), -this._angle);\n newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n }\n return newBounds;\n },\n\n stop: function() {\n var unit, i, shape;\n if (this._cp != this._sp) {\n if (this._rotating) {\n unit = new RotateUnit(this, this.shapes, this.initialRotates);\n this._rotating = false;\n } else if (this._diffStates()) {\n if (this.diagram.ruler) {\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n var bounds = shape.bounds();\n bounds = this._truncateSizeToGuides(this._truncatePositionToGuides(bounds));\n shape.bounds(bounds);\n this.refreshBounds();\n this.refresh();\n }\n }\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n shape.updateModel();\n }\n unit = new TransformUnit(this.shapes, this.shapeStates, this);\n this.diagram._syncShapeChanges();\n }\n }\n\n this._manipulating = undefined$1;\n this._internalChange = undefined$1;\n this._rotating = undefined$1;\n return unit;\n },\n\n _diffStates: function() {\n var shapes = this.shapes;\n var states = this.shapeStates;\n for (var idx = 0; idx < shapes.length; idx++) {\n if (!shapes[idx].bounds().equals(states[idx])) {\n return true;\n }\n }\n return false;\n },\n\n refreshBounds: function() {\n var bounds = this.shapes.length == 1 ?\n this.shapes[0].bounds().clone() :\n this.diagram.boundingBox(this.shapes, true);\n\n this.bounds(bounds);\n },\n\n refresh: function() {\n var that = this, b, bounds;\n if (this.shapes.length > 0) {\n bounds = this.bounds();\n this.visual.visible(true);\n this.visual.position(bounds.topLeft());\n $.each(this.map, function() {\n b = that._getHandleBounds(new Point(this.x, this.y));\n this.visual.position(b.topLeft());\n });\n this.visual.position(bounds.topLeft());\n\n var center = new Point(bounds.width / 2, bounds.height / 2);\n this.visual.rotate(this._angle, center);\n this.rect.redraw({ width: bounds.width, height: bounds.height });\n if (this.rotationThumb) {\n var thumb = this.options.editable.rotate.thumb;\n this._rotationThumbBounds = new Rect(bounds.center().x, bounds.y + thumb.y, 0, 0).inflate(thumb.width);\n this.rotationThumb.redraw({ x: bounds.width / 2 - thumb.width / 2 });\n }\n } else {\n this.visual.visible(false);\n }\n }\n });\n\n var Selector = Class.extend({\n init: function(diagram) {\n var selectable = diagram.options.selectable;\n this.options = deepExtend({}, this.options, selectable);\n\n this.visual = new Rectangle(this.options);\n this.diagram = diagram;\n },\n options: {\n stroke: {\n color: \"#778899\",\n width: 1,\n dashType: \"dash\"\n },\n fill: {\n color: TRANSPARENT\n }\n },\n start: function(p) {\n this._sp = this._ep = p;\n this.refresh();\n this.diagram._adorn(this, true);\n },\n end: function() {\n this._sp = this._ep = undefined$1;\n this.diagram._adorn(this, false);\n },\n bounds: function(value) {\n if (value) {\n this._bounds = value;\n }\n return this._bounds;\n },\n move: function(p) {\n this._ep = p;\n this.refresh();\n },\n refresh: function() {\n if (this._sp) {\n var visualBounds = Rect.fromPoints(this.diagram.modelToLayer(this._sp), this.diagram.modelToLayer(this._ep));\n this.bounds(Rect.fromPoints(this._sp, this._ep));\n this.visual.position(visualBounds.topLeft());\n this.visual.redraw({ height: visualBounds.height + 1, width: visualBounds.width + 1 });\n }\n }\n });\n\n var ConnectorVisual = Class.extend({\n init: function(connector) {\n this.options = deepExtend({}, connector.options);\n this._c = connector;\n this.visual = new Circle(this.options);\n this.refresh();\n },\n _hover: function(value) {\n var options = this.options,\n hover = options.hover,\n stroke = options.stroke,\n fill = options.fill;\n\n if (value && Utils.isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\n }\n\n if (value && Utils.isDefined(hover.fill)) {\n fill = hover.fill;\n }\n\n this.visual.redraw({\n stroke: stroke,\n fill: fill\n });\n },\n refresh: function() {\n var p = this._c.shape.diagram.modelToView(this._c.position()),\n relative = p.minus(this._c.shape.bounds(\"transformed\").topLeft()),\n value = new Rect(p.x, p.y, 0, 0);\n value.inflate(this.options.width / 2, this.options.height / 2);\n this._visualBounds = value;\n this.visual.redraw({ center: new Point(relative.x, relative.y) });\n },\n _hitTest: function(p) {\n var tp = this._c.shape.diagram.modelToView(p);\n return this._visualBounds.contains(tp);\n }\n });\n\n function canDrag(element) {\n var editable = element.options.editable;\n return editable && editable.drag !== false;\n }\n\n function hitTestShapeConnectors(shape, point) {\n var connector, position, rect;\n for (var idx = 0; idx < shape.connectors.length; idx++) {\n connector = shape.connectors[idx];\n position = connector.position();\n rect = new Rect(position.x, position.y);\n rect.inflate(HIT_TEST_DISTANCE, HIT_TEST_DISTANCE);\n if (rect.contains(point)) {\n return connector;\n }\n }\n }\n\n function noMeta(meta) {\n return meta.ctrlKey === false && meta.altKey === false && meta.shiftKey === false;\n }\n\n deepExtend(diagram, {\n CompositeUnit: CompositeUnit,\n TransformUnit: TransformUnit,\n PanUndoUnit: PanUndoUnit,\n AddShapeUnit: AddShapeUnit,\n AddConnectionUnit: AddConnectionUnit,\n DeleteShapeUnit: DeleteShapeUnit,\n DeleteConnectionUnit: DeleteConnectionUnit,\n ConnectionEditAdorner: ConnectionEditAdorner,\n ConnectionTool: ConnectionTool,\n ConnectorVisual: ConnectorVisual,\n UndoRedoService: UndoRedoService,\n ResizingAdorner: ResizingAdorner,\n Selector: Selector,\n ToolService: ToolService,\n ConnectorsAdorner: ConnectorsAdorner,\n LayoutUndoUnit: LayoutUndoUnit,\n ConnectionEditUnit: ConnectionEditUnit,\n ToFrontUnit: ToFrontUnit,\n ToBackUnit: ToBackUnit,\n ConnectionRouterBase: ConnectionRouterBase,\n PolylineRouter: PolylineRouter,\n CascadingRouter: CascadingRouter,\n SelectionTool: SelectionTool,\n ScrollerTool: ScrollerTool,\n PointerTool: PointerTool,\n ConnectionEditTool: ConnectionEditTool,\n RotateUnit: RotateUnit\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n diagram = kendo.dataviz.diagram,\n Graph = diagram.Graph,\n Node = diagram.Node,\n Link = diagram.Link,\n deepExtend = kendo.deepExtend,\n Size = diagram.Size,\n Rect = diagram.Rect,\n Dictionary = diagram.Dictionary,\n Set = diagram.Set,\n HyperTree = diagram.Graph,\n Utils = diagram.Utils,\n Point = diagram.Point,\n EPSILON = 1e-06,\n DEG_TO_RAD = Math.PI / 180,\n contains = Utils.contains,\n grep = $.grep;\n\n /**\n * Base class for layout algorithms.\n * @type {*}\n */\n var LayoutBase = kendo.Class.extend({\n defaultOptions: {\n type: \"Tree\",\n subtype: \"Down\",\n roots: null,\n animate: false,\n //-------------------------------------------------------------------\n /**\n * Force-directed option: whether the motion of the nodes should be limited by the boundaries of the diagram surface.\n */\n limitToView: false,\n /**\n * Force-directed option: the amount of friction applied to the motion of the nodes.\n */\n friction: 0.9,\n /**\n * Force-directed option: the optimal distance between nodes (minimum energy).\n */\n nodeDistance: 50,\n /**\n * Force-directed option: the number of time things are being calculated.\n */\n iterations: 300,\n //-------------------------------------------------------------------\n /**\n * Tree option: the separation in one direction (depends on the subtype what direction this is).\n */\n horizontalSeparation: 90,\n /**\n * Tree option: the separation in the complementary direction (depends on the subtype what direction this is).\n */\n verticalSeparation: 50,\n\n //-------------------------------------------------------------------\n /**\n * Tip-over tree option: children-to-parent vertical distance.\n */\n underneathVerticalTopOffset: 15,\n /**\n * Tip-over tree option: children-to-parent horizontal distance.\n */\n underneathHorizontalOffset: 15,\n /**\n * Tip-over tree option: leaf-to-next-branch vertical distance.\n */\n underneathVerticalSeparation: 15,\n //-------------------------------------------------------------------\n /**\n * Settings object to organize the different components of the diagram in a grid layout structure\n */\n grid: {\n /**\n * The width of the grid in which components are arranged. Beyond this width a component will be on the next row.\n */\n width: 1500,\n /**\n * The left offset of the grid.\n */\n offsetX: 50,\n /**\n * The top offset of the grid.\n */\n offsetY: 50,\n /**\n * The horizontal padding within a cell of the grid where a single component resides.\n */\n componentSpacingX: 20,\n /**\n * The vertical padding within a cell of the grid where a single component resides.\n */\n componentSpacingY: 20\n },\n\n //-------------------------------------------------------------------\n /**\n * Layered option: the separation height/width between the layers.\n */\n layerSeparation: 50,\n /**\n * Layered option: how many rounds of shifting and fine-tuning.\n */\n layeredIterations: 2,\n /**\n * Tree-radial option: the angle at which the layout starts.\n */\n startRadialAngle: 0,\n /**\n * Tree-radial option: the angle at which the layout starts.\n */\n endRadialAngle: 360,\n /**\n * Tree-radial option: the separation between levels.\n */\n radialSeparation: 150,\n /**\n * Tree-radial option: the separation between the root and the first level.\n */\n radialFirstLevelSeparation: 200,\n /**\n * Tree-radial option: whether a virtual roots bing the components in one radial layout.\n */\n keepComponentsInOneRadialLayout: false,\n //-------------------------------------------------------------------\n\n // TODO: ensure to change this to false when containers are around\n ignoreContainers: true,\n layoutContainerChildren: false,\n ignoreInvisible: true,\n animateTransitions: false\n },\n init: function() {\n },\n\n /**\n * Organizes the components in a grid.\n * Returns the final set of nodes (not the Graph).\n * @param components\n */\n gridLayoutComponents: function(components) {\n if (!components) {\n throw \"No components supplied.\";\n }\n\n // calculate and cache the bounds of the components\n Utils.forEach(components, function(c) {\n c.calcBounds();\n });\n\n // order by decreasing width\n components.sort(function(a, b) {\n return b.bounds.width - a.bounds.width;\n });\n\n var maxWidth = this.options.grid.width,\n offsetX = this.options.grid.componentSpacingX,\n offsetY = this.options.grid.componentSpacingY,\n height = 0,\n startX = this.options.grid.offsetX,\n startY = this.options.grid.offsetY,\n x = startX,\n y = startY,\n i,\n resultLinkSet = [],\n resultNodeSet = [];\n\n while (components.length > 0) {\n if (x >= maxWidth) {\n // start a new row\n x = startX;\n y += height + offsetY;\n // reset the row height\n height = 0;\n }\n var component = components.pop();\n this.moveToOffset(component, new Point(x, y));\n for (i = 0; i < component.nodes.length; i++) {\n resultNodeSet.push(component.nodes[i]); // to be returned in the end\n }\n for (i = 0; i < component.links.length; i++) {\n resultLinkSet.push(component.links[i]);\n }\n var boundingRect = component.bounds;\n var currentHeight = boundingRect.height;\n if (currentHeight <= 0 || isNaN(currentHeight)) {\n currentHeight = 0;\n }\n var currentWidth = boundingRect.width;\n if (currentWidth <= 0 || isNaN(currentWidth)) {\n currentWidth = 0;\n }\n\n if (currentHeight >= height) {\n height = currentHeight;\n }\n x += currentWidth + offsetX;\n }\n\n return {\n nodes: resultNodeSet,\n links: resultLinkSet\n };\n },\n\n moveToOffset: function(component, p) {\n var i, j,\n bounds = component.bounds,\n deltax = p.x - bounds.x,\n deltay = p.y - bounds.y;\n\n for (i = 0; i < component.nodes.length; i++) {\n var node = component.nodes[i];\n var nodeBounds = node.bounds();\n if (nodeBounds.width === 0 && nodeBounds.height === 0 && nodeBounds.x === 0 && nodeBounds.y === 0) {\n nodeBounds = new Rect(0, 0, 0, 0);\n }\n nodeBounds.x += deltax;\n nodeBounds.y += deltay;\n node.bounds(nodeBounds);\n }\n for (i = 0; i < component.links.length; i++) {\n var link = component.links[i];\n if (link.points) {\n var newpoints = [];\n var points = link.points;\n for (j = 0; j < points.length; j++) {\n var pt = points[j];\n pt.x += deltax;\n pt.y += deltay;\n newpoints.push(pt);\n }\n link.points = newpoints;\n }\n }\n this.currentHorizontalOffset += bounds.width + this.options.grid.offsetX;\n return new Point(deltax, deltay);\n },\n\n transferOptions: function(options) {\n\n // Size options lead to stackoverflow and need special handling\n\n this.options = kendo.deepExtend({}, this.defaultOptions);\n if (Utils.isUndefined(options)) {\n return;\n }\n\n this.options = kendo.deepExtend(this.options, options || {});\n }\n });\n\n /**\n * The data bucket a hypertree holds in its nodes. *\n * @type {*}\n */\n /* var ContainerGraph = kendo.Class.extend({\n init: function (diagram) {\n this.diagram = diagram;\n this.graph = new Graph(diagram);\n this.container = null;\n this.containerNode = null;\n }\n\n });*/\n\n /**\n * Adapter between the diagram control and the graph representation. It converts shape and connections to nodes and edges taking into the containers and their collapsef state,\n * the visibility of items and more. If the layoutContainerChildren is true a hypertree is constructed which holds the hierarchy of containers and many conditions are analyzed\n * to investigate how the effective graph structure looks like and how the layout has to be performed.\n * @type {*}\n */\n var DiagramToHyperTreeAdapter = kendo.Class.extend({\n init: function(diagram) {\n\n /**\n * The mapping to/from the original nodes.\n * @type {Dictionary}\n */\n this.nodeMap = new Dictionary();\n\n /**\n * Gets the mapping of a shape to a container in case the shape sits in a collapsed container.\n * @type {Dictionary}\n */\n this.shapeMap = new Dictionary();\n\n /**\n * The nodes being mapped.\n * @type {Dictionary}\n */\n this.nodes = [];\n\n /**\n * The connections being mapped.\n * @type {Dictionary}\n */\n this.edges = [];\n\n // the mapping from an edge to all the connections it represents, this can be both because of multiple connections between\n // two shapes or because a container holds multiple connections to another shape or container.\n this.edgeMap = new Dictionary();\n\n /**\n * The resulting set of Nodes when the analysis has finished.\n * @type {Array}\n */\n this.finalNodes = [];\n\n /**\n * The resulting set of Links when the analysis has finished.\n * @type {Array}\n */\n this.finalLinks = [];\n\n /**\n * The items being omitted because of multigraph edges.\n * @type {Array}\n */\n this.ignoredConnections = [];\n\n /**\n * The items being omitted because of containers, visibility and other factors.\n * @type {Array}\n */\n this.ignoredShapes = [];\n\n /**\n * The map from a node to the partition/hypernode in which it sits. This hyperMap is null if 'options.layoutContainerChildren' is false.\n * @type {Dictionary}\n */\n this.hyperMap = new Dictionary();\n\n /**\n * The hypertree contains the hierarchy defined by the containers.\n * It's in essence a Graph of Graphs with a tree structure defined by the hierarchy of containers.\n * @type {HyperTree}\n */\n this.hyperTree = new Graph();\n\n /**\n * The resulting graph after conversion. Note that this does not supply the information contained in the\n * ignored connection and shape collections.\n * @type {null}\n */\n this.finalGraph = null;\n\n this.diagram = diagram;\n },\n\n /**\n * The hyperTree is used when the 'options.layoutContainerChildren' is true. It contains the hierarchy of containers whereby each node is a ContainerGraph.\n * This type of node has a Container reference to the container which holds the Graph items. There are three possible situations during the conversion process:\n * - Ignore the containers: the container are non-existent and only normal shapes are mapped. If a shape has a connection to a container it will be ignored as well\n * since there is no node mapped for the container.\n * - Do not ignore the containers and leave the content of the containers untouched: the top-level elements are being mapped and the children within a container are not altered.\n * - Do not ignore the containers and organize the content of the containers as well: the hypertree is constructed and there is a partitioning of all nodes and connections into the hypertree.\n * The only reason a connection or node is not being mapped might be due to the visibility, which includes the visibility change through a collapsed parent container.\n * @param options\n */\n convert: function(options) {\n\n if (Utils.isUndefined(this.diagram)) {\n throw \"No diagram to convert.\";\n }\n\n this.options = kendo.deepExtend({\n ignoreInvisible: true,\n ignoreContainers: true,\n layoutContainerChildren: false\n },\n options || {}\n );\n\n this.clear();\n // create the nodes which participate effectively in the graph analysis\n this._renormalizeShapes();\n\n // recreate the incoming and outgoing collections of each and every node\n this._renormalizeConnections();\n\n // export the resulting graph\n this.finalNodes = new Dictionary(this.nodes);\n this.finalLinks = new Dictionary(this.edges);\n\n this.finalGraph = new Graph();\n this.finalNodes.forEach(function(n) {\n this.finalGraph.addNode(n);\n }, this);\n this.finalLinks.forEach(function(l) {\n this.finalGraph.addExistingLink(l);\n }, this);\n return this.finalGraph;\n },\n\n /**\n * Maps the specified connection to an edge of the graph deduced from the given diagram.\n * @param connection\n * @returns {*}\n */\n mapConnection: function(connection) {\n return this.edgeMap.get(connection.id);\n },\n\n /**\n * Maps the specified shape to a node of the graph deduced from the given diagram.\n * @param shape\n * @returns {*}\n */\n mapShape: function(shape) {\n return this.nodeMap.get(shape.id);\n },\n\n /**\n * Gets the edge, if any, between the given nodes.\n * @param a\n * @param b\n */\n getEdge: function(a, b) {\n return Utils.first(a.links, function(link) {\n return link.getComplement(a) === b;\n });\n },\n\n /**\n * Clears all the collections used by the conversion process.\n */\n clear: function() {\n this.finalGraph = null;\n this.hyperTree = (!this.options.ignoreContainers && this.options.layoutContainerChildren) ? new HyperTree() : null;\n this.hyperMap = (!this.options.ignoreContainers && this.options.layoutContainerChildren) ? new Dictionary() : null;\n this.nodeMap = new Dictionary();\n this.shapeMap = new Dictionary();\n this.nodes = [];\n this.edges = [];\n this.edgeMap = new Dictionary();\n this.ignoredConnections = [];\n this.ignoredShapes = [];\n this.finalNodes = [];\n this.finalLinks = [];\n },\n\n /**\n * The path from a given ContainerGraph to the root (container).\n * @param containerGraph\n * @returns {Array}\n */\n listToRoot: function(containerGraph) {\n var list = [];\n var s = containerGraph.container;\n if (!s) {\n return list;\n }\n list.push(s);\n while (s.parentContainer) {\n s = s.parentContainer;\n list.push(s);\n }\n list.reverse();\n return list;\n },\n\n firstNonIgnorableContainer: function(shape) {\n\n if (shape.isContainer && !this._isIgnorableItem(shape)) {\n return shape;\n }\n return !shape.parentContainer ? null : this.firstNonIgnorableContainer(shape.parentContainer);\n },\n isContainerConnection: function(a, b) {\n if (a.isContainer && this.isDescendantOf(a, b)) {\n return true;\n }\n return b.isContainer && this.isDescendantOf(b, a);\n },\n\n /**\n * Returns true if the given shape is a direct child or a nested container child of the given container.\n * If the given container and shape are the same this will return false since a shape cannot be its own child.\n * @param scope\n * @param a\n * @returns {boolean}\n */\n isDescendantOf: function(scope, a) {\n if (!scope.isContainer) {\n throw \"Expecting a container.\";\n }\n if (scope === a) {\n return false;\n }\n if (contains(scope.children, a)) {\n return true;\n }\n var containers = [];\n for (var i = 0, len = scope.children.length; i < len; i++) {\n var c = scope.children[i];\n if (c.isContainer && this.isDescendantOf(c, a)) {\n containers.push(c);\n }\n }\n\n return containers.length > 0;\n },\n isIgnorableItem: function(shape) {\n if (this.options.ignoreInvisible) {\n if (shape.isCollapsed && this._isVisible(shape)) {\n return false;\n }\n if (!shape.isCollapsed && this._isVisible(shape)) {\n return false;\n }\n return true;\n }\n else {\n return shape.isCollapsed && !this._isTop(shape);\n }\n },\n\n /**\n * Determines whether the shape is or needs to be mapped to another shape. This occurs essentially when the shape sits in\n * a collapsed container hierarchy and an external connection needs a node endpoint. This node then corresponds to the mapped shape and is\n * necessarily a container in the parent hierarchy of the shape.\n * @param shape\n */\n isShapeMapped: function(shape) {\n return shape.isCollapsed && !this._isVisible(shape) && !this._isTop(shape);\n },\n\n leastCommonAncestor: function(a, b) {\n if (!a) {\n throw \"Parameter should not be null.\";\n }\n if (!b) {\n throw \"Parameter should not be null.\";\n }\n\n if (!this.hyperTree) {\n throw \"No hypertree available.\";\n }\n var al = this.listToRoot(a);\n var bl = this.listToRoot(b);\n var found = null;\n if (Utils.isEmpty(al) || Utils.isEmpty(bl)) {\n return this.hyperTree.root.data;\n }\n var xa = al[0];\n var xb = bl[0];\n var i = 0;\n while (xa === xb) {\n found = al[i];\n i++;\n if (i >= al.length || i >= bl.length) {\n break;\n }\n xa = al[i];\n xb = bl[i];\n }\n if (!found) {\n return this.hyperTree.root.data;\n }\n else {\n return grep(this.hyperTree.nodes, function(n) {\n return n.data.container === found;\n });\n }\n },\n /**\n * Determines whether the specified item is a top-level shape or container.\n * @param item\n * @returns {boolean}\n * @private\n */\n _isTop: function(item) {\n return !item.parentContainer;\n },\n\n /**\n * Determines iteratively (by walking up the container stack) whether the specified shape is visible.\n * This does NOT tell whether the item is not visible due to an explicit Visibility change or due to a collapse state.\n * @param shape\n * @returns {*}\n * @private\n */\n _isVisible: function(shape) {\n\n if (!shape.visible()) {\n return false;\n }\n return !shape.parentContainer ? shape.visible() : this._isVisible(shape.parentContainer);\n },\n\n _isCollapsed: function(shape) {\n\n if (shape.isContainer && shape.isCollapsed) {\n return true;\n }\n return shape.parentContainer && this._isCollapsed(shape.parentContainer);\n },\n\n /**\n * First part of the graph creation; analyzing the shapes and containers and deciding whether they should be mapped to a Node.\n * @private\n */\n _renormalizeShapes: function() {\n // add the nodes, the adjacency structure will be reconstructed later on\n if (this.options.ignoreContainers) {\n for (var i = 0, len = this.diagram.shapes.length; i < len; i++) {\n var shape = this.diagram.shapes[i];\n\n // if not visible (and ignoring the invisible ones) or a container we skip\n if ((this.options.ignoreInvisible && !this._isVisible(shape)) || shape.isContainer) {\n this.ignoredShapes.push(shape);\n continue;\n }\n var node = new Node(shape.id, shape);\n node.isVirtual = false;\n\n // the mapping will always contain singletons and the hyperTree will be null\n this.nodeMap.add(shape.id, node);\n this.nodes.push(node);\n }\n }\n else {\n throw \"Containers are not supported yet, but stay tuned.\";\n }\n },\n\n /**\n * Second part of the graph creation; analyzing the connections and deciding whether they should be mapped to an edge.\n * @private\n */\n _renormalizeConnections: function() {\n if (this.diagram.connections.length === 0) {\n return;\n }\n for (var i = 0, len = this.diagram.connections.length; i < len; i++) {\n var conn = this.diagram.connections[i];\n\n if (this.isIgnorableItem(conn)) {\n this.ignoredConnections.push(conn);\n continue;\n }\n\n var source = !conn.sourceConnector ? null : conn.sourceConnector.shape;\n var sink = !conn.targetConnector ? null : conn.targetConnector.shape;\n\n // no layout for floating connections\n if (!source || !sink) {\n this.ignoredConnections.push(conn);\n continue;\n }\n\n if (contains(this.ignoredShapes, source) && !this.shapeMap.containsKey(source)) {\n this.ignoredConnections.push(conn);\n continue;\n }\n if (contains(this.ignoredShapes, sink) && !this.shapeMap.containsKey(sink)) {\n this.ignoredConnections.push(conn);\n continue;\n }\n\n // if the endpoint sits in a collapsed container we need the container rather than the shape itself\n if (this.shapeMap.containsKey(source)) {\n source = this.shapeMap[source];\n }\n if (this.shapeMap.containsKey(sink)) {\n sink = this.shapeMap[sink];\n }\n\n var sourceNode = this.mapShape(source);\n var sinkNode = this.mapShape(sink);\n if ((sourceNode === sinkNode) || this.areConnectedAlready(sourceNode, sinkNode)) {\n this.ignoredConnections.push(conn);\n continue;\n }\n\n if (sourceNode === null || sinkNode === null) {\n throw \"A shape was not mapped to a node.\";\n }\n if (this.options.ignoreContainers) {\n // much like a floating connection here since at least one end is attached to a container\n if (sourceNode.isVirtual || sinkNode.isVirtual) {\n this.ignoredConnections.push(conn);\n continue;\n }\n var newEdge = new Link(sourceNode, sinkNode, conn.id, conn);\n\n this.edgeMap.add(conn.id, newEdge);\n this.edges.push(newEdge);\n }\n else {\n throw \"Containers are not supported yet, but stay tuned.\";\n }\n }\n },\n\n areConnectedAlready: function(n, m) {\n return Utils.any(this.edges, function(l) {\n return l.source === n && l.target === m || l.source === m && l.target === n;\n });\n }\n\n /**\n * Depth-first traversal of the given container.\n * @param container\n * @param action\n * @param includeStart\n * @private\n */\n /* _visitContainer: function (container, action, includeStart) {\n\n *//*if (container == null) throw new ArgumentNullException(\"container\");\n if (action == null) throw new ArgumentNullException(\"action\");\n if (includeStart) action(container);\n if (container.children.isEmpty()) return;\n foreach(\n var item\n in\n container.children.OfType < IShape > ()\n )\n {\n var childContainer = item\n as\n IContainerShape;\n if (childContainer != null) this.VisitContainer(childContainer, action);\n else action(item);\n }*//*\n }*/\n\n\n });\n\n /**\n * The classic spring-embedder (aka force-directed, Fruchterman-Rheingold, barycentric) algorithm.\n * http://en.wikipedia.org/wiki/Force-directed_graph_drawing\n * - Chapter 12 of Tamassia et al. \"Handbook of graph drawing and visualization\".\n * - Kobourov on preprint arXiv; http://arxiv.org/pdf/1201.3011.pdf\n * - Fruchterman and Rheingold in SOFTWARE-PRACTICE AND EXPERIENCE, VOL. 21(1 1), 1129-1164 (NOVEMBER 1991)\n * @type {*}\n */\n var SpringLayout = LayoutBase.extend({\n init: function(diagram) {\n var that = this;\n LayoutBase.fn.init.call(that);\n if (Utils.isUndefined(diagram)) {\n throw \"Diagram is not specified.\";\n }\n this.diagram = diagram;\n },\n\n layout: function(options) {\n\n this.transferOptions(options);\n\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n var graph = adapter.convert(options);\n if (graph.isEmpty()) {\n return;\n }\n // split into connected components\n var components = graph.getConnectedComponents();\n if (Utils.isEmpty(components)) {\n return;\n }\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n this.layoutGraph(component, options);\n }\n var finalNodeSet = this.gridLayoutComponents(components);\n return new diagram.LayoutState(this.diagram, finalNodeSet);\n },\n\n layoutGraph: function(graph, options) {\n\n if (Utils.isDefined(options)) {\n this.transferOptions(options);\n }\n this.graph = graph;\n\n var initialTemperature = this.options.nodeDistance * 9;\n this.temperature = initialTemperature;\n\n var guessBounds = this._expectedBounds();\n this.width = guessBounds.width;\n this.height = guessBounds.height;\n\n for (var step = 0; step < this.options.iterations; step++) {\n this.refineStage = step >= this.options.iterations * 5 / 6;\n this.tick();\n // exponential cooldown\n this.temperature = this.refineStage ?\n initialTemperature / 30 :\n initialTemperature * (1 - step / (2 * this.options.iterations ));\n }\n },\n\n /**\n * Single iteration of the simulation.\n */\n tick: function() {\n var i;\n // collect the repulsive forces on each node\n for (i = 0; i < this.graph.nodes.length; i++) {\n this._repulsion(this.graph.nodes[i]);\n }\n\n // collect the attractive forces on each node\n for (i = 0; i < this.graph.links.length; i++) {\n this._attraction(this.graph.links[i]);\n }\n // update the positions\n for (i = 0; i < this.graph.nodes.length; i++) {\n var node = this.graph.nodes[i];\n var offset = Math.sqrt(node.dx * node.dx + node.dy * node.dy);\n if (offset === 0) {\n return;\n }\n node.x += Math.min(offset, this.temperature) * node.dx / offset;\n node.y += Math.min(offset, this.temperature) * node.dy / offset;\n if (this.options.limitToView) {\n node.x = Math.min(this.width, Math.max(node.width / 2, node.x));\n node.y = Math.min(this.height, Math.max(node.height / 2, node.y));\n }\n }\n },\n\n /**\n * Shakes the node away from its current position to escape the deadlock.\n * @param node A Node.\n * @private\n */\n _shake: function(node) {\n // just a simple polar neighborhood\n var rho = Math.random() * this.options.nodeDistance / 4;\n var alpha = Math.random() * 2 * Math.PI;\n node.x += rho * Math.cos(alpha);\n node.y -= rho * Math.sin(alpha);\n },\n\n /**\n * The typical Coulomb-Newton force law F=k/r^2\n * @remark This only works in dimensions less than three.\n * @param d\n * @param n A Node.\n * @param m Another Node.\n * @returns {number}\n * @private\n */\n _InverseSquareForce: function(d, n, m) {\n var force;\n if (!this.refineStage) {\n force = Math.pow(d, 2) / Math.pow(this.options.nodeDistance, 2);\n }\n else {\n var deltax = n.x - m.x;\n var deltay = n.y - m.y;\n\n var wn = n.width / 2;\n var hn = n.height / 2;\n var wm = m.width / 2;\n var hm = m.height / 2;\n\n force = (Math.pow(deltax, 2) / Math.pow(wn + wm + this.options.nodeDistance, 2)) + (Math.pow(deltay, 2) / Math.pow(hn + hm + this.options.nodeDistance, 2));\n }\n return force * 4 / 3;\n },\n\n /**\n * The typical Hooke force law F=kr^2\n * @param d\n * @param n\n * @param m\n * @returns {number}\n * @private\n */\n _SquareForce: function(d, n, m) {\n return 1 / this._InverseSquareForce(d, n, m);\n },\n\n _repulsion: function(n) {\n n.dx = 0;\n n.dy = 0;\n Utils.forEach(this.graph.nodes, function(m) {\n if (m === n) {\n return;\n }\n while (n.x === m.x && n.y === m.y) {\n this._shake(m);\n }\n var vx = n.x - m.x;\n var vy = n.y - m.y;\n var distance = Math.sqrt(vx * vx + vy * vy);\n var r = this._SquareForce(distance, n, m) * 2;\n n.dx += (vx / distance) * r;\n n.dy += (vy / distance) * r;\n }, this);\n },\n _attraction: function(link) {\n var t = link.target;\n var s = link.source;\n if (s === t) {\n // loops induce endless shakes\n return;\n }\n while (s.x === t.x && s.y === t.y) {\n this._shake(t);\n }\n\n var vx = s.x - t.x;\n var vy = s.y - t.y;\n var distance = Math.sqrt(vx * vx + vy * vy);\n\n var a = this._InverseSquareForce(distance, s, t) * 5;\n var dx = (vx / distance) * a;\n var dy = (vy / distance) * a;\n t.dx += dx;\n t.dy += dy;\n s.dx -= dx;\n s.dy -= dy;\n },\n\n /**\n * Calculates the expected bounds after layout.\n * @returns {*}\n * @private\n */\n _expectedBounds: function() {\n\n var size, N = this.graph.nodes.length, /*golden ration optimal?*/ ratio = 1.5, multiplier = 4;\n if (N === 0) {\n return size;\n }\n size = Utils.fold(this.graph.nodes, function(s, node) {\n var area = node.width * node.height;\n if (area > 0) {\n s += Math.sqrt(area);\n return s;\n }\n return 0;\n }, 0, this);\n var av = size / N;\n var squareSize = av * Math.ceil(Math.sqrt(N));\n var width = squareSize * Math.sqrt(ratio);\n var height = squareSize / Math.sqrt(ratio);\n return { width: width * multiplier, height: height * multiplier };\n }\n\n });\n\n var TreeLayoutProcessor = kendo.Class.extend({\n\n init: function(options) {\n this.center = null;\n this.options = options;\n },\n layout: function(treeGraph, root) {\n this.graph = treeGraph;\n if (!this.graph.nodes || this.graph.nodes.length === 0) {\n return;\n }\n\n if (!contains(this.graph.nodes, root)) {\n throw \"The given root is not in the graph.\";\n }\n\n this.center = root;\n this.graph.cacheRelationships();\n /* var nonull = this.graph.nodes.where(function (n) {\n return n.associatedShape != null;\n });*/\n\n // transfer the rects\n /*nonull.forEach(function (n) {\n n.Location = n.associatedShape.Position;\n n.NodeSize = n.associatedShape.ActualBounds.ToSize();\n }\n\n );*/\n\n // caching the children\n /* nonull.forEach(function (n) {\n n.children = n.getChildren();\n });*/\n\n this.layoutSwitch();\n\n // apply the layout to the actual visuals\n // nonull.ForEach(n => n.associatedShape.Position = n.Location);\n },\n\n layoutLeft: function(left) {\n this.setChildrenDirection(this.center, \"Left\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n var h = 0, w = 0, y, i, node;\n for (i = 0; i < left.length; i++) {\n node = left[i];\n node.TreeDirection = \"Left\";\n var s = this.measure(node, Size.Empty);\n w = Math.max(w, s.Width);\n h += s.height + this.options.verticalSeparation;\n }\n\n h -= this.options.verticalSeparation;\n var x = this.center.x - this.options.horizontalSeparation;\n y = this.center.y + ((this.center.height - h) / 2);\n for (i = 0; i < left.length; i++) {\n node = left[i];\n var p = new Point(x - node.Size.width, y);\n\n this.arrange(node, p);\n y += node.Size.height + this.options.verticalSeparation;\n }\n },\n\n layoutRight: function(right) {\n this.setChildrenDirection(this.center, \"Right\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n var h = 0, w = 0, y, i, node;\n for (i = 0; i < right.length; i++) {\n node = right[i];\n node.TreeDirection = \"Right\";\n var s = this.measure(node, Size.Empty);\n w = Math.max(w, s.Width);\n h += s.height + this.options.verticalSeparation;\n }\n\n h -= this.options.verticalSeparation;\n var x = this.center.x + this.options.horizontalSeparation + this.center.width;\n y = this.center.y + ((this.center.height - h) / 2);\n for (i = 0; i < right.length; i++) {\n node = right[i];\n var p = new Point(x, y);\n this.arrange(node, p);\n y += node.Size.height + this.options.verticalSeparation;\n }\n },\n\n layoutUp: function(up) {\n this.setChildrenDirection(this.center, \"Up\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n var w = 0, y, node, i;\n for (i = 0; i < up.length; i++) {\n node = up[i];\n node.TreeDirection = \"Up\";\n var s = this.measure(node, Size.Empty);\n w += s.width + this.options.horizontalSeparation;\n }\n\n w -= this.options.horizontalSeparation;\n var x = this.center.x + (this.center.width / 2) - (w / 2);\n\n // y = this.center.y -verticalSeparation -this.center.height/2 - h;\n for (i = 0; i < up.length; i++) {\n node = up[i];\n y = this.center.y - this.options.verticalSeparation - node.Size.height;\n var p = new Point(x, y);\n this.arrange(node, p);\n x += node.Size.width + this.options.horizontalSeparation;\n }\n },\n\n layoutDown: function(down) {\n var node, i;\n this.setChildrenDirection(this.center, \"Down\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n var w = 0, y;\n for (i = 0; i < down.length; i++) {\n node = down[i];\n node.treeDirection = \"Down\";\n var s = this.measure(node, Size.Empty);\n w += s.width + this.options.horizontalSeparation;\n }\n\n w -= this.options.horizontalSeparation;\n var x = this.center.x + (this.center.width / 2) - (w / 2);\n y = this.center.y + this.options.verticalSeparation + this.center.height;\n for (i = 0; i < down.length; i++) {\n node = down[i];\n var p = new Point(x, y);\n this.arrange(node, p);\n x += node.Size.width + this.options.horizontalSeparation;\n }\n },\n\n layoutRadialTree: function() {\n // var rmax = children.Aggregate(0D, (current, node) => Math.max(node.SectorAngle, current));\n this.setChildrenDirection(this.center, \"Radial\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n this.previousRoot = null;\n var startAngle = this.options.startRadialAngle * DEG_TO_RAD;\n var endAngle = this.options.endRadialAngle * DEG_TO_RAD;\n if (endAngle <= startAngle) {\n throw \"Final angle should not be less than the start angle.\";\n }\n\n this.maxDepth = 0;\n this.origin = new Point(this.center.x, this.center.y);\n this.calculateAngularWidth(this.center, 0);\n\n // perform the layout\n if (this.maxDepth > 0) {\n this.radialLayout(this.center, this.options.radialFirstLevelSeparation, startAngle, endAngle);\n }\n\n // update properties of the root node\n this.center.Angle = endAngle - startAngle;\n },\n\n tipOverTree: function(down, startFromLevel) {\n if (Utils.isUndefined(startFromLevel)) {\n startFromLevel = 0;\n }\n\n this.setChildrenDirection(this.center, \"Down\", false);\n this.setChildrenLayout(this.center, \"Default\", false);\n this.setChildrenLayout(this.center, \"Underneath\", false, startFromLevel);\n var w = 0, y, node, i;\n for (i = 0; i < down.length; i++) {\n node = down[i];\n\n // if (node.IsSpecial) continue;\n node.TreeDirection = \"Down\";\n var s = this.measure(node, Size.Empty);\n w += s.width + this.options.horizontalSeparation;\n }\n\n w -= this.options.horizontalSeparation;\n\n // putting the root in the center with respect to the whole diagram is not a nice result, let's put it with respect to the first level only\n w -= down[down.length - 1].width;\n w += down[down.length - 1].associatedShape.bounds().width;\n\n var x = this.center.x + (this.center.width / 2) - (w / 2);\n y = this.center.y + this.options.verticalSeparation + this.center.height;\n for (i = 0; i < down.length; i++) {\n node = down[i];\n // if (node.IsSpecial) continue;\n var p = new Point(x, y);\n this.arrange(node, p);\n x += node.Size.width + this.options.horizontalSeparation;\n }\n\n /*//let's place the special node, assuming there is only one\n if (down.Count(n => n.IsSpecial) > 0)\n {\n var special = (from n in down where n.IsSpecial select n).First();\n if (special.Children.Count > 0)\n throw new DiagramException(\"The 'special' element should not have children.\");\n special.Data.Location = new Point(Center.Data.Location.X + Center.AssociatedShape.BoundingRectangle.Width + this.options.HorizontalSeparation, Center.Data.Location.Y);\n }*/\n },\n calculateAngularWidth: function(n, d) {\n if (d > this.maxDepth) {\n this.maxDepth = d;\n }\n\n var aw = 0, w = 1000, h = 1000, diameter = d === 0 ? 0 : Math.sqrt((w * w) + (h * h)) / d;\n\n if (n.children.length > 0) {\n // eventually with n.IsExpanded\n for (var i = 0, len = n.children.length; i < len; i++) {\n var child = n.children[i];\n aw += this.calculateAngularWidth(child, d + 1);\n }\n aw = Math.max(diameter, aw);\n }\n else {\n aw = diameter;\n }\n\n n.sectorAngle = aw;\n return aw;\n },\n sortChildren: function(n) {\n var basevalue = 0, i;\n\n // update basevalue angle for node ordering\n if (n.parents.length > 1) {\n throw \"Node is not part of a tree.\";\n }\n var p = n.parents[0];\n if (p) {\n var pl = new Point(p.x, p.y);\n var nl = new Point(n.x, n.y);\n basevalue = this.normalizeAngle(Math.atan2(pl.y - nl.y, pl.x - nl.x));\n }\n\n var count = n.children.length;\n if (count === 0) {\n return null;\n }\n\n var angle = [];\n var idx = [];\n\n for (i = 0; i < count; ++i) {\n var c = n.children[i];\n var l = new Point(c.x, c.y);\n idx[i] = i;\n angle[i] = this.normalizeAngle(-basevalue + Math.atan2(l.y - l.y, l.x - l.x));\n }\n\n Utils.bisort(angle, idx);\n var col = []; // list of nodes\n var children = n.children;\n for (i = 0; i < count; ++i) {\n col.push(children[idx[i]]);\n }\n\n return col;\n },\n\n normalizeAngle: function(angle) {\n while (angle > Math.PI * 2) {\n angle -= 2 * Math.PI;\n }\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n return angle;\n },\n radialLayout: function(node, radius, startAngle, endAngle) {\n var deltaTheta = endAngle - startAngle;\n var deltaThetaHalf = deltaTheta / 2.0;\n var parentSector = node.sectorAngle;\n var fraction = 0;\n var sorted = this.sortChildren(node);\n for (var i = 0, len = sorted.length; i < len; i++) {\n var childNode = sorted[i];\n var cp = childNode;\n var childAngleFraction = cp.sectorAngle / parentSector;\n if (childNode.children.length > 0) {\n this.radialLayout(childNode,\n radius + this.options.radialSeparation,\n startAngle + (fraction * deltaTheta),\n startAngle + ((fraction + childAngleFraction) * deltaTheta));\n }\n\n this.setPolarLocation(childNode, radius, startAngle + (fraction * deltaTheta) + (childAngleFraction * deltaThetaHalf));\n cp.angle = childAngleFraction * deltaTheta;\n fraction += childAngleFraction;\n }\n },\n setPolarLocation: function(node, radius, angle) {\n node.x = this.origin.x + (radius * Math.cos(angle));\n node.y = this.origin.y + (radius * Math.sin(angle));\n node.BoundingRectangle = new Rect(node.x, node.y, node.width, node.height);\n },\n\n /**\n * Sets the children direction recursively.\n * @param node\n * @param direction\n * @param includeStart\n */\n setChildrenDirection: function(node, direction, includeStart) {\n var rootDirection = node.treeDirection;\n this.graph.depthFirstTraversal(node, function(n) {\n n.treeDirection = direction;\n });\n if (!includeStart) {\n node.treeDirection = rootDirection;\n }\n },\n\n /**\n * Sets the children layout recursively.\n * @param node\n * @param layout\n * @param includeStart\n * @param startFromLevel\n */\n setChildrenLayout: function(node, layout, includeStart, startFromLevel) {\n if (Utils.isUndefined(startFromLevel)) {\n startFromLevel = 0;\n }\n var rootLayout = node.childrenLayout;\n if (startFromLevel > 0) {\n // assign levels to the Node.Level property\n this.graph.assignLevels(node);\n\n // assign the layout on the condition that the level is at least the 'startFromLevel'\n this.graph.depthFirstTraversal(\n node, function(s) {\n if (s.level >= startFromLevel + 1) {\n s.childrenLayout = layout;\n }\n }\n );\n }\n else {\n this.graph.depthFirstTraversal(node, function(s) {\n s.childrenLayout = layout;\n });\n\n // if the start should not be affected we put the state back\n if (!includeStart) {\n node.childrenLayout = rootLayout;\n }\n }\n },\n\n /**\n * Returns the actual size of the node. The given size is the allowed space wherein the node can lay out itself.\n * @param node\n * @param givenSize\n * @returns {Size}\n */\n measure: function(node, givenSize) {\n var w = 0, h = 0, s;\n var result = new Size(0, 0);\n if (!node) {\n throw \"\";\n }\n var b = node.associatedShape.bounds();\n var shapeWidth = b.width;\n var shapeHeight = b.height;\n if (node.parents.length !== 1) {\n throw \"Node not in a spanning tree.\";\n }\n\n var parent = node.parents[0];\n if (node.treeDirection === \"Undefined\") {\n node.treeDirection = parent.treeDirection;\n }\n\n if (Utils.isEmpty(node.children)) {\n result = new Size(\n Math.abs(shapeWidth) < EPSILON ? 50 : shapeWidth,\n Math.abs(shapeHeight) < EPSILON ? 25 : shapeHeight);\n }\n else if (node.children.length === 1) {\n switch (node.treeDirection) {\n case \"Radial\":\n s = this.measure(node.children[0], givenSize); // child size\n w = shapeWidth + (this.options.radialSeparation * Math.cos(node.AngleToParent)) + s.width;\n h = shapeHeight + Math.abs(this.options.radialSeparation * Math.sin(node.AngleToParent)) + s.height;\n break;\n case \"Left\":\n case \"Right\":\n switch (node.childrenLayout) {\n\n case \"TopAlignedWithParent\":\n break;\n\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n s = this.measure(node.children[0], givenSize);\n w = shapeWidth + s.width + this.options.underneathHorizontalOffset;\n h = shapeHeight + this.options.underneathVerticalTopOffset + s.height;\n break;\n\n case \"Default\":\n s = this.measure(node.children[0], givenSize);\n w = shapeWidth + this.options.horizontalSeparation + s.width;\n h = Math.max(shapeHeight, s.height);\n break;\n\n default:\n throw \"Unhandled TreeDirection in the Radial layout measuring.\";\n }\n break;\n case \"Up\":\n case \"Down\":\n switch (node.childrenLayout) {\n\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n s = this.measure(node.children[0], givenSize);\n w = Math.max(shapeWidth, s.width + this.options.underneathHorizontalOffset);\n h = shapeHeight + this.options.underneathVerticalTopOffset + s.height;\n break;\n\n case \"Default\":\n s = this.measure(node.children[0], givenSize);\n h = shapeHeight + this.options.verticalSeparation + s.height;\n w = Math.max(shapeWidth, s.width);\n break;\n\n default:\n throw \"Unhandled TreeDirection in the Down layout measuring.\";\n }\n break;\n default:\n throw \"Unhandled TreeDirection in the layout measuring.\";\n }\n\n result = new Size(w, h);\n }\n else {\n var i, childNode;\n switch (node.treeDirection) {\n case \"Left\":\n case \"Right\":\n switch (node.childrenLayout) {\n\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n w = shapeWidth;\n h = shapeHeight + this.options.underneathVerticalTopOffset;\n for (i = 0; i < node.children.length; i++) {\n childNode = node.children[i];\n s = this.measure(childNode, givenSize);\n w = Math.max(w, s.width + this.options.underneathHorizontalOffset);\n h += s.height + this.options.underneathVerticalSeparation;\n }\n\n h -= this.options.underneathVerticalSeparation;\n break;\n\n case \"Default\":\n w = shapeWidth;\n h = 0;\n for (i = 0; i < node.children.length; i++) {\n childNode = node.children[i];\n s = this.measure(childNode, givenSize);\n w = Math.max(w, shapeWidth + this.options.horizontalSeparation + s.width);\n h += s.height + this.options.verticalSeparation;\n }\n h -= this.options.verticalSeparation;\n break;\n\n default:\n throw \"Unhandled TreeDirection in the Right layout measuring.\";\n }\n\n break;\n case \"Up\":\n case \"Down\":\n\n switch (node.childrenLayout) {\n\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n w = shapeWidth;\n h = shapeHeight + this.options.underneathVerticalTopOffset;\n for (i = 0; i < node.children.length; i++) {\n childNode = node.children[i];\n s = this.measure(childNode, givenSize);\n w = Math.max(w, s.width + this.options.underneathHorizontalOffset);\n h += s.height + this.options.underneathVerticalSeparation;\n }\n\n h -= this.options.underneathVerticalSeparation;\n break;\n\n case \"Default\":\n w = 0;\n h = 0;\n for (i = 0; i < node.children.length; i++) {\n childNode = node.children[i];\n s = this.measure(childNode, givenSize);\n w += s.width + this.options.horizontalSeparation;\n h = Math.max(h, s.height + this.options.verticalSeparation + shapeHeight);\n }\n\n w -= this.options.horizontalSeparation;\n break;\n\n default:\n throw \"Unhandled TreeDirection in the Down layout measuring.\";\n }\n\n break;\n default:\n throw \"Unhandled TreeDirection in the layout measuring.\";\n }\n\n result = new Size(w, h);\n }\n\n node.SectorAngle = Math.sqrt((w * w / 4) + (h * h / 4));\n node.Size = result;\n return result;\n },\n arrange: function(n, p) {\n var i, pp, child, node, childrenwidth, b = n.associatedShape.bounds();\n var shapeWidth = b.width;\n var shapeHeight = b.height;\n if (Utils.isEmpty(n.children)) {\n n.x = p.x;\n n.y = p.y;\n n.BoundingRectangle = new Rect(p.x, p.y, shapeWidth, shapeHeight);\n }\n else {\n var x, y;\n var selfLocation;\n switch (n.treeDirection) {\n case \"Left\":\n switch (n.childrenLayout) {\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n selfLocation = p;\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n for (i = 0; i < node.children.length; i++) {\n node = node.children[i];\n x = selfLocation.x - node.associatedShape.width - this.options.underneathHorizontalOffset;\n pp = new Point(x, y);\n this.arrange(node, pp);\n y += node.Size.height + this.options.underneathVerticalSeparation;\n }\n break;\n\n case \"Default\":\n selfLocation = new Point(p.x + n.Size.width - shapeWidth, p.y + ((n.Size.height - shapeHeight) / 2));\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n x = selfLocation.x - this.options.horizontalSeparation; // alignment of children\n y = p.y;\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n pp = new Point(x - node.Size.width, y);\n this.arrange(node, pp);\n y += node.Size.height + this.options.verticalSeparation;\n }\n break;\n\n default:\n throw \"Unsupported TreeDirection\";\n }\n\n break;\n case \"Right\":\n switch (n.childrenLayout) {\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n\n case \"Underneath\":\n selfLocation = p;\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n x = p.x + shapeWidth + this.options.underneathHorizontalOffset;\n\n // alignment of children left-underneath the parent\n y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n pp = new Point(x, y);\n this.arrange(node, pp);\n y += node.Size.height + this.options.underneathVerticalSeparation;\n }\n\n break;\n\n case \"Default\":\n selfLocation = new Point(p.x, p.y + ((n.Size.height - shapeHeight) / 2));\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n x = p.x + shapeWidth + this.options.horizontalSeparation; // alignment of children\n y = p.y;\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n pp = new Point(x, y);\n this.arrange(node, pp);\n y += node.Size.height + this.options.verticalSeparation;\n }\n break;\n\n default:\n throw \"Unsupported TreeDirection\";\n }\n\n break;\n case \"Up\":\n selfLocation = new Point(p.x + ((n.Size.width - shapeWidth) / 2), p.y + n.Size.height - shapeHeight);\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n if (Math.abs(selfLocation.x - p.x) < EPSILON) {\n childrenwidth = 0;\n // means there is an aberration due to the oversized Element with respect to the children\n for (i = 0; i < n.children.length; i++) {\n child = n.children[i];\n childrenwidth += child.Size.width + this.options.horizontalSeparation;\n }\n childrenwidth -= this.options.horizontalSeparation;\n x = p.x + ((shapeWidth - childrenwidth) / 2);\n }\n else {\n x = p.x;\n }\n\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n y = selfLocation.y - this.options.verticalSeparation - node.Size.height;\n pp = new Point(x, y);\n this.arrange(node, pp);\n x += node.Size.width + this.options.horizontalSeparation;\n }\n break;\n\n case \"Down\":\n\n switch (n.childrenLayout) {\n case \"TopAlignedWithParent\":\n case \"BottomAlignedWithParent\":\n break;\n case \"Underneath\":\n selfLocation = p;\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n x = p.x + this.options.underneathHorizontalOffset; // alignment of children left-underneath the parent\n y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n pp = new Point(x, y);\n this.arrange(node, pp);\n y += node.Size.height + this.options.underneathVerticalSeparation;\n }\n break;\n\n case \"Default\":\n selfLocation = new Point(p.x + ((n.Size.width - shapeWidth) / 2), p.y);\n n.x = selfLocation.x;\n n.y = selfLocation.y;\n n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n if (Math.abs(selfLocation.x - p.x) < EPSILON) {\n childrenwidth = 0;\n // means there is an aberration due to the oversized Element with respect to the children\n for (i = 0; i < n.children.length; i++) {\n child = n.children[i];\n childrenwidth += child.Size.width + this.options.horizontalSeparation;\n }\n\n childrenwidth -= this.options.horizontalSeparation;\n x = p.x + ((shapeWidth - childrenwidth) / 2);\n }\n else {\n x = p.x;\n }\n\n for (i = 0; i < n.children.length; i++) {\n node = n.children[i];\n y = selfLocation.y + this.options.verticalSeparation + shapeHeight;\n pp = new Point(x, y);\n this.arrange(node, pp);\n x += node.Size.width + this.options.horizontalSeparation;\n }\n break;\n\n default:\n throw \"Unsupported TreeDirection\";\n }\n break;\n\n case \"None\":\n break;\n\n default:\n throw \"Unsupported TreeDirection\";\n }\n }\n },\n layoutSwitch: function() {\n if (!this.center) {\n return;\n }\n\n if (Utils.isEmpty(this.center.children)) {\n return;\n }\n\n var type = this.options.subtype;\n if (Utils.isUndefined(type)) {\n type = \"Down\";\n }\n var single, male, female, leftcount;\n var children = this.center.children;\n switch (type.toLowerCase()) {\n case \"radial\":\n case \"radialtree\":\n this.layoutRadialTree();\n break;\n\n case \"mindmaphorizontal\":\n case \"mindmap\":\n single = this.center.children;\n\n if (this.center.children.length === 1) {\n this.layoutRight(single);\n }\n else {\n // odd number will give one more at the right\n leftcount = children.length / 2;\n male = grep(this.center.children, function(n) {\n return Utils.indexOf(children, n) < leftcount;\n });\n female = grep(this.center.children, function(n) {\n return Utils.indexOf(children, n) >= leftcount;\n });\n\n this.layoutLeft(male);\n this.layoutRight(female);\n }\n break;\n\n case \"mindmapvertical\":\n single = this.center.children;\n\n if (this.center.children.length === 1) {\n this.layoutDown(single);\n }\n else {\n // odd number will give one more at the right\n leftcount = children.length / 2;\n male = grep(this.center.children, function(n) {\n return Utils.indexOf(children, n) < leftcount;\n });\n female = grep(this.center.children, function(n) {\n return Utils.indexOf(children, n) >= leftcount;\n });\n this.layoutUp(male);\n this.layoutDown(female);\n }\n break;\n\n case \"right\":\n this.layoutRight(this.center.children);\n break;\n\n case \"left\":\n this.layoutLeft(this.center.children);\n break;\n\n case \"up\":\n case \"bottom\":\n this.layoutUp(this.center.children);\n break;\n\n case \"down\":\n case \"top\":\n this.layoutDown(this.center.children);\n break;\n\n case \"tipover\":\n case \"tipovertree\":\n if (this.options.tipOverTreeStartLevel < 0) {\n throw \"The tip-over level should be a positive integer.\";\n }\n this.tipOverTree(this.center.children, this.options.tipOverTreeStartLevel);\n break;\n\n case \"undefined\":\n case \"none\":\n break;\n }\n }\n });\n\n /**\n * The various tree layout algorithms.\n * @type {*}\n */\n var TreeLayout = LayoutBase.extend({\n init: function(diagram) {\n var that = this;\n LayoutBase.fn.init.call(that);\n if (Utils.isUndefined(diagram)) {\n throw \"No diagram specified.\";\n }\n this.diagram = diagram;\n },\n\n /**\n * Arranges the diagram in a tree-layout with the specified options and tree subtype.\n */\n layout: function(options) {\n\n this.transferOptions(options);\n\n // transform the diagram into a Graph\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n\n /**\n * The Graph reduction from the given diagram.\n * @type {*}\n */\n this.graph = adapter.convert();\n\n var finalNodeSet = this.layoutComponents();\n\n // note that the graph contains the original data and\n // the components are another instance of nodes referring to the same set of shapes\n return new diagram.LayoutState(this.diagram, finalNodeSet);\n },\n\n layoutComponents: function() {\n if (this.graph.isEmpty()) {\n return;\n }\n\n // split into connected components\n var components = this.graph.getConnectedComponents();\n if (Utils.isEmpty(components)) {\n return;\n }\n\n var layout = new TreeLayoutProcessor(this.options);\n var trees = [];\n // find a spanning tree for each component\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n\n var treeGraph = this.getTree(component);\n if (!treeGraph) {\n throw \"Failed to find a spanning tree for the component.\";\n }\n var root = treeGraph.root;\n var tree = treeGraph.tree;\n layout.layout(tree, root);\n\n trees.push(tree);\n }\n\n return this.gridLayoutComponents(trees);\n\n },\n\n /**\n * Gets a spanning tree (and root) for the given graph.\n * Ensure that the given graph is connected!\n * @param graph\n * @returns {*} A literal object consisting of the found root and the spanning tree.\n */\n getTree: function(graph) {\n var root = null;\n if (this.options.roots && this.options.roots.length > 0) {\n for (var i = 0, len = graph.nodes.length; i < len; i++) {\n var node = graph.nodes[i];\n for (var j = 0; j < this.options.roots.length; j++) {\n var givenRootShape = this.options.roots[j];\n if (givenRootShape === node.associatedShape) {\n root = node;\n break;\n }\n }\n }\n }\n if (!root) {\n // finds the most probable root on the basis of the longest path in the component\n root = graph.root();\n // should not happen really\n if (!root) {\n throw \"Unable to find a root for the tree.\";\n }\n }\n return this.getTreeForRoot(graph, root);\n },\n\n getTreeForRoot: function(graph, root) {\n\n var tree = graph.getSpanningTree(root);\n if (Utils.isUndefined(tree) || tree.isEmpty()) {\n return null;\n }\n return {\n tree: tree,\n root: tree.root\n };\n }\n\n });\n\n /**\n * The Sugiyama aka layered layout algorithm.\n * @type {*}\n */\n var LayeredLayout = LayoutBase.extend({\n init: function(diagram) {\n var that = this;\n LayoutBase.fn.init.call(that);\n if (Utils.isUndefined(diagram)) {\n throw \"Diagram is not specified.\";\n }\n this.diagram = diagram;\n },\n\n layout: function(options) {\n\n this.transferOptions(options);\n\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n var graph = adapter.convert(options);\n if (graph.isEmpty()) {\n return;\n }\n // split into connected components\n var components = graph.getConnectedComponents();\n if (Utils.isEmpty(components)) {\n return;\n }\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\n this.layoutGraph(component, options);\n }\n var finalNodeSet = this.gridLayoutComponents(components);\n return new diagram.LayoutState(this.diagram, finalNodeSet);\n\n },\n\n /**\n * Initializes the runtime data properties of the layout.\n * @private\n */\n _initRuntimeProperties: function() {\n for (var k = 0; k < this.graph.nodes.length; k++) {\n var node = this.graph.nodes[k];\n node.layer = -1;\n node.downstreamLinkCount = 0;\n node.upstreamLinkCount = 0;\n\n node.isVirtual = false;\n\n node.uBaryCenter = 0.0;\n node.dBaryCenter = 0.0;\n\n node.upstreamPriority = 0;\n node.downstreamPriority = 0;\n\n node.gridPosition = 0;\n }\n },\n _prepare: function(graph) {\n var current = [], i, l, link;\n\n // defines a mapping of a node to the layer index\n var layerMap = new Dictionary();\n var layerCount = 0;\n var targetLayer, next, target;\n\n Utils.forEach(graph.nodes, function(node) {\n if (node.incoming.length === 0) {\n layerMap.set(node, 0);\n current.push(node);\n }\n });\n\n while (current.length > 0) {\n next = current.shift();\n for (i = 0; i < next.outgoing.length; i++) {\n link = next.outgoing[i];\n target = link.target;\n\n if (layerMap.containsKey(target)) {\n targetLayer = Math.max(layerMap.get(next) + 1, layerMap.get(target));\n } else {\n targetLayer = layerMap.get(next) + 1;\n }\n layerMap.set(target, targetLayer);\n if (targetLayer > layerCount) {\n layerCount = targetLayer;\n }\n\n if (!contains(current, target)) {\n current.push(target);\n }\n }\n }\n\n var sortedNodes = layerMap.keys();\n\n sortedNodes.sort(function(o1, o2) {\n var o1layer = layerMap.get(o1);\n var o2layer = layerMap.get(o2);\n return Utils.sign(o2layer - o1layer);\n });\n\n for (var n = 0; n < sortedNodes.length; ++n) {\n var node = sortedNodes[n];\n var minLayer = Number.MAX_VALUE;\n\n if (node.outgoing.length === 0) {\n continue;\n }\n\n for (l = 0; l < node.outgoing.length; ++l) {\n link = node.outgoing[l];\n minLayer = Math.min(minLayer, layerMap.get(link.target));\n }\n\n if (minLayer > 1) {\n layerMap.set(node, minLayer - 1);\n }\n }\n\n this.layers = [];\n var layer;\n for (i = 0; i < layerCount + 1; i++) {\n layer = [];\n layer.linksTo = {};\n this.layers.push(layer);\n }\n\n layerMap.forEach(function(node, layer) {\n node.layer = layer;\n this.layers[layer].push(node);\n }, this);\n\n // set initial grid positions\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n for (i = 0; i < layer.length; i++) {\n layer[i].gridPosition = i;\n }\n }\n },\n /**\n * Performs the layout of a single component.\n */\n layoutGraph: function(graph, options) {\n if (Utils.isUndefined(graph)) {\n throw \"No graph given or graph analysis of the diagram failed.\";\n }\n if (Utils.isDefined(options)) {\n this.transferOptions(options);\n }\n this.graph = graph;\n\n // sets unique indices on the nodes\n graph.setItemIndices();\n\n // ensures no cycles present for this layout\n var reversedEdges = graph.makeAcyclic();\n\n // define the runtime props being used by the layout algorithm\n this._initRuntimeProperties();\n\n this._prepare(graph, options);\n\n this._dummify();\n\n this._optimizeCrossings();\n\n this._swapPairs();\n\n this.arrangeNodes();\n\n this._moveThingsAround();\n\n this._dedummify();\n\n // re-reverse the links which were switched earlier\n Utils.forEach(reversedEdges, function(e) {\n if (e.points) {\n e.points.reverse();\n }\n });\n },\n\n setMinDist: function(m, n, minDist) {\n var l = m.layer;\n var i = m.layerIndex;\n this.minDistances[l][i] = minDist;\n },\n\n getMinDist: function(m, n) {\n var dist = 0,\n i1 = m.layerIndex,\n i2 = n.layerIndex,\n l = m.layer,\n min = Math.min(i1, i2),\n max = Math.max(i1, i2);\n // use Sum()?\n for (var k = min; k < max; ++k) {\n dist += this.minDistances[l][k];\n }\n return dist;\n },\n\n placeLeftToRight: function(leftClasses) {\n var leftPos = new Dictionary(), n, node;\n for (var c = 0; c < this.layers.length; ++c) {\n var classNodes = leftClasses[c];\n if (!classNodes) {\n continue;\n }\n\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n if (!leftPos.containsKey(node)) {\n this.placeLeft(node, leftPos, c);\n }\n }\n\n // adjust class\n var d = Number.POSITIVE_INFINITY;\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n var rightSibling = this.rightSibling(node);\n if (rightSibling && this.nodeLeftClass.get(rightSibling) !== c) {\n d = Math.min(d, leftPos.get(rightSibling) - leftPos.get(node) - this.getMinDist(node, rightSibling));\n }\n }\n if (d === Number.POSITIVE_INFINITY) {\n var D = [];\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n var neighbors = [];\n Utils.addRange(neighbors, this.upNodes.get(node));\n Utils.addRange(neighbors, this.downNodes.get(node));\n\n for (var e = 0; e < neighbors.length; e++) {\n var neighbor = neighbors[e];\n if (this.nodeLeftClass.get(neighbor) < c) {\n D.push(leftPos.get(neighbor) - leftPos.get(node));\n }\n }\n }\n D.sort();\n if (D.length === 0) {\n d = 0;\n }\n else if (D.length % 2 === 1) {\n d = D[this.intDiv(D.length, 2)];\n }\n else {\n d = (D[this.intDiv(D.length, 2) - 1] + D[this.intDiv(D.length, 2)]) / 2;\n }\n }\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n leftPos.set(node, leftPos.get(node) + d);\n }\n }\n return leftPos;\n },\n\n placeRightToLeft: function(rightClasses) {\n var rightPos = new Dictionary(), n, node;\n for (var c = 0; c < this.layers.length; ++c) {\n var classNodes = rightClasses[c];\n if (!classNodes) {\n continue;\n }\n\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n if (!rightPos.containsKey(node)) {\n this.placeRight(node, rightPos, c);\n }\n }\n\n // adjust class\n var d = Number.NEGATIVE_INFINITY;\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n var leftSibling = this.leftSibling(node);\n if (leftSibling && this.nodeRightClass.get(leftSibling) !== c) {\n d = Math.max(d, rightPos.get(leftSibling) - rightPos.get(node) + this.getMinDist(leftSibling, node));\n }\n }\n if (d === Number.NEGATIVE_INFINITY) {\n var D = [];\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n var neighbors = [];\n Utils.addRange(neighbors, this.upNodes.get(node));\n Utils.addRange(neighbors, this.downNodes.get(node));\n\n for (var e = 0; e < neighbors.length; e++) {\n var neighbor = neighbors[e];\n if (this.nodeRightClass.get(neighbor) < c) {\n D.push(rightPos.get(node) - rightPos.get(neighbor));\n }\n }\n }\n D.sort();\n if (D.length === 0) {\n d = 0;\n }\n else if (D.length % 2 === 1) {\n d = D[this.intDiv(D.length, 2)];\n }\n else {\n d = (D[this.intDiv(D.length, 2) - 1] + D[this.intDiv(D.length, 2)]) / 2;\n }\n }\n for (n = 0; n < classNodes.length; n++) {\n node = classNodes[n];\n rightPos.set(node, rightPos.get(node) + d);\n }\n }\n return rightPos;\n },\n\n _getLeftWing: function() {\n var leftWing = { value: null };\n var result = this.computeClasses(leftWing, 1);\n this.nodeLeftClass = leftWing.value;\n return result;\n },\n\n _getRightWing: function() {\n var rightWing = { value: null };\n var result = this.computeClasses(rightWing, -1);\n this.nodeRightClass = rightWing.value;\n return result;\n },\n\n computeClasses: function(wingPair, d) {\n var currentWing = 0,\n wing = wingPair.value = new Dictionary();\n\n for (var l = 0; l < this.layers.length; ++l) {\n currentWing = l;\n\n var layer = this.layers[l];\n for (var n = d === 1 ? 0 : layer.length - 1; n >= 0 && n < layer.length; n += d) {\n var node = layer[n];\n if (!wing.containsKey(node)) {\n wing.set(node, currentWing);\n if (node.isVirtual) {\n var ndsinl = this._nodesInLink(node);\n for (var kk = 0; kk < ndsinl.length; kk++) {\n var vnode = ndsinl[kk];\n wing.set(vnode, currentWing);\n }\n }\n }\n else {\n currentWing = wing.get(node);\n }\n }\n }\n\n var wings = [];\n for (var i = 0; i < this.layers.length; i++) {\n wings.push(null);\n }\n wing.forEach(function(node, classIndex) {\n if (wings[classIndex] === null) {\n wings[classIndex] = [];\n }\n wings[classIndex].push(node);\n });\n\n return wings;\n },\n _isVerticalLayout: function() {\n return this.options.subtype.toLowerCase() === \"up\" || this.options.subtype.toLowerCase() === \"down\" || this.options.subtype.toLowerCase() === \"vertical\";\n },\n\n _isHorizontalLayout: function() {\n return this.options.subtype.toLowerCase() === \"right\" || this.options.subtype.toLowerCase() === \"left\" || this.options.subtype.toLowerCase() === \"horizontal\";\n },\n _isIncreasingLayout: function() {\n // meaning that the visiting of the layers goes in the natural order of increasing layer index\n return this.options.subtype.toLowerCase() === \"right\" || this.options.subtype.toLowerCase() === \"down\";\n },\n _moveThingsAround: function() {\n var i, l, node, layer, n, w;\n // sort the layers by their grid position\n for (l = 0; l < this.layers.length; ++l) {\n layer = this.layers[l];\n layer.sort(this._gridPositionComparer);\n }\n\n this.minDistances = [];\n for (l = 0; l < this.layers.length; ++l) {\n layer = this.layers[l];\n this.minDistances[l] = [];\n for (n = 0; n < layer.length; ++n) {\n node = layer[n];\n node.layerIndex = n;\n this.minDistances[l][n] = this.options.nodeDistance;\n if (n < layer.length - 1) {\n if (this._isVerticalLayout()) {\n this.minDistances[l][n] += (node.width + layer[n + 1].width) / 2;\n }\n else {\n this.minDistances[l][n] += (node.height + layer[n + 1].height) / 2;\n }\n }\n }\n }\n\n this.downNodes = new Dictionary();\n this.upNodes = new Dictionary();\n Utils.forEach(this.graph.nodes, function(node) {\n this.downNodes.set(node, []);\n this.upNodes.set(node, []);\n }, this);\n Utils.forEach(this.graph.links, function(link) {\n var origin = link.source;\n var dest = link.target;\n var down = null, up = null;\n if (origin.layer > dest.layer) {\n down = link.source;\n up = link.target;\n }\n else {\n up = link.source;\n down = link.target;\n }\n this.downNodes.get(up).push(down);\n this.upNodes.get(down).push(up);\n }, this);\n this.downNodes.forEachValue(function(list) {\n list.sort(this._gridPositionComparer);\n }, this);\n this.upNodes.forEachValue(function(list) {\n list.sort(this._gridPositionComparer);\n }, this);\n\n for (l = 0; l < this.layers.length - 1; ++l) {\n layer = this.layers[l];\n for (w = 0; w < layer.length - 1; w++) {\n var currentNode = layer[w];\n if (!currentNode.isVirtual) {\n continue;\n }\n\n var currDown = this.downNodes.get(currentNode)[0];\n if (!currDown.isVirtual) {\n continue;\n }\n\n for (n = w + 1; n < layer.length; ++n) {\n node = layer[n];\n if (!node.isVirtual) {\n continue;\n }\n\n var downNode = this.downNodes.get(node)[0];\n if (!downNode.isVirtual) {\n continue;\n }\n\n if (currDown.gridPosition > downNode.gridPosition) {\n var pos = currDown.gridPosition;\n currDown.gridPosition = downNode.gridPosition;\n downNode.gridPosition = pos;\n var i1 = currDown.layerIndex;\n var i2 = downNode.layerIndex;\n this.layers[l + 1][i1] = downNode;\n this.layers[l + 1][i2] = currDown;\n currDown.layerIndex = i2;\n downNode.layerIndex = i1;\n }\n }\n }\n }\n\n\n var leftClasses = this._getLeftWing();\n var rightClasses = this._getRightWing();\n\n\n var leftPos = this.placeLeftToRight(leftClasses);\n var rightPos = this.placeRightToLeft(rightClasses);\n var x = new Dictionary();\n Utils.forEach(this.graph.nodes, function(node) {\n x.set(node, (leftPos.get(node) + rightPos.get(node)) / 2);\n });\n\n\n var order = new Dictionary();\n var placed = new Dictionary();\n for (l = 0; l < this.layers.length; ++l) {\n layer = this.layers[l];\n var sequenceStart = -1, sequenceEnd = -1;\n for (n = 0; n < layer.length; ++n) {\n node = layer[n];\n order.set(node, 0);\n placed.set(node, false);\n if (node.isVirtual) {\n if (sequenceStart === -1) {\n sequenceStart = n;\n }\n else if (sequenceStart === n - 1) {\n sequenceStart = n;\n }\n else {\n sequenceEnd = n;\n order.set(layer[sequenceStart], 0);\n if (x.get(node) - x.get(layer[sequenceStart]) === this.getMinDist(layer[sequenceStart], node)) {\n placed.set(layer[sequenceStart], true);\n }\n else {\n placed.set(layer[sequenceStart], false);\n }\n sequenceStart = n;\n }\n }\n }\n }\n var directions = [1, -1];\n Utils.forEach(directions, function(d) {\n var start = d === 1 ? 0 : this.layers.length - 1;\n for (var l = start; l >= 0 && l < this.layers.length; l += d) {\n var layer = this.layers[l];\n var virtualStartIndex = this._firstVirtualNode(layer);\n var virtualStart = null;\n var sequence = null;\n if (virtualStartIndex !== -1) {\n virtualStart = layer[virtualStartIndex];\n sequence = [];\n for (i = 0; i < virtualStartIndex; i++) {\n sequence.push(layer[i]);\n }\n }\n else {\n virtualStart = null;\n sequence = layer;\n }\n if (sequence.length > 0) {\n this._sequencer(x, null, virtualStart, d, sequence);\n for (i = 0; i < sequence.length - 1; ++i) {\n this.setMinDist(sequence[i], sequence[i + 1], x.get(sequence[i + 1]) - x.get(sequence[i]));\n }\n if (virtualStart) {\n this.setMinDist(sequence[sequence.length - 1], virtualStart, x.get(virtualStart) - x.get(sequence[sequence.length - 1]));\n }\n }\n\n while (virtualStart) {\n var virtualEnd = this.nextVirtualNode(layer, virtualStart);\n if (!virtualEnd) {\n virtualStartIndex = virtualStart.layerIndex;\n sequence = [];\n for (i = virtualStartIndex + 1; i < layer.length; i++) {\n sequence.push(layer[i]);\n }\n if (sequence.length > 0) {\n this._sequencer(x, virtualStart, null, d, sequence);\n for (i = 0; i < sequence.length - 1; ++i) {\n this.setMinDist(sequence[i], sequence[i + 1], x.get(sequence[i + 1]) - x.get(sequence[i]));\n }\n this.setMinDist(virtualStart, sequence[0], x.get(sequence[0]) - x.get(virtualStart));\n }\n }\n else if (order.get(virtualStart) === d) {\n virtualStartIndex = virtualStart.layerIndex;\n var virtualEndIndex = virtualEnd.layerIndex;\n sequence = [];\n for (i = virtualStartIndex + 1; i < virtualEndIndex; i++) {\n sequence.push(layer[i]);\n }\n if (sequence.length > 0) {\n this._sequencer(x, virtualStart, virtualEnd, d, sequence);\n }\n placed.set(virtualStart, true);\n }\n virtualStart = virtualEnd;\n }\n this.adjustDirections(l, d, order, placed);\n }\n }, this);\n\n\n var fromLayerIndex = this._isIncreasingLayout() ? 0 : this.layers.length - 1;\n var reachedFinalLayerIndex = function(k, ctx) {\n if (ctx._isIncreasingLayout()) {\n return k < ctx.layers.length;\n }\n else {\n return k >= 0;\n }\n };\n var layerIncrement = this._isIncreasingLayout() ? +1 : -1, offset = 0;\n\n /**\n * Calcs the max height of the given layer.\n */\n function maximumHeight(layer, ctx) {\n var height = Number.MIN_VALUE;\n for (var n = 0; n < layer.length; ++n) {\n var node = layer[n];\n if (ctx._isVerticalLayout()) {\n height = Math.max(height, node.height);\n }\n else {\n height = Math.max(height, node.width);\n }\n }\n return height;\n }\n\n for (i = fromLayerIndex; reachedFinalLayerIndex(i, this); i += layerIncrement) {\n layer = this.layers[i];\n var height = maximumHeight(layer, this);\n\n for (n = 0; n < layer.length; ++n) {\n node = layer[n];\n if (this._isVerticalLayout()) {\n node.x = x.get(node);\n node.y = offset + height / 2;\n }\n else {\n node.x = offset + height / 2;\n node.y = x.get(node);\n }\n }\n\n offset += this.options.layerSeparation + height;\n }\n },\n\n adjustDirections: function(l, d, order, placed) {\n if (l + d < 0 || l + d >= this.layers.length) {\n return;\n }\n\n var prevBridge = null, prevBridgeTarget = null;\n var layer = this.layers[l + d];\n for (var n = 0; n < layer.length; ++n) {\n var nextBridge = layer[n];\n if (nextBridge.isVirtual) {\n var nextBridgeTarget = this.getNeighborOnLayer(nextBridge, l);\n if (nextBridgeTarget.isVirtual) {\n if (prevBridge) {\n var p = placed.get(prevBridgeTarget);\n var clayer = this.layers[l];\n var i1 = prevBridgeTarget.layerIndex;\n var i2 = nextBridgeTarget.layerIndex;\n for (var i = i1 + 1; i < i2; ++i) {\n if (clayer[i].isVirtual) {\n p = p && placed.get(clayer[i]);\n }\n }\n if (p) {\n order.set(prevBridge, d);\n var j1 = prevBridge.layerIndex;\n var j2 = nextBridge.layerIndex;\n for (var j = j1 + 1; j < j2; ++j) {\n if (layer[j].isVirtual) {\n order.set(layer[j], d);\n }\n }\n }\n }\n prevBridge = nextBridge;\n prevBridgeTarget = nextBridgeTarget;\n }\n }\n }\n },\n\n getNeighborOnLayer: function(node, l) {\n var neighbor = this.upNodes.get(node)[0];\n if (neighbor.layer === l) {\n return neighbor;\n }\n neighbor = this.downNodes.get(node)[0];\n if (neighbor.layer === l) {\n return neighbor;\n }\n return null;\n },\n\n _sequencer: function(x, virtualStart, virtualEnd, dir, sequence) {\n if (sequence.length === 1) {\n this._sequenceSingle(x, virtualStart, virtualEnd, dir, sequence[0]);\n }\n\n if (sequence.length > 1) {\n var r = sequence.length, t = this.intDiv(r, 2);\n this._sequencer(x, virtualStart, virtualEnd, dir, sequence.slice(0, t));\n this._sequencer(x, virtualStart, virtualEnd, dir, sequence.slice(t));\n this.combineSequences(x, virtualStart, virtualEnd, dir, sequence);\n }\n },\n\n _sequenceSingle: function(x, virtualStart, virtualEnd, dir, node) {\n var neighbors = dir === -1 ? this.downNodes.get(node) : this.upNodes.get(node);\n\n var n = neighbors.length;\n if (n !== 0) {\n if (n % 2 === 1) {\n x.set(node, x.get(neighbors[this.intDiv(n, 2)]));\n }\n else {\n x.set(node, (x.get(neighbors[this.intDiv(n, 2) - 1]) + x.get(neighbors[this.intDiv(n, 2)])) / 2);\n }\n\n if (virtualStart) {\n x.set(node, Math.max(x.get(node), x.get(virtualStart) + this.getMinDist(virtualStart, node)));\n }\n if (virtualEnd) {\n x.set(node, Math.min(x.get(node), x.get(virtualEnd) - this.getMinDist(node, virtualEnd)));\n }\n }\n },\n\n combineSequences: function(x, virtualStart, virtualEnd, dir, sequence) {\n var r = sequence.length, t = this.intDiv(r, 2);\n\n // collect left changes\n var leftHeap = [], i, c, n, neighbors, neighbor, pair;\n for (i = 0; i < t; ++i) {\n c = 0;\n neighbors = dir === -1 ? this.downNodes.get(sequence[i]) : this.upNodes.get(sequence[i]);\n for (n = 0; n < neighbors.length; ++n) {\n neighbor = neighbors[n];\n if (x.get(neighbor) >= x.get(sequence[i])) {\n c++;\n }\n else {\n c--;\n leftHeap.push({ k: x.get(neighbor) + this.getMinDist(sequence[i], sequence[t - 1]), v: 2 });\n }\n }\n leftHeap.push({ k: x.get(sequence[i]) + this.getMinDist(sequence[i], sequence[t - 1]), v: c });\n }\n if (virtualStart) {\n leftHeap.push({ k: x.get(virtualStart) + this.getMinDist(virtualStart, sequence[t - 1]), v: Number.MAX_VALUE });\n }\n leftHeap.sort(this._positionDescendingComparer);\n\n // collect right changes\n var rightHeap = [];\n for (i = t; i < r; ++i) {\n c = 0;\n neighbors = dir === -1 ? this.downNodes.get(sequence[i]) : this.upNodes.get(sequence[i]);\n for (n = 0; n < neighbors.length; ++n) {\n neighbor = neighbors[n];\n if (x.get(neighbor) <= x.get(sequence[i])) {\n c++;\n }\n else {\n c--;\n rightHeap.push({ k: x.get(neighbor) - this.getMinDist(sequence[i], sequence[t]), v: 2 });\n }\n }\n rightHeap.push({ k: x.get(sequence[i]) - this.getMinDist(sequence[i], sequence[t]), v: c });\n }\n if (virtualEnd) {\n rightHeap.push({ k: x.get(virtualEnd) - this.getMinDist(virtualEnd, sequence[t]), v: Number.MAX_VALUE });\n }\n rightHeap.sort(this._positionAscendingComparer);\n\n var leftRes = 0, rightRes = 0;\n var m = this.getMinDist(sequence[t - 1], sequence[t]);\n while (x.get(sequence[t]) - x.get(sequence[t - 1]) < m) {\n if (leftRes < rightRes) {\n if (leftHeap.length === 0) {\n x.set(sequence[t - 1], x.get(sequence[t]) - m);\n break;\n }\n else {\n pair = leftHeap.shift();\n leftRes = leftRes + pair.v;\n x.set(sequence[t - 1], pair.k);\n x.set(sequence[t - 1], Math.max(x.get(sequence[t - 1]), x.get(sequence[t]) - m));\n }\n }\n else {\n if (rightHeap.length === 0) {\n x.set(sequence[t], x.get(sequence[t - 1]) + m);\n break;\n }\n else {\n pair = rightHeap.shift();\n rightRes = rightRes + pair.v;\n x.set(sequence[t], pair.k);\n x.set(sequence[t], Math.min(x.get(sequence[t]), x.get(sequence[t - 1]) + m));\n }\n }\n }\n for (i = t - 2; i >= 0; i--) {\n x.set(sequence[i], Math.min(x.get(sequence[i]), x.get(sequence[t - 1]) - this.getMinDist(sequence[i], sequence[t - 1])));\n }\n for (i = t + 1; i < r; i++) {\n x.set(sequence[i], Math.max(x.get(sequence[i]), x.get(sequence[t]) + this.getMinDist(sequence[i], sequence[t])));\n }\n },\n\n placeLeft: function(node, leftPos, leftClass) {\n var pos = Number.NEGATIVE_INFINITY;\n Utils.forEach(this._getComposite(node), function(v) {\n var leftSibling = this.leftSibling(v);\n if (leftSibling && this.nodeLeftClass.get(leftSibling) === this.nodeLeftClass.get(v)) {\n if (!leftPos.containsKey(leftSibling)) {\n this.placeLeft(leftSibling, leftPos, leftClass);\n }\n pos = Math.max(pos, leftPos.get(leftSibling) + this.getMinDist(leftSibling, v));\n }\n }, this);\n if (pos === Number.NEGATIVE_INFINITY) {\n pos = 0;\n }\n Utils.forEach(this._getComposite(node), function(v) {\n leftPos.set(v, pos);\n });\n },\n\n placeRight: function(node, rightPos, rightClass) {\n var pos = Number.POSITIVE_INFINITY;\n Utils.forEach(this._getComposite(node), function(v) {\n var rightSibling = this.rightSibling(v);\n if (rightSibling && this.nodeRightClass.get(rightSibling) === this.nodeRightClass.get(v)) {\n if (!rightPos.containsKey(rightSibling)) {\n this.placeRight(rightSibling, rightPos, rightClass);\n }\n pos = Math.min(pos, rightPos.get(rightSibling) - this.getMinDist(v, rightSibling));\n }\n }, this);\n if (pos === Number.POSITIVE_INFINITY) {\n pos = 0;\n }\n Utils.forEach(this._getComposite(node), function(v) {\n rightPos.set(v, pos);\n });\n },\n\n leftSibling: function(node) {\n var layer = this.layers[node.layer],\n layerIndex = node.layerIndex;\n return layerIndex === 0 ? null : layer[layerIndex - 1];\n },\n\n rightSibling: function(node) {\n var layer = this.layers[node.layer];\n var layerIndex = node.layerIndex;\n return layerIndex === layer.length - 1 ? null : layer[layerIndex + 1];\n\n },\n\n _getComposite: function(node) {\n return node.isVirtual ? this._nodesInLink(node) : [node];\n },\n\n arrangeNodes: function() {\n var i, l, ni, layer, node;\n // Initialize node's base priority\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n\n for (ni = 0; ni < layer.length; ni++) {\n node = layer[ni];\n node.upstreamPriority = node.upstreamLinkCount;\n node.downstreamPriority = node.downstreamLinkCount;\n }\n }\n\n // Layout is invoked after MinimizeCrossings\n // so we may assume node's barycenters are initially correct\n\n var maxLayoutIterations = 2;\n for (var it = 0; it < maxLayoutIterations; it++) {\n for (i = this.layers.length - 1; i >= 1; i--) {\n this.layoutLayer(false, i);\n }\n\n for (i = 0; i < this.layers.length - 1; i++) {\n this.layoutLayer(true, i);\n }\n }\n\n // Offset the whole structure so that there are no gridPositions < 0\n var gridPos = Number.MAX_VALUE;\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n\n for (ni = 0; ni < layer.length; ni++) {\n node = layer[ni];\n gridPos = Math.min(gridPos, node.gridPosition);\n }\n }\n\n if (gridPos < 0) {\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n\n for (ni = 0; ni < layer.length; ni++) {\n node = layer[ni];\n node.gridPosition = node.gridPosition - gridPos;\n }\n }\n }\n },\n\n /// \n /// Layout of a single layer.\n /// \n /// The layer to organize.\n /// If set to true we move down in the layer stack.\n /// \n layoutLayer: function(down, layer) {\n var iconsidered;\n var considered;\n\n if (down) {\n considered = this.layers[iconsidered = layer + 1];\n }\n else {\n considered = this.layers[iconsidered = layer - 1];\n }\n\n // list containing the nodes in the considered layer sorted by priority\n var sorted = [];\n for (var n = 0; n < considered.length; n++) {\n sorted.push(considered[n]);\n }\n sorted.sort(function(n1, n2) {\n var n1Priority = (n1.upstreamPriority + n1.downstreamPriority) / 2;\n var n2Priority = (n2.upstreamPriority + n2.downstreamPriority) / 2;\n\n if (Math.abs(n1Priority - n2Priority) < 0.0001) {\n return 0;\n }\n if (n1Priority < n2Priority) {\n return 1;\n }\n return -1;\n });\n\n // each node strives for its barycenter; high priority nodes start first\n Utils.forEach(sorted, function(node) {\n var nodeGridPos = node.gridPosition;\n var nodeBaryCenter = this.calcBaryCenter(node);\n var nodePriority = (node.upstreamPriority + node.downstreamPriority) / 2;\n\n if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.0001) {\n // This node is exactly at its barycenter -> perfect\n return;\n }\n\n if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.25 + 0.0001) {\n // This node is close enough to the barycenter -> should work\n return;\n }\n\n if (nodeGridPos < nodeBaryCenter) {\n // Try to move the node to the right in an\n // attempt to reach its barycenter\n while (nodeGridPos < nodeBaryCenter) {\n if (!this.moveRight(node, considered, nodePriority)) {\n break;\n }\n\n nodeGridPos = node.gridPosition;\n }\n }\n else {\n // Try to move the node to the left in an\n // attempt to reach its barycenter\n while (nodeGridPos > nodeBaryCenter) {\n if (!this.moveLeft(node, considered, nodePriority)) {\n break;\n }\n\n nodeGridPos = node.gridPosition;\n }\n }\n }, this);\n\n // after the layer has been rearranged we need to recalculate the barycenters\n // of the nodes in the surrounding layers\n if (iconsidered > 0) {\n this.calcDownData(iconsidered - 1);\n }\n if (iconsidered < this.layers.length - 1) {\n this.calcUpData(iconsidered + 1);\n }\n },\n\n /// \n /// Moves the node to the right and returns true if this was possible.\n /// \n /// The node.\n /// The layer.\n /// Returns true if the shift was possible, otherwise false . \n moveRight: function(node, layer, priority) {\n var index = Utils.indexOf(layer, node);\n if (index === layer.length - 1) {\n // this is the last node in the layer, so we can move to the right without troubles\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n\n var rightNode = layer[index + 1];\n var rightNodePriority = (rightNode.upstreamPriority + rightNode.downstreamPriority) / 2;\n\n // check if there is space between the right and the current node\n if (rightNode.gridPosition > node.gridPosition + 1) {\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n\n // we have reached a node with higher priority; no movement is allowed\n if (rightNodePriority > priority ||\n Math.abs(rightNodePriority - priority) < 0.0001) {\n return false;\n }\n\n // the right node has lower priority - try to move it\n if (this.moveRight(rightNode, layer, priority)) {\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n\n return false;\n },\n\n /// \n /// Moves the node to the left and returns true if this was possible.\n /// \n /// The node.\n /// The layer.\n /// Returns true if the shift was possible, otherwise false . \n moveLeft: function(node, layer, priority) {\n var index = Utils.indexOf(layer, node);\n if (index === 0) {\n // this is the last node in the layer, so we can move to the left without troubles\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n\n var leftNode = layer[index - 1];\n var leftNodePriority = (leftNode.upstreamPriority + leftNode.downstreamPriority) / 2;\n\n // check if there is space between the left and the current node\n if (leftNode.gridPosition < node.gridPosition - 1) {\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n\n // we have reached a node with higher priority; no movement is allowed\n if (leftNodePriority > priority ||\n Math.abs(leftNodePriority - priority) < 0.0001) {\n return false;\n }\n\n // The left node has lower priority - try to move it\n if (this.moveLeft(leftNode, layer, priority)) {\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n\n return false;\n },\n\n mapVirtualNode: function(node, link) {\n this.nodeToLinkMap.set(node, link);\n if (!this.linkToNodeMap.containsKey(link)) {\n this.linkToNodeMap.set(link, []);\n }\n this.linkToNodeMap.get(link).push(node);\n },\n\n _nodesInLink: function(node) {\n return this.linkToNodeMap.get(this.nodeToLinkMap.get(node));\n },\n\n /// \n /// Inserts dummy nodes to break long links.\n /// \n _dummify: function() {\n this.linkToNodeMap = new Dictionary();\n this.nodeToLinkMap = new Dictionary();\n\n var layer, pos, newNode, node, r, newLink, i, l, links = this.graph.links.slice(0);\n var layers = this.layers;\n\n var addLinkBetweenLayers = function(upLayer, downLayer, link) {\n layers[upLayer].linksTo[downLayer] = layers[upLayer].linksTo[downLayer] || [];\n layers[upLayer].linksTo[downLayer].push(link);\n };\n\n for (l = 0; l < links.length; l++) {\n var link = links[l];\n var o = link.source;\n var d = link.target;\n\n var oLayer = o.layer;\n var dLayer = d.layer;\n var oPos = o.gridPosition;\n var dPos = d.gridPosition;\n\n var step = (dPos - oPos) / Math.abs(dLayer - oLayer);\n\n var p = o;\n if (oLayer - dLayer > 1) {\n for (i = oLayer - 1; i > dLayer; i--) {\n newNode = new Node();\n newNode.x = o.x;\n newNode.y = o.y;\n newNode.width = o.width / 100;\n newNode.height = o.height / 100;\n\n layer = layers[i];\n pos = (i - dLayer) * step + oPos;\n if (pos > layer.length) {\n pos = layer.length;\n }\n\n // check if origin and dest are both last\n if (oPos >= layers[oLayer].length - 1 &&\n dPos >= layers[dLayer].length - 1) {\n pos = layer.length;\n }\n\n // check if origin and destination are both first\n else if (oPos === 0 && dPos === 0) {\n pos = 0;\n }\n\n newNode.layer = i;\n newNode.uBaryCenter = 0.0;\n newNode.dBaryCenter = 0.0;\n newNode.upstreamLinkCount = 0;\n newNode.downstreamLinkCount = 0;\n newNode.gridPosition = pos;\n newNode.isVirtual = true;\n\n Utils.insert(layer, newNode, pos);\n\n // translate rightwards nodes' positions\n for (r = pos + 1; r < layer.length; r++) {\n node = layer[r];\n node.gridPosition = node.gridPosition + 1;\n }\n\n newLink = new Link(p, newNode);\n newLink.depthOfDumminess = 0;\n\n addLinkBetweenLayers(i - 1, i, newLink);\n\n p = newNode;\n\n // add the new node and the new link to the graph\n this.graph._addNode(newNode);\n this.graph.addLink(newLink);\n\n newNode.index = this.graph.nodes.length - 1;\n this.mapVirtualNode(newNode, link);\n }\n\n // set the origin of the real arrow to the last dummy\n addLinkBetweenLayers(dLayer - 1, dLayer, newLink);\n link.changeSource(p);\n link.depthOfDumminess = oLayer - dLayer - 1;\n } else if (oLayer - dLayer < -1) {\n for (i = oLayer + 1; i < dLayer; i++) {\n newNode = new Node();\n newNode.x = o.x;\n newNode.y = o.y;\n newNode.width = o.width / 100;\n newNode.height = o.height / 100;\n\n layer = layers[i];\n pos = (i - oLayer) * step + oPos;\n if (pos > layer.length) {\n pos = layer.length;\n }\n\n // check if origin and dest are both last\n if (oPos >= layers[oLayer].length - 1 &&\n dPos >= layers[dLayer].length - 1) {\n pos = layer.length;\n }\n\n // check if origin and destination are both first\n else if (oPos === 0 && dPos === 0) {\n pos = 0;\n }\n\n newNode.layer = i;\n newNode.uBaryCenter = 0.0;\n newNode.dBaryCenter = 0.0;\n newNode.upstreamLinkCount = 0;\n newNode.downstreamLinkCount = 0;\n newNode.gridPosition = pos;\n newNode.isVirtual = true;\n\n pos &= pos; // truncates to int\n Utils.insert(layer, newNode, pos);\n\n // translate rightwards nodes' positions\n for (r = pos + 1; r < layer.length; r++) {\n node = layer[r];\n node.gridPosition = node.gridPosition + 1;\n }\n\n newLink = new Link(p, newNode);\n newLink.depthOfDumminess = 0;\n addLinkBetweenLayers(i - 1, i, newLink);\n\n p = newNode;\n\n // add the new node and the new link to the graph\n this.graph._addNode(newNode);\n this.graph.addLink(newLink);\n\n newNode.index = this.graph.nodes.length - 1;\n this.mapVirtualNode(newNode, link);\n }\n addLinkBetweenLayers(dLayer - 1, dLayer, link);\n\n // Set the origin of the real arrow to the last dummy\n link.changeSource(p);\n link.depthOfDumminess = dLayer - oLayer - 1;\n } else {\n addLinkBetweenLayers(oLayer, dLayer, link);\n }\n }\n },\n\n /// \n /// Removes the dummy nodes inserted earlier to break long links.\n /// \n /// The virtual nodes are effectively turned into intermediate connection points. \n _dedummify: function() {\n var dedum = true;\n while (dedum) {\n dedum = false;\n\n for (var l = 0; l < this.graph.links.length; l++) {\n var link = this.graph.links[l];\n if (!link.depthOfDumminess) {\n continue;\n }\n\n var points = [];\n\n // add points in reverse order\n points.unshift({ x: link.target.x, y: link.target.y });\n points.unshift({ x: link.source.x, y: link.source.y });\n\n // _dedummify the link\n var temp = link;\n var depthOfDumminess = link.depthOfDumminess;\n for (var d = 0; d < depthOfDumminess; d++) {\n var node = temp.source;\n var prevLink = node.incoming[0];\n\n points.unshift({ x: prevLink.source.x, y: prevLink.source.y });\n\n temp = prevLink;\n }\n\n // restore the original link origin\n link.changeSource(temp.source);\n\n // reset dummification flag\n link.depthOfDumminess = 0;\n\n // note that we only need the intermediate points, floating links have been dropped in the analysis\n if (points.length > 2) {\n // first and last are the endpoints\n points.splice(0, 1);\n points.splice(points.length - 1);\n link.points = points;\n }\n else {\n link.points = [];\n }\n\n // we are not going to delete the dummy elements;\n // they won't be needed anymore anyway.\n\n dedum = true;\n break;\n }\n }\n },\n\n /// \n /// Optimizes/reduces the crossings between the layers by turning the crossing problem into a (combinatorial) number ordering problem.\n /// \n _optimizeCrossings: function() {\n var moves = -1, i;\n var maxIterations = 3;\n var iter = 0;\n\n while (moves !== 0) {\n if (iter++ > maxIterations) {\n break;\n }\n\n moves = 0;\n\n for (i = this.layers.length - 1; i >= 1; i--) {\n moves += this.optimizeLayerCrossings(false, i);\n }\n\n for (i = 0; i < this.layers.length - 1; i++) {\n moves += this.optimizeLayerCrossings(true, i);\n }\n }\n },\n\n calcUpData: function(layer) {\n if (layer === 0) {\n return;\n }\n\n var considered = this.layers[layer], i, l, link;\n var upLayer = new Set();\n var temp = this.layers[layer - 1];\n for (i = 0; i < temp.length; i++) {\n upLayer.add(temp[i]);\n }\n\n for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n\n // calculate barycenter\n var sum = 0;\n var total = 0;\n\n for (l = 0; l < node.incoming.length; l++) {\n link = node.incoming[l];\n if (upLayer.contains(link.source)) {\n total++;\n sum += link.source.gridPosition;\n }\n }\n\n for (l = 0; l < node.outgoing.length; l++) {\n link = node.outgoing[l];\n if (upLayer.contains(link.target)) {\n total++;\n sum += link.target.gridPosition;\n }\n }\n\n if (total > 0) {\n node.uBaryCenter = sum / total;\n node.upstreamLinkCount = total;\n }\n else {\n node.uBaryCenter = i;\n node.upstreamLinkCount = 0;\n }\n }\n },\n\n calcDownData: function(layer) {\n if (layer === this.layers.length - 1) {\n return;\n }\n\n var considered = this.layers[layer], i , l, link;\n var downLayer = new Set();\n var temp = this.layers[layer + 1];\n for (i = 0; i < temp.length; i++) {\n downLayer.add(temp[i]);\n }\n\n for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n\n // calculate barycenter\n var sum = 0;\n var total = 0;\n\n for (l = 0; l < node.incoming.length; l++) {\n link = node.incoming[l];\n if (downLayer.contains(link.source)) {\n total++;\n sum += link.source.gridPosition;\n }\n }\n\n for (l = 0; l < node.outgoing.length; l++) {\n link = node.outgoing[l];\n if (downLayer.contains(link.target)) {\n total++;\n sum += link.target.gridPosition;\n }\n }\n\n if (total > 0) {\n node.dBaryCenter = sum / total;\n node.downstreamLinkCount = total;\n }\n else {\n node.dBaryCenter = i;\n node.downstreamLinkCount = 0;\n }\n }\n },\n\n /// \n /// Optimizes the crossings.\n /// \n /// The big trick here is the usage of weights or values attached to connected nodes which turn a problem of crossing links\n /// to an a problem of ordering numbers. \n /// The layer index.\n /// If set to true we move down in the layer stack.\n /// The number of nodes having moved, i.e. the number of crossings reduced. \n optimizeLayerCrossings: function(down, layer) {\n var iconsidered;\n var considered;\n\n if (down) {\n considered = this.layers[iconsidered = layer + 1];\n }\n else {\n considered = this.layers[iconsidered = layer - 1];\n }\n\n // remember what it was\n var presorted = considered.slice(0);\n\n // calculate barycenters for all nodes in the considered layer\n if (down) {\n this.calcUpData(iconsidered);\n }\n else {\n this.calcDownData(iconsidered);\n }\n\n var that = this;\n // sort nodes within this layer according to the barycenters\n considered.sort(function(n1, n2) {\n var n1BaryCenter = that.calcBaryCenter(n1),\n n2BaryCenter = that.calcBaryCenter(n2);\n if (Math.abs(n1BaryCenter - n2BaryCenter) < 0.0001) {\n // in case of coinciding barycenters compare by the count of in/out links\n if (n1.degree() === n2.degree()) {\n return that.compareByIndex(n1, n2);\n }\n else if (n1.degree() < n2.degree()) {\n return 1;\n }\n return -1;\n }\n var compareValue = (n2BaryCenter - n1BaryCenter) * 1000;\n if (compareValue > 0) {\n return -1;\n }\n else if (compareValue < 0) {\n return 1;\n }\n return that.compareByIndex(n1, n2);\n });\n\n // count relocations\n var i, moves = 0;\n for (i = 0; i < considered.length; i++) {\n if (considered[i] !== presorted[i]) {\n moves++;\n }\n }\n\n if (moves > 0) {\n // now that the boxes have been arranged, update their grid positions\n var inode = 0;\n for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n node.gridPosition = inode++;\n }\n }\n\n return moves;\n },\n\n /// \n /// Swaps a pair of nodes in a layer.\n /// \n /// Index of the layer.\n /// The Nth node in the layer.\n _swapPairs: function() {\n var maxIterations = this.options.layeredIterations;\n var iter = 0;\n\n while (true) {\n if (iter++ > maxIterations) {\n break;\n }\n\n var downwards = (iter % 4 <= 1);\n var secondPass = (iter % 4 === 1);\n\n for (var l = (downwards ? 0 : this.layers.length - 1);\n downwards ? l <= this.layers.length - 1 : l >= 0; l += (downwards ? 1 : -1)) {\n var layer = this.layers[l];\n var hasSwapped = false;\n\n // there is no need to recalculate crossings if they were calculated\n // on the previous step and nothing has changed\n var calcCrossings = true;\n var memCrossings = 0;\n\n for (var n = 0; n < layer.length - 1; n++) {\n // count crossings\n var up = 0;\n var down = 0;\n var crossBefore = 0;\n\n if (calcCrossings) {\n if (l !== 0) {\n up = this.countLinksCrossingBetweenTwoLayers(l - 1, l);\n }\n if (l !== this.layers.length - 1) {\n down = this.countLinksCrossingBetweenTwoLayers(l, l + 1);\n }\n if (downwards) {\n up *= 2;\n }\n else {\n down *= 2;\n }\n\n crossBefore = up + down;\n }\n else {\n crossBefore = memCrossings;\n }\n\n if (crossBefore === 0) {\n continue;\n }\n\n // Swap nodes\n var node1 = layer[n];\n var node2 = layer[n + 1];\n\n var node1GridPos = node1.gridPosition;\n var node2GridPos = node2.gridPosition;\n layer[n] = node2;\n layer[n + 1] = node1;\n node1.gridPosition = node2GridPos;\n node2.gridPosition = node1GridPos;\n\n // count crossings again and if worse than before, restore swapping\n up = 0;\n if (l !== 0) {\n up = this.countLinksCrossingBetweenTwoLayers(l - 1, l);\n }\n down = 0;\n if (l !== this.layers.length - 1) {\n down = this.countLinksCrossingBetweenTwoLayers(l, l + 1);\n }\n if (downwards) {\n up *= 2;\n }\n else {\n down *= 2;\n }\n var crossAfter = up + down;\n\n var revert = false;\n if (secondPass) {\n revert = crossAfter >= crossBefore;\n }\n else {\n revert = crossAfter > crossBefore;\n }\n\n if (revert) {\n node1 = layer[n];\n node2 = layer[n + 1];\n\n node1GridPos = node1.gridPosition;\n node2GridPos = node2.gridPosition;\n layer[n] = node2;\n layer[n + 1] = node1;\n node1.gridPosition = node2GridPos;\n node2.gridPosition = node1GridPos;\n\n // nothing has changed, remember the crossings so that\n // they are not calculated again on the next step\n memCrossings = crossBefore;\n calcCrossings = false;\n }\n else {\n hasSwapped = true;\n calcCrossings = true;\n }\n }\n\n if (hasSwapped) {\n if (l !== this.layers.length - 1) {\n this.calcUpData(l + 1);\n }\n if (l !== 0) {\n this.calcDownData(l - 1);\n }\n }\n }\n }\n },\n\n /// \n /// Counts the number of links crossing between two layers.\n /// \n /// The layer index.\n /// Another layer index.\n /// \n countLinksCrossingBetweenTwoLayers: function(ulayer, dlayer) {\n var links = this.layers[ulayer].linksTo[dlayer];\n var link1, link2, n11, n12, n21, n22, l1, l2;\n var crossings = 0;\n var length = links.length;\n\n for (l1 = 0; l1 < length; l1++) {\n link1 = links[l1];\n for (l2 = l1 + 1; l2 < length; l2++) {\n\n link2 = links[l2];\n\n if (link1.target.layer === dlayer) {\n n11 = link1.source;\n n12 = link1.target;\n }\n else {\n n11 = link1.target;\n n12 = link1.source;\n }\n\n if (link2.target.layer === dlayer) {\n n21 = link2.source;\n n22 = link2.target;\n }\n else {\n n21 = link2.target;\n n22 = link2.source;\n }\n\n var n11gp = n11.gridPosition;\n var n12gp = n12.gridPosition;\n var n21gp = n21.gridPosition;\n var n22gp = n22.gridPosition;\n\n if ((n11gp - n21gp) * (n12gp - n22gp) < 0) {\n crossings++;\n }\n }\n }\n\n return crossings;\n },\n\n calcBaryCenter: function(node) {\n var upstreamLinkCount = node.upstreamLinkCount;\n var downstreamLinkCount = node.downstreamLinkCount;\n var uBaryCenter = node.uBaryCenter;\n var dBaryCenter = node.dBaryCenter;\n\n if (upstreamLinkCount > 0 && downstreamLinkCount > 0) {\n return (uBaryCenter + dBaryCenter) / 2;\n }\n if (upstreamLinkCount > 0) {\n return uBaryCenter;\n }\n if (downstreamLinkCount > 0) {\n return dBaryCenter;\n }\n\n return 0;\n },\n\n _gridPositionComparer: function(x, y) {\n if (x.gridPosition < y.gridPosition) {\n return -1;\n }\n if (x.gridPosition > y.gridPosition) {\n return 1;\n }\n return 0;\n },\n\n _positionAscendingComparer: function(x, y) {\n return x.k < y.k ? -1 : x.k > y.k ? 1 : 0;\n },\n\n _positionDescendingComparer: function(x, y) {\n return x.k < y.k ? 1 : x.k > y.k ? -1 : 0;\n },\n\n _firstVirtualNode: function(layer) {\n for (var c = 0; c < layer.length; c++) {\n if (layer[c].isVirtual) {\n return c;\n }\n }\n return -1;\n },\n\n compareByIndex: function(o1, o2) {\n var i1 = o1.index;\n var i2 = o2.index;\n\n if (i1 < i2) {\n return 1;\n }\n\n if (i1 > i2) {\n return -1;\n }\n\n return 0;\n },\n\n intDiv: function(numerator, denominator) {\n return (numerator - numerator % denominator) / denominator;\n },\n\n nextVirtualNode: function(layer, node) {\n var nodeIndex = node.layerIndex;\n for (var i = nodeIndex + 1; i < layer.length; ++i) {\n if (layer[i].isVirtual) {\n return layer[i];\n }\n }\n return null;\n }\n\n });\n\n /**\n * Captures the state of a diagram; node positions, link points and so on.\n * @type {*}\n */\n var LayoutState = kendo.Class.extend({\n init: function(diagram, graphOrNodes) {\n if (Utils.isUndefined(diagram)) {\n throw \"No diagram given\";\n }\n this.diagram = diagram;\n this.nodeMap = new Dictionary();\n this.linkMap = new Dictionary();\n this.capture(graphOrNodes ? graphOrNodes : diagram);\n },\n\n /**\n * Will capture either\n * - the state of the shapes and the intermediate points of the connections in the diagram\n * - the bounds of the nodes contained in the Graph together with the intermediate points of the links in the Graph\n * - the bounds of the nodes in the Array\n * - the links points and node bounds in the literal object\n * @param diagramOrGraphOrNodes\n */\n capture: function(diagramOrGraphOrNodes) {\n var node,\n nodes,\n shape,\n i,\n conn,\n link,\n links;\n\n if (diagramOrGraphOrNodes instanceof diagram.Graph) {\n\n for (i = 0; i < diagramOrGraphOrNodes.nodes.length; i++) {\n node = diagramOrGraphOrNodes.nodes[i];\n shape = node.associatedShape;\n //shape.bounds(new Rect(node.x, node.y, node.width, node.height));\n this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n }\n for (i = 0; i < diagramOrGraphOrNodes.links.length; i++) {\n link = diagramOrGraphOrNodes.links[i];\n conn = link.associatedConnection;\n this.linkMap.set(conn.visual.id, link.points());\n }\n }\n else if (diagramOrGraphOrNodes instanceof Array) {\n nodes = diagramOrGraphOrNodes;\n for (i = 0; i < nodes.length; i++) {\n node = nodes[i];\n shape = node.associatedShape;\n if (shape) {\n this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n }\n }\n }\n else if (diagramOrGraphOrNodes.hasOwnProperty(\"links\") && diagramOrGraphOrNodes.hasOwnProperty(\"nodes\")) {\n nodes = diagramOrGraphOrNodes.nodes;\n links = diagramOrGraphOrNodes.links;\n for (i = 0; i < nodes.length; i++) {\n node = nodes[i];\n shape = node.associatedShape;\n if (shape) {\n this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n }\n }\n for (i = 0; i < links.length; i++) {\n link = links[i];\n conn = link.associatedConnection;\n if (conn) {\n this.linkMap.set(conn.visual.id, link.points);\n }\n }\n }\n else { // capture the diagram\n var shapes = this.diagram.shapes;\n var connections = this.diagram.connections;\n for (i = 0; i < shapes.length; i++) {\n shape = shapes[i];\n this.nodeMap.set(shape.visual.id, shape.bounds());\n }\n for (i = 0; i < connections.length; i++) {\n conn = connections[i];\n this.linkMap.set(conn.visual.id, conn.points());\n }\n }\n }\n });\n\n deepExtend(diagram, {\n init: function(element) {\n kendo.init(element, diagram.ui);\n },\n SpringLayout: SpringLayout,\n TreeLayout: TreeLayout,\n GraphAdapter: DiagramToHyperTreeAdapter,\n LayeredLayout: LayeredLayout,\n LayoutBase: LayoutBase,\n LayoutState: LayoutState\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n // Imports ================================================================\n var dataviz = kendo.dataviz,\n draw = kendo.drawing,\n geom = kendo.geometry,\n diagram = dataviz.diagram,\n Widget = kendo.ui.Widget,\n Class = kendo.Class,\n deepExtend = kendo.deepExtend,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n extend = $.extend,\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n Canvas = diagram.Canvas,\n Group = diagram.Group,\n Rectangle = diagram.Rectangle,\n Circle = diagram.Circle,\n CompositeTransform = diagram.CompositeTransform,\n Rect = diagram.Rect,\n Path = diagram.Path,\n DeleteShapeUnit = diagram.DeleteShapeUnit,\n DeleteConnectionUnit = diagram.DeleteConnectionUnit,\n TextBlock = diagram.TextBlock,\n Image = diagram.Image,\n Point = diagram.Point,\n Intersect = diagram.Intersect,\n ConnectionEditAdorner = diagram.ConnectionEditAdorner,\n UndoRedoService = diagram.UndoRedoService,\n ToolService = diagram.ToolService,\n Selector = diagram.Selector,\n ResizingAdorner = diagram.ResizingAdorner,\n ConnectorsAdorner = diagram.ConnectorsAdorner,\n Cursors = diagram.Cursors,\n Utils = diagram.Utils,\n Observable = kendo.Observable,\n ToBackUnit = diagram.ToBackUnit,\n ToFrontUnit = diagram.ToFrontUnit,\n PolylineRouter = diagram.PolylineRouter,\n CascadingRouter = diagram.CascadingRouter,\n isUndefined = Utils.isUndefined,\n isDefined = Utils.isDefined,\n defined = draw.util.defined,\n isArray = Array.isArray,\n isFunction = kendo.isFunction,\n isString = Utils.isString,\n isPlainObject = $.isPlainObject,\n\n math = Math;\n\n // Constants ==============================================================\n var NS = \".kendoDiagram\",\n CASCADING = \"cascading\",\n ITEMBOUNDSCHANGE = \"itemBoundsChange\",\n CHANGE = \"change\",\n CLICK = \"click\",\n DRAG = \"drag\",\n DRAG_END = \"dragEnd\",\n DRAG_START = \"dragStart\",\n MOUSE_ENTER = \"mouseEnter\",\n MOUSE_LEAVE = \"mouseLeave\",\n ERROR = \"error\",\n AUTO = \"Auto\",\n TOP = \"Top\",\n RIGHT = \"Right\",\n LEFT = \"Left\",\n BOTTOM = \"Bottom\",\n MAXINT = 9007199254740992,\n SELECT = \"select\",\n ITEMROTATE = \"itemRotate\",\n PAN = \"pan\",\n ZOOM_START = \"zoomStart\",\n ZOOM_END = \"zoomEnd\",\n NONE = \"none\",\n DEFAULT_CANVAS_WIDTH = 600,\n DEFAULT_CANVAS_HEIGHT = 600,\n DEFAULT_SHAPE_TYPE = \"rectangle\",\n DEFAULT_SHAPE_WIDTH = 100,\n DEFAULT_SHAPE_HEIGHT = 100,\n DEFAULT_SHAPE_MINWIDTH = 20,\n DEFAULT_SHAPE_MINHEIGHT = 20,\n DEFAULT_SHAPE_POSITION = 0,\n DEFAULT_CONNECTION_BACKGROUND = \"Yellow\",\n MAX_VALUE = Number.MAX_VALUE,\n MIN_VALUE = -Number.MAX_VALUE,\n ABSOLUTE = \"absolute\",\n TRANSFORMED = \"transformed\",\n ROTATED = \"rotated\",\n TRANSPARENT = \"transparent\",\n WIDTH = \"width\",\n HEIGHT = \"height\",\n X = \"x\",\n Y = \"y\",\n MOUSEWHEEL_NS = \"DOMMouseScroll\" + NS + \" mousewheel\" + NS,\n MOBILE_ZOOM_RATE = 0.05,\n MOBILE_PAN_DISTANCE = 5,\n BUTTON_TEMPLATE = function (ref) {\n var className = ref.className;\n var icon = ref.icon;\n var themeColor = ref.themeColor;\n var text = ref.text;\n\n return kendo.html.renderButton((\"\" + text + \" \"), {\n icon: icon,\n themeColor: themeColor\n });\n },\n CONNECTION_CONTENT_OFFSET = 5;\n\n diagram.DefaultConnectors = [{\n name: TOP\n }, {\n name: BOTTOM\n }, {\n name: LEFT\n }, {\n name: RIGHT\n }, {\n name: AUTO,\n position: function(shape) {\n return shape.getPosition(\"center\");\n }\n }];\n\n var defaultButtons = {\n cancel: {\n text: \"Cancel\",\n icon: \"cancel-outline\",\n className: \"k-diagram-cancel\",\n },\n update: {\n text: \"Save\",\n imageClass: \"save\",\n className: \"k-diagram-update\",\n icon: \"save\",\n themeColor: \"primary\"\n }\n };\n\n diagram.shapeDefaults = function(extra) {\n var defaults = {\n type: DEFAULT_SHAPE_TYPE,\n path: \"\",\n autoSize: true,\n visual: null,\n x: DEFAULT_SHAPE_POSITION,\n y: DEFAULT_SHAPE_POSITION,\n minWidth: DEFAULT_SHAPE_MINWIDTH,\n minHeight: DEFAULT_SHAPE_MINHEIGHT,\n width: DEFAULT_SHAPE_WIDTH,\n height: DEFAULT_SHAPE_HEIGHT,\n hover: {},\n editable: {\n connect: true,\n tools: []\n },\n connectors: diagram.DefaultConnectors,\n rotation: {\n angle: 0\n }\n };\n\n Utils.simpleExtend(defaults, extra);\n\n return defaults;\n };\n\n function mwDelta(e) {\n var origEvent = e.originalEvent,\n delta = 0;\n\n if (origEvent.wheelDelta) {\n delta = -origEvent.wheelDelta / 40;\n delta = delta > 0 ? math.ceil(delta) : math.floor(delta);\n } else if (origEvent.detail) {\n delta = origEvent.detail;\n }\n\n return delta;\n }\n\n function isAutoConnector(connector) {\n return connector.options.name.toLowerCase() === AUTO.toLowerCase();\n }\n\n function closestConnector(point, connectors) {\n var minimumDistance = MAXINT, resCtr, connector;\n for (var i = 0; i < connectors.length; i++) {\n connector = connectors[i];\n if (!isAutoConnector(connector)) {\n var dist = point.distanceTo(connector.position());\n if (dist < minimumDistance) {\n minimumDistance = dist;\n resCtr = connector;\n }\n }\n }\n return resCtr;\n }\n\n function indicesOfItems(group, visuals) {\n var i, indices = [], visual;\n var children = group.drawingContainer().children;\n var length = children.length;\n for (i = 0; i < visuals.length; i++) {\n visual = visuals[i];\n for (var j = 0; j < length; j++) {\n if (children[j] == visual.drawingContainer()) {\n indices.push(j);\n break;\n }\n }\n }\n return indices;\n }\n\n var DiagramElement = Observable.extend({\n init: function(options) {\n var that = this;\n that.dataItem = (options || {}).dataItem;\n Observable.fn.init.call(that);\n that.options = deepExtend({ id: diagram.randomId() }, that.options, options);\n that.isSelected = false;\n that.visual = new Group({\n id: that.options.id,\n autoSize: that.options.autoSize\n });\n that.id = that.options.id;\n that._template();\n },\n\n options: {\n hover: {},\n cursor: Cursors.grip,\n content: {\n align: \"center middle\"\n },\n selectable: true,\n serializable: true,\n enable: true\n },\n\n _getCursor: function(point) {\n if (this.adorner) {\n return this.adorner._getCursor(point);\n }\n return this.options.cursor;\n },\n\n visible: function(value) {\n if (isUndefined(value)) {\n return this.visual.visible();\n } else {\n this.visual.visible(value);\n }\n },\n\n bounds: function() {\n },\n\n refresh: function() {\n this.visual.redraw();\n },\n\n position: function(point) {\n this.options.x = point.x;\n this.options.y = point.y;\n this.visual.position(point);\n },\n\n toString: function() {\n return this.options.id;\n },\n\n serialize: function() {\n // the options json object describes the shape perfectly. So this object can serve as shape serialization.\n var json = deepExtend({}, { options: this.options });\n if (this.dataItem) {\n json.dataItem = this.dataItem.toString();\n }\n return json;\n },\n\n _content: function(content) {\n if (content !== undefined$1) {\n var options = this.options;\n\n if (diagram.Utils.isString(content)) {\n options.content.text = content;\n } else {\n deepExtend(options.content, content);\n }\n\n var contentOptions = options.content;\n var contentVisual = this._contentVisual;\n\n if (!contentVisual) {\n this._createContentVisual(contentOptions);\n } else {\n this._updateContentVisual(contentOptions);\n }\n }\n\n return this.options.content.text;\n },\n\n _createContentVisual: function(options) {\n if (options.text) {\n this._contentVisual = new TextBlock(options);\n this._contentVisual._includeInBBox = false;\n this.visual.append(this._contentVisual);\n }\n },\n\n _updateContentVisual: function(options) {\n this._contentVisual.redraw(options);\n },\n\n _hitTest: function(point) {\n var bounds = this.bounds();\n return this.visible() && bounds.contains(point) && this.options.enable;\n },\n\n _template: function() {\n var that = this;\n if (that.options.content.template) {\n var data = that.dataItem || {},\n elementTemplate = kendo.template(that.options.content.template, {\n paramName: \"dataItem\"\n });\n\n that.options.content.text = elementTemplate(data);\n }\n },\n\n _canSelect: function() {\n return this.options.selectable !== false;\n },\n\n toJSON: function() {\n return {\n id: this.options.id\n };\n }\n });\n\n var Connector = Class.extend({\n init: function(shape, options) {\n this.options = deepExtend({}, this.options, options);\n this.connections = [];\n this.shape = shape;\n },\n options: {\n width: 7,\n height: 7,\n fill: {\n color: DEFAULT_CONNECTION_BACKGROUND\n },\n hover: {}\n },\n position: function() {\n if (this.options.position) {\n return this.options.position(this.shape);\n } else {\n return this.shape.getPosition(this.options.name);\n }\n },\n toJSON: function() {\n return {\n shapeId: this.shape.toString(),\n connector: this.options.name\n };\n }\n });\n\n Connector.parse = function(diagram, str) {\n var tempStr = str.split(\":\"),\n id = tempStr[0],\n name = tempStr[1] || AUTO;\n\n for (var i = 0; i < diagram.shapes.length; i++) {\n var shape = diagram.shapes[i];\n if (shape.options.id == id) {\n return shape.getConnector(name.trim());\n }\n }\n };\n\n var Shape = DiagramElement.extend({\n init: function(options, diagram) {\n var that = this;\n DiagramElement.fn.init.call(that, options);\n this.diagram = diagram;\n this.updateOptionsFromModel();\n options = that.options;\n that.connectors = [];\n that.type = options.type;\n that.createShapeVisual();\n that.updateBounds();\n that.content(that.content());\n\n that._createConnectors();\n },\n\n options: diagram.shapeDefaults(),\n\n _setOptionsFromModel: function(model) {\n var modelOptions = filterShapeDataItem(model || this.dataItem);\n this.options = deepExtend({}, this.options, modelOptions);\n\n this.redrawVisual();\n },\n\n updateOptionsFromModel: function(model, field) {\n if (this.diagram && this.diagram._isEditable) {\n var modelOptions = filterShapeDataItem(model || this.dataItem);\n\n if (model && field) {\n if (!dataviz.inArray(field, [\"x\", \"y\", \"width\", \"height\"])) {\n if (this.options.visual) {\n this._redrawVisual();\n } else if (modelOptions.type) {\n this.options = deepExtend({}, this.options, modelOptions);\n this._redrawVisual();\n }\n\n if (this.options.content) {\n this._template();\n this.content(this.options.content);\n }\n } else {\n var bounds = this.bounds();\n bounds[field] = model[field];\n this.bounds(bounds);\n }\n } else {\n this.options = deepExtend({}, this.options, modelOptions);\n }\n }\n },\n\n _redrawVisual: function() {\n this.visual.clear();\n this._contentVisual = null;\n this.options.dataItem = this.dataItem;\n this.createShapeVisual();\n this.updateBounds();\n },\n\n redrawVisual: function() {\n this._redrawVisual();\n if (this.options.content) {\n this._template();\n this.content(this.options.content);\n }\n },\n\n updateModel: function(syncChanges) {\n var diagram = this.diagram;\n if (diagram && diagram._isEditable) {\n var bounds = this._bounds;\n var model = this.dataItem;\n\n if (model) {\n diagram._suspendModelRefresh();\n if (defined(model.x) && bounds.x !== model.x) {\n model.set(\"x\", bounds.x);\n }\n\n if (defined(model.y) && bounds.y !== model.y) {\n model.set(\"y\", bounds.y);\n }\n\n if (defined(model.width) && bounds.width !== model.width) {\n model.set(\"width\", bounds.width);\n }\n\n if (defined(model.height) && bounds.height !== model.height) {\n model.set(\"height\", bounds.height);\n }\n\n this.dataItem = model;\n diagram._resumeModelRefresh();\n\n if (syncChanges) {\n diagram._syncShapeChanges();\n }\n }\n }\n },\n\n updateBounds: function() {\n var bounds = this.visual._measure(true);\n var options = this.options;\n this.bounds(new Rect(options.x, options.y, bounds.width, bounds.height));\n this._rotate();\n this._alignContent();\n },\n\n content: function(content) {\n var result = this._content(content);\n\n this._alignContent();\n\n return result;\n },\n\n _alignContent: function() {\n var contentOptions = this.options.content || {};\n var contentVisual = this._contentVisual;\n if (contentVisual && contentOptions.align) {\n var containerRect = this.visual._measure();\n var aligner = new diagram.RectAlign(containerRect);\n var contentBounds = contentVisual.drawingElement.bbox(null);\n\n var contentRect = new Rect(0, 0, contentBounds.width(), contentBounds.height());\n var alignedBounds = aligner.align(contentRect, contentOptions.align);\n\n contentVisual.position(alignedBounds.topLeft());\n }\n },\n\n _createConnectors: function() {\n var options = this.options,\n length = options.connectors.length,\n connectorDefaults = options.connectorDefaults,\n connector, i;\n\n for (i = 0; i < length; i++) {\n connector = new Connector(\n this, deepExtend({},\n connectorDefaults,\n options.connectors[i]\n )\n );\n this.connectors.push(connector);\n }\n },\n\n bounds: function(value) {\n var bounds;\n\n if (value) {\n if (isString(value)) {\n switch (value) {\n case TRANSFORMED :\n bounds = this._transformedBounds();\n break;\n case ABSOLUTE :\n bounds = this._transformedBounds();\n var pan = this.diagram._pan;\n bounds.x += pan.x;\n bounds.y += pan.y;\n break;\n case ROTATED :\n bounds = this._rotatedBounds();\n break;\n default:\n bounds = this._bounds;\n }\n } else {\n this._setBounds(value);\n this._triggerBoundsChange();\n if (!(this.diagram && this.diagram._layouting)) {\n this.refreshConnections();\n }\n }\n } else {\n bounds = this._bounds;\n }\n\n return bounds;\n },\n\n _setBounds: function(rect) {\n var options = this.options;\n var topLeft = rect.topLeft();\n var x = options.x = topLeft.x;\n var y = options.y = topLeft.y;\n var width = options.width = math.max(rect.width, options.minWidth);\n var height = options.height = math.max(rect.height, options.minHeight);\n\n this._bounds = new Rect(x, y, width, height);\n\n this.visual.redraw({\n x: x,\n y: y,\n width: width,\n height: height\n });\n },\n\n position: function(point) {\n if (point) {\n this.bounds(new Rect(point.x, point.y, this._bounds.width, this._bounds.height));\n } else {\n return this._bounds.topLeft();\n }\n },\n /**\n * Returns a clone of this shape.\n * @returns {Shape}\n */\n clone: function() {\n var json = this.serialize();\n\n json.options.id = diagram.randomId();\n\n if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n json.options.dataItem = cloneDataItem(this.dataItem);\n }\n\n return new Shape(json.options);\n },\n\n select: function(value) {\n var diagram = this.diagram, selected, deselected;\n if (isUndefined(value)) {\n value = true;\n }\n\n if (this._canSelect()) {\n if (this.isSelected != value) {\n selected = [];\n deselected = [];\n this.isSelected = value;\n if (this.isSelected) {\n diagram._selectedItems.push(this);\n selected.push(this);\n } else {\n Utils.remove(diagram._selectedItems, this);\n deselected.push(this);\n }\n\n if (!diagram._internalSelection) {\n diagram._selectionChanged(selected, deselected);\n }\n\n return true;\n }\n }\n },\n\n rotate: function(angle, center, undoable) { // we assume the center is always the center of the shape.\n var rotate = this.visual.rotate();\n if (angle !== undefined$1) {\n if (undoable !== false && this.diagram && this.diagram.undoRedoService && angle !== rotate.angle) {\n this.diagram.undoRedoService.add(\n new diagram.RotateUnit(this.diagram._resizingAdorner, [this], [rotate.angle]), false);\n }\n\n var b = this.bounds(),\n sc = new Point(b.width / 2, b.height / 2),\n deltaAngle,\n newPosition;\n\n if (center) {\n deltaAngle = angle - rotate.angle;\n newPosition = b.center().rotate(center, 360 - deltaAngle).minus(sc);\n this._rotationOffset = this._rotationOffset.plus(newPosition.minus(b.topLeft()));\n this.position(newPosition);\n }\n\n this.visual.rotate(angle, sc);\n this.options.rotation.angle = angle;\n\n if (this.diagram && this.diagram._connectorsAdorner) {\n this.diagram._connectorsAdorner.refresh();\n }\n\n this.refreshConnections();\n\n if (this.diagram) {\n this.diagram.trigger(ITEMROTATE, { item: this });\n }\n }\n\n return rotate;\n },\n\n connections: function(type) { // in, out, undefined = both\n var result = [], i, j, con, cons, ctr;\n\n for (i = 0; i < this.connectors.length; i++) {\n ctr = this.connectors[i];\n cons = ctr.connections;\n for (j = 0, cons; j < cons.length; j++) {\n con = cons[j];\n if (type == \"out\") {\n var source = con.source();\n if (source.shape && source.shape == this) {\n result.push(con);\n }\n } else if (type == \"in\") {\n var target = con.target();\n if (target.shape && target.shape == this) {\n result.push(con);\n }\n } else {\n result.push(con);\n }\n }\n }\n\n return result;\n },\n\n refreshConnections: function() {\n $.each(this.connections(), function() {\n this.refresh();\n });\n },\n /**\n * Gets a connector of this shape either by the connector's supposed name or\n * via a Point in which case the closest connector will be returned.\n * @param nameOrPoint The name of a Connector or a Point.\n * @returns {Connector}\n */\n getConnector: function(nameOrPoint) {\n var i, ctr;\n if (isString(nameOrPoint)) {\n nameOrPoint = nameOrPoint.toLocaleLowerCase();\n for (i = 0; i < this.connectors.length; i++) {\n ctr = this.connectors[i];\n if (ctr.options.name.toLocaleLowerCase() == nameOrPoint) {\n return ctr;\n }\n }\n } else if (nameOrPoint instanceof Point) {\n return closestConnector(nameOrPoint, this.connectors);\n } else {\n return this.connectors.length ? this.connectors[0] : null;\n }\n },\n\n getPosition: function(side) {\n var b = this.bounds(),\n fnName = side.charAt(0).toLowerCase() + side.slice(1);\n\n if (isFunction(b[fnName])) {\n return this._transformPoint(b[fnName]());\n }\n\n return b.center();\n },\n\n redraw: function(options) {\n if (options) {\n var shapeOptions = this.options;\n var boundsChange;\n\n this.shapeVisual.redraw(this._visualOptions(options));\n\n if (this._diffNumericOptions(options, [WIDTH, HEIGHT, X, Y])) {\n this.bounds(new Rect(shapeOptions.x, shapeOptions.y, shapeOptions.width, shapeOptions.height));\n boundsChange = true;\n }\n\n if (options.connectors) {\n shapeOptions.connectors = options.connectors;\n this._updateConnectors();\n }\n\n shapeOptions = deepExtend(shapeOptions, options);\n\n if (options.rotation || boundsChange) {\n this._rotate();\n }\n\n if (shapeOptions.content) {\n this.content(shapeOptions.content);\n }\n }\n },\n\n _updateConnectors: function() {\n var connections = this.connections();\n this.connectors = [];\n this._createConnectors();\n var connection;\n var source;\n var target;\n\n for (var idx = 0; idx < connections.length; idx++) {\n connection = connections[idx];\n source = connection.source();\n target = connection.target();\n if (source.shape && source.shape === this) {\n connection.source(this.getConnector(source.options.name) || null);\n } else if (target.shape && target.shape === this) {\n connection.target(this.getConnector(target.options.name) || null);\n }\n connection.updateModel();\n }\n },\n\n _diffNumericOptions: diagram.diffNumericOptions,\n\n _visualOptions: function(options) {\n return {\n data: options.path,\n source: options.source,\n hover: options.hover,\n fill: options.fill,\n stroke: options.stroke\n };\n },\n\n _triggerBoundsChange: function() {\n if (this.diagram) {\n this.diagram.trigger(ITEMBOUNDSCHANGE, { item: this, bounds: this._bounds.clone() }); // the trigger modifies the arguments internally.\n }\n },\n\n _transformPoint: function(point) {\n var rotate = this.rotate(),\n bounds = this.bounds(),\n tl = bounds.topLeft();\n\n if (rotate.angle) {\n point.rotate(rotate.center().plus(tl), 360 - rotate.angle);\n }\n\n return point;\n },\n\n _transformedBounds: function() {\n var bounds = this.bounds(),\n tl = bounds.topLeft(),\n br = bounds.bottomRight();\n\n return Rect.fromPoints(this.diagram.modelToView(tl), this.diagram.modelToView(br));\n },\n\n _rotatedBounds: function() {\n var bounds = this.bounds().rotatedBounds(this.rotate().angle),\n tl = bounds.topLeft(),\n br = bounds.bottomRight();\n\n return Rect.fromPoints(tl, br);\n },\n\n _rotate: function() {\n var rotation = this.options.rotation;\n\n if (rotation && rotation.angle) {\n this.rotate(rotation.angle);\n }\n\n this._rotationOffset = new Point();\n },\n\n _hover: function(value) {\n var options = this.options,\n hover = options.hover,\n stroke = options.stroke,\n fill = options.fill;\n\n if (value && isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\n }\n\n if (value && isDefined(hover.fill)) {\n fill = hover.fill;\n }\n\n this.shapeVisual.redraw({\n stroke: stroke,\n fill: fill\n });\n\n if (options.editable && options.editable.connect) {\n this.diagram._showConnectors(this, value);\n }\n },\n\n _hitTest: function(value) {\n if (this.visible()) {\n var bounds = this.bounds(), rotatedPoint,\n angle = this.rotate().angle;\n\n if (value.isEmpty && !value.isEmpty()) { // rect selection\n return Intersect.rects(value, bounds, angle ? angle : 0);\n } else { // point\n rotatedPoint = value.clone().rotate(bounds.center(), angle); // cloning is important because rotate modifies the point inline.\n if (bounds.contains(rotatedPoint)) {\n return this;\n }\n }\n }\n },\n\n toJSON: function() {\n return {\n shapeId: this.options.id\n };\n },\n\n createShapeVisual: function() {\n var options = this.options;\n var visualOptions = this._visualOptions(options);\n var visualTemplate = options.visual;\n var type = (options.type + \"\").toLocaleLowerCase();\n var shapeVisual;\n\n visualOptions.width = options.width;\n visualOptions.height = options.height;\n\n if (isFunction(visualTemplate)) { // custom template\n shapeVisual = visualTemplate.call(this, options);\n } else if (visualOptions.data) {\n shapeVisual = new Path(visualOptions);\n translateToOrigin(shapeVisual);\n } else if (type == \"rectangle\") {\n shapeVisual = new Rectangle(visualOptions);\n } else if (type == \"circle\") {\n shapeVisual = new Circle(visualOptions);\n } else if (type == \"text\") {\n shapeVisual = new TextBlock(visualOptions);\n } else if (type == \"image\") {\n shapeVisual = new Image(visualOptions);\n } else {\n shapeVisual = new Path(visualOptions);\n }\n\n this.shapeVisual = shapeVisual;\n this.visual.append(this.shapeVisual);\n }\n });\n\n /**\n * The visual link between two Shapes through the intermediate of Connectors.\n */\n var Connection = DiagramElement.extend({\n init: function(from, to, options) {\n var that = this;\n DiagramElement.fn.init.call(that, options);\n this.updateOptionsFromModel();\n this._initRouter();\n that.path = new diagram.Polyline(that.options);\n that.path.fill(TRANSPARENT);\n that.visual.append(that.path);\n that._sourcePoint = that._targetPoint = new Point();\n that._setSource(from);\n that._setTarget(to);\n that.content(that.options.content);\n that.definers = [];\n if (defined(options) && options.points) {\n that.points(options.points);\n }\n },\n\n options: {\n hover: {\n stroke: {}\n },\n startCap: NONE,\n endCap: NONE,\n points: [],\n selectable: true,\n fromConnector: AUTO,\n toConnector: AUTO\n },\n\n _setOptionsFromModel: function(model) {\n this.updateOptionsFromModel(model || this.dataItem);\n },\n\n updateOptionsFromModel: function(model) {\n if (this.diagram && this.diagram._isEditable) {\n var dataMap = this.diagram._dataMap;\n var options = filterConnectionDataItem(model || this.dataItem);\n\n if (model) {\n if (defined(options.from)) {\n var from = dataMap[options.from];\n if (from && defined(options.fromConnector)) {\n from = from.getConnector(options.fromConnector);\n }\n this.source(from);\n } else if (defined(options.fromX) && defined(options.fromY)) {\n this.source(new Point(options.fromX, options.fromY));\n }\n\n if (defined(options.to)) {\n var to = dataMap[options.to];\n if (to && defined(options.toConnector)) {\n to = to.getConnector(options.toConnector);\n }\n this.target(to);\n } else if (defined(options.toX) && defined(options.toY)) {\n this.target(new Point(options.toX, options.toY));\n }\n\n if (defined(options.type) && this.type() !== options.type) {\n this.points([]);\n this.type(options.type);\n }\n\n this.dataItem = model;\n\n this._template();\n this.redraw(this.options);\n } else {\n this.options = deepExtend({}, options, this.options);\n }\n }\n },\n\n updateModel: function(syncChanges) {\n if (this.diagram && this.diagram._isEditable) {\n if (this.diagram.connectionsDataSource) {\n var model = this.diagram.connectionsDataSource.getByUid(this.dataItem.uid);\n\n if (model) {\n this.diagram._suspendModelRefresh();\n if (defined(this.options.fromX) && this.options.fromX !== null) {\n clearField(\"from\", model);\n clearField(\"fromConnector\", model);\n model.set(\"fromX\", this.options.fromX);\n model.set(\"fromY\", this.options.fromY);\n } else {\n model.set(\"from\", this.options.from);\n if (defined(model.fromConnector)) {\n model.set(\"fromConnector\", this.sourceConnector ? this.sourceConnector.options.name : null);\n }\n clearField(\"fromX\", model);\n clearField(\"fromY\", model);\n }\n\n if (defined(this.options.toX) && this.options.toX !== null) {\n clearField(\"to\", model);\n clearField(\"toConnector\", model);\n model.set(\"toX\", this.options.toX);\n model.set(\"toY\", this.options.toY);\n } else {\n model.set(\"to\", this.options.to);\n if (defined(model.toConnector)) {\n model.set(\"toConnector\", this.targetConnector ? this.targetConnector.options.name : null);\n }\n clearField(\"toX\", model);\n clearField(\"toY\", model);\n }\n\n if (defined(this.options.type) && defined(model.type)) {\n model.set(\"type\", this.options.type);\n }\n\n this.dataItem = model;\n this.diagram._resumeModelRefresh();\n\n if (syncChanges) {\n this.diagram._syncConnectionChanges();\n }\n }\n }\n }\n },\n\n /**\n * Gets the Point where the source of the connection resides.\n * If the endpoint in Auto-connector the location of the resolved connector will be returned.\n * If the endpoint is floating the location of the endpoint is returned.\n */\n sourcePoint: function() {\n return this._resolvedSourceConnector ? this._resolvedSourceConnector.position() : this._sourcePoint;\n },\n\n _setSource: function(source) {\n var shapeSource = source instanceof Shape;\n var defaultConnector = this.options.fromConnector || AUTO;\n var dataItem;\n if (shapeSource && !source.getConnector(defaultConnector)) {\n return;\n }\n\n if (source !== undefined$1) {\n this.from = source;\n }\n\n this._removeFromSourceConnector();\n\n if (source === null) { // detach\n if (this.sourceConnector) {\n this._sourcePoint = (this._resolvedSourceConnector || this.sourceConnector).position();\n this._clearSourceConnector();\n this._setFromOptions(null, this._sourcePoint);\n }\n } else if (source instanceof Connector) {\n dataItem = source.shape.dataItem;\n if (dataItem) {\n this._setFromOptions(dataItem.id);\n }\n this.sourceConnector = source;\n this.sourceConnector.connections.push(this);\n } else if (source instanceof Point) {\n this._setFromOptions(null, source);\n this._sourcePoint = source;\n if (this.sourceConnector) {\n this._clearSourceConnector();\n }\n\n } else if (shapeSource) {\n dataItem = source.dataItem;\n if (dataItem) {\n this._setFromOptions(dataItem.id);\n }\n\n this.sourceConnector = source.getConnector(defaultConnector);\n this.sourceConnector.connections.push(this);\n }\n },\n\n source: function(source, undoable) {\n if (isDefined(source)) {\n if (undoable && this.diagram) {\n this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, source));\n }\n this._setSource(source);\n this.refresh();\n }\n return this.sourceConnector ? this.sourceConnector : this._sourcePoint;\n },\n\n _setFromOptions: function(from, fromPoint) {\n this.options.from = from;\n if (fromPoint) {\n this.options.fromX = fromPoint.x;\n this.options.fromY = fromPoint.y;\n } else {\n this.options.fromX = null;\n this.options.fromY = null;\n }\n },\n\n /**\n * Gets or sets the PathDefiner of the sourcePoint.\n * The left part of this definer is always null since it defines the source tangent.\n * @param value\n * @returns {*}\n */\n sourceDefiner: function(value) {\n if (value) {\n if (value instanceof diagram.PathDefiner) {\n value.left = null;\n this._sourceDefiner = value;\n this.source(value.point); // refresh implicit here\n } else {\n throw \"The sourceDefiner needs to be a PathDefiner.\";\n }\n } else {\n if (!this._sourceDefiner) {\n this._sourceDefiner = new diagram.PathDefiner(this.sourcePoint(), null, null);\n }\n return this._sourceDefiner;\n }\n },\n\n /**\n * Gets the Point where the target of the connection resides.\n */\n targetPoint: function() {\n return this._resolvedTargetConnector ? this._resolvedTargetConnector.position() : this._targetPoint;\n },\n\n _setTarget: function(target) {\n var shapeTarget = target instanceof Shape;\n var defaultConnector = this.options.toConnector || AUTO;\n var dataItem;\n\n if (shapeTarget && !target.getConnector(defaultConnector)) {\n return;\n }\n\n if (target !== undefined$1) {\n this.to = target;\n }\n\n this._removeFromTargetConnector();\n\n if (target === null) { // detach\n if (this.targetConnector) {\n this._targetPoint = (this._resolvedTargetConnector || this.targetConnector).position();\n this._clearTargetConnector();\n this._setToOptions(null, this._targetPoint);\n }\n } else if (target instanceof Connector) {\n dataItem = target.shape.dataItem;\n if (dataItem) {\n this._setToOptions(dataItem.id);\n }\n this.targetConnector = target;\n this.targetConnector.connections.push(this);\n } else if (target instanceof Point) {\n this._setToOptions(null, target);\n this._targetPoint = target;\n if (this.targetConnector) {\n this._clearTargetConnector();\n }\n } else if (shapeTarget) {\n dataItem = target.dataItem;\n if (dataItem) {\n this._setToOptions(dataItem.id);\n }\n this.targetConnector = target.getConnector(defaultConnector);\n this.targetConnector.connections.push(this);\n }\n },\n\n target: function(target, undoable) {\n if (isDefined(target)) {\n if (undoable && this.diagram) {\n this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, undefined$1, target));\n }\n this._setTarget(target);\n\n this.refresh();\n }\n return this.targetConnector ? this.targetConnector : this._targetPoint;\n },\n\n _setToOptions: function(to, toPoint) {\n this.options.to = to;\n if (toPoint) {\n this.options.toX = toPoint.x;\n this.options.toY = toPoint.y;\n } else {\n this.options.toX = null;\n this.options.toY = null;\n }\n },\n\n /**\n * Gets or sets the PathDefiner of the targetPoint.\n * The right part of this definer is always null since it defines the target tangent.\n * @param value\n * @returns {*}\n */\n targetDefiner: function(value) {\n if (value) {\n if (value instanceof diagram.PathDefiner) {\n value.right = null;\n this._targetDefiner = value;\n this.target(value.point); // refresh implicit here\n } else {\n throw \"The sourceDefiner needs to be a PathDefiner.\";\n }\n } else {\n if (!this._targetDefiner) {\n this._targetDefiner = new diagram.PathDefiner(this.targetPoint(), null, null);\n }\n return this._targetDefiner;\n }\n },\n\n _updateConnectors: function() {\n this._updateConnector(this.source(), \"source\");\n this._updateConnector(this.target(), \"target\");\n },\n\n _updateConnector: function(instance, name) {\n var that = this;\n var diagram = that.diagram;\n if (instance instanceof Connector && !diagram.getShapeById(instance.shape.id)) {\n var dataItem = instance.shape.dataItem;\n var connectorName = instance.options.name;\n var setNewTarget = function() {\n var shape = diagram._dataMap[dataItem.id];\n instance = shape.getConnector(connectorName);\n that[name](instance, false);\n that.updateModel();\n };\n if (diagram._dataMap[dataItem.id]) {\n setNewTarget();\n } else {\n var inactiveItem = diagram._inactiveShapeItems.getByUid(dataItem.uid);\n if (inactiveItem) {\n diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(setNewTarget));\n }\n }\n } else {\n that[name](instance, false);\n }\n },\n\n content: function(content) {\n var result = this._content(content);\n if (defined(content)) {\n this._alignContent();\n }\n return result;\n },\n\n _createContentVisual: function(options) {\n var visual;\n if (isFunction(options.visual)) {\n visual = options.visual.call(this, options);\n } else if (options.text) {\n visual = new TextBlock(options);\n }\n\n if (visual) {\n this._contentVisual = visual;\n visual._includeInBBox = false;\n this.visual.append(visual);\n }\n\n return visual;\n },\n\n _updateContentVisual: function(options) {\n if (isFunction(options.visual)) {\n this.visual.remove(this._contentVisual);\n this._createContentVisual(options);\n } else {\n this._contentVisual.redraw(options);\n }\n },\n\n _alignContent: function() {\n if (this._contentVisual) {\n var offset = CONNECTION_CONTENT_OFFSET;\n var points = this.allPoints();\n var endIdx = math.floor(points.length / 2);\n var startIdx = endIdx - 1;\n\n while (startIdx > 0 && points[startIdx].equals(points[endIdx])) {\n startIdx--;\n endIdx++;\n }\n\n var endPoint = points[endIdx];\n var startPoint = points[startIdx];\n\n var boundingBox = this._contentVisual._measure();\n var width = boundingBox.width;\n var height = boundingBox.height;\n var alignToPath = points.length % 2 === 0;\n var distance = startPoint.distanceTo(endPoint);\n\n if (alignToPath && points.length > 2 && distance > 0 &&\n ((startPoint.y === endPoint.y && distance < width) || (startPoint.x === endPoint.x && distance < height))) {\n alignToPath = false;\n offset = 0;\n }\n\n var point;\n\n if (alignToPath) {\n var angle = draw.util.deg(math.atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x));\n point = new Point((endPoint.x - startPoint.x) / 2 + startPoint.x, (endPoint.y - startPoint.y) / 2 + startPoint.y);\n\n if (math.abs(angle) === 90) {\n point.x += offset;\n point.y -= height / 2;\n } else if (angle % 180 === 0) {\n point.x -= width / 2;\n point.y -= height + offset;\n } else if (angle < -90 || (0 < angle && angle < 90)) {\n point.y -= height;\n } else if (angle < 0 || angle > 90) {\n point.x -= width;\n point.y -= height;\n }\n } else {\n var midIdx = math.floor(points.length / 2);\n point = points[midIdx].clone();\n startPoint = points[midIdx - 1];\n endPoint = points[midIdx + 1];\n\n var offsetX = startPoint.x <= point.x && endPoint.x <= point.x ? offset : -boundingBox.width - offset;\n var offsetY = startPoint.y <= point.y && endPoint.y <= point.y ? offset : -boundingBox.height - offset;\n\n point.x += offsetX;\n point.y += offsetY;\n }\n\n this._contentVisual.position(point);\n }\n },\n\n /**\n * Selects or unselects this connections.\n * @param value True to select, false to unselect.\n */\n select: function(value) {\n var diagram = this.diagram, selected, deselected;\n if (this._canSelect()) {\n if (this.isSelected !== value) {\n this.isSelected = value;\n selected = [];\n deselected = [];\n if (this.isSelected) {\n this.adorner = new ConnectionEditAdorner(this, this.options.selection);\n diagram._adorn(this.adorner, true);\n diagram._selectedItems.push(this);\n selected.push(this);\n } else {\n if (this.adorner) {\n diagram._adorn(this.adorner, false);\n Utils.remove(diagram._selectedItems, this);\n this.adorner = undefined$1;\n deselected.push(this);\n }\n }\n\n if (this.adorner) {\n this.adorner.refresh();\n }\n\n if (!diagram._internalSelection) {\n diagram._selectionChanged(selected, deselected);\n }\n return true;\n }\n }\n },\n /**\n * Gets or sets the bounds of this connection.\n * @param value A Rect object.\n * @remark This is automatically set in the refresh().\n * @returns {Rect}\n */\n bounds: function(value) {\n if (value && !isString(value)) {\n this._bounds = value;\n } else {\n return this._bounds;\n }\n },\n /**\n * Gets or sets the connection type (see ConnectionType enumeration).\n * @param value A ConnectionType value.\n * @returns {ConnectionType}\n */\n type: function(value) {\n var options = this.options;\n if (value) {\n if (value !== options.type) {\n options.type = value;\n this._initRouter();\n this.refresh();\n }\n } else {\n return options.type;\n }\n },\n\n _initRouter: function() {\n var type = (this.options.type || \"\").toLowerCase();\n if (type == CASCADING) {\n this._router = new CascadingRouter(this);\n } else {\n this._router = new PolylineRouter(this);\n }\n },\n /**\n * Gets or sets the collection of *intermediate* points.\n * The 'allPoints()' property will return all the points.\n * The 'definers' property returns the definers of the intermediate points.\n * The 'sourceDefiner' and 'targetDefiner' return the definers of the endpoints.\n * @param value\n */\n points: function(value) {\n if (value) {\n this.definers = [];\n for (var i = 0; i < value.length; i++) {\n var definition = value[i];\n if (definition instanceof diagram.Point) {\n this.definers.push(new diagram.PathDefiner(definition));\n } else if (definition.hasOwnProperty(\"x\") && definition.hasOwnProperty(\"y\")) { // e.g. Clipboard does not preserve the Point definition and tunred into an Object\n this.definers.push(new diagram.PathDefiner(new Point(definition.x, definition.y)));\n } else {\n throw \"A Connection point needs to be a Point or an object with x and y properties.\";\n }\n }\n\n } else {\n var pts = [];\n if (isDefined(this.definers)) {\n for (var k = 0; k < this.definers.length; k++) {\n pts.push(this.definers[k].point);\n }\n }\n return pts;\n }\n },\n /**\n * Gets all the points of this connection. This is the combination of the sourcePoint, the points and the targetPoint.\n * @returns {Array}\n */\n allPoints: function() {\n var pts = [this.sourcePoint()];\n if (this.definers) {\n for (var k = 0; k < this.definers.length; k++) {\n pts.push(this.definers[k].point);\n }\n }\n pts.push(this.targetPoint());\n return pts;\n },\n\n refresh: function() {\n this._resolveConnectors();\n this._refreshPath();\n this._alignContent();\n\n if (this.adorner) {\n this.adorner.refresh();\n }\n },\n\n _resolveConnectors: function() {\n var connection = this,\n sourcePoint, targetPoint,\n sourceConnectors, targetConnectors,\n source = connection.source(),\n target = connection.target();\n\n if (source instanceof Point) {\n sourcePoint = source;\n } else if (source instanceof Connector) {\n if (isAutoConnector(source)) {\n sourceConnectors = source.shape.connectors;\n } else {\n sourceConnectors = [source];\n }\n }\n\n if (target instanceof Point) {\n targetPoint = target;\n } else if (target instanceof Connector) {\n if (isAutoConnector(target)) {\n targetConnectors = target.shape.connectors;\n } else {\n targetConnectors = [target];\n }\n }\n\n if (sourcePoint) {\n if (targetConnectors) {\n connection._resolvedTargetConnector = closestConnector(sourcePoint, targetConnectors);\n }\n } else if (sourceConnectors) {\n if (targetPoint) {\n connection._resolvedSourceConnector = closestConnector(targetPoint, sourceConnectors);\n } else if (targetConnectors) {\n this._resolveAutoConnectors(sourceConnectors, targetConnectors);\n }\n }\n },\n\n _resolveAutoConnectors: function(sourceConnectors, targetConnectors) {\n var minNonConflict = MAXINT;\n var minDist = MAXINT;\n var minNonConflictSource, minNonConflictTarget;\n var sourcePoint, targetPoint;\n var minSource, minTarget;\n var sourceConnector, targetConnector;\n var sourceIdx, targetIdx;\n var dist;\n\n for (sourceIdx = 0; sourceIdx < sourceConnectors.length; sourceIdx++) {\n sourceConnector = sourceConnectors[sourceIdx];\n if (!isAutoConnector(sourceConnector)) {\n sourcePoint = sourceConnector.position();\n\n for (targetIdx = 0; targetIdx < targetConnectors.length; targetIdx++) {\n targetConnector = targetConnectors[targetIdx];\n if (!isAutoConnector(targetConnector)) {\n targetPoint = targetConnector.position();\n dist = math.round(sourcePoint.distanceTo(targetPoint));\n\n if (dist < minNonConflict && this.diagram && this._testRoutePoints(sourcePoint, targetPoint, sourceConnector, targetConnector)) {\n minNonConflict = dist;\n minNonConflictSource = sourceConnector;\n minNonConflictTarget = targetConnector;\n }\n\n if (dist < minDist) {\n minSource = sourceConnector;\n minTarget = targetConnector;\n minDist = dist;\n }\n }\n }\n }\n }\n\n if (minNonConflictSource) {\n minSource = minNonConflictSource;\n minTarget = minNonConflictTarget;\n }\n\n this._resolvedSourceConnector = minSource;\n this._resolvedTargetConnector = minTarget;\n },\n\n _testRoutePoints: function(sourcePoint, targetPoint, sourceConnector, targetConnector) {\n var router = this._router;\n var passRoute = true;\n if (router instanceof CascadingRouter) {\n var points = router.routePoints(sourcePoint, targetPoint, sourceConnector, targetConnector),\n start, end,\n rect, exclude;\n\n exclude = this._getRouteExclude(sourcePoint, targetPoint, sourceConnector.shape, targetConnector.shape);\n points.unshift(sourcePoint);\n points.push(targetPoint);\n\n\n for (var idx = 1; idx < points.length; idx++) {\n start = points[idx - 1];\n end = points[idx];\n rect = new Rect(math.min(start.x, end.x), math.min(start.y, end.y),\n math.abs(start.x - end.x), math.abs(start.y - end.y));\n if (rect.width > 0) {\n rect.x++;\n rect.width -= 2;\n }\n if (rect.height > 0) {\n rect.y++;\n rect.height -= 2;\n }\n\n if (!rect.isEmpty() && this.diagram._shapesQuadTree.hitTestRect(rect, exclude)) {\n passRoute = false;\n break;\n }\n }\n }\n return passRoute;\n },\n\n _getRouteExclude: function(sourcePoint, targetPoint, sourceShape, targetShape) {\n var exclude = [];\n if (this._isPointInsideShape(sourcePoint, sourceShape)) {\n exclude.push(sourceShape);\n }\n if (this._isPointInsideShape(targetPoint, targetShape)) {\n exclude.push(targetShape);\n }\n return exclude;\n },\n\n _isPointInsideShape: function(point, shape) {\n var bounds = shape.bounds(), rotatedPoint,\n angle = shape.rotate().angle,\n pointX, pointY,\n boundsX = bounds.x,\n boundsY = bounds.y;\n\n rotatedPoint = point.clone().rotate(bounds.center(), angle);\n pointX = rotatedPoint.x;\n pointY = rotatedPoint.y;\n return pointX > boundsX && pointX < (boundsX + bounds.width) && pointY > boundsY && pointY < (boundsY + bounds.height);\n },\n\n redraw: function(options) {\n if (options) {\n this.options = deepExtend({}, this.options, options);\n\n var points = this.options.points;\n\n if (defined(points) && points.length > 0) {\n this.points(points);\n this._refreshPath();\n }\n\n if ((options && options.content) || options.text) {\n this.content(options.content);\n }\n\n this.path.redraw({\n fill: options.fill,\n stroke: options.stroke,\n startCap: options.startCap,\n endCap: options.endCap\n });\n }\n },\n /**\n * Returns a clone of this connection.\n * @returns {Connection}\n */\n clone: function() {\n var json = this.serialize();\n\n if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n json.options.dataItem = cloneDataItem(this.dataItem);\n }\n\n return new Connection(this.from, this.to, json.options);\n },\n /**\n * Returns a serialized connection in json format. Consist of the options and the dataItem.\n * @returns {Connection}\n */\n serialize: function() {\n var from = this.from.toJSON ? this.from.toJSON : this.from.toString(),\n to = this.to.toJSON ? this.to.toJSON : this.to.toString();\n\n var json = deepExtend({}, {\n options: this.options,\n from: from,\n to: to\n });\n\n if (defined(this.dataItem)) {\n json.dataItem = this.dataItem.toString();\n }\n\n json.options.points = this.points();\n return json;\n },\n\n /**\n * Returns whether the given Point or Rect hits this connection.\n * @param value\n * @returns {Connection}\n * @private\n */\n _hitTest: function(value) {\n if (this.visible()) {\n var p = new Point(value.x, value.y), from = this.sourcePoint(), to = this.targetPoint();\n if (value.isEmpty && !value.isEmpty() && value.contains(from) && value.contains(to)) {\n return this;\n }\n if (this._router.hitTest(p)) {\n return this;\n }\n }\n },\n\n _hover: function(value) {\n var color = (this.options.stroke || {}).color;\n\n if (value && isDefined(this.options.hover.stroke.color)) {\n color = this.options.hover.stroke.color;\n }\n\n this.path.redraw({\n stroke: {\n color: color\n }\n });\n },\n\n _refreshPath: function() {\n if (!defined(this.path)) {\n return;\n }\n this._drawPath();\n this.bounds(this._router.getBounds());\n },\n\n _drawPath: function() {\n if (this._router) {\n this._router.route(); // sets the intermediate points\n }\n var source = this.sourcePoint();\n var target = this.targetPoint();\n var points = this.points();\n\n this.path.redraw({\n points: [source].concat(points, [target])\n });\n },\n\n _clearSourceConnector: function() {\n this.sourceConnector = undefined$1;\n this._resolvedSourceConnector = undefined$1;\n },\n\n _clearTargetConnector: function() {\n this.targetConnector = undefined$1;\n this._resolvedTargetConnector = undefined$1;\n },\n\n _removeFromSourceConnector: function() {\n if (this.sourceConnector) {\n Utils.remove(this.sourceConnector.connections, this);\n }\n },\n\n _removeFromTargetConnector: function() {\n if (this.targetConnector) {\n Utils.remove(this.targetConnector.connections, this);\n }\n },\n\n toJSON: function() {\n var connection = this;\n var from, to, point;\n if (connection.from && connection.from.toJSON) {\n from = connection.from.toJSON();\n } else {\n point = connection._sourcePoint;\n from = {\n x: point.x,\n y: point.y\n };\n }\n\n if (connection.to && connection.to.toJSON) {\n to = connection.to.toJSON();\n } else {\n point = connection._targetPoint;\n to = {\n x: point.x,\n y: point.y\n };\n }\n\n return {\n from: from,\n to: to\n };\n }\n });\n\n var Diagram = Widget.extend({\n init: function(element, userOptions) {\n var that = this;\n\n kendo.destroy(element);\n Widget.fn.init.call(that, element, userOptions);\n\n that._initTheme();\n\n that._initElements();\n that._extendLayoutOptions(that.options);\n that._initDefaults(userOptions);\n that._interactionDefaults();\n\n that._initCanvas();\n\n that.mainLayer = new Group({\n id: \"main-layer\"\n });\n that.canvas.append(that.mainLayer);\n\n that._shapesQuadTree = new ShapesQuadTree(that);\n\n that._pan = new Point();\n that._adorners = [];\n that.adornerLayer = new Group({\n id: \"adorner-layer\"\n });\n that.canvas.append(that.adornerLayer);\n\n that._createHandlers();\n\n that._initialize();\n\n that._resizingAdorner = new ResizingAdorner(that, { editable: that.options.editable });\n that._connectorsAdorner = new ConnectorsAdorner(that);\n\n that._adorn(that._resizingAdorner, true);\n that._adorn(that._connectorsAdorner, true);\n\n that.selector = new Selector(that);\n // TODO: We may consider using real Clipboard API once is supported by the standard.\n that._clipboard = [];\n\n that.pauseMouseHandlers = false;\n\n that._fetchFreshData();\n\n that._createGlobalToolBar();\n\n that._createOptionElements();\n\n that.zoom(that.options.zoom);\n\n that.canvas.draw();\n },\n\n options: {\n name: \"Diagram\",\n theme: \"default\",\n layout: \"\",\n zoomRate: 0.1,\n zoom: 1,\n zoomMin: 0,\n zoomMax: 2,\n dataSource: {},\n draggable: true,\n template: \"\",\n autoBind: true,\n editable: {\n rotate: {},\n resize: {},\n text: true,\n tools: [],\n drag: {\n snap: {\n size: 10,\n angle: 10\n }\n },\n remove: true\n },\n pannable: {},\n selectable: {\n key: \"none\"\n },\n tooltip: { enabled: true, format: \"{0}\" },\n copy: {\n enabled: true,\n offsetX: 20,\n offsetY: 20\n },\n shapeDefaults: diagram.shapeDefaults({ undoable: true }),\n connectionDefaults: {\n editable: {\n tools: []\n },\n type: CASCADING\n },\n shapes: [],\n connections: []\n },\n\n events: [\n ZOOM_END,\n ZOOM_START,\n PAN, SELECT,\n ITEMROTATE,\n ITEMBOUNDSCHANGE,\n CHANGE,\n CLICK,\n MOUSE_ENTER,\n MOUSE_LEAVE,\n \"toolBarClick\",\n \"save\",\n \"cancel\",\n \"edit\",\n \"remove\",\n \"add\",\n \"dataBound\",\n DRAG_START,\n DRAG,\n DRAG_END\n ],\n\n items: function() {\n return $();\n },\n\n _createGlobalToolBar: function() {\n var editable = this.options.editable;\n if (editable) {\n var tools = editable.tools;\n if (this._isEditable && tools !== false && (!tools || tools.length === 0)) {\n tools = [\"createShape\", \"undo\", \"redo\", \"rotateClockwise\", \"rotateAnticlockwise\"];\n }\n\n if (tools && tools.length) {\n this.toolBar = new DiagramToolBar(this, {\n tools: tools || {},\n click: this._toolBarClick.bind(this),\n modal: false\n });\n\n this.toolBar.element.css({\n textAlign: \"left\"\n });\n\n this.element.prepend(this.toolBar.element);\n this._resize();\n }\n }\n },\n\n createShape: function() {\n if ((this.editor && this.editor.end()) || !this.editor) {\n var dataSource = this.dataSource;\n var view = dataSource.view() || [];\n var index = view.length;\n var model = createModel(dataSource, {});\n var shape = this._createShape(model, {});\n\n if (!this.trigger(\"add\", { shape: shape })) {\n dataSource.insert(index, model);\n var inactiveItem = this._inactiveShapeItems.getByUid(model.uid);\n inactiveItem.element = shape;\n this.edit(shape);\n }\n }\n },\n\n _createShape: function(dataItem, options) {\n options = deepExtend({}, this.options.shapeDefaults, options);\n options.dataItem = dataItem;\n var shape = new Shape(options, this);\n return shape;\n },\n\n createConnection: function() {\n if (((this.editor && this.editor.end()) || !this.editor)) {\n var connectionsDataSource = this.connectionsDataSource;\n var view = connectionsDataSource.view() || [];\n var index = view.length;\n var model = createModel(connectionsDataSource, {});\n var connection = this._createConnection(model);\n if (!this.trigger(\"add\", { connection: connection })) {\n this._connectionsDataMap[model.uid] = connection;\n connectionsDataSource.insert(index, model);\n this.addConnection(connection, false);\n this.edit(connection);\n }\n }\n },\n\n _createConnection: function(dataItem, source, target) {\n var options = deepExtend({}, this.options.connectionDefaults);\n options.dataItem = dataItem;\n\n var connection = new Connection(source || new Point(), target || new Point(), options);\n\n return connection;\n },\n\n editModel: function(dataItem, editorType) {\n this.cancelEdit();\n var editors, template;\n var editable = this.options.editable;\n\n if (editorType == \"shape\") {\n editors = editable.shapeEditors;\n template = editable.shapeTemplate;\n } else if (editorType == \"connection\") {\n var connectionSelectorHandler = connectionSelector.bind(this);\n editors = deepExtend({}, { from: connectionSelectorHandler, to: connectionSelectorHandler }, editable.connectionEditors);\n template = editable.connectionTemplate;\n } else {\n return;\n }\n\n this.editor = new PopupEditor(this.element, {\n update: this._update.bind(this),\n cancel: this._cancel.bind(this),\n model: dataItem,\n type: editorType,\n target: this,\n editors: editors,\n template: template\n });\n\n this.trigger(\"edit\", this._editArgs());\n },\n\n edit: function(item) {\n if (item.dataItem) {\n var editorType = item instanceof Shape ? \"shape\" : \"connection\";\n this.editModel(item.dataItem, editorType);\n }\n },\n\n cancelEdit: function() {\n if (this.editor) {\n this._getEditDataSource().cancelChanges(this.editor.model);\n\n this._destroyEditor();\n }\n },\n\n saveEdit: function() {\n if (this.editor && this.editor.end() &&\n !this.trigger(\"save\", this._editArgs())) {\n this._getEditDataSource().sync();\n }\n },\n\n _update: function() {\n if (this.editor && this.editor.end() &&\n !this.trigger(\"save\", this._editArgs())) {\n this._getEditDataSource().sync();\n this._destroyEditor();\n }\n },\n\n _cancel: function() {\n if (this.editor && !this.trigger(\"cancel\", this._editArgs())) {\n var model = this.editor.model;\n this._getEditDataSource().cancelChanges(model);\n var element = this._connectionsDataMap[model.uid] || this._dataMap[model.id];\n if (element) {\n element._setOptionsFromModel(model);\n }\n this._destroyEditor();\n }\n },\n\n _getEditDataSource: function() {\n return this.editor.options.type === \"shape\" ? this.dataSource : this.connectionsDataSource;\n },\n\n _editArgs: function() {\n var result = { container: this.editor.wrapper };\n result[this.editor.options.type] = this.editor.model;\n return result;\n },\n\n _destroyEditor: function() {\n if (this.editor) {\n this.editor.close();\n this.editor = null;\n }\n },\n\n _initElements: function() {\n this.wrapper = this.element.empty()\n .css(\"position\", \"relative\")\n .attr(\"tabindex\", 0)\n .addClass(\"k-widget k-diagram\");\n\n this.scrollable = $(\"
\").appendTo(this.element);\n },\n\n _initDefaults: function(userOptions) {\n var options = this.options;\n var editable = options.editable;\n var shapeDefaults = options.shapeDefaults;\n var connectionDefaults = options.connectionDefaults;\n var userShapeDefaults = (userOptions || {}).shapeDefaults;\n if (editable === false) {\n shapeDefaults.editable = false;\n connectionDefaults.editable = false;\n } else {\n copyDefaultOptions(editable, shapeDefaults.editable, [\"drag\", \"remove\", \"connect\"]);\n copyDefaultOptions(editable, connectionDefaults.editable, [\"drag\", \"remove\"]);\n }\n\n if (userShapeDefaults && userShapeDefaults.connectors) {\n options.shapeDefaults.connectors = userShapeDefaults.connectors;\n }\n },\n\n _interactionDefaults: function() {\n var options = this.options;\n var selectable = options.selectable;\n var pannable = options.pannable;\n var mobile = kendo.support.mobileOS;\n\n if (selectable && !defined(selectable.multiple)) {\n options.selectable = deepExtend({\n multiple: mobile ? false : true\n }, options.selectable);\n }\n\n if (pannable && !defined(pannable.key)) {\n options.pannable = deepExtend({\n key: mobile ? \"none\" : \"ctrl\"\n }, options.pannable);\n }\n },\n\n _initCanvas: function() {\n var canvasContainer = $(\"
\").appendTo(this.scrollable)[0];\n var viewPort = this.viewport();\n this.canvas = new Canvas(canvasContainer, {\n width: viewPort.width || DEFAULT_CANVAS_WIDTH,\n height: viewPort.height || DEFAULT_CANVAS_HEIGHT\n });\n },\n\n _createHandlers: function() {\n var that = this;\n var element = that.element;\n\n element.on(MOUSEWHEEL_NS, that._wheel.bind(that))\n .on(\"keydown\" + NS, that._keydown.bind(that));\n\n that._userEvents = new kendo.UserEvents(this.scrollable, {\n multiTouch: true,\n fastTap: true,\n tap: that._tap.bind(that),\n start: that._dragStart.bind(that),\n move: that._drag.bind(that),\n end: that._dragEnd.bind(that),\n gesturestart: that._gestureStart.bind(that),\n gesturechange: that._gestureChange.bind(that),\n gestureend: that._gestureEnd.bind(that),\n doubleTap: that._doubleTap.bind(that),\n supportDoubleTap: true\n });\n\n that.toolService = new ToolService(that);\n\n this.scrollable\n .on(\"mouseover\" + NS, that._mouseover.bind(that))\n .on(\"mouseout\" + NS, that._mouseout.bind(that))\n .on(\"mousemove\" + NS, that._mouseMove.bind(that))\n .on(\"mousedown\" + NS, that._mouseDown.bind(that))\n .on(\"mouseup\" + NS, that._mouseUp.bind(that));\n\n this._syncHandler = that._syncChanges.bind(that);\n\n that._resizeHandler = that.resize.bind(that, false);\n kendo.onResize(that._resizeHandler);\n\n this.bind(ZOOM_START, that._destroyToolBar.bind(that));\n this.bind(PAN, that._destroyToolBar.bind(that));\n },\n\n _dragStart: function(e) {\n this._pauseMouseHandlers = true;\n var point = this._eventPositions(e, true);\n\n var event = e.event;\n if (this.toolService.start(point, this._meta(event))) {\n this._destroyToolBar();\n event.preventDefault();\n }\n },\n\n _drag: function(e) {\n var p = this._eventPositions(e);\n var event = e.event;\n if (this.toolService.move(p, this._meta(event))) {\n event.preventDefault();\n }\n },\n\n _dragEnd: function(e) {\n this._pauseMouseHandlers = false;\n var p = this._eventPositions(e);\n var event = e.event;\n if (this.toolService.end(p, this._meta(event))) {\n this._createToolBar();\n event.preventDefault();\n }\n },\n\n _mouseMove: function(e) {\n if (!this._pauseMouseHandlers) {\n var p = this._eventPositions(e);\n this.toolService._updateHoveredItem(p);\n this.toolService._updateCursor(p);\n }\n },\n\n _mouseDown: function() {\n this._pauseMouseHandlers = true;\n },\n\n _mouseUp: function() {\n this._pauseMouseHandlers = false;\n },\n\n _tap: function(e) {\n var toolService = this.toolService;\n var selectable = this.options.selectable;\n var point = this._eventPositions(e);\n var focused = this.focus();\n\n toolService._updateHoveredItem(point);\n\n if (toolService.hoveredItem) {\n var item = toolService.hoveredItem;\n\n this.trigger(\"click\", {\n item: item,\n point: point,\n meta: this._meta(e.event)\n });\n\n if (selectable && item.options.selectable !== false) {\n var multiple = selectable.multiple !== false;\n var ctrlPressed = kendo.support.mobileOS || this._meta(e.event).ctrlKey;\n\n if (item.isSelected) {\n if (ctrlPressed) {\n this._destroyToolBar();\n item.select(false);\n } else {\n this._createToolBar(focused);\n }\n } else {\n this._destroyToolBar();\n this.select(item, {\n addToSelection: multiple && ctrlPressed\n });\n this._createToolBar(focused);\n }\n }\n } else if (selectable) {\n this._destroyToolBar();\n this.deselect();\n }\n },\n\n _keydown: function(e) {\n if (this.toolService.keyDown(e.keyCode, this._meta(e))) {\n e.preventDefault();\n }\n },\n\n _wheel: function(e) {\n var delta = mwDelta(e),\n p = this._eventPositions(e),\n meta = deepExtend(this._meta(e), { delta: delta });\n\n if (this.toolService.wheel(p, meta)) {\n e.preventDefault();\n }\n },\n\n _meta: function(e) {\n return { ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey, shiftKey: e.shiftKey, type: e.type };\n },\n\n _eventPositions: function(e, start) {\n var point;\n if (e.touch) {\n var field = start ? \"startLocation\" : \"location\";\n point = new Point(e.x[field], e.y[field]);\n } else {\n var event = e.originalEvent;\n point = new Point(event.pageX, event.pageY);\n }\n\n return this.documentToModel(point);\n },\n\n _gestureStart: function(e) {\n this._destroyToolBar();\n this.scroller.disable();\n var initialCenter = this.documentToModel(new Point(e.center.x, e.center.y));\n var eventArgs = {\n point: initialCenter,\n zoom: this.zoom()\n };\n\n if (this.trigger(ZOOM_START, eventArgs)) {\n return;\n }\n\n this._gesture = e;\n this._initialCenter = initialCenter;\n },\n\n _gestureChange: function(e) {\n var previousGesture = this._gesture;\n var initialCenter = this._initialCenter;\n var center = this.documentToView(new Point(e.center.x, e.center.y));\n var scaleDelta = e.distance / previousGesture.distance;\n var zoom = this._zoom;\n var updateZoom = false;\n\n if (math.abs(scaleDelta - 1) >= MOBILE_ZOOM_RATE) {\n this._zoom = zoom = this._getValidZoom(zoom * scaleDelta);\n this.options.zoom = zoom;\n this._gesture = e;\n updateZoom = true;\n }\n\n var zoomedPoint = initialCenter.times(zoom);\n var pan = center.minus(zoomedPoint);\n if (updateZoom || this._pan.distanceTo(pan) >= MOBILE_PAN_DISTANCE) {\n this._panTransform(pan);\n this._updateAdorners();\n }\n\n e.preventDefault();\n },\n\n _doubleTap: function(e) {\n var diagram = this;\n var pointPosition = this._eventPositions(e);\n var options = diagram.options;\n var zoomRate = options.zoomRate;\n var zoom = diagram.zoom() + zoomRate;\n var meta = this._meta(e);\n var zoomOptions = { point: pointPosition, meta: meta, zoom: zoom };\n\n\n if (diagram.trigger(ZOOM_START, zoomOptions)) {\n return;\n }\n\n zoom = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, zoom)), 2);\n zoomOptions.zoom = zoom;\n\n diagram.zoom(zoom, zoomOptions);\n diagram.trigger(ZOOM_END, zoomOptions);\n },\n\n _gestureEnd: function() {\n if (this.options.pannable !== false) {\n this.scroller.enable();\n }\n this.trigger(ZOOM_END, {\n point: this._initialCenter,\n zoom: this.zoom()\n });\n },\n\n _resize: function() {\n var viewport = this.viewport();\n if (this.canvas) {\n this.canvas.size(viewport);\n }\n\n if (this.scrollable && this.toolBar) {\n this.scrollable.height(viewport.height);\n }\n },\n\n _mouseover: function(e) {\n var node = e.target._kendoNode;\n if (node && node.srcElement._hover) {\n node.srcElement._hover(true, node.srcElement);\n }\n },\n\n _mouseout: function(e) {\n var node = e.target._kendoNode;\n if (node && node.srcElement._hover) {\n node.srcElement._hover(false, node.srcElement);\n }\n },\n\n _initTheme: function() {\n var that = this;\n var themeName = ((that.options || {}).theme || \"\").toLowerCase();\n var themes = dataviz.ui.themes || {};\n var themeOptions;\n\n if (dataviz.SASS_THEMES.indexOf(themeName) != -1) {\n themeOptions = dataviz.autoTheme().diagram;\n }\n else {\n themeOptions = (themes[themeName] || {}).diagram;\n }\n\n that.options = deepExtend({}, themeOptions, that.options);\n if (that.options.editable === true) {\n deepExtend(that.options, {\n editable: (themeOptions || {}).editable\n });\n }\n },\n\n _createOptionElements: function() {\n var options = this.options;\n var shapesLength = options.shapes.length;\n\n if (shapesLength) {\n this._createShapes();\n }\n\n if (options.connections.length) {\n this._createConnections();\n }\n\n if (shapesLength && options.layout) {\n this.layout(options.layout);\n }\n },\n\n _createShapes: function() {\n var that = this,\n options = that.options,\n shapes = options.shapes,\n shape, i;\n\n for (i = 0; i < shapes.length; i++) {\n shape = shapes[i];\n that.addShape(shape);\n }\n },\n\n _createConnections: function() {\n var diagram = this,\n options = diagram.options,\n defaults = options.connectionDefaults,\n connections = options.connections,\n conn, source, target, i;\n\n for (i = 0; i < connections.length; i++) {\n conn = connections[i];\n source = diagram._findConnectionTarget(conn.from);\n target = diagram._findConnectionTarget(conn.to);\n\n diagram.connect(source, target, deepExtend({}, defaults, conn));\n }\n },\n\n _findConnectionTarget: function(options) {\n options = options || {};\n var diagram = this;\n var shapeId = isString(options) ? options : options.shapeId || options.id;\n var target;\n if (shapeId) {\n target = diagram.getShapeById(shapeId);\n if (options.connector) {\n target = target.getConnector(options.connector);\n }\n } else {\n target = new Point(options.x || 0, options.y || 0);\n }\n\n return target;\n },\n\n destroy: function() {\n var that = this;\n Widget.fn.destroy.call(that);\n\n if (this._userEvents) {\n this._userEvents.destroy();\n }\n\n kendo.unbindResize(that._resizeHandler);\n\n that.clear();\n that.element.off(NS);\n that.scroller.wrapper.off(NS);\n that.canvas.destroy(true);\n that.canvas = undefined$1;\n\n that._destroyEditor();\n that.destroyScroller();\n that._destroyGlobalToolBar();\n that._destroyToolBar();\n },\n\n destroyScroller: function() {\n var scroller = this.scroller;\n\n if (!scroller) {\n return;\n }\n\n scroller.destroy();\n scroller.element.remove();\n this.scroller = null;\n },\n\n save: function() {\n var json = {\n shapes: [],\n connections: []\n };\n var i, connection, shape;\n\n for (i = 0; i < this.shapes.length; i++) {\n shape = this.shapes[i];\n if (shape.options.serializable) {\n json.shapes.push(shape.options);\n }\n }\n\n for (i = 0; i < this.connections.length; i++) {\n connection = this.connections[i];\n\n json.connections.push(deepExtend({}, connection.options, connection.toJSON()));\n }\n\n return json;\n },\n\n focus: function() {\n if (!this.element.is(kendo._activeElement())) {\n var element = this.element,\n scrollContainer = element[0],\n containers = [],\n offsets = [],\n documentElement = document.documentElement,\n i;\n\n do {\n scrollContainer = scrollContainer.parentNode;\n\n if (scrollContainer.scrollHeight > scrollContainer.clientHeight) {\n containers.push(scrollContainer);\n offsets.push(scrollContainer.scrollTop);\n }\n } while (scrollContainer != documentElement);\n\n element.trigger(\"focus\");\n\n for (i = 0; i < containers.length; i++) {\n containers[i].scrollTop = offsets[i];\n }\n return true;\n }\n },\n\n load: function(options) {\n this.clear();\n\n this.setOptions(options);\n this._createShapes();\n this._createConnections();\n },\n\n setOptions: function(options) {\n deepExtend(this.options, options);\n },\n\n clear: function() {\n var that = this;\n\n that.select(false);\n that.mainLayer.clear();\n that._shapesQuadTree.clear();\n that._initialize();\n },\n /**\n * Connects two items.\n * @param source Shape, Connector, Point.\n * @param target Shape, Connector, Point.\n * @param options Connection options that will be passed to the newly created connection.\n * @returns The newly created connection.\n */\n connect: function(source, target, options) {\n var connection;\n if (this.connectionsDataSource && this._isEditable) {\n var dataItem = this.connectionsDataSource.add({});\n connection = this._connectionsDataMap[dataItem.uid];\n connection.source(source);\n connection.target(target);\n connection.redraw(options);\n connection.updateModel();\n } else {\n connection = new Connection(source, target,\n deepExtend({ }, this.options.connectionDefaults, options));\n\n this.addConnection(connection);\n }\n\n return connection;\n },\n /**\n * Determines whether the the two items are connected.\n * @param source Shape, Connector, Point.\n * @param target Shape, Connector, Point.\n * @returns true if the two items are connected.\n */\n connected: function(source, target) {\n for (var i = 0; i < this.connections.length; i++) {\n var c = this.connections[i];\n if (c.from == source && c.to == target) {\n return true;\n }\n }\n\n return false;\n },\n /**\n * Adds connection to the diagram.\n * @param connection Connection.\n * @param undoable Boolean.\n * @returns The newly created connection.\n */\n addConnection: function(connection, undoable) {\n if (undoable !== false) {\n this.undoRedoService.add(\n new diagram.AddConnectionUnit(connection, this), false);\n }\n\n connection.diagram = this;\n connection._setOptionsFromModel();\n connection.refresh();\n this.mainLayer.append(connection.visual);\n this.connections.push(connection);\n\n this.trigger(CHANGE, {\n added: [connection],\n removed: []\n });\n\n return connection;\n },\n\n _addConnection: function(connection, undoable) {\n var connectionsDataSource = this.connectionsDataSource;\n var dataItem;\n if (connectionsDataSource && this._isEditable) {\n dataItem = createModel(connectionsDataSource, cloneDataItem(connection.dataItem));\n connection.dataItem = dataItem;\n connection.updateModel();\n\n if (!this.trigger(\"add\", { connection: connection })) {\n this._connectionsDataMap[dataItem.uid] = connection;\n\n connectionsDataSource.add(dataItem);\n this.addConnection(connection, undoable);\n connection._updateConnectors();\n\n return connection;\n }\n } else if (!this.trigger(\"add\", { connection: connection })) {\n this.addConnection(connection, undoable);\n connection._updateConnectors();\n return connection;\n }\n },\n\n /**\n * Adds shape to the diagram.\n * @param item Shape, Point. If point is passed it will be created new Shape and positioned at that point.\n * @param options. The options to be passed to the newly created Shape.\n * @returns The newly created shape.\n */\n addShape: function(item, undoable) {\n var shape,\n shapeDefaults = this.options.shapeDefaults;\n\n if (item instanceof Shape) {\n shape = item;\n this._parseBounds(shape.bounds());\n } else if (!(item instanceof kendo.Class)) {\n shapeDefaults = deepExtend({}, shapeDefaults, item || {});\n shape = new Shape(shapeDefaults, this);\n this._parseBounds(shape.bounds());\n } else {\n return;\n }\n\n if (undoable !== false) {\n this.undoRedoService.add(new diagram.AddShapeUnit(shape, this), false);\n }\n\n this.shapes.push(shape);\n if (shape.diagram !== this) {\n this._shapesQuadTree.insert(shape);\n shape.diagram = this;\n }\n this.mainLayer.append(shape.visual);\n\n this.trigger(CHANGE, {\n added: [shape],\n removed: []\n });\n\n return shape;\n },\n\n _addShape: function(shape, undoable) {\n var that = this;\n var dataSource = that.dataSource;\n var dataItem;\n if (dataSource && this._isEditable) {\n dataItem = createModel(dataSource, cloneDataItem(shape.dataItem));\n shape.dataItem = dataItem;\n shape.updateModel();\n\n if (!this.trigger(\"add\", { shape: shape })) {\n this.dataSource.add(dataItem);\n var inactiveItem = this._inactiveShapeItems.getByUid(dataItem.uid);\n inactiveItem.element = shape;\n inactiveItem.undoable = undoable;\n return shape;\n }\n } else if (!this.trigger(\"add\", { shape: shape })) {\n return this.addShape(shape, undoable);\n }\n },\n\n _parseBounds: function(bounds) {\n bounds.x = typeof(bounds.x) == \"string\" ? parseFloat(bounds.x) : bounds.x;\n bounds.y = typeof(bounds.y) == \"string\" ? parseFloat(bounds.y) : bounds.y;\n },\n /**\n * Removes items (or single item) from the diagram.\n * @param items DiagramElement, Array of Items.\n * @param undoable.\n */\n\n remove: function(items, undoable) {\n items = isArray(items) ? items.slice(0) : [items];\n var elements = splitDiagramElements(items);\n var shapes = elements.shapes;\n var connections = elements.connections;\n var i;\n\n if (!defined(undoable)) {\n undoable = true;\n }\n\n if (undoable) {\n this.undoRedoService.begin();\n }\n\n this._suspendModelRefresh();\n for (i = shapes.length - 1; i >= 0; i--) {\n this._removeItem(shapes[i], undoable, connections);\n }\n\n for (i = connections.length - 1; i >= 0; i--) {\n this._removeItem(connections[i], undoable);\n }\n\n this._resumeModelRefresh();\n\n if (undoable) {\n this.undoRedoService.commit(false);\n }\n\n this.trigger(CHANGE, {\n added: [],\n removed: items\n });\n },\n\n _removeShapeDataItem: function(item) {\n if (this._isEditable) {\n this.dataSource.remove(item.dataItem);\n delete this._dataMap[item.dataItem.id];\n }\n },\n\n _removeConnectionDataItem: function(item) {\n if (this._isEditable) {\n this.connectionsDataSource.remove(item.dataItem);\n delete this._connectionsDataMap[item.dataItem.uid];\n }\n },\n\n _triggerRemove: function(items) {\n var toRemove = [];\n var item, args, editable;\n\n for (var idx = 0; idx < items.length; idx++) {\n item = items[idx];\n editable = item.options.editable;\n if (item instanceof Shape) {\n args = { shape: item };\n } else {\n args = { connection: item };\n }\n if (editable && editable.remove !== false && !this.trigger(\"remove\", args)) {\n toRemove.push(item);\n }\n }\n return toRemove;\n },\n\n /**\n * Executes the next undoable action on top of the undo stack if any.\n */\n undo: function() {\n this.undoRedoService.undo();\n },\n /**\n * Executes the previous undoable action on top of the redo stack if any.\n */\n redo: function() {\n this.undoRedoService.redo();\n },\n /**\n * Selects items on the basis of the given input or returns the current selection if none.\n * @param itemsOrRect DiagramElement, Array of elements, \"All\", false or Rect. A value 'false' will deselect everything.\n * @param options\n * @returns {Array}\n */\n select: function(item, options) {\n if (isDefined(item)) {\n options = deepExtend({ addToSelection: false }, options);\n\n var addToSelection = options.addToSelection,\n items = [],\n selected = [],\n i, element;\n\n if (!addToSelection) {\n this.deselect();\n }\n\n this._internalSelection = true;\n\n if (item instanceof Array) {\n items = item;\n } else if (item instanceof DiagramElement) {\n items = [ item ];\n }\n\n for (i = 0; i < items.length; i++) {\n element = items[i];\n if (element.select(true)) {\n selected.push(element);\n }\n }\n\n this._selectionChanged(selected, []);\n\n this._internalSelection = false;\n } else {\n return this._selectedItems;\n }\n },\n\n selectAll: function() {\n this.select(this.shapes.concat(this.connections));\n },\n\n selectArea: function(rect) {\n var i, items, item;\n this._internalSelection = true;\n var selected = [];\n if (rect instanceof Rect) {\n items = this.shapes.concat(this.connections);\n for (i = 0; i < items.length; i++) {\n item = items[i];\n if ((!rect || item._hitTest(rect)) && item.options.enable) {\n if (item.select(true)) {\n selected.push(item);\n }\n }\n }\n }\n\n this._selectionChanged(selected, []);\n this._internalSelection = false;\n },\n\n deselect: function(item) {\n this._internalSelection = true;\n var deselected = [],\n items = [],\n element, i;\n\n if (item instanceof Array) {\n items = item;\n } else if (item instanceof DiagramElement) {\n items.push(item);\n } else if (!isDefined(item)) {\n items = this._selectedItems.slice(0);\n }\n\n for (i = 0; i < items.length; i++) {\n element = items[i];\n if (element.select(false)) {\n deselected.push(element);\n }\n }\n\n this._selectionChanged([], deselected);\n this._internalSelection = false;\n },\n /**\n * Brings to front the passed items.\n * @param items DiagramElement, Array of Items.\n * @param undoable. By default the action is undoable.\n */\n toFront: function(items, undoable) {\n if (!items) {\n items = this._selectedItems.slice();\n }\n\n var result = this._getDiagramItems(items), indices;\n if (!defined(undoable) || undoable) {\n indices = indicesOfItems(this.mainLayer, result.visuals);\n var unit = new ToFrontUnit(this, items, indices);\n this.undoRedoService.add(unit);\n } else {\n this.mainLayer.toFront(result.visuals);\n this._fixOrdering(result, true);\n }\n },\n /**\n * Sends to back the passed items.\n * @param items DiagramElement, Array of Items.\n * @param undoable. By default the action is undoable.\n */\n toBack: function(items, undoable) {\n if (!items) {\n items = this._selectedItems.slice();\n }\n\n var result = this._getDiagramItems(items), indices;\n if (!defined(undoable) || undoable) {\n indices = indicesOfItems(this.mainLayer, result.visuals);\n var unit = new ToBackUnit(this, items, indices);\n this.undoRedoService.add(unit);\n } else {\n this.mainLayer.toBack(result.visuals);\n this._fixOrdering(result, false);\n }\n },\n /**\n * Bring into view the passed item(s) or rectangle.\n * @param items DiagramElement, Array of Items, Rect.\n * @param options. align - controls the position of the calculated rectangle relative to the viewport.\n * \"Center middle\" will position the items in the center. animate - controls if the pan should be animated.\n */\n bringIntoView: function(item, options) { // jQuery|Item|Array|Rect\n var viewport = this.viewport();\n var aligner = new diagram.RectAlign(viewport);\n var current, rect, original, newPan;\n\n if (viewport.width === 0 || viewport.height === 0) {\n return;\n }\n\n options = deepExtend({ animate: false, align: \"center middle\" }, options);\n if (options.align == \"none\") {\n options.align = \"center middle\";\n }\n\n if (item instanceof DiagramElement) {\n rect = item.bounds(TRANSFORMED);\n } else if (isArray(item)) {\n rect = this.boundingBox(item);\n } else if (item instanceof Rect) {\n rect = item.clone();\n }\n\n original = rect.clone();\n\n rect.zoom(this._zoom);\n\n if (rect.width > viewport.width || rect.height > viewport.height) {\n this._zoom = this._getValidZoom(math.min(viewport.width / original.width, viewport.height / original.height));\n rect = original.clone().zoom(this._zoom);\n }\n\n this._zoomMainLayer();\n\n current = rect.clone();\n aligner.align(rect, options.align);\n\n newPan = rect.topLeft().minus(current.topLeft());\n this.pan(newPan.times(-1), options.animate);\n },\n\n alignShapes: function(direction) {\n if (isUndefined(direction)) {\n direction = \"Left\";\n }\n var items = this.select(),\n val,\n item,\n i;\n\n if (items.length === 0) {\n return;\n }\n\n switch (direction.toLowerCase()) {\n case \"left\":\n case \"top\":\n val = MAX_VALUE;\n break;\n case \"right\":\n case \"bottom\":\n val = MIN_VALUE;\n break;\n }\n\n for (i = 0; i < items.length; i++) {\n item = items[i];\n if (item instanceof Shape) {\n switch (direction.toLowerCase()) {\n case \"left\":\n val = math.min(val, item.options.x);\n break;\n case \"top\":\n val = math.min(val, item.options.y);\n break;\n case \"right\":\n val = math.max(val, item.options.x);\n break;\n case \"bottom\":\n val = math.max(val, item.options.y);\n break;\n }\n }\n }\n var undoStates = [];\n var shapes = [];\n for (i = 0; i < items.length; i++) {\n item = items[i];\n if (item instanceof Shape) {\n shapes.push(item);\n undoStates.push(item.bounds());\n switch (direction.toLowerCase()) {\n case \"left\":\n case \"right\":\n item.position(new Point(val, item.options.y));\n break;\n case \"top\":\n case \"bottom\":\n item.position(new Point(item.options.x, val));\n break;\n }\n }\n }\n var unit = new diagram.TransformUnit(shapes, undoStates);\n this.undoRedoService.add(unit, false);\n },\n\n zoom: function(zoom, options) {\n if (zoom) {\n var staticPoint = options ? options.point : new diagram.Point(0, 0);\n // var meta = options ? options.meta : 0;\n zoom = this._zoom = this._getValidZoom(zoom);\n\n if (!isUndefined(staticPoint)) {//Viewpoint vector is constant\n staticPoint = new diagram.Point(math.round(staticPoint.x), math.round(staticPoint.y));\n var zoomedPoint = staticPoint.times(zoom);\n var viewportVector = this.modelToView(staticPoint);\n var raw = viewportVector.minus(zoomedPoint);//pan + zoomed point = viewpoint vector\n this._storePan(new diagram.Point(math.round(raw.x), math.round(raw.y)));\n }\n\n if (options) {\n options.zoom = zoom;\n }\n\n this._panTransform();\n\n this.canvas.surface.hideTooltip();\n\n this._updateAdorners();\n }\n\n return this._zoom;\n },\n\n _getPan: function(pan) {\n var canvas = this.canvas;\n if (!canvas.translate) {\n pan = pan.plus(this._pan);\n }\n return pan;\n },\n\n pan: function(pan, animate) {\n if (pan instanceof Point) {\n var that = this;\n var scroller = that.scroller;\n pan = that._getPan(pan);\n pan = pan.times(-1);\n\n if (animate) {\n scroller.animatedScrollTo(pan.x, pan.y, function() {\n that._updateAdorners();\n });\n } else {\n scroller.scrollTo(pan.x, pan.y);\n that._updateAdorners();\n }\n } else {\n return this._pan.times(-1);\n }\n },\n\n viewport: function() {\n var element = this.element;\n var width = element.width();\n var height = element.height();\n\n if (this.toolBar) {\n height -= outerHeight(this.toolBar.element);\n }\n\n return new Rect(0, 0, width, height);\n },\n copy: function() {\n if (this.options.copy.enabled) {\n this._clipboard = [];\n this._copyOffset = 1;\n for (var i = 0; i < this._selectedItems.length; i++) {\n var item = this._selectedItems[i];\n this._clipboard.push(item);\n }\n }\n },\n cut: function() {\n if (this.options.copy.enabled) {\n this._clipboard = [];\n this._copyOffset = 0;\n for (var i = 0; i < this._selectedItems.length; i++) {\n var item = this._selectedItems[i];\n this._clipboard.push(item);\n }\n this.remove(this._clipboard, true);\n }\n },\n\n paste: function() {\n if (this._clipboard.length > 0) {\n var item, copied, i;\n var mapping = {};\n var elements = splitDiagramElements(this._clipboard);\n var connections = elements.connections;\n var shapes = elements.shapes;\n var offset = {\n x: this._copyOffset * this.options.copy.offsetX,\n y: this._copyOffset * this.options.copy.offsetY\n };\n this.deselect();\n // first the shapes\n for (i = 0; i < shapes.length; i++) {\n item = shapes[i];\n copied = item.clone();\n mapping[item.id] = copied;\n copied.position(new Point(item.options.x + offset.x, item.options.y + offset.y));\n copied.diagram = this;\n copied = this._addShape(copied);\n if (copied) {\n copied.select();\n }\n }\n // then the connections\n for (i = 0; i < connections.length; i++) {\n item = connections[i];\n copied = this._addConnection(item.clone());\n if (copied) {\n this._updateCopiedConnection(copied, item, \"source\", mapping, offset);\n this._updateCopiedConnection(copied, item, \"target\", mapping, offset);\n\n copied.select(true);\n copied.updateModel();\n }\n }\n\n this._syncChanges();\n\n this._copyOffset += 1;\n }\n },\n\n _updateCopiedConnection: function(connection, sourceConnection, connectorName, mapping, offset) {\n var onActivate, inactiveItem, targetShape;\n var target = sourceConnection[connectorName]();\n var diagram = this;\n if (target instanceof Connector && mapping[target.shape.id]) {\n targetShape = mapping[target.shape.id];\n if (diagram.getShapeById(targetShape.id)) {\n connection[connectorName](targetShape.getConnector(target.options.name));\n } else {\n inactiveItem = diagram._inactiveShapeItems.getByUid(targetShape.dataItem.uid);\n if (inactiveItem) {\n onActivate = function(item) {\n targetShape = diagram._dataMap[item.id];\n connection[connectorName](targetShape.getConnector(target.options.name));\n connection.updateModel();\n };\n diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(onActivate));\n }\n }\n } else {\n connection[connectorName](new Point(sourceConnection[connectorName + \"Point\"]().x + offset.x, sourceConnection[connectorName + \"Point\"]().y + offset.y));\n }\n },\n /**\n * Gets the bounding rectangle of the given items.\n * @param items DiagramElement, Array of elements.\n * @param origin Boolean. Pass 'true' if you need to get the bounding box of the shapes without their rotation offset.\n * @returns {Rect}\n */\n boundingBox: function(items, origin) {\n var rect = Rect.empty(), temp,\n di = isDefined(items) ? this._getDiagramItems(items) : { shapes: this.shapes };\n if (di.shapes.length > 0) {\n var item = di.shapes[0];\n rect = item.bounds(ROTATED);\n for (var i = 1; i < di.shapes.length; i++) {\n item = di.shapes[i];\n temp = item.bounds(ROTATED);\n if (origin === true) {\n temp.x -= item._rotationOffset.x;\n temp.y -= item._rotationOffset.y;\n }\n rect = rect.union(temp);\n }\n }\n return rect;\n },\n\n _containerOffset: function() {\n var containerOffset = this.element.offset();\n if (this.toolBar) {\n containerOffset.top += outerHeight(this.toolBar.element);\n }\n return containerOffset;\n },\n\n documentToView: function(point) {\n var containerOffset = this._containerOffset();\n\n return new Point(point.x - containerOffset.left, point.y - containerOffset.top);\n },\n viewToDocument: function(point) {\n var containerOffset = this._containerOffset();\n\n return new Point(point.x + containerOffset.left, point.y + containerOffset.top);\n },\n viewToModel: function(point) {\n return this._transformWithMatrix(point, this._matrixInvert);\n },\n modelToView: function(point) {\n return this._transformWithMatrix(point, this._matrix);\n },\n modelToLayer: function(point) {\n return this._transformWithMatrix(point, this._layerMatrix);\n },\n layerToModel: function(point) {\n return this._transformWithMatrix(point, this._layerMatrixInvert);\n },\n documentToModel: function(point) {\n var viewPoint = this.documentToView(point);\n if (!this.canvas.translate) {\n viewPoint.x = viewPoint.x + this.scroller.scrollLeft;\n viewPoint.y = viewPoint.y + this.scroller.scrollTop;\n }\n return this.viewToModel(viewPoint);\n },\n modelToDocument: function(point) {\n return this.viewToDocument(this.modelToView(point));\n },\n _transformWithMatrix: function(point, matrix) {\n var result = point;\n if (point instanceof Point) {\n if (matrix) {\n result = matrix.apply(point);\n }\n }\n else {\n var tl = this._transformWithMatrix(point.topLeft(), matrix),\n br = this._transformWithMatrix(point.bottomRight(), matrix);\n result = Rect.fromPoints(tl, br);\n }\n return result;\n },\n\n setDataSource: function(dataSource) {\n this.options.dataSource = dataSource;\n this._dataSource();\n if (this.options.autoBind) {\n this.dataSource.fetch();\n }\n },\n\n setConnectionsDataSource: function(dataSource) {\n this.options.connectionsDataSource = dataSource;\n this._connectionDataSource();\n if (this.options.autoBind) {\n this.connectionsDataSource.fetch();\n }\n },\n\n /**\n * Performs a diagram layout of the given type.\n * @param layoutType The layout algorithm to be applied (TreeLayout, LayeredLayout, SpringLayout).\n * @param options Layout-specific options.\n */\n layout: function(options) {\n this._layouting = true;\n // TODO: raise layout event?\n var type;\n if (isUndefined(options)) {\n options = this.options.layout;\n }\n if (isUndefined(options) || isUndefined(options.type)) {\n type = \"Tree\";\n }\n else {\n type = options.type;\n }\n var l;\n switch (type.toLowerCase()) {\n case \"tree\":\n l = new diagram.TreeLayout(this);\n break;\n\n case \"layered\":\n l = new diagram.LayeredLayout(this);\n break;\n\n case \"forcedirected\":\n case \"force\":\n case \"spring\":\n case \"springembedder\":\n l = new diagram.SpringLayout(this);\n break;\n default:\n throw \"Layout algorithm '\" + type + \"' is not supported.\";\n }\n var initialState = new diagram.LayoutState(this);\n var finalState = l.layout(options);\n if (finalState) {\n var unit = new diagram.LayoutUndoUnit(initialState, finalState, options ? options.animate : null);\n this.undoRedoService.add(unit);\n }\n this._layouting = false;\n this._redrawConnections();\n },\n /**\n * Gets a shape on the basis of its identifier.\n * @param id (string) the identifier of a shape.\n * @returns {Shape}\n */\n getShapeById: function(id) {\n var found;\n found = Utils.first(this.shapes, function(s) {\n return s.visual.id === id;\n });\n if (found) {\n return found;\n }\n found = Utils.first(this.connections, function(c) {\n return c.visual.id === id;\n });\n return found;\n },\n\n getShapeByModelId: function(id) {\n var shape;\n if (this._isEditable) {\n shape = this._dataMap[id];\n } else {\n shape = Utils.first(this.shapes, function(shape) {\n return (shape.dataItem || {}).id === id;\n });\n }\n return shape;\n },\n\n getShapeByModelUid: function(uid) {\n var shape;\n if (this._isEditable) {\n shape = Utils.first(this.shapes, function(shape) {\n return (shape.dataItem || {}).uid === uid;\n });\n } else {\n shape = this._dataMap[uid];\n }\n return shape;\n },\n\n getConnectionByModelId: function(id) {\n var connection;\n if (this.connectionsDataSource) {\n connection = Utils.first(this.connections, function(connection) {\n return (connection.dataItem || {}).id === id;\n });\n }\n return connection;\n },\n\n getConnectionByModelUid: function(uid) {\n var connection;\n if (this.connectionsDataSource) {\n connection = this._connectionsDataMap[uid];\n }\n return connection;\n },\n\n _extendLayoutOptions: function(options) {\n if (options.layout) {\n options.layout = deepExtend({}, diagram.LayoutBase.fn.defaultOptions || {}, options.layout);\n }\n },\n\n _selectionChanged: function(selected, deselected) {\n if (selected.length || deselected.length) {\n this.trigger(SELECT, { selected: selected, deselected: deselected });\n }\n },\n _getValidZoom: function(zoom) {\n return math.min(math.max(zoom, this.options.zoomMin), this.options.zoomMax);\n },\n _panTransform: function(pos) {\n var diagram = this,\n pan = pos || diagram._pan;\n\n if (diagram.canvas.translate) {\n diagram.scroller.scrollTo(pan.x, pan.y);\n diagram._zoomMainLayer();\n } else {\n diagram._storePan(pan);\n diagram._transformMainLayer();\n }\n },\n\n _finishPan: function() {\n this.trigger(PAN, { total: this._pan, delta: Number.NaN });\n },\n _storePan: function(pan) {\n this._pan = pan;\n this._storeViewMatrix();\n },\n _zoomMainLayer: function() {\n var zoom = this._zoom;\n\n var transform = new CompositeTransform(0, 0, zoom, zoom);\n transform.render(this.mainLayer);\n this._storeLayerMatrix(transform);\n this._storeViewMatrix();\n },\n _transformMainLayer: function() {\n var pan = this._pan,\n zoom = this._zoom;\n\n var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n transform.render(this.mainLayer);\n this._storeLayerMatrix(transform);\n this._storeViewMatrix();\n },\n _storeLayerMatrix: function(canvasTransform) {\n this._layerMatrix = canvasTransform.toMatrix();\n this._layerMatrixInvert = canvasTransform.invert().toMatrix();\n },\n _storeViewMatrix: function() {\n var pan = this._pan,\n zoom = this._zoom;\n\n var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n this._matrix = transform.toMatrix();\n this._matrixInvert = transform.invert().toMatrix();\n },\n _toIndex: function(items, indices) {\n var result = this._getDiagramItems(items);\n this.mainLayer.toIndex(result.visuals, indices);\n this._fixOrdering(result, false);\n },\n _fixOrdering: function(result, toFront) {\n var shapePos = toFront ? this.shapes.length - 1 : 0,\n conPos = toFront ? this.connections.length - 1 : 0,\n i, item;\n for (i = 0; i < result.shapes.length; i++) {\n item = result.shapes[i];\n Utils.remove(this.shapes, item);\n Utils.insert(this.shapes, item, shapePos);\n }\n for (i = 0; i < result.cons.length; i++) {\n item = result.cons[i];\n Utils.remove(this.connections, item);\n Utils.insert(this.connections, item, conPos);\n }\n },\n _getDiagramItems: function(items) {\n var i, result = {}, args = items;\n result.visuals = [];\n result.shapes = [];\n result.cons = [];\n\n if (!items) {\n args = this._selectedItems.slice();\n } else if (!isArray(items)) {\n args = [items];\n }\n\n for (i = 0; i < args.length; i++) {\n var item = args[i];\n if (item instanceof Shape) {\n result.shapes.push(item);\n result.visuals.push(item.visual);\n } else if (item instanceof Connection) {\n result.cons.push(item);\n result.visuals.push(item.visual);\n }\n }\n\n return result;\n },\n\n _removeItem: function(item, undoable, removedConnections) {\n item.select(false);\n if (item instanceof Shape) {\n this._removeShapeDataItem(item);\n this._removeShape(item, undoable, removedConnections);\n } else if (item instanceof Connection) {\n this._removeConnectionDataItem(item);\n this._removeConnection(item, undoable);\n }\n\n this.mainLayer.remove(item.visual);\n },\n\n _removeShape: function(shape, undoable, removedConnections) {\n var i, connection, connector,\n sources = [], targets = [];\n this.toolService._removeHover();\n\n if (undoable) {\n this.undoRedoService.addCompositeItem(new DeleteShapeUnit(shape));\n }\n Utils.remove(this.shapes, shape);\n this._shapesQuadTree.remove(shape);\n\n for (i = 0; i < shape.connectors.length; i++) {\n connector = shape.connectors[i];\n for (var j = 0; j < connector.connections.length; j++) {\n connection = connector.connections[j];\n if (!removedConnections || !dataviz.inArray(connection, removedConnections)) {\n if (connection.sourceConnector == connector) {\n sources.push(connection);\n } else if (connection.targetConnector == connector) {\n targets.push(connection);\n }\n }\n }\n }\n\n for (i = 0; i < sources.length; i++) {\n sources[i].source(null, undoable);\n sources[i].updateModel();\n }\n for (i = 0; i < targets.length; i++) {\n targets[i].target(null, undoable);\n targets[i].updateModel();\n }\n },\n\n _removeConnection: function(connection, undoable) {\n if (connection.sourceConnector) {\n Utils.remove(connection.sourceConnector.connections, connection);\n }\n if (connection.targetConnector) {\n Utils.remove(connection.targetConnector.connections, connection);\n }\n if (undoable) {\n this.undoRedoService.addCompositeItem(new DeleteConnectionUnit(connection));\n }\n\n Utils.remove(this.connections, connection);\n },\n\n _removeDataItems: function(items, recursive) {\n var item, children, shape, idx;\n items = isArray(items) ? items : [items];\n\n while (items.length) {\n item = items.shift();\n shape = this._dataMap[item.uid];\n if (shape) {\n this._removeShapeConnections(shape);\n this._removeItem(shape, false);\n delete this._dataMap[item.uid];\n if (recursive && item.hasChildren && item.loaded()) {\n children = item.children.data();\n for (idx = 0; idx < children.length; idx++) {\n items.push(children[idx]);\n }\n }\n }\n }\n },\n\n _removeShapeConnections: function(shape) {\n var connections = shape.connections();\n var idx;\n\n if (connections) {\n for (idx = 0; idx < connections.length; idx++) {\n this._removeItem(connections[idx], false);\n }\n }\n },\n\n _addDataItem: function(dataItem, undoable) {\n if (!defined(dataItem)) {\n return;\n }\n\n var shape = this._dataMap[dataItem.id];\n if (shape) {\n return shape;\n }\n\n var options = deepExtend({}, this.options.shapeDefaults);\n options.dataItem = dataItem;\n shape = new Shape(options, this);\n this.addShape(shape, undoable !== false);\n this._dataMap[dataItem.id] = shape;\n return shape;\n },\n\n _addDataItemByUid: function(dataItem) {\n if (!defined(dataItem)) {\n return;\n }\n\n var shape = this._dataMap[dataItem.uid];\n if (shape) {\n return shape;\n }\n\n var options = deepExtend({}, this.options.shapeDefaults);\n options.dataItem = dataItem;\n shape = new Shape(options, this);\n this.addShape(shape);\n this._dataMap[dataItem.uid] = shape;\n return shape;\n },\n\n _addDataItems: function(items, parent) {\n var item, idx, shape, parentShape, connection;\n for (idx = 0; idx < items.length; idx++) {\n item = items[idx];\n shape = this._addDataItemByUid(item);\n parentShape = this._addDataItemByUid(parent);\n if (parentShape && !this.connected(parentShape, shape)) { // check if connected to not duplicate connections.\n connection = this.connect(parentShape, shape);\n }\n }\n },\n\n _refreshSource: function(e) {\n var that = this,\n node = e.node,\n action = e.action,\n items = e.items,\n options = that.options,\n idx,\n dataBound;\n\n if (e.field) {\n for (idx = 0; idx < items.length; idx++) {\n if (this._dataMap[items[idx].uid]) {\n this._dataMap[items[idx].uid].redrawVisual();\n }\n }\n return;\n }\n\n if (action == \"remove\") {\n this._removeDataItems(e.items, true);\n } else {\n\n if ((!action || action === \"itemloaded\") && !this._bindingRoots) {\n this._bindingRoots = true;\n dataBound = true;\n }\n\n if (!action && !node) {\n that.clear();\n }\n\n this._addDataItems(items, node);\n\n for (idx = 0; idx < items.length; idx++) {\n items[idx].load();\n }\n }\n\n if (options.layout && (dataBound || action == \"remove\" || action == \"add\")) {\n that.layout(options.layout);\n }\n\n if (dataBound) {\n this.trigger(\"dataBound\");\n this._bindingRoots = false;\n }\n },\n\n _addItem: function(item) {\n if (item instanceof Shape) {\n this.addShape(item);\n } else if (item instanceof Connection) {\n this.addConnection(item);\n }\n },\n\n _createToolBar: function(preventClosing) {\n var diagram = this.toolService.diagram;\n\n if (!this.singleToolBar && diagram.select().length === 1) {\n var element = diagram.select()[0];\n if (element && element.options.editable !== false) {\n var editable = element.options.editable;\n var tools = editable.tools;\n if (this._isEditable && tools.length === 0) {\n if (element instanceof Shape) {\n tools = [\"edit\", \"rotateClockwise\", \"rotateAnticlockwise\"];\n } else if (element instanceof Connection) {\n tools = [\"edit\"];\n }\n\n if (editable && editable.remove !== false) {\n tools.push(\"delete\");\n }\n }\n\n if (tools && tools.length) {\n var padding = 20;\n var point;\n this.singleToolBar = new DiagramToolBar(diagram, {\n tools: tools,\n click: this._toolBarClick.bind(this),\n modal: true,\n popupZIndex: parseInt(diagram.element.closest(\".k-window\").css(\"zIndex\"), 10) + 10\n });\n var popupWidth = outerWidth(this.singleToolBar._popup.element);\n var popupHeight = outerHeight(this.singleToolBar._popup.element);\n if (element instanceof Shape) {\n var shapeBounds = this.modelToView(element.bounds(ROTATED));\n point = new Point(shapeBounds.x, shapeBounds.y).minus(new Point(\n (popupWidth - shapeBounds.width) / 2,\n popupHeight + padding));\n } else if (element instanceof Connection) {\n var connectionBounds = this.modelToView(element.bounds());\n\n point = new Point(connectionBounds.x, connectionBounds.y)\n .minus(new Point(\n (popupWidth - connectionBounds.width - 20) / 2,\n popupHeight + padding\n ));\n }\n\n if (point) {\n if (!this.canvas.translate) {\n point = point.minus(new Point(this.scroller.scrollLeft, this.scroller.scrollTop));\n }\n point = this.viewToDocument(point);\n point = new Point(math.max(point.x, 0), math.max(point.y, 0));\n this.singleToolBar.showAt(point);\n if (preventClosing) {\n this.singleToolBar._popup.one(\"close\", preventDefault);\n }\n } else {\n this._destroyToolBar();\n }\n }\n }\n }\n },\n\n _toolBarClick: function(e) {\n this.trigger(\"toolBarClick\", e);\n this._destroyToolBar();\n },\n\n _normalizePointZoom: function(point) {\n return point.times(1 / this.zoom());\n },\n\n _initialize: function() {\n this.shapes = [];\n this._selectedItems = [];\n this.connections = [];\n this._dataMap = {};\n this._connectionsDataMap = {};\n this._inactiveShapeItems = new InactiveItemsCollection();\n this._deferredConnectionUpdates = [];\n this.undoRedoService = new UndoRedoService({\n undone: this._syncHandler,\n redone: this._syncHandler\n });\n this.id = diagram.randomId();\n },\n\n _fetchFreshData: function() {\n var that = this;\n that._dataSource();\n\n if (that._isEditable) {\n that._connectionDataSource();\n }\n\n if (that.options.autoBind) {\n if (that._isEditable) {\n this._loadingShapes = true;\n this._loadingConnections = true;\n that.dataSource.fetch();\n that.connectionsDataSource.fetch();\n } else {\n that.dataSource.fetch();\n }\n }\n },\n\n _dataSource: function() {\n if (defined(this.options.connectionsDataSource)) {\n this._isEditable = true;\n var dsOptions = this.options.dataSource || {};\n var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n\n if (this.dataSource && this._shapesRefreshHandler) {\n this.dataSource\n .unbind(\"change\", this._shapesRefreshHandler)\n .unbind(\"requestStart\", this._shapesRequestStartHandler)\n .unbind(\"error\", this._shapesErrorHandler);\n } else {\n this._shapesRefreshHandler = this._refreshShapes.bind(this);\n this._shapesRequestStartHandler = this._shapesRequestStart.bind(this);\n this._shapesErrorHandler = this._error.bind(this);\n }\n\n this.dataSource = kendo.data.DataSource.create(ds)\n .bind(\"change\", this._shapesRefreshHandler)\n .bind(\"requestStart\", this._shapesRequestStartHandler)\n .bind(\"error\", this._shapesErrorHandler);\n } else {\n this._treeDataSource();\n this._isEditable = false;\n }\n },\n\n _connectionDataSource: function() {\n var dsOptions = this.options.connectionsDataSource;\n if (dsOptions) {\n var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n\n if (this.connectionsDataSource && this._connectionsRefreshHandler) {\n this.connectionsDataSource\n .unbind(\"change\", this._connectionsRefreshHandler)\n .unbind(\"requestStart\", this._connectionsRequestStartHandler)\n .unbind(\"error\", this._connectionsErrorHandler);\n } else {\n this._connectionsRefreshHandler = this._refreshConnections.bind(this);\n this._connectionsRequestStartHandler = this._connectionsRequestStart.bind(this);\n this._connectionsErrorHandler = this._connectionsError.bind(this);\n }\n\n this.connectionsDataSource = kendo.data.DataSource.create(ds)\n .bind(\"change\", this._connectionsRefreshHandler)\n .bind(\"requestStart\", this._connectionsRequestStartHandler)\n .bind(\"error\", this._connectionsErrorHandler);\n }\n },\n\n _shapesRequestStart: function(e) {\n if (e.type == \"read\") {\n this._loadingShapes = true;\n }\n },\n\n _connectionsRequestStart: function(e) {\n if (e.type == \"read\") {\n this._loadingConnections = true;\n }\n },\n\n _error: function() {\n this._loadingShapes = false;\n },\n\n _connectionsError: function() {\n this._loadingConnections = false;\n },\n\n _refreshShapes: function(e) {\n if (e.action === \"remove\") {\n if (this._shouldRefresh()) {\n this._removeShapes(e.items);\n }\n } else if (e.action === \"itemchange\") {\n if (this._shouldRefresh()) {\n this._updateShapes(e.items, e.field);\n }\n } else if (e.action === \"add\") {\n this._inactiveShapeItems.add(e.items);\n } else if (e.action === \"sync\") {\n this._syncShapes(e.items);\n } else {\n this.refresh();\n }\n },\n\n _shouldRefresh: function() {\n return !this._suspended;\n },\n\n _suspendModelRefresh: function() {\n this._suspended = (this._suspended || 0) + 1;\n },\n\n _resumeModelRefresh: function() {\n this._suspended = math.max((this._suspended || 0) - 1, 0);\n },\n\n refresh: function() {\n this._loadingShapes = false;\n if (!this._loadingConnections) {\n this._rebindShapesAndConnections();\n }\n },\n\n _rebindShapesAndConnections: function() {\n this.clear();\n this._addShapes(this.dataSource.view());\n if (this.connectionsDataSource) {\n this._addConnections(this.connectionsDataSource.view(), false);\n }\n\n if (this.options.layout) {\n this.layout(this.options.layout);\n } else {\n this._redrawConnections();\n }\n this.trigger(\"dataBound\");\n },\n\n refreshConnections: function() {\n this._loadingConnections = false;\n if (!this._loadingShapes) {\n this._rebindShapesAndConnections();\n }\n },\n\n _redrawConnections: function() {\n var connections = this.connections;\n for (var idx = 0; idx < connections.length; idx++) {\n connections[idx].refresh();\n }\n },\n\n _removeShapes: function(items) {\n var dataMap = this._dataMap;\n var item, i;\n for (i = 0; i < items.length; i++) {\n item = items[i];\n if (dataMap[item.id]) {\n this.remove(dataMap[item.id], false);\n dataMap[item.id] = null;\n }\n }\n },\n\n _syncShapes: function() {\n var diagram = this;\n var inactiveItems = diagram._inactiveShapeItems;\n inactiveItems.forEach(function(inactiveItem) {\n var dataItem = inactiveItem.dataItem;\n var shape = inactiveItem.element;\n if (!dataItem.isNew()) {\n if (shape) {\n shape._setOptionsFromModel();\n diagram.addShape(shape, inactiveItem.undoable);\n diagram._dataMap[dataItem.id] = shape;\n } else {\n diagram._addDataItem(dataItem);\n }\n inactiveItem.activate();\n inactiveItems.remove(dataItem);\n }\n });\n },\n\n _updateShapes: function(items, field) {\n for (var i = 0; i < items.length; i++) {\n var dataItem = items[i];\n\n var shape = this._dataMap[dataItem.id];\n if (shape) {\n shape.updateOptionsFromModel(dataItem, field);\n }\n }\n },\n\n _addShapes: function(dataItems) {\n for (var i = 0; i < dataItems.length; i++) {\n this._addDataItem(dataItems[i], false);\n }\n },\n\n _refreshConnections: function(e) {\n if (e.action === \"remove\") {\n if (this._shouldRefresh()) {\n this._removeConnections(e.items);\n }\n } else if (e.action === \"add\") {\n this._addConnections(e.items);\n } else if (e.action === \"sync\") {\n //TO DO: include logic to update the connections with different values returned from the server.\n } else if (e.action === \"itemchange\") {\n if (this._shouldRefresh()) {\n this._updateConnections(e.items);\n }\n } else {\n this.refreshConnections();\n }\n },\n\n _removeConnections: function(items) {\n for (var i = 0; i < items.length; i++) {\n this.remove(this._connectionsDataMap[items[i].uid], false);\n this._connectionsDataMap[items[i].uid] = null;\n }\n },\n\n _updateConnections: function(items) {\n for (var i = 0; i < items.length; i++) {\n var dataItem = items[i];\n\n var connection = this._connectionsDataMap[dataItem.uid];\n connection.updateOptionsFromModel(dataItem);\n }\n },\n\n _addConnections: function(connections, undoable) {\n var length = connections.length;\n\n for (var i = 0; i < length; i++) {\n var dataItem = connections[i];\n this._addConnectionDataItem(dataItem, undoable);\n }\n },\n\n _addConnectionDataItem: function(dataItem, undoable) {\n if (!this._connectionsDataMap[dataItem.uid]) {\n var from = this._validateConnector(dataItem.from);\n if (!defined(from) || from === null) {\n from = new Point(dataItem.fromX, dataItem.fromY);\n }\n\n var to = this._validateConnector(dataItem.to);\n if (!defined(to) || to === null) {\n to = new Point(dataItem.toX, dataItem.toY);\n }\n\n if (defined(from) && defined(to)) {\n var options = deepExtend({}, this.options.connectionDefaults);\n options.dataItem = dataItem;\n var connection = new Connection(from, to, options);\n\n this._connectionsDataMap[dataItem.uid] = connection;\n this.addConnection(connection, undoable);\n }\n }\n },\n\n _validateConnector: function(value) {\n var connector;\n\n if (defined(value) && value !== null) {\n connector = this._dataMap[value];\n }\n\n return connector;\n },\n\n _treeDataSource: function() {\n var that = this,\n options = that.options,\n dataSource = options.dataSource;\n\n dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n\n if (dataSource instanceof kendo.data.DataSource && !(dataSource instanceof kendo.data.HierarchicalDataSource)) {\n 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 }\n\n if (!dataSource.fields) {\n dataSource.fields = [\n { field: \"text\" },\n { field: \"url\" },\n { field: \"spriteCssClass\" },\n { field: \"imageUrl\" }\n ];\n }\n if (that.dataSource && that._refreshHandler) {\n that._unbindDataSource();\n }\n\n that._refreshHandler = that._refreshSource.bind(that);\n that._errorHandler = that._error.bind(that);\n\n that.dataSource = HierarchicalDataSource.create(dataSource)\n .bind(CHANGE, that._refreshHandler)\n .bind(ERROR, that._errorHandler);\n },\n\n _unbindDataSource: function() {\n var that = this;\n\n that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(ERROR, that._errorHandler);\n },\n\n _adorn: function(adorner, isActive) {\n if (isActive !== undefined$1 && adorner) {\n if (isActive) {\n this._adorners.push(adorner);\n this.adornerLayer.append(adorner.visual);\n }\n else {\n Utils.remove(this._adorners, adorner);\n this.adornerLayer.remove(adorner.visual);\n }\n }\n },\n\n _showConnectors: function(shape, value) {\n if (value) {\n this._connectorsAdorner.show(shape);\n } else {\n this._connectorsAdorner.destroy();\n }\n },\n\n _updateAdorners: function() {\n var adorners = this._adorners;\n\n for (var i = 0; i < adorners.length; i++) {\n var adorner = adorners[i];\n\n if (adorner.refreshBounds) {\n adorner.refreshBounds();\n }\n adorner.refresh();\n }\n },\n\n _refresh: function() {\n for (var i = 0; i < this.connections.length; i++) {\n this.connections[i].refresh();\n }\n },\n\n _destroyToolBar: function() {\n if (this.singleToolBar) {\n this.singleToolBar.hide();\n this.singleToolBar.destroy();\n this.singleToolBar = null;\n }\n },\n\n _destroyGlobalToolBar: function() {\n if (this.toolBar) {\n this.toolBar.hide();\n this.toolBar.destroy();\n this.toolBar = null;\n }\n },\n\n exportDOMVisual: function() {\n var viewBox = this.canvas._viewBox;\n var scrollOffset = geom.transform()\n .translate(-viewBox.x, -viewBox.y);\n\n var viewRect = new geom.Rect([0, 0], [viewBox.width, viewBox.height]);\n var clipPath = draw.Path.fromRect(viewRect);\n var wrap = new draw.Group({ transform: scrollOffset });\n var clipWrap = new draw.Group({ clip: clipPath });\n var root = this.canvas.drawingElement.children[0];\n\n clipWrap.append(wrap);\n\n // Don't reparent the root\n wrap.children.push(root);\n\n return clipWrap;\n },\n\n exportVisual: function() {\n var scale = geom.transform().scale(1 / this._zoom);\n var wrap = new draw.Group({\n transform: scale\n });\n\n var root = this.mainLayer.drawingElement;\n wrap.children.push(root);\n\n return wrap;\n },\n\n _syncChanges: function() {\n this._syncShapeChanges();\n this._syncConnectionChanges();\n },\n\n _syncShapeChanges: function() {\n if (this.dataSource && this._isEditable) {\n this.dataSource.sync();\n }\n },\n\n _syncConnectionChanges: function() {\n var that = this;\n if (that.connectionsDataSource && that._isEditable) {\n $.when.apply($, that._deferredConnectionUpdates).then(function() {\n that.connectionsDataSource.sync();\n });\n that.deferredConnectionUpdates = [];\n }\n }\n });\n\n dataviz.ExportMixin.extend(Diagram.fn, true);\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(Diagram.fn);\n }\n\n function filterShapeDataItem(dataItem) {\n var result = {};\n\n dataItem = dataItem || {};\n\n if (defined(dataItem.text) && dataItem.text !== null) {\n result.text = dataItem.text;\n }\n\n if (defined(dataItem.x) && dataItem.x !== null) {\n result.x = dataItem.x;\n }\n\n if (defined(dataItem.y) && dataItem.y !== null) {\n result.y = dataItem.y;\n }\n\n if (defined(dataItem.width) && dataItem.width !== null) {\n result.width = dataItem.width;\n }\n\n if (defined(dataItem.height) && dataItem.height !== null) {\n result.height = dataItem.height;\n }\n\n if (defined(dataItem.type) && dataItem.type !== null) {\n result.type = dataItem.type;\n }\n\n return result;\n }\n\n function filterConnectionDataItem(dataItem) {\n var result = {};\n\n dataItem = dataItem || {};\n\n if (defined(dataItem.text) && dataItem.text !== null) {\n result.content = dataItem.text;\n }\n\n if (defined(dataItem.type) && dataItem.type !== null) {\n result.type = dataItem.type;\n }\n\n if (defined(dataItem.from) && dataItem.from !== null) {\n result.from = dataItem.from;\n }\n\n if (defined(dataItem.fromConnector) && dataItem.fromConnector !== null) {\n result.fromConnector = dataItem.fromConnector;\n }\n\n if (defined(dataItem.fromX) && dataItem.fromX !== null) {\n result.fromX = dataItem.fromX;\n }\n\n if (defined(dataItem.fromY) && dataItem.fromY !== null) {\n result.fromY = dataItem.fromY;\n }\n\n if (defined(dataItem.to) && dataItem.to !== null) {\n result.to = dataItem.to;\n }\n\n if (defined(dataItem.toConnector) && dataItem.toConnector !== null) {\n result.toConnector = dataItem.toConnector;\n }\n\n if (defined(dataItem.toX) && dataItem.toX !== null) {\n result.toX = dataItem.toX;\n }\n\n if (defined(dataItem.toY) && dataItem.toY !== null) {\n result.toY = dataItem.toY;\n }\n\n return result;\n }\n\n\n var DiagramToolBar = kendo.Observable.extend({\n init: function(diagram, options) {\n kendo.Observable.fn.init.call(this);\n this.diagram = diagram;\n this.options = deepExtend({}, this.options, options);\n this._tools = [];\n this.createToolBar();\n this.createTools();\n this.appendTools();\n\n if (this.options.modal) {\n this.createPopup();\n }\n\n this.bind(this.events, options);\n },\n\n events: [\"click\"],\n\n createPopup: function() {\n this.container = $(\"
\").append(this.element);\n this._popup = this.container.kendoPopup({}).getKendoPopup();\n },\n\n appendTools: function() {\n for (var i = 0; i < this._tools.length; i++) {\n var tool = this._tools[i];\n if (tool.buttons && tool.buttons.length || !defined(tool.buttons)) {\n this._toolBar.add(tool);\n }\n }\n },\n\n createToolBar: function() {\n this.element = $(\"
\");\n this._toolBar = this.element\n .kendoToolBar({\n click: this.click.bind(this),\n resizable: false\n }).getKendoToolBar();\n\n this.element.css(\"border\", \"none\");\n },\n\n createTools: function() {\n for (var i = 0; i < this.options.tools.length; i++) {\n this.createTool(this.options.tools[i]);\n }\n },\n\n createTool: function(tool) {\n if (!isPlainObject(tool)) {\n tool = {\n name: tool\n };\n }\n var toolName = tool.name + \"Tool\";\n if (this[toolName]) {\n this[toolName](tool);\n } else {\n this._tools.push(deepExtend({}, tool, {\n attributes: this._setAttributes({ action: tool.name })\n }));\n }\n },\n\n showAt: function(point) {\n var popupZIndex = parseInt(this.options.popupZIndex, 10);\n\n if (this._popup) {\n this._popup.open(point.x, point.y);\n\n if (popupZIndex) {\n this._popup.wrapper.css(\"zIndex\", popupZIndex);\n }\n }\n },\n\n hide: function() {\n if (this._popup) {\n this._popup.close();\n }\n },\n\n newGroup: function() {\n return {\n type: \"buttonGroup\",\n buttons: []\n };\n },\n\n editTool: function() {\n this._tools.push({\n icon: \"pencil\",\n showText: \"overflow\",\n type: \"button\",\n text: \"Edit\",\n attributes: this._setAttributes({ action: \"edit\" })\n });\n },\n\n deleteTool: function() {\n this._tools.push({\n icon: \"x\",\n showText: \"overflow\",\n type: \"button\",\n text: \"Delete\",\n attributes: this._setAttributes({ action: \"delete\" })\n });\n },\n\n rotateAnticlockwiseTool: function(options) {\n this._appendGroup(\"rotate\");\n this._rotateGroup.buttons.push({\n icon: \"rotate-left\",\n showText: \"overflow\",\n text: \"RotateAnticlockwise\",\n group: \"rotate\",\n attributes: this._setAttributes({ action: \"rotateAnticlockwise\", step: options.step })\n });\n },\n\n rotateClockwiseTool: function(options) {\n this._appendGroup(\"rotate\");\n this._rotateGroup.buttons.push({\n icon: \"rotate-right\",\n attributes: this._setAttributes({ action: \"rotateClockwise\", step: options.step }),\n showText: \"overflow\",\n text: \"RotateClockwise\",\n group: \"rotate\"\n });\n },\n\n createShapeTool: function() {\n this._appendGroup(\"create\");\n this._createGroup.buttons.push({\n icon: \"shapes\",\n showText: \"overflow\",\n text: \"CreateShape\",\n group: \"create\",\n attributes: this._setAttributes({ action: \"createShape\" })\n });\n },\n\n createConnectionTool: function() {\n this._appendGroup(\"create\");\n this._createGroup.buttons.push({\n icon: \"connector\",\n showText: \"overflow\",\n text: \"CreateConnection\",\n group: \"create\",\n attributes: this._setAttributes({ action: \"createConnection\" })\n });\n },\n\n undoTool: function() {\n this._appendGroup(\"history\");\n this._historyGroup.buttons.push({\n icon: \"undo\",\n showText: \"overflow\",\n text: \"Undo\",\n group: \"history\",\n attributes: this._setAttributes({ action: \"undo\" })\n });\n },\n\n redoTool: function() {\n this._appendGroup(\"history\");\n this._historyGroup.buttons.push({\n icon: \"redo\",\n showText: \"overflow\",\n text: \"Redo\",\n group: \"history\",\n attributes: this._setAttributes({ action: \"redo\" })\n });\n },\n\n _appendGroup: function(name) {\n var prop = \"_\" + name + \"Group\";\n if (!this[prop]) {\n this[prop] = this.newGroup();\n this._tools.push(this[prop]);\n }\n },\n\n _setAttributes: function(attributes) {\n var attr = {};\n\n if (attributes.action) {\n attr[kendo.attr(\"action\")] = attributes.action;\n }\n\n if (attributes.step) {\n attr[kendo.attr(\"step\")] = attributes.step;\n }\n\n return attr;\n },\n\n _getAttributes: function(element) {\n var attr = {};\n\n var action = element.attr(kendo.attr(\"action\"));\n if (action) {\n attr.action = action;\n }\n\n var step = element.attr(kendo.attr(\"step\"));\n if (step) {\n attr.step = step;\n }\n\n return attr;\n },\n\n click: function(e) {\n var attributes = this._getAttributes($(e.target));\n var action = attributes.action;\n\n if (action && this[action]) {\n this[action](attributes);\n }\n\n this.trigger(\"click\", this.eventData(action, e.target));\n },\n\n eventData: function(action, target) {\n var elements = this.selectedElements(),\n length = elements.length,\n shapes = [], connections = [], element;\n\n for (var idx = 0; idx < length; idx++) {\n element = elements[idx];\n if (element instanceof Shape) {\n shapes.push(element);\n } else {\n connections.push(element);\n }\n }\n\n return {\n shapes: shapes,\n connections: connections,\n action: action,\n target: target\n };\n },\n\n \"delete\": function() {\n var diagram = this.diagram;\n var toRemove = diagram._triggerRemove(this.selectedElements());\n if (toRemove.length) {\n this.diagram.remove(toRemove, true);\n this.diagram._syncChanges();\n }\n },\n\n edit: function() {\n var selectedElemens = this.selectedElements();\n if (selectedElemens.length === 1) {\n this.diagram.edit(selectedElemens[0]);\n }\n },\n\n rotateClockwise: function(options) {\n var angle = parseFloat(options.step || 90);\n this._rotate(angle);\n },\n\n rotateAnticlockwise: function(options) {\n var angle = parseFloat(options.step || 90);\n this._rotate(-angle);\n },\n\n _rotate: function(angle) {\n var adorner = this.diagram._resizingAdorner;\n adorner.angle(adorner.angle() + angle);\n adorner.rotate();\n },\n\n selectedElements: function() {\n return this.diagram.select();\n },\n\n createShape: function() {\n this.diagram.createShape();\n },\n\n createConnection: function() {\n this.diagram.createConnection();\n },\n\n undo: function() {\n this.diagram.undo();\n },\n\n redo: function() {\n this.diagram.redo();\n },\n\n destroy: function() {\n this.diagram = null;\n this.element = null;\n this.options = null;\n\n if (this._toolBar) {\n this._toolBar.destroy();\n }\n\n if (this._popup) {\n this._popup.destroy();\n }\n }\n });\n\n var Editor = kendo.Observable.extend({\n init: function(element, options) {\n kendo.Observable.fn.init.call(this);\n\n this.options = extend(true, {}, this.options, options);\n this.element = element;\n this.model = this.options.model;\n this.fields = this._getFields();\n this._initContainer();\n this.createEditable();\n },\n\n options: {\n editors: {}\n },\n\n _initContainer: function() {\n this.wrapper = this.element;\n },\n\n createEditable: function() {\n var options = this.options;\n\n this.editable = new kendo.ui.Editable(this.wrapper, {\n fields: this.fields,\n target: options.target,\n clearContainer: false,\n model: this.model\n });\n },\n\n _isEditable: function(field) {\n return this.model.editable && this.model.editable(field);\n },\n\n _getFields: function() {\n var fields = [];\n var modelFields = this.model.fields;\n\n for (var field in modelFields) {\n var result = {};\n if (this._isEditable(field)) {\n var editor = this.options.editors[field];\n if (editor) {\n result.editor = editor;\n }\n result.field = field;\n fields.push(result);\n }\n }\n\n return fields;\n },\n\n end: function() {\n return this.editable.end();\n },\n\n destroy: function() {\n this.editable.destroy();\n this.editable.element.find(\"[\" + kendo.attr(\"container-for\") + \"]\").empty();\n this.model = this.wrapper = this.element = this.columns = this.editable = null;\n }\n });\n\n var PopupEditor = Editor.extend({\n init: function(element, options) {\n Editor.fn.init.call(this, element, options);\n this.bind(this.events, this.options);\n\n this.open();\n },\n\n events: [ \"update\", \"cancel\" ],\n\n options: {\n window: {\n modal: true,\n resizable: false,\n draggable: true,\n title: \"Edit\",\n visible: false\n }\n },\n\n _initContainer: function() {\n var that = this;\n this.wrapper = $('