{"version":3,"sources":["kendo.dataviz.diagram.js"],"names":["f","define","$","normalizeText","text","String","replace","REPLACE_REGEX","SPACE","objectKey","object","key","parts","push","sort","join","hashKey","str","i","hash","length","charCodeAt","zeroSize","width","height","baseline","measureText","style","measureBox","TextMetrics","current","measure","LRUCache","DEFAULT_OPTIONS","defaultMeasureBox","window","kendo","util","Class","extend","init","size","this","_size","_length","_map","put","value","map","entry","_head","_tail","newer","older","get","baselineMarkerSize","document","createElement","cssText","options","_cache","styleKey","cacheKey","cachedResult","baselineMarker","textStr","box","_baselineMarker","cloneNode","textContent","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","marker","deepExtend","jQuery","amd","a1","a2","a3","undefined","Range","start","stop","step","rangeIntegerScale","x","k","range","j","Utils","sign","Infinity","Math","abs","findRadian","end","sngXComp","sngYComp","y","atan","PI","Easing","Ticker","diagram","dataviz","isArray","EPSILON","isNearZero","num","isDefined","obj","isUndefined","isObject","Object","has","hasOwnProperty","call","isString","prototype","toString","isBoolean","isType","type","isNumber","isNaN","parseFloat","isFinite","isEmpty","simpleExtend","destination","source","name","initArray","array","serializePoints","points","p","res","deserializePoints","s","v","split","Point","parseInt","randomInteger","lower","upper","floor","random","DFT","el","func","item","childNodes","getMatrixAngle","m","d","atan2","b","getMatrixScaling","sX","sqrt","a","c","sY","number","findAngle","center","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","n","addRange","apply","easeInOut","pos","cos","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","clearInterval","play","origin","initState","reverse","propagate","update","movement","now","timePassed","ui","intersectLine","start1","end1","start2","end2","isSegment","num1","num2","r","tangensdiff","normalVariable","mean","deviation","log","randomId","chars","charAt","round","PathDefiner","Rect","Size","Intersect","RectAlign","Polar","Matrix","MatrixVector","Geometry","HashTable","Dictionary","Queue","Set","Node","Link","Graph","Point2D","isFunction","HITTESTAREA","fn","plus","minus","offset","times","normalize","lengthSquared","middleOf","q","toPolar","useDegrees","halfpi","len","factor","isOnLine","temp","r1","r2","o1","u1","inflate","union","parse","tempStr","slice","xy","left","right","point","dx","dy","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","delta","scaled","thisCenter","zoom","overlaps","rectBottomRight","Empty","toRect","empty","fromPoints","lines","segments","rectWithLine","rects","rect1","rect2","intersect","reverseAngle","container","align","content","alignment","alignValues","toLowerCase","_singleAlign","_align","_left","_center","_right","stretch","_stretch","_top","middle","_middle","_bottom","alignCalc","e","applyRect","fromSVGMatrix","vm","fromMatrixVector","fromList","translation","unit","rotation","sin","scaling","nums","trim","substr","fromMatrix","_distanceToLineSquared","d2","pt1","pt2","vx","vy","dot","distanceToLine","distanceToPolyline","p1","p2","minimum","Number","MAX_VALUE","_buckets","add","_createGetBucket","_bucketExists","set","containsKey","hashId","_hash","bucket","hashes","_hashes","ht","_hashString","_objectHashId","ch","id","_hashId","Observable","dictionary","that","_hashTable","Error","forEachValue","forEachKey","keys","enqueue","next","dequeue","resource","kv","toArray","shape","links","outgoing","incoming","weight","associatedShape","bounds","data","shortForm","isVirtual","isIsolated","isLinkedTo","node","link","getComplement","getChildren","children","getParents","parents","copy","balance","owner","adjacentTo","removeLink","hasLinkTo","degree","incidentWith","getLinksWith","getNeighbors","neighbors","connection","sourceFound","targetFound","associatedConnection","getCommonNode","isBridging","v1","v2","getNodes","changeSource","changeTarget","changesNodes","w","oldSource","oldTarget","directTo","createReverseEdge","reversed","idOrDiagram","nodes","_nodeMap","_root","_hasCachedRelationships","cacheRelationships","forceRebuild","assignLevels","startNode","visited","child","level","root","found","getConnectedComponents","componentId","components","graph","componentIndex","setItemIndices","_collectConnectedNodes","addNodeAndOutgoings","setIds","nodeIndex","nextId","calcBounds","getSpanningTree","remaining","levelCount","ni","cn","newLink","treeLevels","tree","_addNode","pop","addLink","takeRandomNode","excludedNodes","incidenceLessThan","pool","isHealthy","hasNode","sourceOrLink","foundSource","foundTarget","addExistingLink","getNode","addNode","removeAllLinks","t","hasLink","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","oneLink","oneNode","rev","N","intensityCatalog","flowIntensity","catalogEqualIntensity","sourceStack","targetStack","intensity","targets","li","targetLink","sources","si","sourceLink","maxdiff","ri","ril","u","vertexOrder","kk","reversedEdges","unshift","concat","Predefined","EightGraph","Mindmap","ThreeGraph","BinaryTree","levels","createBalancedTree","Linear","Tree","siblingsCount","Forest","trees","createBalancedForest","Workflow","Grid","previous","g","graphString","previousLink","part","lin","_addShape","kendoDiagram","shapeDefaults","radius","fill","undoable","addShape","_addConnection","connect","createDiagramFromGraph","doLayout","randomSize","opt","gli","sourceShape","targetShape","l","shi","clientWidth","clientHeight","color","SpringLayout","layoutGraph","limitToView","counter","lastAdded","news","parent","treeCount","createRandomConnectedGraph","nodeCount","maxIncidence","isTree","poolNode","randomAdditions","randomDiagram","shapeCount","diffNumericOptions","fields","field","elementOptions","hasChanges","sizeOptionsOrDefault","normalizeDrawingOptions","drawingOptions","getColor","TRANSPARENT","Color","toHex","lineAngle","xDiff","yDiff","deg","createSegment","Segment","toDrawingRect","Scale","Translation","Rotation","CompositeTransform","AutoSizeableMixin","Element","VisualBase","TextBlock","Rectangle","MarkerBase","CircleMarker","ArrowMarker","MarkerPathMixin","Path","Line","Polyline","Image","Group","Layout","Circle","Canvas","geometry","drawing","defined","Markers","none","arrowStart","filledCircle","arrowEnd","FULL_CIRCLE_ANGLE","START","END","WIDTH","HEIGHT","X","Y","toMatrix","format","invert","toMatrixVector","Length","ZERO","create","values","translate","transform","render","visual","_transform","_renderTransform","rotateMatrix","scaleMatrix","translatePoint","_setScale","originWidth","_originWidth","originHeight","_originHeight","_setTranslate","_initSize","autoSize","_measure","_updateSize","_diffNumericOptions","_originSize","visible","drawingContainer","redraw","drawingElement","matrix","_hover","force","startPoint","_measured","_boundingBox","rawBBox","stroke","opacity","_fill","_stroke","show","hover","strokeOptions","dashType","fillOptions","gradient","GradientClass","RadialGradient","LinearGradient","_textColor","_font","_initText","fontSize","fontFamily","Text","font","fontOptions","fontStyle","fontWeight","sizeChanged","textOptions","_initPath","_setPosition","_drawPath","closed","sizeOptions","elements","anchor","_transformToPath","path","transformCopy","positionMarker","targetSegment","_linePoints","endPoint","nextSegment","prevSegment","controlOut","controlIn","_getPath","MultiPath","paths","_normalizeMarkerOptions","startCap","endCap","_removeMarker","_markers","_createMarkers","_createMarker","markerType","append","_positionMarker","_capMap","_redrawMarker","pathChange","pathOptions","cap","pathCapType","optionsCap","created","_redrawMarkers","_createElements","_setData","multipath","_updatePath","_pointsDiffer","currentPoints","differ","_initImage","src","_rect","_childrenChange","_remove","removeAt","toFront","visuals","toBack","_reorderChildren","toIndex","group","drawingChildren","fixedPosition","boundingBox","childBoundingBox","_includeInBBox","clippedBBox","drawingRect","reflow","_initCircle","circleOptions","move","_circle","setRadius","surface","Surface","_translate","_viewBox","viewBox","setSize","draw","insertBefore","destroy","clearHtml","testKey","toUpperCase","hitToOppositeSide","hit","canDrag","editable","drag","hitTestShapeConnectors","connector","idx","connectors","HIT_TEST_DISTANCE","noMeta","meta","ctrlKey","altKey","shiftKey","PositionAdapter","LayoutUndoUnit","CompositeUnit","ConnectionEditUnit","ConnectionEditUndoUnit","DeleteConnectionUnit","DeleteShapeUnit","TransformUnit","AddConnectionUnit","AddShapeUnit","PanUndoUnit","RotateUnit","ToFrontUnit","ToBackUnit","UndoRedoService","EmptyTool","ScrollerTool","PointerTool","SelectionTool","ConnectionTool","ConnectionEditTool","ToolService","ConnectionRouterBase","LinearConnectionRouter","PolylineRouter","CascadingRouter","AdornerBase","ConnectionEditAdorner","ConnectorsAdorner","ResizingAdorner","Selector","ConnectorVisual","Movable","proxy","Cursors","arrow","grip","cross","select","south","east","west","north","rowresize","colresize","AUTO","TOP","RIGHT","LEFT","BOTTOM","DEFAULT_SNAP_SIZE","DEFAULT_SNAP_ANGLE","DRAG_START","DRAG","DRAG_END","ITEMROTATE","ITEMBOUNDSCHANGE","MIN_SNAP_SIZE","MIN_SNAP_ANGLE","MOUSE_ENTER","MOUSE_LEAVE","ZOOM_START","ZOOM_END","SCROLL_MIN","SCROLL_MAX","FRICTION","FRICTION_MOBILE","VELOCITY_MULTIPLIER","PAN","ROTATED","SOURCE","TARGET","HANDLE_NAMES","-1","1","layoutState","pusher","getShapeById","subjects","froms","tos","initialState","finalState","animate","_initialState","_finalState","title","undo","setState","redo","state","ticker","conn","units","undoUnit","redoSource","redoTarget","_redoSource","_redoTarget","_undoSource","_undoTarget","_updateConnector","updateModel","undoSource","undoTarget","targetConnector","shapes","undoStates","adorner","redoStates","layout","refreshBounds","refresh","deselect","initialPosition","finalPosition","finalPos","pan","undoRotates","redoRotates","redoAngle","_angle","_innerBounds","_initialize","items","initialIndices","_toIndex","bind","events","capacity","begin","composite","cancel","commit","execute","_restart","addCompositeItem","count","toolService","tryActivate","getCursor","canvas","scroller","virtualScroll","tool","friction","support","mobileOS","scrollable","kendoMobileScroller","velocityMultiplier","mousewheelScrolling","scroll","_move","movableCanvas","dimension","makeVirtual","virtualSize","dimensions","disable","pannable","enabled","hoveredItem","hoveredAdorner","_hoveredConnector","enable","args","scrollPos","scrollLeft","scrollTop","_storePan","moveTo","_pan","selectSingle","handle","_hitTest","_resizingAdorner","isDragHandle","connections","undoRedoService","_getCursor","selectable","multiple","selector","isSelected","selectArea","_createConnection","_c","connectionHandle","_connectionManipulation","_removeHover","activeConnection","_cachedTouchTarget","cachedTouchTarget","sourceConnector","Shape","getConnector","_syncConnectionChanges","_connectorsAdorner","isActive","handleName","tools","activeTool","_updateHoveredItem","_activateTool","_updateCursor","focus","suspendTracking","updateHovered","resumeTracking","keyDown","toRemove","metaKey","_triggerRemove","_syncChanges","_destroyToolBar","_discardNewConnection","selectAll","cut","paste","wheel","z","zoomRate","zoomOptions","zoomMin","zoomMax","setTool","addToSelection","newConnection","cursor","css","disabledShape","isNew","selectedConnections","_visible","_selectedItems","Connection","_hitTestItems","_hitTestElements","mainLayer","shapeIdx","connectionIdx","shapeHit","connectionHit","hitTest","rec","getBounds","allPoints","route","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","horizontal","_adorners","sp","tp","_ts","spVisual","handles","epVisual","_initialSource","_initialTarget","ts","radiusX","radiusY","sourcePointDistance","distanceTo","targetPointDistance","sourceHandle","targetHandle","modelToLayer","_refreshHandler","ctr","_clearVisual","_keepCachedTouchTarget","visualChildren","childrenCount","unbind","each","_manipulating","_initSelection","_createHandles","selected","_internalChange","_rotatedHandler","_resizable","resize","_handleOptions","_bounds","handleBounds","handlesCount","_getHandleBounds","_rotationOffset","_startAngle","_rotates","_positions","initialRotates","initialStates","handleOptions","_sp","_cp","_lp","shapeStates","visibleHandles","currentAngle","dragging","newBounds","staticPoint","thr","newCenter","oldBounds","dtl","dbr","changed","_truncateAngle","_rotating","shouldSnap","_truncateDistance","_displaceBounds","minWidth","minHeight","states","_truncatePositionToGuides","ruler","truncatePositionToGuides","_truncateSizeToGuides","truncateSizeToGuides","snap","snapOptions","snapAngle","snapSize","_diffStates","_syncShapeChanges","thumb","rotationThumb","_rotationThumbBounds","_ep","_adorn","visualBounds","modelToView","relative","_visualBounds","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","startY","resultLinkSet","resultNodeSet","boundingRect","currentHeight","currentWidth","moveToOffset","nodeBounds","newpoints","pt","deltax","deltay","currentHorizontalOffset","transferOptions","DiagramToHyperTreeAdapter","shapeMap","edges","edgeMap","finalNodes","finalLinks","ignoredConnections","ignoredShapes","hyperMap","hyperTree","finalGraph","convert","_renormalizeShapes","_renormalizeConnections","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","newEdge","areConnectedAlready","adapter","finalNodeSet","LayoutState","initialTemperature","guessBounds","temperature","_expectedBounds","refineStage","_repulsion","_attraction","_shake","rho","alpha","_InverseSquareForce","wn","hn","wm","hm","pow","_SquareForce","distance","av","squareSize","ratio","multiplier","area","ceil","TreeLayoutProcessor","treeGraph","layoutSwitch","layoutLeft","setChildrenDirection","setChildrenLayout","TreeDirection","Width","arrange","layoutRight","layoutUp","up","layoutDown","down","treeDirection","layoutRadialTree","startAngle","endAngle","previousRoot","maxDepth","calculateAngularWidth","radialLayout","Angle","tipOverTree","startFromLevel","aw","diameter","sectorAngle","sortChildren","pl","nl","col","basevalue","normalizeAngle","childNode","cp","childAngleFraction","deltaTheta","deltaThetaHalf","parentSector","fraction","sorted","setPolarLocation","BoundingRectangle","direction","includeStart","rootDirection","rootLayout","childrenLayout","givenSize","shapeWidth","shapeHeight","AngleToParent","SectorAngle","pp","childrenwidth","selfLocation","single","male","female","leftcount","tipOverTreeStartLevel","TreeLayout","layoutComponents","getTree","givenRootShape","getTreeForRoot","LayeredLayout","_initRuntimeProperties","layer","downstreamLinkCount","upstreamLinkCount","uBaryCenter","dBaryCenter","upstreamPriority","downstreamPriority","gridPosition","_prepare","targetLayer","sortedNodes","minLayer","layerMap","layerCount","shift","o2","o1layer","o2layer","layers","linksTo","_dummify","_optimizeCrossings","_swapPairs","arrangeNodes","_moveThingsAround","_dedummify","setMinDist","minDist","layerIndex","minDistances","getMinDist","dist","i1","i2","placeLeftToRight","leftClasses","classNodes","rightSibling","D","neighbor","leftPos","placeLeft","POSITIVE_INFINITY","nodeLeftClass","upNodes","downNodes","intDiv","placeRightToLeft","rightClasses","leftSibling","rightPos","placeRight","NEGATIVE_INFINITY","nodeRightClass","_getLeftWing","leftWing","computeClasses","_getRightWing","rightWing","wingPair","ndsinl","vnode","wings","currentWing","wing","_nodesInLink","classIndex","_isVerticalLayout","_isHorizontalLayout","_isIncreasingLayout","maximumHeight","ctx","MIN_VALUE","currentNode","currDown","downNode","order","placed","sequenceStart","sequenceEnd","directions","fromLayerIndex","reachedFinalLayerIndex","layerIncrement","_gridPositionComparer","dest","virtualStartIndex","virtualStart","sequence","virtualEnd","virtualEndIndex","_firstVirtualNode","_sequencer","nextVirtualNode","adjustDirections","prevBridge","prevBridgeTarget","nextBridge","nextBridgeTarget","clayer","j1","j2","getNeighborOnLayer","dir","_sequenceSingle","combineSequences","pair","rightHeap","leftRes","rightRes","leftHeap","_positionDescendingComparer","_positionAscendingComparer","leftClass","_getComposite","rightClass","maxLayoutIterations","it","gridPos","layoutLayer","iconsidered","considered","n1Priority","n2Priority","nodeGridPos","nodeBaryCenter","calcBaryCenter","nodePriority","moveRight","moveLeft","calcDownData","calcUpData","priority","rightNode","rightNodePriority","leftNode","leftNodePriority","mapVirtualNode","nodeToLinkMap","linkToNodeMap","addLinkBetweenLayers","o","oLayer","dLayer","oPos","dPos","upLayer","downLayer","depthOfDumminess","prevLink","dedum","moves","maxIterations","iter","optimizeLayerCrossings","sum","total","presorted","inode","compareValue","n1BaryCenter","n2BaryCenter","compareByIndex","downwards","secondPass","hasSwapped","calcCrossings","memCrossings","crossBefore","node1","node2","node1GridPos","node2GridPos","crossAfter","revert","countLinksCrossingBetweenTwoLayers","ulayer","dlayer","link1","link2","n11","n12","n21","n22","l1","l2","n11gp","n12gp","n21gp","n22gp","crossings","numerator","denominator","graphOrNodes","capture","diagramOrGraphOrNodes","Array","GraphAdapter","mwDelta","origEvent","originalEvent","wheelDelta","math","detail","isAutoConnector","closestConnector","resCtr","minimumDistance","MAXINT","indicesOfItems","filterShapeDataItem","dataItem","filterConnectionDataItem","fromConnector","fromX","fromY","toConnector","toX","toY","connectionSelector","textField","model","dataSource","reader","idField","appendTo","kendoDropDownList","dataValueField","dataTextField","toJSON","optionLabel","valuePrimitive","InactiveItem","callbacks","InactiveItemsCollection","cloneDataItem","Model","_defaultId","splitDiagramElements","createModel","ObservableObject","clearField","copyDefaultOptions","mainOptions","translateToOrigin","bbox","preventDefault","defaultButtons","DiagramElement","Connector","Diagram","DiagramToolBar","Editor","PopupEditor","QuadRoot","QuadNode","ShapesQuadTree","geom","Widget","outerWidth","_outerWidth","outerHeight","_outerHeight","HierarchicalDataSource","isPlainObject","NS","CASCADING","CHANGE","CLICK","ERROR","SELECT","NONE","DEFAULT_CANVAS_WIDTH","DEFAULT_CANVAS_HEIGHT","DEFAULT_SHAPE_TYPE","DEFAULT_SHAPE_WIDTH","DEFAULT_SHAPE_HEIGHT","DEFAULT_SHAPE_MINWIDTH","DEFAULT_SHAPE_MINHEIGHT","DEFAULT_SHAPE_POSITION","DEFAULT_CONNECTION_BACKGROUND","ABSOLUTE","TRANSFORMED","MOUSEWHEEL_NS","MOBILE_ZOOM_RATE","MOBILE_PAN_DISTANCE","BUTTON_TEMPLATE","CONNECTION_CONTENT_OFFSET","DefaultConnectors","getPosition","imageClass","className","iconClass","extra","defaults","_template","serializable","serialize","json","_content","contentOptions","contentVisual","_contentVisual","_updateContentVisual","_createContentVisual","elementTemplate","template","paramName","_canSelect","shapeId","updateOptionsFromModel","createShapeVisual","updateBounds","_createConnectors","_setOptionsFromModel","modelOptions","redrawVisual","_isEditable","_redrawVisual","syncChanges","_suspendModelRefresh","_resumeModelRefresh","_rotate","_alignContent","containerRect","aligner","contentBounds","contentRect","alignedBounds","connectorDefaults","_transformedBounds","_rotatedBounds","_setBounds","_triggerBoundsChange","_layouting","refreshConnections","deselected","_internalSelection","_selectionChanged","sc","deltaAngle","newPosition","con","cons","nameOrPoint","toLocaleLowerCase","fnName","_transformPoint","shapeOptions","boundsChange","shapeVisual","_visualOptions","_updateConnectors","_showConnectors","rotatedPoint","visualOptions","visualTemplate","_initRouter","_sourcePoint","_targetPoint","_setSource","_setTarget","definers","dataMap","_dataMap","connectionsDataSource","getByUid","uid","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","definition","pts","_resolveConnectors","_refreshPath","sourceConnectors","targetConnectors","_resolveAutoConnectors","minNonConflictSource","minNonConflictTarget","minSource","minTarget","sourceIdx","targetIdx","minNonConflict","_testRoutePoints","exclude","router","passRoute","_getRouteExclude","_shapesQuadTree","hitTestRect","_isPointInsideShape","boundsX","boundsY","userOptions","_initTheme","_initElements","_extendLayoutOptions","_initDefaults","_interactionDefaults","_initCanvas","adornerLayer","_createHandlers","_clipboard","pauseMouseHandlers","_fetchFreshData","_createGlobalToolBar","_createOptionElements","theme","draggable","autoBind","tooltip","connectionDefaults","toolBar","click","_toolBarClick","modal","textAlign","prepend","_resize","createShape","view","editor","_createShape","edit","createConnection","_connectionsDataMap","addConnection","editModel","editorType","editors","connectionSelectorHandler","cancelEdit","shapeEditors","shapeTemplate","connectionEditors","connectionTemplate","_update","_cancel","_editArgs","_getEditDataSource","cancelChanges","_destroyEditor","saveEdit","sync","wrapper","close","attr","addClass","userShapeDefaults","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","event","_pauseMouseHandlers","_eventPositions","_meta","_createToolBar","ctrlPressed","focused","keyCode","touch","pageX","pageY","documentToModel","initialCenter","eventArgs","_gesture","_initialCenter","zoomedPoint","previousGesture","documentToView","scaleDelta","_zoom","updateZoom","_getValidZoom","_panTransform","_updateAdorners","pointPosition","_kendoNode","srcElement","themeOptions","themeName","themes","SASS_THEMES","autoTheme","shapesLength","_createShapes","_createConnections","_findConnectionTarget","unbindResize","off","destroyScroller","_destroyGlobalToolBar","is","_activeElement","scrollContainer","offsets","documentElement","scrollHeight","load","setOptions","added","removed","_removeItem","_removeShapeDataItem","_removeConnectionDataItem","_getDiagramItems","_fixOrdering","bringIntoView","original","newPan","_zoomMainLayer","alignShapes","val","viewportVector","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","padding","popupWidth","popupHeight","connectionBounds","singleToolBar","popupZIndex","closest","_popup","showAt","one","_normalizePointZoom","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","icon","showText","deleteTool","rotateAnticlockwiseTool","_appendGroup","_rotateGroup","rotateClockwiseTool","createShapeTool","_createGroup","createConnectionTool","undoTool","_historyGroup","redoTool","prop","_getAttributes","eventData","selectedElements","delete","selectedElemens","rotateClockwise","rotateAnticlockwise","_getFields","_initContainer","createEditable","Editable","clearContainer","modelFields","columns","formContent","_renderTemplate","_renderFields","_renderButtons","Window","userTriggered","sender","_cancelClick","_attachButtonEvents","unescape","form","_createButton","_cancelClickHandler","_updateClickHandler","_updateClick","_editUpdateClickHandler","callback","deffered","Deferred","deferred","resolve","_add","_quadNode","_testRect","inBounds","nodeRect","nodeBottomRight","overlapsBounds","inserted","_initChildren","childIdx","halfWidth","halfHeight","ROOT_SIZE","boundsChangeHandler","_boundsChange","initRoots","rootMap","rootSize","sectors","getSectors","inRoot","bottomX","bottomY","xIdx","yIdx","plugin"],"mappings":"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","file":"kendo.dataviz.diagram.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('util/text-metrics', ['kendo.core'], f);\n}(function () {\n (function ($) {\n window.kendo.util = window.kendo.util || {};\n var LRUCache = kendo.Class.extend({\n init: function (size) {\n this._size = size;\n this._length = 0;\n this._map = {};\n },\n put: function (key, value) {\n var map = this._map;\n var entry = {\n key: key,\n value: value\n };\n map[key] = entry;\n if (!this._head) {\n this._head = this._tail = entry;\n } else {\n this._tail.newer = entry;\n entry.older = this._tail;\n this._tail = entry;\n }\n if (this._length >= this._size) {\n map[this._head.key] = null;\n this._head = this._head.newer;\n this._head.older = null;\n } else {\n this._length++;\n }\n },\n get: function (key) {\n var entry = this._map[key];\n if (entry) {\n if (entry === this._head && entry !== this._tail) {\n this._head = entry.newer;\n this._head.older = null;\n }\n if (entry !== this._tail) {\n if (entry.older) {\n entry.older.newer = entry.newer;\n entry.newer.older = entry.older;\n }\n entry.older = this._tail;\n entry.newer = null;\n this._tail.newer = entry;\n this._tail = entry;\n }\n return entry.value;\n }\n }\n });\n var REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\n var SPACE = ' ';\n function normalizeText(text) {\n return String(text).replace(REPLACE_REGEX, SPACE);\n }\n function objectKey(object) {\n var parts = [];\n for (var key in object) {\n parts.push(key + object[key]);\n }\n return parts.sort().join('');\n }\n function hashKey(str) {\n var hash = 2166136261;\n for (var i = 0; i < str.length; ++i) {\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n hash ^= str.charCodeAt(i);\n }\n return hash >>> 0;\n }\n function zeroSize() {\n return {\n width: 0,\n height: 0,\n baseline: 0\n };\n }\n var DEFAULT_OPTIONS = { baselineMarkerSize: 1 };\n var defaultMeasureBox;\n if (typeof document !== 'undefined') {\n defaultMeasureBox = document.createElement('div');\n defaultMeasureBox.style.cssText = 'position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;' + 'padding: 0 !important; margin: 0 !important; border: 0 !important;' + 'line-height: normal !important; visibility: hidden !important; white-space: pre!important;';\n }\n var TextMetrics = kendo.Class.extend({\n init: function (options) {\n this._cache = new LRUCache(1000);\n this.options = $.extend({}, DEFAULT_OPTIONS, options);\n },\n measure: function (text, style, options) {\n if (options === void 0) {\n options = {};\n }\n if (typeof text === 'undefined' || text === null) {\n return zeroSize();\n }\n var styleKey = objectKey(style);\n var cacheKey = hashKey(text + styleKey);\n var cachedResult = this._cache.get(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n var size = zeroSize();\n var measureBox = options.box || defaultMeasureBox;\n var baselineMarker = this._baselineMarker().cloneNode(false);\n for (var key in style) {\n var value = style[key];\n if (typeof value !== 'undefined') {\n measureBox.style[key] = value;\n }\n }\n var textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\n measureBox.textContent = textStr;\n measureBox.appendChild(baselineMarker);\n document.body.appendChild(measureBox);\n if (textStr.length) {\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n size.height = measureBox.offsetHeight;\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n }\n if (size.width > 0 && size.height > 0) {\n this._cache.put(cacheKey, size);\n }\n measureBox.parentNode.removeChild(measureBox);\n return size;\n },\n _baselineMarker: function () {\n var marker = document.createElement('div');\n marker.style.cssText = 'display: inline-block; vertical-align: baseline;width: ' + this.options.baselineMarkerSize + 'px; height: ' + this.options.baselineMarkerSize + 'px;overflow: hidden;';\n return marker;\n }\n });\n TextMetrics.current = new TextMetrics();\n function measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n }\n kendo.deepExtend(kendo.util, {\n LRUCache: LRUCache,\n TextMetrics: TextMetrics,\n measureText: measureText,\n objectKey: objectKey,\n hashKey: hashKey,\n normalizeText: normalizeText\n });\n }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/utils', ['kendo.core'], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, diagram = kendo.dataviz.diagram = {}, deepExtend = kendo.deepExtend, isArray = $.isArray, EPSILON = 0.000001;\n var Utils = {};\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 isUndefined: function (obj) {\n return typeof obj === 'undefined' || obj === null;\n },\n isObject: function (obj) {\n return obj === Object(obj);\n },\n has: function (obj, key) {\n return Object.hasOwnProperty.call(obj, key);\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 isNumber: function (obj) {\n return !isNaN(parseFloat(obj)) && isFinite(obj);\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 for (var name in source) {\n destination[name] = source[name];\n }\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(parseInt(v[i], 10), parseInt(v[i + 1], 10)));\n }\n return points;\n },\n randomInteger: function (lower, upper) {\n return parseInt(Math.floor(Math.random() * upper) + lower, 10);\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 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 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 [\n sX,\n sY\n ];\n }\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 function rangeIntegerScale(x) {\n var k = 1;\n while (x * k % 1) {\n k *= 10;\n }\n return k;\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 } else {\n while ((j = start + step * ++i) <= stop) {\n range.push(j / k);\n }\n }\n return range;\n }\n function findRadian(start, end) {\n if (start == end) {\n return 0;\n }\n var sngXComp = end.x - start.x, sngYComp = start.y - end.y, 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 Utils.sign = function (number) {\n return number ? number < 0 ? -1 : 1 : 0;\n };\n Utils.findAngle = function (center, end) {\n return findRadian(center, end) * 180 / Math.PI;\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 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 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 Utils.contains = function (arr, obj) {\n return Utils.indexOf(arr, obj) !== -1;\n };\n Utils.indexOf = function (arr, what) {\n return $.inArray(what, arr);\n };\n Utils.fold = function (list, iterator, acc, context) {\n var initial = arguments.length > 2;\n for (var i = 0; i < list.length; i++) {\n var value = list[i];\n if (!initial) {\n acc = value;\n initial = true;\n } else {\n acc = iterator.call(context, acc, value, i, list);\n }\n }\n if (!initial) {\n throw 'Reduce of empty array with no initial value';\n }\n return acc;\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 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 return Utils.find(arr, constraint, context);\n };\n Utils.insert = function (arr, element, position) {\n arr.splice(position, 0, element);\n return arr;\n };\n Utils.all = function (arr, iterator, context) {\n var result = true;\n var value;\n for (var i = 0; i < arr.length; i++) {\n value = arr[i];\n result = result && iterator.call(context, value, i, arr);\n if (!result) {\n break;\n }\n }\n return result;\n };\n Utils.clear = function (arr) {\n arr.splice(0, arr.length);\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 var all = [], i;\n for (i = 0; i < a.length; i++) {\n all.push({\n 'x': a[i],\n 'y': b[i]\n });\n }\n if (Utils.isUndefined(sortfunc)) {\n all.sort(function (m, n) {\n return m.x - n.x;\n });\n } else {\n all.sort(function (m, n) {\n return sortfunc(m.x, n.x);\n });\n }\n Utils.clear(a);\n Utils.clear(b);\n for (i = 0; i < all.length; i++) {\n a.push(all[i].x);\n b.push(all[i].y);\n }\n };\n Utils.addRange = function (arr, range) {\n arr.push.apply(arr, range);\n };\n var Easing = {\n easeInOut: function (pos) {\n return -Math.cos(pos * Math.PI) / 2 + 0.5;\n }\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 this.trigger();\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 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 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 kendo.deepExtend(diagram, {\n init: function (element) {\n kendo.init(element, diagram.ui);\n },\n Utils: Utils,\n Range: Range,\n Ticker: Ticker\n });\n }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/math', [\n 'dataviz/diagram/utils',\n 'kendo.dataviz.core'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, diagram = kendo.dataviz.diagram, Class = kendo.Class, deepExtend = kendo.deepExtend, dataviz = kendo.dataviz, Utils = diagram.Utils, Point = dataviz.Point2D, isFunction = kendo.isFunction, contains = Utils.contains, map = $.map;\n var HITTESTAREA = 3, EPSILON = 0.000001;\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 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 } 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 } 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) {\n var temp = to;\n to = from;\n from = temp;\n }\n var r1 = new Rect(from.x, from.y).inflate(HITTESTAREA, HITTESTAREA), 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 } 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 } 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 deepExtend(Point, {\n parse: function (str) {\n var tempStr = str.slice(1, str.length - 1), xy = tempStr.split(','), x = parseInt(xy[0], 10), y = parseInt(xy[1], 10);\n if (!isNaN(x) && !isNaN(y)) {\n return new Point(x, y);\n }\n }\n });\n var PathDefiner = Class.extend({\n init: function (p, left, right) {\n this.point = p;\n this.left = left;\n this.right = right;\n }\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) {\n dy = dx;\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(), points = this.rotatedPoints(angle), tl = points[0], tr = points[1], br = points[2], bl = points[3];\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 return rect;\n },\n rotatedPoints: function (angle) {\n var rect = this, c = rect.center(), br = rect.bottomRight().rotate(c, 360 - angle), tl = rect.topLeft().rotate(c, 360 - angle), tr = rect.topRight().rotate(c, 360 - angle), bl = rect.bottomLeft().rotate(c, 360 - angle);\n return [\n tl,\n tr,\n br,\n bl\n ];\n },\n toString: function (delimiter) {\n delimiter = delimiter || ' ';\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 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 this.x = tl.x;\n this.y = tl.y;\n this.width *= scaleX;\n this.height *= scaleY;\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 overlaps: function (rect) {\n var bottomRight = this.bottomRight();\n var rectBottomRight = rect.bottomRight();\n var overlaps = !(bottomRight.x < rect.x || bottomRight.y < rect.y || rectBottomRight.x < this.x || rectBottomRight.y < this.y);\n return overlaps;\n }\n });\n var Size = Class.extend({\n init: function (width, height) {\n this.width = width;\n this.height = height;\n }\n });\n Size.prototype.Empty = new Size(0, 0);\n Rect.toRect = function (rect) {\n if (!(rect instanceof Rect)) {\n rect = new Rect(rect.x, rect.y, rect.width, rect.height);\n }\n return rect;\n };\n Rect.empty = function () {\n return new Rect(0, 0, 0, 0);\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 function isNearZero(num) {\n return Math.abs(num) < EPSILON;\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 return;\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 if (isSegment && (r < 0 || r > 1 || s < 0 || s > 1)) {\n return;\n }\n return new Point(start1.x + r * (end1.x - start1.x), start1.y + r * (end1.y - start1.y));\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()) || Intersect.segments(start, end, rect.topRight(), rect.bottomRight()) || Intersect.segments(start, end, rect.bottomLeft(), rect.bottomRight()) || Intersect.segments(start, end, rect.topLeft(), rect.bottomLeft());\n },\n rects: function (rect1, rect2, angle) {\n var tl = rect2.topLeft(), tr = rect2.topRight(), bl = rect2.bottomLeft(), 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 var intersect = rect1.contains(tl) || rect1.contains(tr) || rect1.contains(bl) || rect1.contains(br) || Intersect.rectWithLine(rect1, tl, tr) || Intersect.rectWithLine(rect1, tl, bl) || Intersect.rectWithLine(rect1, tr, br) || Intersect.rectWithLine(rect1, bl, br);\n if (!intersect) {\n tl = rect1.topLeft();\n tr = rect1.topRight();\n bl = rect1.bottomLeft();\n br = rect1.bottomRight();\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 intersect = rect2.contains(tl) || rect2.contains(tr) || rect2.contains(bl) || rect2.contains(br);\n }\n return intersect;\n }\n };\n var RectAlign = Class.extend({\n init: function (container) {\n this.container = Rect.toRect(container);\n },\n align: function (content, alignment) {\n var alignValues = alignment.toLowerCase().split(' ');\n for (var i = 0; i < alignValues.length; i++) {\n content = this._singleAlign(content, alignValues[i]);\n }\n return content;\n },\n _singleAlign: function (content, alignment) {\n if (isFunction(this[alignment])) {\n return this[alignment](content);\n } else {\n return content;\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 _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 return content;\n }\n });\n var Polar = Class.extend({\n init: function (r, a) {\n this.r = r;\n this.angle = a;\n }\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(this.a * m.a + this.c * m.b, this.b * m.a + this.d * m.b, this.a * m.c + this.c * m.d, this.b * m.c + this.d * m.d, this.a * m.e + this.c * m.f + this.e, this.b * m.e + this.d * m.f + this.f);\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 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 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 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 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 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 } while (!r || r > 1);\n return mean + deviation * x * Math.sqrt(-2 * Math.log(r) / r);\n }\n function randomId(length) {\n if (Utils.isUndefined(length)) {\n length = 10;\n }\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 var Geometry = {\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 if (a === b) {\n return d2(p, a);\n }\n var vx = b.x - a.x, vy = b.y - a.y, dot = (p.x - a.x) * vx + (p.y - a.y) * vy;\n if (dot < 0) {\n return d2(a, p);\n }\n dot = (b.x - p.x) * vx + (b.y - p.y) * vy;\n if (dot < 0) {\n return d2(b, p);\n }\n dot = (b.x - p.x) * vy - (b.y - p.y) * vx;\n return dot * dot / (vx * vx + vy * vy);\n },\n distanceToLine: function (p, a, b) {\n return Math.sqrt(this._distanceToLineSquared(p, a, b));\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 var d = this._distanceToLineSquared(p, p1, p2);\n if (d < minimum) {\n minimum = d;\n }\n }\n return Math.sqrt(minimum);\n }\n };\n var HashTable = kendo.Class.extend({\n init: function () {\n this._buckets = [];\n this.length = 0;\n },\n add: function (key, value) {\n var obj = this._createGetBucket(key);\n if (Utils.isDefined(value)) {\n obj.value = value;\n }\n return obj;\n },\n get: function (key) {\n if (this._bucketExists(key)) {\n return this._createGetBucket(key);\n }\n return null;\n },\n set: function (key, value) {\n this.add(key, value);\n },\n containsKey: function (key) {\n return this._bucketExists(key);\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 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 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 _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 _bucketExists: function (key) {\n var hashId = this._hash(key);\n return Utils.isDefined(this._buckets[hashId]);\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 _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 _hashString: function (s) {\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 _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 var Dictionary = kendo.Observable.extend({\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 ($.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 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 set: function (key, value) {\n this.add(key, value);\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 containsKey: function (key) {\n return this._hashTable.containsKey(key);\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 forEach: function (func, thisRef) {\n this._hashTable.forEach(function (entry) {\n func.call(thisRef, entry.key, entry.value);\n });\n },\n forEachValue: function (func, thisRef) {\n this._hashTable.forEach(function (entry) {\n func.call(thisRef, entry.value);\n });\n },\n forEachKey: function (func, thisRef) {\n this._hashTable.forEach(function (entry) {\n func.call(thisRef, entry.key);\n });\n },\n keys: function () {\n var keys = [];\n this.forEachKey(function (key) {\n keys.push(key);\n });\n return keys;\n }\n });\n var Queue = kendo.Class.extend({\n init: function () {\n this._tail = null;\n this._head = null;\n this.length = 0;\n },\n enqueue: function (value) {\n var entry = {\n value: value,\n next: null\n };\n if (!this._head) {\n this._head = entry;\n this._tail = this._head;\n } else {\n this._tail.next = entry;\n this._tail = this._tail.next;\n }\n this.length++;\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 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 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 } else if (resource instanceof Dictionary) {\n resource.forEach(function (k, v) {\n this.add({\n key: k,\n value: v\n });\n }, this);\n }\n }\n },\n contains: function (item) {\n return this._hashTable.containsKey(item);\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 get: function (item) {\n if (this.contains(item)) {\n return this._hashTable.get(item).value;\n } else {\n return null;\n }\n },\n hash: function (item) {\n return this._hashTable._hash(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 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 var Node = kendo.Class.extend({\n init: function (id, shape) {\n this.links = [];\n this.outgoing = [];\n this.incoming = [];\n this.weight = 1;\n if (Utils.isDefined(id)) {\n this.id = id;\n } else {\n this.id = randomId();\n }\n if (Utils.isDefined(shape)) {\n this.associatedShape = shape;\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 } else {\n this.associatedShape = null;\n }\n this.data = null;\n this.type = 'Node';\n this.shortForm = 'Node \\'' + this.id + '\\'';\n this.isVirtual = false;\n },\n isIsolated: function () {\n return Utils.isEmpty(this.links);\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 this.x = r.x;\n this.y = r.y;\n this.width = r.width;\n this.height = r.height;\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 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 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 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 adjacentTo: function (node) {\n return this.isLinkedTo(node) !== null;\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 if (link.target === this) {\n Utils.remove(this.links, link);\n Utils.remove(this.incoming, link);\n link.target = null;\n }\n },\n hasLinkTo: function (node) {\n return Utils.any(this.outgoing, function (link) {\n return link.target === node;\n });\n },\n degree: function () {\n return this.links.length;\n },\n incidentWith: function (link) {\n return contains(this.links, link);\n },\n getLinksWith: function (node) {\n return Utils.all(this.links, function (link) {\n return link.getComplement(this) === node;\n }, this);\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 var Link = kendo.Class.extend({\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 } else {\n sourceFound = source;\n }\n if (Utils.isString(target)) {\n targetFound = new Node(target);\n } else {\n targetFound = target;\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 } else {\n this.id = randomId();\n }\n if (Utils.isDefined(connection)) {\n this.associatedConnection = connection;\n } else {\n this.associatedConnection = null;\n }\n this.type = 'Link';\n this.shortForm = 'Link \\'' + this.source.id + '->' + this.target.id + '\\'';\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 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 isBridging: function (v1, v2) {\n return this.source === v1 && this.target === v2 || this.source === v2 && this.target === v1;\n },\n getNodes: function () {\n return [\n this.source,\n this.target\n ];\n },\n incidentWith: function (node) {\n return this.source === node || this.target === node;\n },\n adjacentTo: function (link) {\n return contains(this.source.links, link) || contains(this.target.links, link);\n },\n changeSource: function (node) {\n Utils.remove(this.source.links, this);\n Utils.remove(this.source.outgoing, this);\n node.links.push(this);\n node.outgoing.push(this);\n this.source = node;\n },\n changeTarget: function (node) {\n Utils.remove(this.target.links, this);\n Utils.remove(this.target.incoming, this);\n node.links.push(this);\n node.incoming.push(this);\n this.target = node;\n },\n changesNodes: function (v, w) {\n if (this.source === v) {\n this.changeSource(w);\n } else if (this.target === v) {\n this.changeTarget(w);\n }\n },\n reverse: function () {\n var oldSource = this.source;\n var oldTarget = this.target;\n this.source = oldTarget;\n Utils.remove(oldSource.outgoing, this);\n this.source.outgoing.push(this);\n this.target = oldSource;\n Utils.remove(oldTarget.incoming, this);\n this.target.incoming.push(this);\n return this;\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 createReverseEdge: function () {\n var r = this.clone();\n r.reverse();\n r.reversed = true;\n return r;\n },\n clone: function () {\n var clone = new Link(this.source, this.target);\n return clone;\n }\n });\n var Graph = kendo.Class.extend({\n init: function (idOrDiagram) {\n this.links = [];\n this.nodes = [];\n this._nodeMap = new Dictionary();\n this.diagram = null;\n this._root = null;\n if (Utils.isDefined(idOrDiagram)) {\n if (Utils.isString(idOrDiagram)) {\n this.id = idOrDiagram;\n } else {\n this.diagram = idOrDiagram;\n this.id = idOrDiagram.id;\n }\n } else {\n this.id = randomId();\n }\n this.bounds = new Rect();\n this._hasCachedRelationships = false;\n this.type = 'Graph';\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 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 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 root: function (value) {\n if (Utils.isUndefined(value)) {\n if (!this._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 } else {\n return this._root;\n }\n } else {\n this._root = value;\n }\n },\n getConnectedComponents: function () {\n this.componentIndex = 0;\n this.setItemIndices();\n var componentId = Utils.initArray(this.nodes.length, -1);\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 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 components.sort(function (a, b) {\n return b.nodes.length - a.nodes.length;\n });\n return components;\n },\n _collectConnectedNodes: function (setIds, nodeIndex) {\n setIds[nodeIndex] = this.componentIndex;\n var node = this.nodes[nodeIndex];\n Utils.forEach(node.links, 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 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 } else {\n b = b.union(node.bounds());\n }\n }\n this.bounds = b;\n return this.bounds;\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 var visited = [];\n var remaining = [];\n tree._addNode(tree.root);\n visited.push(root);\n remaining.push(root);\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 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 } 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 } 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 var treeLevels = [];\n for (var i = 0; i < levelCount; i++) {\n treeLevels.push([]);\n }\n Utils.forEach(tree.nodes, function (node) {\n treeLevels[node.level].push(node);\n });\n tree.treeLevels = treeLevels;\n tree.cacheRelationships();\n return tree;\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 isEmpty: function () {\n return Utils.isEmpty(this.nodes);\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 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 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 addLink: function (sourceOrLink, target, owner) {\n if (Utils.isUndefined(sourceOrLink)) {\n throw 'The source of the link is not defined.';\n }\n if (Utils.isUndefined(target)) {\n if (Utils.isDefined(sourceOrLink.type) && sourceOrLink.type === 'Link') {\n this.addExistingLink(sourceOrLink);\n return;\n } else {\n throw 'The target of the link is not defined.';\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 var newLink = new Link(foundSource, foundTarget);\n if (Utils.isDefined(owner)) {\n newLink.owner = owner;\n }\n this.links.push(newLink);\n return newLink;\n },\n removeAllLinks: function () {\n while (this.links.length > 0) {\n var link = this.links[0];\n this.removeLink(link);\n }\n },\n addExistingLink: function (link) {\n if (this.hasLink(link)) {\n return;\n }\n this.links.push(link);\n if (this.hasNode(link.source.id)) {\n var s = this.getNode(link.source.id);\n link.changeSource(s);\n } else {\n this.addNode(link.source);\n }\n if (this.hasNode(link.target.id)) {\n var t = this.getNode(link.target.id);\n link.changeTarget(t);\n } else {\n this.addNode(link.target);\n }\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 getNode: function (nodeOrId) {\n var id = nodeOrId.id || nodeOrId;\n if (this._nodeMap.containsKey(id)) {\n return this._nodeMap.get(id);\n }\n },\n hasNode: function (nodeOrId) {\n var id = nodeOrId.id || nodeOrId;\n return this._nodeMap.containsKey(id);\n },\n _addNode: function (node) {\n this.nodes.push(node);\n this._nodeMap.add(node.id, node);\n },\n _removeNode: function (node) {\n Utils.remove(this.nodes, node);\n this._nodeMap.remove(node.id);\n },\n removeNode: function (nodeOrId) {\n var n = nodeOrId;\n if (Utils.isString(nodeOrId)) {\n n = this.getNode(nodeOrId);\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 } else {\n throw 'The identifier should be a Node or the Id (string) of a node.';\n }\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 removeLink: function (link) {\n Utils.remove(this.links, link);\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 addNode: function (nodeOrId, layoutRect, owner) {\n var newNode = null;\n if (!Utils.isDefined(nodeOrId)) {\n throw 'No Node or identifier for a new Node is given.';\n }\n if (Utils.isString(nodeOrId)) {\n if (this.hasNode(nodeOrId)) {\n return this.getNode(nodeOrId);\n }\n newNode = new Node(nodeOrId);\n } else {\n if (this.hasNode(nodeOrId)) {\n return this.getNode(nodeOrId);\n }\n newNode = nodeOrId;\n }\n if (Utils.isDefined(layoutRect)) {\n newNode.bounds(layoutRect);\n }\n if (Utils.isDefined(owner)) {\n newNode.owner = owner;\n }\n this._addNode(newNode);\n return newNode;\n },\n addNodeAndOutgoings: function (node) {\n if (!this.hasNode(node)) {\n this._addNode(node);\n }\n var newLinks = node.outgoing;\n node.outgoing = [];\n Utils.forEach(newLinks, function (link) {\n this.addExistingLink(link);\n }, this);\n },\n setItemIndices: function () {\n var i;\n for (i = 0; i < this.nodes.length; ++i) {\n this.nodes[i].index = i;\n }\n for (i = 0; i < this.links.length; ++i) {\n this.links[i].index = i;\n }\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 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 if (save) {\n copy.nodeMap.set(nCopy, nOriginal);\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 return copy;\n },\n linearize: function (addIds) {\n return Graph.Utils.linearize(this, addIds);\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);\n var visited = [];\n this._dftIterator(foundNode, action, visited);\n },\n _dftIterator: function (node, action, visited) {\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 breadthFirstTraversal: 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);\n var queue = new Queue();\n var visited = [];\n queue.enqueue(foundNode);\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 _stronglyConnectedComponents: function (excludeSingleItems, node, indices, lowLinks, connected, stack, index) {\n indices.add(node, index);\n lowLinks.add(node, index);\n index++;\n stack.push(node);\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 } else if (contains(stack, next)) {\n lowLinks.add(node, Math.min(lowLinks.get(node), indices.get(next)));\n }\n }\n if (lowLinks.get(node) === indices.get(node)) {\n var component = [];\n do {\n next = stack.pop();\n component.push(next);\n } while (next !== node);\n if (!excludeSingleItems || component.length > 1) {\n connected.push(component);\n }\n }\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 isAcyclic: function () {\n return Utils.isEmpty(this.findCycles());\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 makeAcyclic: function () {\n if (this.isEmpty() || this.nodes.length <= 1 || this.links.length <= 1) {\n return [];\n }\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 var copy = this.clone(true);\n var N = this.nodes.length;\n var intensityCatalog = new Dictionary();\n var flowIntensity = function (node) {\n if (node.outgoing.length === 0) {\n return 2 - N;\n } else if (node.incoming.length === 0) {\n return N - 2;\n } else {\n return node.outgoing.length - node.incoming.length;\n }\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 Utils.forEach(copy.nodes, function (v) {\n catalogEqualIntensity(v, intensityCatalog);\n });\n var sourceStack = [];\n var targetStack = [];\n while (copy.nodes.length > 0) {\n var source, target, intensity;\n if (intensityCatalog.containsKey(2 - N)) {\n var targets = intensityCatalog.get(2 - N);\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 if (intensityCatalog.containsKey(N - 2)) {\n var sources = intensityCatalog.get(N - 2);\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 if (copy.nodes.length > 0) {\n for (var k = N - 3; k > 2 - N; k--) {\n if (intensityCatalog.containsKey(k) && 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 sourceStack = sourceStack.concat(targetStack);\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 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 Graph.Predefined = {\n EightGraph: function () {\n return Graph.Utils.parse([\n '1->2',\n '2->3',\n '3->4',\n '4->1',\n '3->5',\n '5->6',\n '6->7',\n '7->3'\n ]);\n },\n Mindmap: function () {\n return Graph.Utils.parse([\n '0->1',\n '0->2',\n '0->3',\n '0->4',\n '0->5',\n '1->6',\n '1->7',\n '7->8',\n '2->9',\n '9->10',\n '9->11',\n '3->12',\n '12->13',\n '13->14',\n '4->15',\n '4->16',\n '15->17',\n '15->18',\n '18->19',\n '18->20',\n '14->21',\n '14->22',\n '5->23',\n '23->24',\n '23->25',\n '6->26'\n ]);\n },\n ThreeGraph: function () {\n return Graph.Utils.parse([\n '1->2',\n '2->3',\n '3->1'\n ]);\n },\n BinaryTree: function (levels) {\n if (Utils.isUndefined(levels)) {\n levels = 5;\n }\n return Graph.Utils.createBalancedTree(levels, 2);\n },\n Linear: function (length) {\n if (Utils.isUndefined(length)) {\n length = 10;\n }\n return Graph.Utils.createBalancedTree(length, 1);\n },\n Tree: function (levels, siblingsCount) {\n return Graph.Utils.createBalancedTree(levels, siblingsCount);\n },\n Forest: function (levels, siblingsCount, trees) {\n return Graph.Utils.createBalancedForest(levels, siblingsCount, trees);\n },\n Workflow: function () {\n return Graph.Utils.parse([\n '0->1',\n '1->2',\n '2->3',\n '1->4',\n '4->3',\n '3->5',\n '5->6',\n '6->3',\n '6->7',\n '5->4'\n ]);\n },\n Grid: function (n, m) {\n var g = new diagram.Graph();\n if (n <= 0 && m <= 0) {\n return g;\n }\n for (var i = 0; i < n + 1; i++) {\n var previous = null;\n for (var j = 0; j < m + 1; j++) {\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 Graph.Utils = {\n parse: function (graphString) {\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)) {\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 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 _addShape: function (kendoDiagram, p, id, shapeDefaults) {\n if (Utils.isUndefined(p)) {\n p = new diagram.Point(0, 0);\n }\n if (Utils.isUndefined(id)) {\n id = randomId();\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 return kendoDiagram.addShape(shapeDefaults);\n },\n _addConnection: function (diagram, from, to, options) {\n return diagram.connect(from, to, options);\n },\n createDiagramFromGraph: function (diagram, graph, doLayout, randomSize) {\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 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 } else {\n p = new Point(Utils.randomInteger(10, width - 20), Utils.randomInteger(10, height - 20));\n }\n }\n var opt = {};\n if (node.id === '0') {\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: { color: '#778899' }\n });\n }\n shape = this._addShape(diagram, p, node.id, opt);\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 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 createBalancedTree: function (levels, siblingsCount) {\n if (Utils.isUndefined(levels)) {\n levels = 3;\n }\n if (Utils.isUndefined(siblingsCount)) {\n siblingsCount = 3;\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 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 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 createRandomConnectedGraph: function (nodeCount, maxIncidence, isTree) {\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 var g = new diagram.Graph(), counter = -1;\n if (nodeCount <= 0) {\n return g;\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 for (var i = 1; i < nodeCount; i++) {\n var poolNode = g.takeRandomNode([], maxIncidence);\n if (!poolNode) {\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 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 kendo.deepExtend(diagram, {\n init: function (element) {\n kendo.init(element, diagram.ui);\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}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/svg', [\n 'kendo.drawing',\n 'dataviz/diagram/math'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, diagram = kendo.dataviz.diagram, Class = kendo.Class, deepExtend = kendo.deepExtend, Point = diagram.Point, Rect = diagram.Rect, Matrix = diagram.Matrix, Utils = diagram.Utils, isNumber = Utils.isNumber, isString = Utils.isString, MatrixVector = diagram.MatrixVector, g = kendo.geometry, d = kendo.drawing, defined = d.util.defined, inArray = $.inArray;\n var TRANSPARENT = 'transparent', Markers = {\n none: 'none',\n arrowStart: 'ArrowStart',\n filledCircle: 'FilledCircle',\n arrowEnd: 'ArrowEnd'\n }, FULL_CIRCLE_ANGLE = 360, START = 'start', END = 'end', WIDTH = 'width', HEIGHT = 'height', X = 'x', Y = 'y';\n diagram.Markers = Markers;\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 return hasChanges;\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 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 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);\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 Rotation.ZERO = new Rotation(0);\n Rotation.create = function (rotation) {\n return new Rotation(rotation.angle, rotation.x, rotation.y);\n };\n Rotation.parse = function (str) {\n var values = str.slice(1, str.length - 1).split(','), angle = values[0], x = values[1], y = values[2];\n var rotation = new Rotation(angle, x, y);\n return rotation;\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 && scaleY !== undefined) {\n this.scale = new Scale(scaleX, scaleY);\n }\n if (angle !== undefined) {\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 return toString(this.translate) + toString(this.rotate) + toString(this.scale);\n },\n render: function (visual) {\n visual._transform = this;\n visual._renderTransform();\n },\n toMatrix: function () {\n var m = Matrix.unit();\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, rotateMatrix = rotate ? rotate.toMatrix() : Matrix.unit(), scale = this.scale ? this.scale.invert() : undefined, scaleMatrix = scale ? scale.toMatrix() : Matrix.unit();\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 var transform = new CompositeTransform();\n transform.translate = translate;\n transform.rotate = rotate;\n transform.scale = scale;\n return transform;\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 if (!isNumber(scaleX)) {\n scaleX = 1;\n }\n if (!isNumber(scaleY)) {\n scaleY = 1;\n }\n this._transform.scale = new Scale(scaleX, scaleY);\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 _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 if (defined(options.x) || defined(options.y)) {\n this._setTranslate();\n transform = true;\n }\n if (transform) {\n this._renderTransform();\n }\n },\n _updateSize: function (options) {\n var update = false;\n if (this.options.autoSize !== false && this._diffNumericOptions(options, [\n WIDTH,\n HEIGHT\n ])) {\n update = true;\n this._measure(true);\n this._setScale();\n }\n if (this._diffNumericOptions(options, [\n X,\n Y\n ])) {\n update = true;\n this._setTranslate();\n }\n if (update) {\n this._renderTransform();\n }\n return update;\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 visible: function (value) {\n return this.drawingContainer().visible(value);\n },\n redraw: function (options) {\n if (options && options.id) {\n this.id = options.id;\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 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 this._transform.translate = new Translation(options.x, options.y);\n this._renderTransform();\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 drawingContainer: function () {\n return this.drawingElement;\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 _hover: function () {\n },\n _diffNumericOptions: diffNumericOptions,\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 _boundingBox: function () {\n return this.drawingElement.rawBBox();\n }\n });\n var VisualBase = Element.extend({\n init: function (options) {\n Element.fn.init.call(this, options);\n options = this.options;\n options.fill = normalizeDrawingOptions(options.fill);\n options.stroke = normalizeDrawingOptions(options.stroke);\n },\n options: {\n stroke: {\n color: 'gray',\n width: 1\n },\n fill: { color: TRANSPARENT }\n },\n fill: function (color, opacity) {\n this._fill({\n color: getColor(color),\n opacity: opacity\n });\n },\n stroke: function (color, width, opacity) {\n this._stroke({\n color: getColor(color),\n width: width,\n opacity: opacity\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 Element.fn.redraw.call(this, options);\n }\n },\n _hover: function (show) {\n var drawingElement = this.drawingElement;\n var options = this.options;\n var hover = options.hover;\n if (hover && hover.fill) {\n var fill = show ? normalizeDrawingOptions(hover.fill) : options.fill;\n drawingElement.fill(fill.color, fill.opacity);\n }\n },\n _stroke: function (strokeOptions) {\n var options = this.options;\n deepExtend(options, { stroke: strokeOptions });\n strokeOptions = options.stroke;\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 this.drawingElement.options.set('stroke', stroke);\n },\n _fill: function (fillOptions) {\n var options = this.options;\n deepExtend(options, { fill: fillOptions || {} });\n var fill = options.fill;\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 var TextBlock = VisualBase.extend({\n init: function (options) {\n options = this._textColor(options);\n VisualBase.fn.init.call(this, options);\n this._font();\n this._initText();\n this._initSize();\n },\n options: {\n fontSize: 15,\n fontFamily: 'sans-serif',\n stroke: { width: 0 },\n fill: { color: 'black' },\n autoSize: true\n },\n _initText: function () {\n var options = this.options;\n this.drawingElement = new d.Text(defined(options.text) ? options.text : '', new g.Point(), { font: options.font });\n this._fill();\n this._stroke();\n },\n _textColor: function (options) {\n if (options && options.color) {\n options = deepExtend({}, options, { fill: { color: options.color } });\n }\n return options;\n },\n _font: function () {\n var options = this.options;\n if (options.fontFamily && defined(options.fontSize)) {\n var fontOptions = [];\n if (options.fontStyle) {\n fontOptions.push(options.fontStyle);\n }\n if (options.fontWeight) {\n fontOptions.push(options.fontWeight);\n }\n fontOptions.push(options.fontSize + (isNumber(options.fontSize) ? 'px' : ''));\n fontOptions.push(options.fontFamily);\n options.font = fontOptions.join(' ');\n } else {\n delete options.font;\n }\n },\n content: function (text) {\n return this.drawingElement.content(text);\n },\n redraw: function (options) {\n if (options) {\n var sizeChanged = false;\n var textOptions = this.options;\n options = this._textColor(options);\n VisualBase.fn.redraw.call(this, options);\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 if (options.text) {\n this.content(options.text);\n sizeChanged = true;\n }\n if (!this._updateSize(options) && sizeChanged) {\n this._initSize();\n }\n }\n }\n });\n deepExtend(TextBlock.fn, AutoSizeableMixin);\n var Rectangle = VisualBase.extend({\n init: function (options) {\n VisualBase.fn.init.call(this, options);\n this._initPath();\n this._setPosition();\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 redraw: function (options) {\n if (options) {\n VisualBase.fn.redraw.call(this, options);\n if (this._diffNumericOptions(options, [\n WIDTH,\n HEIGHT\n ])) {\n this._drawPath();\n }\n if (this._diffNumericOptions(options, [\n X,\n Y\n ])) {\n this._setPosition();\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 this._fill();\n this._drawPath();\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 drawingElement.segments.elements([\n createSegment(0, 0),\n createSegment(width, 0),\n createSegment(width, height),\n createSegment(0, height)\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 options: {\n stroke: {\n color: TRANSPARENT,\n width: 0\n },\n fill: { color: 'black' }\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 redraw: function (options) {\n if (options) {\n if (options.position) {\n this.options.position = options.position;\n }\n VisualBase.fn.redraw.call(this, options);\n }\n }\n });\n var CircleMarker = MarkerBase.extend({\n options: {\n radius: 4,\n anchor: {\n x: 0,\n y: 0\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 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 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 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 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 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 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 _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 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 _normalizeMarkerOptions: function (options) {\n var startCap = options.startCap;\n var endCap = options.endCap;\n if (isString(startCap)) {\n options.startCap = { type: startCap };\n }\n if (isString(endCap)) {\n options.endCap = { type: endCap };\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 _createMarkers: function () {\n var options = this.options;\n this._normalizeMarkerOptions(options);\n this._markers = {};\n this._markers[START] = this._createMarker(options.startCap, START);\n this._markers[END] = this._createMarker(options.endCap, END);\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 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, { position: position }));\n marker.positionMarker(path);\n this.drawingContainer().append(marker.drawingElement);\n return marker;\n }\n },\n _positionMarker: function (position) {\n var marker = this._markers[position];\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 _capMap: {\n start: 'startCap',\n end: 'endCap'\n },\n _redrawMarker: function (pathChange, position, options) {\n this._normalizeMarkerOptions(options);\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 _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 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 options: { autoSize: true },\n drawingContainer: function () {\n return this.container;\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 redraw: function (options) {\n if (options) {\n VisualBase.fn.redraw.call(this, options);\n var pathOptions = this.options;\n var data = options.data;\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 _createElements: function () {\n var options = this.options;\n this.drawingElement = d.Path.parse(options.data || '', { stroke: options.stroke });\n this._fill();\n this.container.append(this.drawingElement);\n this._createMarkers();\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 deepExtend(Path.fn, AutoSizeableMixin);\n deepExtend(Path.fn, MarkerPathMixin);\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 drawingContainer: function () {\n return this.container;\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 if (to) {\n this.options.to = to;\n }\n if (from || to) {\n this._drawPath();\n this._redrawMarkers(true, options);\n } else {\n this._redrawMarkers(false, options);\n }\n VisualBase.fn.redraw.call(this, options);\n }\n },\n _initPath: function () {\n var options = this.options;\n var drawingElement = this.drawingElement = new d.Path({ stroke: options.stroke });\n this._fill();\n this._drawPath();\n this.container.append(drawingElement);\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 drawingElement.segments.elements([\n createSegment(from.x, from.y),\n createSegment(to.x, to.y)\n ]);\n }\n });\n deepExtend(Line.fn, MarkerPathMixin);\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 drawingContainer: function () {\n return this.container;\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 redraw: function (options) {\n if (options) {\n var points = options.points;\n VisualBase.fn.redraw.call(this, options);\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 _initPath: function () {\n var options = this.options;\n this.drawingElement = new d.Path({ stroke: options.stroke });\n this._fill();\n this.container.append(this.drawingElement);\n if (options.points) {\n this._updatePath();\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 return differ;\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 drawingElement.segments.elements(segments);\n },\n options: { points: [] }\n });\n deepExtend(Polyline.fn, MarkerPathMixin);\n var Image = Element.extend({\n init: function (options) {\n Element.fn.init.call(this, options);\n this._initImage();\n },\n redraw: function (options) {\n if (options) {\n if (options.source) {\n this.drawingElement.src(options.source);\n }\n if (this._diffNumericOptions(options, [\n WIDTH,\n HEIGHT,\n X,\n Y\n ])) {\n this.drawingElement.rect(this._rect());\n }\n Element.fn.redraw.call(this, options);\n }\n },\n _initImage: function () {\n var options = this.options;\n var rect = this._rect();\n this.drawingElement = new d.Image(options.source, rect, {});\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 return new g.Rect(origin, size);\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 options: { autoSize: false },\n append: function (visual) {\n this.drawingElement.append(visual.drawingContainer());\n this.children.push(visual);\n this._childrenChange = true;\n },\n remove: function (visual) {\n if (this._remove(visual)) {\n this._childrenChange = true;\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 clear: function () {\n this.drawingElement.clear();\n this.children = [];\n this._childrenChange = true;\n },\n toFront: function (visuals) {\n var visual;\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 toBack: function (visuals) {\n this._reorderChildren(visuals, 0);\n },\n toIndex: function (visuals, indices) {\n this._reorderChildren(visuals, indices);\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 for (i = 0; i < visuals.length; i++) {\n visual = visuals[i];\n drawingElement = visual.drawingContainer();\n index = inArray(visual, children);\n if (index >= 0) {\n drawingChildren.splice(index, 1);\n children.splice(index, 1);\n toIndex = fixedPosition ? indices : indices[i];\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 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 Element.fn.redraw.call(this, options);\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 return boundingBox;\n }\n });\n deepExtend(Group.fn, AutoSizeableMixin);\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 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 reflow: function () {\n this.drawingElement.reflow();\n },\n redraw: function (options) {\n kendo.deepExtend(this.drawingElement.options, options);\n Group.fn.redraw.call(this, options);\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 redraw: function (options) {\n if (options) {\n var circleOptions = this.options;\n if (options.center) {\n deepExtend(circleOptions, { center: options.center });\n this._center.move(circleOptions.center.x, circleOptions.center.y);\n }\n if (this._diffNumericOptions(options, ['radius'])) {\n this._circle.setRadius(circleOptions.radius);\n }\n this._updateSize(options);\n VisualBase.fn.redraw.call(this, options);\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 var center = options.center || {\n x: radius,\n y: radius\n };\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, { stroke: options.stroke });\n this._fill();\n }\n });\n deepExtend(Circle.fn, AutoSizeableMixin);\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 this.drawingElement = new d.Group();\n this._viewBox = new Rect(0, 0, options.width, options.height);\n this.size(this._viewBox);\n },\n bounds: function () {\n var box = this.drawingElement.clippedBBox();\n return new Rect(0, 0, box.width(), box.height());\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 _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({\n x: x,\n y: y\n });\n }\n return {\n x: viewBox.x,\n y: viewBox.y\n };\n },\n draw: function () {\n this.surface.draw(this.drawingElement);\n },\n append: function (visual) {\n this.drawingElement.append(visual.drawingContainer());\n return this;\n },\n remove: function (visual) {\n this.drawingElement.remove(visual.drawingContainer());\n },\n insertBefore: function () {\n },\n clear: function () {\n this.drawingElement.clear();\n },\n destroy: function (clearHtml) {\n this.surface.destroy();\n if (clearHtml) {\n $(this.element).remove();\n }\n }\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 function normalizeDrawingOptions(options) {\n if (options) {\n var drawingOptions = options;\n if (isString(drawingOptions)) {\n drawingOptions = { color: drawingOptions };\n }\n if (drawingOptions.color) {\n drawingOptions.color = getColor(drawingOptions.color);\n }\n return drawingOptions;\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 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 function createSegment(x, y) {\n return new d.Segment(new g.Point(x, y));\n }\n function toDrawingRect(rect) {\n if (rect) {\n return new g.Rect([\n rect.x,\n rect.y\n ], [\n rect.width,\n rect.height\n ]);\n }\n }\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}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/services', [\n 'kendo.drawing',\n 'dataviz/diagram/svg'\n ], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, dataviz = kendo.dataviz, diagram = dataviz.diagram, Class = kendo.Class, Group = diagram.Group, Rect = diagram.Rect, Rectangle = diagram.Rectangle, Utils = diagram.Utils, isUndefined = Utils.isUndefined, Point = diagram.Point, Circle = diagram.Circle, Ticker = diagram.Ticker, deepExtend = kendo.deepExtend, Movable = kendo.ui.Movable, util = kendo.drawing.util, defined = util.defined, inArray = $.inArray, proxy = $.proxy;\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 }, HIT_TEST_DISTANCE = 10, AUTO = 'Auto', TOP = 'Top', RIGHT = 'Right', LEFT = 'Left', BOTTOM = 'Bottom', DEFAULT_SNAP_SIZE = 10, DEFAULT_SNAP_ANGLE = 10, DRAG_START = 'dragStart', DRAG = 'drag', DRAG_END = 'dragEnd', ITEMROTATE = 'itemRotate', ITEMBOUNDSCHANGE = 'itemBoundsChange', MIN_SNAP_SIZE = 5, MIN_SNAP_ANGLE = 5, MOUSE_ENTER = 'mouseEnter', MOUSE_LEAVE = 'mouseLeave', ZOOM_START = 'zoomStart', ZOOM_END = 'zoomEnd', SCROLL_MIN = -20000, SCROLL_MAX = 20000, FRICTION = 0.9, FRICTION_MOBILE = 0.93, VELOCITY_MULTIPLIER = 5, TRANSPARENT = 'transparent', PAN = 'pan', ROTATED = 'rotated', SOURCE = 'source', TARGET = 'target', HANDLE_NAMES = {\n '-1': SOURCE,\n '1': TARGET\n };\n diagram.Cursors = Cursors;\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 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 this.subjects[i].position(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 var LayoutUndoUnit = Class.extend({\n init: function (initialState, finalState, animate) {\n if (isUndefined(animate)) {\n this.animate = false;\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(function (id, points) {\n var conn = diagram.getShapeById(id);\n conn.visible(false);\n if (conn) {\n conn.points(points);\n }\n });\n var ticker = new Ticker();\n ticker.addAdapter(new PositionAdapter(state));\n ticker.onComplete(function () {\n state.linkMap.forEach(function (id) {\n var conn = diagram.getShapeById(id);\n conn.visible(true);\n });\n });\n ticker.play();\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(function (id, points) {\n var conn = diagram.getShapeById(id);\n if (conn) {\n conn.points(points);\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) {\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 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 if (defined(redoTarget)) {\n this._undoTarget = item.target();\n }\n this.title = 'Connection Editing';\n },\n undo: function () {\n if (this._undoSource !== undefined) {\n this.item._updateConnector(this._undoSource, 'source');\n }\n if (this._undoTarget !== undefined) {\n this.item._updateConnector(this._undoTarget, 'target');\n }\n this.item.updateModel();\n },\n redo: function () {\n if (this._redoSource !== undefined) {\n this.item._updateConnector(this._redoSource, 'source');\n }\n if (this._redoTarget !== undefined) {\n this.item._updateConnector(this._redoTarget, 'target');\n }\n this.item.updateModel();\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 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 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 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 if (shape.hasOwnProperty('layout')) {\n shape.layout(shape, this.undoStates[i], this.redoStates[i]);\n }\n shape.updateModel();\n }\n if (this.adorner) {\n this.adorner.refreshBounds();\n this.adorner.refresh();\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 undo: function () {\n this.diagram.remove(this.connection, false);\n },\n redo: function () {\n this.diagram._addConnection(this.connection, false);\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 undo: function () {\n this.diagram.deselect();\n this.diagram.remove(this.shape, false);\n },\n redo: function () {\n this.diagram._addShape(this.shape, false);\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 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 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 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 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 events: [\n 'undone',\n 'redone'\n ],\n begin: function () {\n this.composite = new CompositeUnit();\n },\n cancel: function () {\n this.composite = undefined;\n },\n commit: function (execute) {\n if (this.composite.units.length > 0) {\n this._restart(this.composite, execute);\n }\n this.composite = undefined;\n },\n addCompositeItem: function (undoUnit) {\n if (this.composite) {\n this.composite.add(undoUnit);\n } else {\n this.add(undoUnit);\n }\n },\n add: function (undoUnit, execute) {\n this._restart(undoUnit, execute);\n },\n pop: function () {\n if (this.index > 0) {\n this.stack.pop();\n this.index--;\n }\n },\n count: function () {\n return this.stack.length;\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 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 _restart: function (composite, execute) {\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 if (this.stack.length > this.capacity) {\n this.stack.splice(0, this.stack.length - this.capacity);\n this.index = this.capacity;\n }\n },\n clear: function () {\n this.stack = [];\n this.index = 0;\n }\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 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 var diagram = tool.toolService.diagram, canvas = diagram.canvas;\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: proxy(tool._move, tool)\n }).data('kendoMobileScroller');\n if (canvas.translate) {\n tool.movableCanvas = new Movable(canvas.element);\n }\n var virtualScroll = function (dimension, min, max) {\n dimension.makeVirtual();\n dimension.virtualSize(min || SCROLL_MIN, max || SCROLL_MAX);\n };\n virtualScroll(scroller.dimensions.x);\n virtualScroll(scroller.dimensions.y);\n scroller.disable();\n },\n tryActivate: function (p, meta) {\n var toolService = this.toolService;\n var options = toolService.diagram.options.pannable;\n var enabled = meta.ctrlKey;\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 return options !== false && enabled && !defined(toolService.hoveredAdorner) && !defined(toolService._hoveredConnector);\n },\n start: function () {\n this.scroller.enable();\n },\n move: function () {\n },\n _move: function (args) {\n var tool = this, diagram = tool.toolService.diagram, canvas = diagram.canvas, scrollPos = new Point(args.scrollLeft, args.scrollTop);\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 diagram.trigger(PAN, { pan: scrollPos });\n },\n end: function () {\n this.scroller.disable();\n },\n getCursor: function () {\n return Cursors.move;\n }\n });\n var PointerTool = Class.extend({\n init: function (toolService) {\n this.toolService = toolService;\n },\n tryActivate: function () {\n return true;\n },\n start: function (p, meta) {\n var toolService = this.toolService, diagram = toolService.diagram, hoveredItem = toolService.hoveredItem;\n if (hoveredItem) {\n toolService.selectSingle(hoveredItem, meta);\n if (hoveredItem.adorner) {\n this.adorner = hoveredItem.adorner;\n this.handle = this.adorner._hitTest(p);\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 if (this.adorner) {\n if (!this.adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_START, {\n shapes: this.adorner.shapes,\n connections: []\n })) {\n this.adorner.start(p);\n } else {\n toolService.startPoint = p;\n toolService.end(p);\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, {\n shapes: this.adorner.shapes,\n connections: []\n });\n }\n }\n },\n end: function () {\n var diagram = this.toolService.diagram, adorner = this.adorner, unit;\n if (adorner) {\n if (!adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_END, {\n shapes: adorner.shapes,\n connections: []\n })) {\n unit = adorner.stop();\n if (unit) {\n diagram.undoRedoService.add(unit, false);\n }\n } else {\n adorner.cancel();\n }\n }\n this.adorner = undefined;\n this.handle = undefined;\n },\n getCursor: function (p) {\n return this.toolService.hoveredItem ? this.toolService.hoveredItem._getCursor(p) : Cursors.arrow;\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 if (enabled) {\n if (selectable.key && selectable.key != 'none') {\n enabled = meta[selectable.key + 'Key'];\n } else {\n enabled = noMeta(meta);\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 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, diagram = toolService.diagram, connector = toolService._hoveredConnector, connection = diagram._createConnection({}, connector._c, p);\n if (canDrag(connection) && !diagram.trigger(DRAG_START, {\n shapes: [],\n connections: [connection],\n connectionHandle: TARGET\n }) && 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 move: function (p) {\n var toolService = this.toolService;\n var connection = toolService.activeConnection;\n connection.target(p);\n toolService.diagram.trigger(DRAG, {\n shapes: [],\n connections: [connection],\n connectionHandle: TARGET\n });\n return true;\n },\n end: function (p) {\n var toolService = this.toolService, d = toolService.diagram, connection = toolService.activeConnection, hoveredItem = toolService.hoveredItem, connector = toolService._hoveredConnector, target, cachedTouchTarget = d._cachedTouchTarget;\n if (!connection) {\n return;\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 connection.target(target);\n if (!d.trigger(DRAG_END, {\n shapes: [],\n connections: [connection],\n connectionHandle: TARGET\n })) {\n connection.updateModel();\n d._syncConnectionChanges();\n } else {\n d.remove(connection, false);\n d.undoRedoService.pop();\n }\n toolService._connectionManipulation();\n if (cachedTouchTarget) {\n d._connectorsAdorner.visual.remove(cachedTouchTarget);\n d._cachedTouchTarget = null;\n }\n },\n getCursor: function () {\n return Cursors.arrow;\n }\n });\n var ConnectionEditTool = Class.extend({\n init: function (toolService) {\n this.toolService = toolService;\n this.type = 'ConnectionTool';\n },\n tryActivate: function (p, meta) {\n var toolService = this.toolService, diagram = toolService.diagram, selectable = diagram.options.selectable, item = toolService.hoveredItem, isActive = selectable !== false && item && item.path && !(item.isSelected && meta.ctrlKey);\n if (isActive) {\n this._c = item;\n }\n return isActive;\n },\n start: function (p, meta) {\n var toolService = this.toolService;\n var connection = this._c;\n toolService.selectSingle(connection, meta);\n var adorner = connection.adorner;\n var handle, name;\n if (adorner) {\n handle = adorner._hitTest(p);\n name = HANDLE_NAMES[handle];\n }\n if (canDrag(connection) && adorner && !toolService.diagram.trigger(DRAG_START, {\n shapes: [],\n connections: [connection],\n connectionHandle: name\n })) {\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 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, {\n shapes: [],\n connections: [this._c],\n connectionHandle: this.handleName\n });\n return true;\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 if (adorner) {\n if (canDrag(connection)) {\n var unit = adorner.stop(p);\n if (!diagram.trigger(DRAG_END, {\n shapes: [],\n connections: [connection],\n connectionHandle: this.handleName\n })) {\n diagram.undoRedoService.add(unit, false);\n connection.updateModel();\n diagram._syncConnectionChanges();\n } else {\n unit.undo();\n }\n }\n }\n },\n getCursor: function () {\n return Cursors.move;\n }\n });\n function testKey(key, str) {\n return str.charCodeAt(0) == key || str.toUpperCase().charCodeAt(0) == key;\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 ];\n this.activeTool = undefined;\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 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 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;\n this._updateCursor(p);\n return true;\n },\n keyDown: function (key, meta) {\n var diagram = this.diagram;\n meta = deepExtend({\n ctrlKey: false,\n metaKey: false,\n altKey: false\n }, meta);\n if ((meta.ctrlKey || meta.metaKey) && !meta.altKey) {\n if (testKey(key, 'a')) {\n diagram.selectAll();\n diagram._destroyToolBar();\n return true;\n } else if (testKey(key, 'z')) {\n diagram.undo();\n diagram._destroyToolBar();\n return true;\n } else if (testKey(key, 'y')) {\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) {\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 return true;\n } else if (key === 27) {\n this._discardNewConnection();\n diagram.deselect();\n diagram._destroyToolBar();\n return true;\n }\n },\n wheel: function (p, meta) {\n var diagram = this.diagram, delta = meta.delta, z = diagram.zoom(), options = diagram.options, zoomRate = options.zoomRate, zoomOptions = {\n point: p,\n meta: meta,\n zoom: z\n };\n if (diagram.trigger(ZOOM_START, zoomOptions)) {\n return;\n }\n if (delta < 0) {\n z += zoomRate;\n } else {\n z -= zoomRate;\n }\n z = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, z)), 2);\n zoomOptions.zoom = z;\n diagram.zoom(z, zoomOptions);\n diagram.trigger(ZOOM_END, zoomOptions);\n return true;\n },\n setTool: function (tool, index) {\n tool.toolService = this;\n this.tools[index] = tool;\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 _discardNewConnection: function () {\n if (this.newConnection) {\n this.diagram.remove(this.newConnection);\n this.newConnection = undefined;\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;\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 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;\n }\n },\n _updateHoveredItem: function (p) {\n var hit = this._hitTest(p);\n var diagram = this.diagram;\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 if (hit && hit.options.enable) {\n diagram.trigger(MOUSE_ENTER, { item: hit });\n this.hoveredItem = hit;\n this.hoveredItem._hover(true);\n } else {\n this.hoveredItem = undefined;\n }\n }\n },\n _removeHover: function () {\n if (this.hoveredItem) {\n this.hoveredItem._hover(false);\n this.hoveredItem = undefined;\n }\n },\n _hitTest: function (point) {\n var hit, d = this.diagram, item, i;\n if (this._hoveredConnector) {\n this._hoveredConnector._hover(false);\n this._hoveredConnector = undefined;\n }\n if (d._connectorsAdorner._visible) {\n hit = d._connectorsAdorner._hitTest(point);\n if (hit) {\n return hit;\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) {\n return;\n }\n hit = undefined;\n } else {\n this.hoveredAdorner = undefined;\n }\n if (!this.activeTool || this.activeTool.type !== 'ConnectionTool') {\n var selectedConnections = [];\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 return hit || this._hitTestElements(point);\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 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 _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 var ConnectionRouterBase = kendo.Class.extend({\n init: function () {\n }\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 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 getBounds: function () {\n var points = this.connection.allPoints(), s = points[0], e = points[points.length - 1], right = Math.max(s.x, e.x), left = Math.min(s.x, e.x), top = Math.min(s.y, e.y), bottom = Math.max(s.y, e.y);\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 return new Rect(left, top, right - left, bottom - top);\n }\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 }\n });\n var CascadingRouter = LinearConnectionRouter.extend({\n SAME_SIDE_DISTANCE_RATIO: 5,\n init: function (connection) {\n var that = this;\n LinearConnectionRouter.fn.init.call(that);\n this.connection = connection;\n },\n routePoints: function (start, end, sourceConnector, targetConnector) {\n var result;\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 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 _connectorSides: [\n {\n name: 'Top',\n axis: 'y',\n boundsPoint: 'topLeft',\n secondarySign: 1\n },\n {\n name: 'Left',\n axis: 'x',\n boundsPoint: 'topLeft',\n secondarySign: 1\n },\n {\n name: 'Bottom',\n axis: 'y',\n boundsPoint: 'bottomRight',\n secondarySign: -1\n },\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 && (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 _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 _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 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 = [\n new Point(start.x, pointY),\n new Point(end.x, pointY)\n ];\n } else {\n result = [\n new Point(start.x, start.y + deltaY / 2),\n new Point(end.x, start.y + deltaY / 2)\n ];\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 = [\n new Point(pointX, start.y),\n new Point(pointX, end.y)\n ];\n } else {\n result = [\n new Point(start.x + deltaX / 2, start.y),\n new Point(start.x + deltaX / 2, start.y + deltaY)\n ];\n }\n } else {\n result = [new Point(end.x, start.y)];\n }\n }\n return result;\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 = [\n start,\n start,\n end,\n end\n ];\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 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 } else {\n shiftX = 0;\n shiftY = deltaY / ((length - 1) / 2);\n }\n } else {\n if (idx % 2 !== 0) {\n shiftX = 0;\n shiftY = deltaY / (length / 2);\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 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 return [\n points[1],\n 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 return horizontal;\n }\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 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 options: { handles: {} },\n _getCursor: function () {\n return Cursors.move;\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 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 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 if (this.handle === -1) {\n this.connection.source(target);\n } else if (this.handle === 1) {\n this.connection.target(target);\n }\n this.handle = undefined;\n this._ts._connectionManipulation();\n return new ConnectionEditUndoUnit(this.connection, this._initialSource, this._initialTarget);\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 if (sourceHandle && (!targetHandle || sourcePointDistance < targetPointDistance)) {\n handle = -1;\n } else if (targetHandle && (!sourceHandle || targetPointDistance < sourcePointDistance)) {\n handle = 1;\n }\n return handle;\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 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 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 _clearVisual: function () {\n var that = this;\n if (that.diagram._cachedTouchTarget) {\n that._keepCachedTouchTarget();\n } else {\n that.visual.clear();\n }\n },\n _keepCachedTouchTarget: function () {\n var that = this, 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 destroy: function () {\n var that = this;\n that.diagram.unbind(ITEMBOUNDSCHANGE, that._refreshHandler);\n that.shape = undefined;\n that._visible = undefined;\n that.visual.visible(false);\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 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 function hitToOppositeSide(hit, bounds) {\n var result;\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 return result;\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 that._initSelection();\n that._createHandles();\n that.redraw();\n that.diagram.bind('select', function (e) {\n that._initialize(e.selected);\n });\n that._refreshHandler = function () {\n if (!that._internalChange) {\n that.refreshBounds();\n that.refresh();\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 that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler).bind(ITEMROTATE, that._rotatedHandler);\n that.refreshBounds();\n that.refresh();\n },\n options: {\n handles: {\n fill: { color: '#fff' },\n stroke: { color: '#282828' },\n height: 7,\n width: 7,\n hover: {\n fill: { color: '#282828' },\n stroke: { color: '#282828' }\n }\n },\n selectable: {\n stroke: {\n color: '#778899',\n width: 1,\n dashType: 'dash'\n },\n fill: { color: TRANSPARENT }\n },\n offset: 10\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 _resizable: function () {\n return this.options.editable && this.options.editable.resize !== false;\n },\n _handleOptions: function () {\n return (this.options.editable.resize || {}).handles || this.options.handles;\n },\n _createHandles: function () {\n var handles, item, y, x;\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) {\n item = new Rectangle(handles);\n item.drawingElement._hover = proxy(this._hover, this);\n this.map.push({\n x: x,\n y: y,\n visual: item\n });\n this.visual.append(item);\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 _hitTest: function (p) {\n var tp = this.diagram.modelToLayer(p), i, hit, handleBounds, handlesCount = this.map.length, handle;\n if (this._angle) {\n tp = tp.clone().rotate(this._bounds.center(), this._angle);\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);\n handleBounds.offset(this._bounds.x, this._bounds.y);\n if (handleBounds.contains(tp)) {\n return hit;\n }\n }\n }\n if (this._bounds.contains(tp)) {\n return new Point(0, 0);\n }\n },\n _getHandleBounds: function (p) {\n if (this._resizable()) {\n var handles = this._handleOptions(), w = handles.width, h = handles.height, r = new Rect(0, 0, w, h);\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 - w / 2;\n }\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 - h / 2;\n }\n return r;\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 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 _initialize: function () {\n var that = this, i, item, items = that.diagram.select();\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 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 _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 _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 _hover: function (value, element) {\n if (this._resizable()) {\n var handleOptions = this._handleOptions(), hover = handleOptions.hover, stroke = handleOptions.stroke, fill = handleOptions.fill;\n if (value && Utils.isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\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 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 redraw: function () {\n var i, handle, visibleHandles = this._resizable();\n for (i = 0; i < this.map.length; i++) {\n handle = this.map[i];\n handle.visual.visible(visibleHandles);\n }\n },\n angle: function (value) {\n if (defined(value)) {\n this._angle = value;\n }\n return this._angle;\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 move: function (handle, p) {\n var delta, dragging, dtl = new Point(), dbr = new Point(), bounds, center, shape, i, angle, newBounds, changed = 0, staticPoint, scaleX, scaleY;\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 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 if (this.isDragHandle(handle)) {\n dbr = dtl = delta;\n dragging = true;\n } else {\n if (this._angle) {\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 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 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();\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) {\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);\n }\n changed += 1;\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 this._positions();\n }\n this._cp = p;\n },\n isDragHandle: function (handle) {\n return handle.x === 0 && handle.y === 0;\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;\n this._internalChange = undefined;\n this._rotating = undefined;\n },\n _truncatePositionToGuides: function (bounds) {\n if (this.diagram.ruler) {\n return this.diagram.ruler.truncatePositionToGuides(bounds);\n }\n return bounds;\n },\n _truncateSizeToGuides: function (bounds) {\n if (this.diagram.ruler) {\n return this.diagram.ruler.truncateSizeToGuides(bounds);\n }\n return bounds;\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 _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 snapOptions: function () {\n var editable = this.diagram.options.editable;\n var snap = ((editable || {}).drag || {}).snap || {};\n return snap;\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 _displaceBounds: function (bounds, dtl, dbr, dragging) {\n var tl = bounds.topLeft().plus(dtl), br = bounds.bottomRight().plus(dbr), newBounds = Rect.fromPoints(tl, br), 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 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 this._manipulating = undefined;\n this._internalChange = undefined;\n this._rotating = undefined;\n return unit;\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 refreshBounds: function () {\n var bounds = this.shapes.length == 1 ? this.shapes[0].bounds().clone() : this.diagram.boundingBox(this.shapes, true);\n this.bounds(bounds);\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 var center = new Point(bounds.width / 2, bounds.height / 2);\n this.visual.rotate(this._angle, center);\n this.rect.redraw({\n width: bounds.width,\n height: bounds.height\n });\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 var Selector = Class.extend({\n init: function (diagram) {\n var selectable = diagram.options.selectable;\n this.options = deepExtend({}, this.options, selectable);\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: { color: TRANSPARENT }\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;\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({\n height: visualBounds.height + 1,\n 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, hover = options.hover, stroke = options.stroke, fill = options.fill;\n if (value && Utils.isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\n }\n if (value && Utils.isDefined(hover.fill)) {\n fill = hover.fill;\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()), relative = p.minus(this._c.shape.bounds('transformed').topLeft()), 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 function canDrag(element) {\n var editable = element.options.editable;\n return editable && editable.drag !== false;\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 function noMeta(meta) {\n return meta.ctrlKey === false && meta.altKey === false && meta.shiftKey === false;\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}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/layout', ['dataviz/diagram/math'], f);\n}(function () {\n (function ($, undefined) {\n var kendo = window.kendo, diagram = kendo.dataviz.diagram, Graph = diagram.Graph, Node = diagram.Node, Link = diagram.Link, deepExtend = kendo.deepExtend, Size = diagram.Size, Rect = diagram.Rect, Dictionary = diagram.Dictionary, Set = diagram.Set, HyperTree = diagram.Graph, Utils = diagram.Utils, Point = diagram.Point, EPSILON = 0.000001, DEG_TO_RAD = Math.PI / 180, contains = Utils.contains, grep = $.grep;\n var LayoutBase = kendo.Class.extend({\n defaultOptions: {\n type: 'Tree',\n subtype: 'Down',\n roots: null,\n animate: false,\n limitToView: false,\n friction: 0.9,\n nodeDistance: 50,\n iterations: 300,\n horizontalSeparation: 90,\n verticalSeparation: 50,\n underneathVerticalTopOffset: 15,\n underneathHorizontalOffset: 15,\n underneathVerticalSeparation: 15,\n grid: {\n width: 1500,\n offsetX: 50,\n offsetY: 50,\n componentSpacingX: 20,\n componentSpacingY: 20\n },\n layerSeparation: 50,\n layeredIterations: 2,\n startRadialAngle: 0,\n endRadialAngle: 360,\n radialSeparation: 150,\n radialFirstLevelSeparation: 200,\n keepComponentsInOneRadialLayout: false,\n ignoreContainers: true,\n layoutContainerChildren: false,\n ignoreInvisible: true,\n animateTransitions: false\n },\n init: function () {\n },\n gridLayoutComponents: function (components) {\n if (!components) {\n throw 'No components supplied.';\n }\n Utils.forEach(components, function (c) {\n c.calcBounds();\n });\n components.sort(function (a, b) {\n return b.bounds.width - a.bounds.width;\n });\n var maxWidth = this.options.grid.width, offsetX = this.options.grid.componentSpacingX, offsetY = this.options.grid.componentSpacingY, height = 0, startX = this.options.grid.offsetX, startY = this.options.grid.offsetY, x = startX, y = startY, i, resultLinkSet = [], resultNodeSet = [];\n while (components.length > 0) {\n if (x >= maxWidth) {\n x = startX;\n y += height + offsetY;\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]);\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 if (currentHeight >= height) {\n height = currentHeight;\n }\n x += currentWidth + offsetX;\n }\n return {\n nodes: resultNodeSet,\n links: resultLinkSet\n };\n },\n moveToOffset: function (component, p) {\n var i, j, bounds = component.bounds, deltax = p.x - bounds.x, deltay = p.y - bounds.y;\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 transferOptions: function (options) {\n this.options = kendo.deepExtend({}, this.defaultOptions);\n if (Utils.isUndefined(options)) {\n return;\n }\n this.options = kendo.deepExtend(this.options, options || {});\n }\n });\n var DiagramToHyperTreeAdapter = kendo.Class.extend({\n init: function (diagram) {\n this.nodeMap = new Dictionary();\n this.shapeMap = new Dictionary();\n this.nodes = [];\n this.edges = [];\n this.edgeMap = new Dictionary();\n this.finalNodes = [];\n this.finalLinks = [];\n this.ignoredConnections = [];\n this.ignoredShapes = [];\n this.hyperMap = new Dictionary();\n this.hyperTree = new Graph();\n this.finalGraph = null;\n this.diagram = diagram;\n },\n convert: function (options) {\n if (Utils.isUndefined(this.diagram)) {\n throw 'No diagram to convert.';\n }\n this.options = kendo.deepExtend({\n ignoreInvisible: true,\n ignoreContainers: true,\n layoutContainerChildren: false\n }, options || {});\n this.clear();\n this._renormalizeShapes();\n this._renormalizeConnections();\n this.finalNodes = new Dictionary(this.nodes);\n this.finalLinks = new Dictionary(this.edges);\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 mapConnection: function (connection) {\n return this.edgeMap.get(connection.id);\n },\n mapShape: function (shape) {\n return this.nodeMap.get(shape.id);\n },\n getEdge: function (a, b) {\n return Utils.first(a.links, function (link) {\n return link.getComplement(a) === b;\n });\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 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 firstNonIgnorableContainer: function (shape) {\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 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 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 } else {\n return shape.isCollapsed && !this._isTop(shape);\n }\n },\n isShapeMapped: function (shape) {\n return shape.isCollapsed && !this._isVisible(shape) && !this._isTop(shape);\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 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 } else {\n return grep(this.hyperTree.nodes, function (n) {\n return n.data.container === found;\n });\n }\n },\n _isTop: function (item) {\n return !item.parentContainer;\n },\n _isVisible: function (shape) {\n if (!shape.visible()) {\n return false;\n }\n return !shape.parentContainer ? shape.visible() : this._isVisible(shape.parentContainer);\n },\n _isCollapsed: function (shape) {\n if (shape.isContainer && shape.isCollapsed) {\n return true;\n }\n return shape.parentContainer && this._isCollapsed(shape.parentContainer);\n },\n _renormalizeShapes: function () {\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 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 this.nodeMap.add(shape.id, node);\n this.nodes.push(node);\n }\n } else {\n throw 'Containers are not supported yet, but stay tuned.';\n }\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 if (this.isIgnorableItem(conn)) {\n this.ignoredConnections.push(conn);\n continue;\n }\n var source = !conn.sourceConnector ? null : conn.sourceConnector.shape;\n var sink = !conn.targetConnector ? null : conn.targetConnector.shape;\n if (!source || !sink) {\n this.ignoredConnections.push(conn);\n continue;\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 if (this.shapeMap.containsKey(source)) {\n source = this.shapeMap[source];\n }\n if (this.shapeMap.containsKey(sink)) {\n sink = this.shapeMap[sink];\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 if (sourceNode === null || sinkNode === null) {\n throw 'A shape was not mapped to a node.';\n }\n if (this.options.ignoreContainers) {\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 this.edgeMap.add(conn.id, newEdge);\n this.edges.push(newEdge);\n } else {\n throw 'Containers are not supported yet, but stay tuned.';\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 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 layout: function (options) {\n this.transferOptions(options);\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n var graph = adapter.convert(options);\n if (graph.isEmpty()) {\n return;\n }\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 layoutGraph: function (graph, options) {\n if (Utils.isDefined(options)) {\n this.transferOptions(options);\n }\n this.graph = graph;\n var initialTemperature = this.options.nodeDistance * 9;\n this.temperature = initialTemperature;\n var guessBounds = this._expectedBounds();\n this.width = guessBounds.width;\n this.height = guessBounds.height;\n for (var step = 0; step < this.options.iterations; step++) {\n this.refineStage = step >= this.options.iterations * 5 / 6;\n this.tick();\n this.temperature = this.refineStage ? initialTemperature / 30 : initialTemperature * (1 - step / (2 * this.options.iterations));\n }\n },\n tick: function () {\n var i;\n for (i = 0; i < this.graph.nodes.length; i++) {\n this._repulsion(this.graph.nodes[i]);\n }\n for (i = 0; i < this.graph.links.length; i++) {\n this._attraction(this.graph.links[i]);\n }\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 _shake: function (node) {\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 _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 } else {\n var deltax = n.x - m.x;\n var deltay = n.y - m.y;\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 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 _SquareForce: function (d, n, m) {\n return 1 / this._InverseSquareForce(d, n, m);\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 return;\n }\n while (s.x === t.x && s.y === t.y) {\n this._shake(t);\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 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 _expectedBounds: function () {\n var size, N = this.graph.nodes.length, 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 {\n width: width * multiplier,\n height: height * multiplier\n };\n }\n });\n var TreeLayoutProcessor = kendo.Class.extend({\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 if (!contains(this.graph.nodes, root)) {\n throw 'The given root is not in the graph.';\n }\n this.center = root;\n this.graph.cacheRelationships();\n this.layoutSwitch();\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 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 this.arrange(node, p);\n y += node.Size.height + this.options.verticalSeparation;\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 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 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 w -= this.options.horizontalSeparation;\n var x = this.center.x + this.center.width / 2 - w / 2;\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 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 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 layoutRadialTree: function () {\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 this.maxDepth = 0;\n this.origin = new Point(this.center.x, this.center.y);\n this.calculateAngularWidth(this.center, 0);\n if (this.maxDepth > 0) {\n this.radialLayout(this.center, this.options.radialFirstLevelSeparation, startAngle, endAngle);\n }\n this.center.Angle = endAngle - startAngle;\n },\n tipOverTree: function (down, startFromLevel) {\n if (Utils.isUndefined(startFromLevel)) {\n startFromLevel = 0;\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 node.TreeDirection = 'Down';\n var s = this.measure(node, Size.Empty);\n w += s.width + this.options.horizontalSeparation;\n }\n w -= this.options.horizontalSeparation;\n w -= down[down.length - 1].width;\n w += down[down.length - 1].associatedShape.bounds().width;\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 calculateAngularWidth: function (n, d) {\n if (d > this.maxDepth) {\n this.maxDepth = d;\n }\n var aw = 0, w = 1000, h = 1000, diameter = d === 0 ? 0 : Math.sqrt(w * w + h * h) / d;\n if (n.children.length > 0) {\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 } else {\n aw = diameter;\n }\n n.sectorAngle = aw;\n return aw;\n },\n sortChildren: function (n) {\n var basevalue = 0, i;\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 var count = n.children.length;\n if (count === 0) {\n return null;\n }\n var angle = [];\n var idx = [];\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 Utils.bisort(angle, idx);\n var col = [];\n var children = n.children;\n for (i = 0; i < count; ++i) {\n col.push(children[idx[i]]);\n }\n return col;\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;\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, radius + this.options.radialSeparation, startAngle + fraction * deltaTheta, startAngle + (fraction + childAngleFraction) * deltaTheta);\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 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 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 this.graph.assignLevels(node);\n this.graph.depthFirstTraversal(node, function (s) {\n if (s.level >= startFromLevel + 1) {\n s.childrenLayout = layout;\n }\n });\n } else {\n this.graph.depthFirstTraversal(node, function (s) {\n s.childrenLayout = layout;\n });\n if (!includeStart) {\n node.childrenLayout = rootLayout;\n }\n }\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 var parent = node.parents[0];\n if (node.treeDirection === 'Undefined') {\n node.treeDirection = parent.treeDirection;\n }\n if (Utils.isEmpty(node.children)) {\n result = new Size(Math.abs(shapeWidth) < EPSILON ? 50 : shapeWidth, Math.abs(shapeHeight) < EPSILON ? 25 : shapeHeight);\n } else if (node.children.length === 1) {\n switch (node.treeDirection) {\n case 'Radial':\n s = this.measure(node.children[0], givenSize);\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 case 'TopAlignedWithParent':\n break;\n case 'BottomAlignedWithParent':\n break;\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 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 default:\n throw 'Unhandled TreeDirection in the Radial layout measuring.';\n }\n break;\n case 'Up':\n case 'Down':\n switch (node.childrenLayout) {\n case 'TopAlignedWithParent':\n case 'BottomAlignedWithParent':\n break;\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 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 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 result = new Size(w, h);\n } else {\n var i, childNode;\n switch (node.treeDirection) {\n case 'Left':\n case 'Right':\n switch (node.childrenLayout) {\n case 'TopAlignedWithParent':\n case 'BottomAlignedWithParent':\n break;\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 h -= this.options.underneathVerticalSeparation;\n break;\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 default:\n throw 'Unhandled TreeDirection in the Right layout measuring.';\n }\n break;\n case 'Up':\n case 'Down':\n switch (node.childrenLayout) {\n case 'TopAlignedWithParent':\n case 'BottomAlignedWithParent':\n break;\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 h -= this.options.underneathVerticalSeparation;\n break;\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 w -= this.options.horizontalSeparation;\n break;\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 result = new Size(w, h);\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 } 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 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 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;\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 default:\n throw 'Unsupported TreeDirection';\n }\n break;\n case 'Right':\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 + shapeWidth + this.options.underneathHorizontalOffset;\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 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;\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 default:\n throw 'Unsupported TreeDirection';\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 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 } else {\n x = p.x;\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 case 'Down':\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;\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 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 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 } else {\n x = p.x;\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 default:\n throw 'Unsupported TreeDirection';\n }\n break;\n case 'None':\n break;\n default:\n throw 'Unsupported TreeDirection';\n }\n }\n },\n layoutSwitch: function () {\n if (!this.center) {\n return;\n }\n if (Utils.isEmpty(this.center.children)) {\n return;\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 case 'mindmaphorizontal':\n case 'mindmap':\n single = this.center.children;\n if (this.center.children.length === 1) {\n this.layoutRight(single);\n } else {\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.layoutLeft(male);\n this.layoutRight(female);\n }\n break;\n case 'mindmapvertical':\n single = this.center.children;\n if (this.center.children.length === 1) {\n this.layoutDown(single);\n } else {\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 case 'right':\n this.layoutRight(this.center.children);\n break;\n case 'left':\n this.layoutLeft(this.center.children);\n break;\n case 'up':\n case 'bottom':\n this.layoutUp(this.center.children);\n break;\n case 'down':\n case 'top':\n this.layoutDown(this.center.children);\n break;\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 case 'undefined':\n case 'none':\n break;\n }\n }\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 layout: function (options) {\n this.transferOptions(options);\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n this.graph = adapter.convert();\n var finalNodeSet = this.layoutComponents();\n return new diagram.LayoutState(this.diagram, finalNodeSet);\n },\n layoutComponents: function () {\n if (this.graph.isEmpty()) {\n return;\n }\n var components = this.graph.getConnectedComponents();\n if (Utils.isEmpty(components)) {\n return;\n }\n var layout = new TreeLayoutProcessor(this.options);\n var trees = [];\n for (var i = 0; i < components.length; i++) {\n var component = components[i];\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 trees.push(tree);\n }\n return this.gridLayoutComponents(trees);\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 root = graph.root();\n if (!root) {\n throw 'Unable to find a root for the tree.';\n }\n }\n return this.getTreeForRoot(graph, root);\n },\n getTreeForRoot: function (graph, root) {\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 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 layout: function (options) {\n this.transferOptions(options);\n var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n var graph = adapter.convert(options);\n if (graph.isEmpty()) {\n return;\n }\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 _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 node.isVirtual = false;\n node.uBaryCenter = 0;\n node.dBaryCenter = 0;\n node.upstreamPriority = 0;\n node.downstreamPriority = 0;\n node.gridPosition = 0;\n }\n },\n _prepare: function (graph) {\n var current = [], i, l, link;\n var layerMap = new Dictionary();\n var layerCount = 0;\n var targetLayer, next, target;\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 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 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 if (!contains(current, target)) {\n current.push(target);\n }\n }\n }\n var sortedNodes = layerMap.keys();\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 for (var n = 0; n < sortedNodes.length; ++n) {\n var node = sortedNodes[n];\n var minLayer = Number.MAX_VALUE;\n if (node.outgoing.length === 0) {\n continue;\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 if (minLayer > 1) {\n layerMap.set(node, minLayer - 1);\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 layerMap.forEach(function (node, layer) {\n node.layer = layer;\n this.layers[layer].push(node);\n }, this);\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 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 graph.setItemIndices();\n var reversedEdges = graph.makeAcyclic();\n this._initRuntimeProperties();\n this._prepare(graph, options);\n this._dummify();\n this._optimizeCrossings();\n this._swapPairs();\n this.arrangeNodes();\n this._moveThingsAround();\n this._dedummify();\n Utils.forEach(reversedEdges, function (e) {\n if (e.points) {\n e.points.reverse();\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 getMinDist: function (m, n) {\n var dist = 0, i1 = m.layerIndex, i2 = n.layerIndex, l = m.layer, min = Math.min(i1, i2), max = Math.max(i1, i2);\n for (var k = min; k < max; ++k) {\n dist += this.minDistances[l][k];\n }\n return dist;\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 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 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 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 } else if (D.length % 2 === 1) {\n d = D[this.intDiv(D.length, 2)];\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 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 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 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 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 } else if (D.length % 2 === 1) {\n d = D[this.intDiv(D.length, 2)];\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 _getLeftWing: function () {\n var leftWing = { value: null };\n var result = this.computeClasses(leftWing, 1);\n this.nodeLeftClass = leftWing.value;\n return result;\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 computeClasses: function (wingPair, d) {\n var currentWing = 0, wing = wingPair.value = new Dictionary();\n for (var l = 0; l < this.layers.length; ++l) {\n currentWing = l;\n var layer = this.layers[l];\n for (var n = d === 1 ? 0 : layer.length - 1; 0 <= n && 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 } else {\n currentWing = wing.get(node);\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 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 _isHorizontalLayout: function () {\n return this.options.subtype.toLowerCase() === 'right' || this.options.subtype.toLowerCase() === 'left' || this.options.subtype.toLowerCase() === 'horizontal';\n },\n _isIncreasingLayout: function () {\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 for (l = 0; l < this.layers.length; ++l) {\n layer = this.layers[l];\n layer.sort(this._gridPositionComparer);\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 } else {\n this.minDistances[l][n] += (node.height + layer[n + 1].height) / 2;\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 } 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 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 var currDown = this.downNodes.get(currentNode)[0];\n if (!currDown.isVirtual) {\n continue;\n }\n for (n = w + 1; n < layer.length; ++n) {\n node = layer[n];\n if (!node.isVirtual) {\n continue;\n }\n var downNode = this.downNodes.get(node)[0];\n if (!downNode.isVirtual) {\n continue;\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 var leftClasses = this._getLeftWing();\n var rightClasses = this._getRightWing();\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 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 } else if (sequenceStart === n - 1) {\n sequenceStart = 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 } else {\n placed.set(layer[sequenceStart], false);\n }\n sequenceStart = n;\n }\n }\n }\n }\n var directions = [\n 1,\n -1\n ];\n Utils.forEach(directions, function (d) {\n var start = d === 1 ? 0 : this.layers.length - 1;\n for (var l = start; 0 <= l && 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 } 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 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 } 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 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 } else {\n return k >= 0;\n }\n };\n var layerIncrement = this._isIncreasingLayout() ? +1 : -1, offset = 0;\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 } else {\n height = Math.max(height, node.width);\n }\n }\n return height;\n }\n for (i = fromLayerIndex; reachedFinalLayerIndex(i, this); i += layerIncrement) {\n layer = this.layers[i];\n var height = maximumHeight(layer, this);\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 } else {\n node.x = offset + height / 2;\n node.y = x.get(node);\n }\n }\n offset += this.options.layerSeparation + height;\n }\n },\n adjustDirections: function (l, d, order, placed) {\n if (l + d < 0 || l + d >= this.layers.length) {\n return;\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 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 _sequencer: function (x, virtualStart, virtualEnd, dir, sequence) {\n if (sequence.length === 1) {\n this._sequenceSingle(x, virtualStart, virtualEnd, dir, sequence[0]);\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 _sequenceSingle: function (x, virtualStart, virtualEnd, dir, node) {\n var neighbors = dir === -1 ? this.downNodes.get(node) : this.upNodes.get(node);\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 } else {\n x.set(node, (x.get(neighbors[this.intDiv(n, 2) - 1]) + x.get(neighbors[this.intDiv(n, 2)])) / 2);\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 combineSequences: function (x, virtualStart, virtualEnd, dir, sequence) {\n var r = sequence.length, t = this.intDiv(r, 2);\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 } else {\n c--;\n leftHeap.push({\n k: x.get(neighbor) + this.getMinDist(sequence[i], sequence[t - 1]),\n v: 2\n });\n }\n }\n leftHeap.push({\n k: x.get(sequence[i]) + this.getMinDist(sequence[i], sequence[t - 1]),\n v: c\n });\n }\n if (virtualStart) {\n leftHeap.push({\n k: x.get(virtualStart) + this.getMinDist(virtualStart, sequence[t - 1]),\n v: Number.MAX_VALUE\n });\n }\n leftHeap.sort(this._positionDescendingComparer);\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 } else {\n c--;\n rightHeap.push({\n k: x.get(neighbor) - this.getMinDist(sequence[i], sequence[t]),\n v: 2\n });\n }\n }\n rightHeap.push({\n k: x.get(sequence[i]) - this.getMinDist(sequence[i], sequence[t]),\n v: c\n });\n }\n if (virtualEnd) {\n rightHeap.push({\n k: x.get(virtualEnd) - this.getMinDist(virtualEnd, sequence[t]),\n v: Number.MAX_VALUE\n });\n }\n rightHeap.sort(this._positionAscendingComparer);\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 } 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 } else {\n if (rightHeap.length === 0) {\n x.set(sequence[t], x.get(sequence[t - 1]) + m);\n break;\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 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 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 leftSibling: function (node) {\n var layer = this.layers[node.layer], layerIndex = node.layerIndex;\n return layerIndex === 0 ? null : layer[layerIndex - 1];\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 _getComposite: function (node) {\n return node.isVirtual ? this._nodesInLink(node) : [node];\n },\n arrangeNodes: function () {\n var i, l, ni, layer, node;\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\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 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 for (i = 0; i < this.layers.length - 1; i++) {\n this.layoutLayer(true, i);\n }\n }\n var gridPos = Number.MAX_VALUE;\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n for (ni = 0; ni < layer.length; ni++) {\n node = layer[ni];\n gridPos = Math.min(gridPos, node.gridPosition);\n }\n }\n if (gridPos < 0) {\n for (l = 0; l < this.layers.length; l++) {\n layer = this.layers[l];\n for (ni = 0; ni < layer.length; ni++) {\n node = layer[ni];\n node.gridPosition = node.gridPosition - gridPos;\n }\n }\n }\n },\n layoutLayer: function (down, layer) {\n var iconsidered;\n var considered;\n if (down) {\n considered = this.layers[iconsidered = layer + 1];\n } else {\n considered = this.layers[iconsidered = layer - 1];\n }\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 if (Math.abs(n1Priority - n2Priority) < 0.0001) {\n return 0;\n }\n if (n1Priority < n2Priority) {\n return 1;\n }\n return -1;\n });\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 if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.0001) {\n return;\n }\n if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.25 + 0.0001) {\n return;\n }\n if (nodeGridPos < nodeBaryCenter) {\n while (nodeGridPos < nodeBaryCenter) {\n if (!this.moveRight(node, considered, nodePriority)) {\n break;\n }\n nodeGridPos = node.gridPosition;\n }\n } else {\n while (nodeGridPos > nodeBaryCenter) {\n if (!this.moveLeft(node, considered, nodePriority)) {\n break;\n }\n nodeGridPos = node.gridPosition;\n }\n }\n }, this);\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 moveRight: function (node, layer, priority) {\n var index = Utils.indexOf(layer, node);\n if (index === layer.length - 1) {\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n var rightNode = layer[index + 1];\n var rightNodePriority = (rightNode.upstreamPriority + rightNode.downstreamPriority) / 2;\n if (rightNode.gridPosition > node.gridPosition + 1) {\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n if (rightNodePriority > priority || Math.abs(rightNodePriority - priority) < 0.0001) {\n return false;\n }\n if (this.moveRight(rightNode, layer, priority)) {\n node.gridPosition = node.gridPosition + 0.5;\n return true;\n }\n return false;\n },\n moveLeft: function (node, layer, priority) {\n var index = Utils.indexOf(layer, node);\n if (index === 0) {\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n var leftNode = layer[index - 1];\n var leftNodePriority = (leftNode.upstreamPriority + leftNode.downstreamPriority) / 2;\n if (leftNode.gridPosition < node.gridPosition - 1) {\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n if (leftNodePriority > priority || Math.abs(leftNodePriority - priority) < 0.0001) {\n return false;\n }\n if (this.moveLeft(leftNode, layer, priority)) {\n node.gridPosition = node.gridPosition - 0.5;\n return true;\n }\n return false;\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 _nodesInLink: function (node) {\n return this.linkToNodeMap.get(this.nodeToLinkMap.get(node));\n },\n _dummify: function () {\n this.linkToNodeMap = new Dictionary();\n this.nodeToLinkMap = new Dictionary();\n var layer, pos, newNode, node, r, newLink, i, l, links = this.graph.links.slice(0);\n var layers = this.layers;\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 for (l = 0; l < links.length; l++) {\n var link = links[l];\n var o = link.source;\n var d = link.target;\n var oLayer = o.layer;\n var dLayer = d.layer;\n var oPos = o.gridPosition;\n var dPos = d.gridPosition;\n var step = (dPos - oPos) / Math.abs(dLayer - oLayer);\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 layer = layers[i];\n pos = (i - dLayer) * step + oPos;\n if (pos > layer.length) {\n pos = layer.length;\n }\n if (oPos >= layers[oLayer].length - 1 && dPos >= layers[dLayer].length - 1) {\n pos = layer.length;\n } else if (oPos === 0 && dPos === 0) {\n pos = 0;\n }\n newNode.layer = i;\n newNode.uBaryCenter = 0;\n newNode.dBaryCenter = 0;\n newNode.upstreamLinkCount = 0;\n newNode.downstreamLinkCount = 0;\n newNode.gridPosition = pos;\n newNode.isVirtual = true;\n Utils.insert(layer, newNode, pos);\n for (r = pos + 1; r < layer.length; r++) {\n node = layer[r];\n node.gridPosition = node.gridPosition + 1;\n }\n newLink = new Link(p, newNode);\n newLink.depthOfDumminess = 0;\n addLinkBetweenLayers(i - 1, i, newLink);\n p = newNode;\n this.graph._addNode(newNode);\n this.graph.addLink(newLink);\n newNode.index = this.graph.nodes.length - 1;\n this.mapVirtualNode(newNode, link);\n }\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 layer = layers[i];\n pos = (i - oLayer) * step + oPos;\n if (pos > layer.length) {\n pos = layer.length;\n }\n if (oPos >= layers[oLayer].length - 1 && dPos >= layers[dLayer].length - 1) {\n pos = layer.length;\n } else if (oPos === 0 && dPos === 0) {\n pos = 0;\n }\n newNode.layer = i;\n newNode.uBaryCenter = 0;\n newNode.dBaryCenter = 0;\n newNode.upstreamLinkCount = 0;\n newNode.downstreamLinkCount = 0;\n newNode.gridPosition = pos;\n newNode.isVirtual = true;\n pos &= pos;\n Utils.insert(layer, newNode, pos);\n for (r = pos + 1; r < layer.length; r++) {\n node = layer[r];\n node.gridPosition = node.gridPosition + 1;\n }\n newLink = new Link(p, newNode);\n newLink.depthOfDumminess = 0;\n addLinkBetweenLayers(i - 1, i, newLink);\n p = newNode;\n this.graph._addNode(newNode);\n this.graph.addLink(newLink);\n newNode.index = this.graph.nodes.length - 1;\n this.mapVirtualNode(newNode, link);\n }\n addLinkBetweenLayers(dLayer - 1, dLayer, link);\n link.changeSource(p);\n link.depthOfDumminess = dLayer - oLayer - 1;\n } else {\n addLinkBetweenLayers(oLayer, dLayer, link);\n }\n }\n },\n _dedummify: function () {\n var dedum = true;\n while (dedum) {\n dedum = false;\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 var points = [];\n points.unshift({\n x: link.target.x,\n y: link.target.y\n });\n points.unshift({\n x: link.source.x,\n y: link.source.y\n });\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 points.unshift({\n x: prevLink.source.x,\n y: prevLink.source.y\n });\n temp = prevLink;\n }\n link.changeSource(temp.source);\n link.depthOfDumminess = 0;\n if (points.length > 2) {\n points.splice(0, 1);\n points.splice(points.length - 1);\n link.points = points;\n } else {\n link.points = [];\n }\n dedum = true;\n break;\n }\n }\n },\n _optimizeCrossings: function () {\n var moves = -1, i;\n var maxIterations = 3;\n var iter = 0;\n while (moves !== 0) {\n if (iter++ > maxIterations) {\n break;\n }\n moves = 0;\n for (i = this.layers.length - 1; i >= 1; i--) {\n moves += this.optimizeLayerCrossings(false, i);\n }\n for (i = 0; i < this.layers.length - 1; i++) {\n moves += this.optimizeLayerCrossings(true, i);\n }\n }\n },\n calcUpData: function (layer) {\n if (layer === 0) {\n return;\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 for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n var sum = 0;\n var total = 0;\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 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 if (total > 0) {\n node.uBaryCenter = sum / total;\n node.upstreamLinkCount = total;\n } else {\n node.uBaryCenter = i;\n node.upstreamLinkCount = 0;\n }\n }\n },\n calcDownData: function (layer) {\n if (layer === this.layers.length - 1) {\n return;\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 for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n var sum = 0;\n var total = 0;\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 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 if (total > 0) {\n node.dBaryCenter = sum / total;\n node.downstreamLinkCount = total;\n } else {\n node.dBaryCenter = i;\n node.downstreamLinkCount = 0;\n }\n }\n },\n optimizeLayerCrossings: function (down, layer) {\n var iconsidered;\n var considered;\n if (down) {\n considered = this.layers[iconsidered = layer + 1];\n } else {\n considered = this.layers[iconsidered = layer - 1];\n }\n var presorted = considered.slice(0);\n if (down) {\n this.calcUpData(iconsidered);\n } else {\n this.calcDownData(iconsidered);\n }\n var that = this;\n considered.sort(function (n1, n2) {\n var n1BaryCenter = that.calcBaryCenter(n1), n2BaryCenter = that.calcBaryCenter(n2);\n if (Math.abs(n1BaryCenter - n2BaryCenter) < 0.0001) {\n if (n1.degree() === n2.degree()) {\n return that.compareByIndex(n1, n2);\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 } else if (compareValue < 0) {\n return 1;\n }\n return that.compareByIndex(n1, n2);\n });\n var i, moves = 0;\n for (i = 0; i < considered.length; i++) {\n if (considered[i] !== presorted[i]) {\n moves++;\n }\n }\n if (moves > 0) {\n var inode = 0;\n for (i = 0; i < considered.length; i++) {\n var node = considered[i];\n node.gridPosition = inode++;\n }\n }\n return moves;\n },\n _swapPairs: function () {\n var maxIterations = this.options.layeredIterations;\n var iter = 0;\n while (true) {\n if (iter++ > maxIterations) {\n break;\n }\n var downwards = iter % 4 <= 1;\n var secondPass = iter % 4 === 1;\n for (var l = downwards ? 0 : this.layers.length - 1; downwards ? l <= this.layers.length - 1 : l >= 0; l += downwards ? 1 : -1) {\n var layer = this.layers[l];\n var hasSwapped = false;\n var calcCrossings = true;\n var memCrossings = 0;\n for (var n = 0; n < layer.length - 1; n++) {\n var up = 0;\n var down = 0;\n var crossBefore = 0;\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 } else {\n down *= 2;\n }\n crossBefore = up + down;\n } else {\n crossBefore = memCrossings;\n }\n if (crossBefore === 0) {\n continue;\n }\n var node1 = layer[n];\n var node2 = layer[n + 1];\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 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 } else {\n down *= 2;\n }\n var crossAfter = up + down;\n var revert = false;\n if (secondPass) {\n revert = crossAfter >= crossBefore;\n } else {\n revert = crossAfter > crossBefore;\n }\n if (revert) {\n node1 = layer[n];\n node2 = layer[n + 1];\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 memCrossings = crossBefore;\n calcCrossings = false;\n } else {\n hasSwapped = true;\n calcCrossings = true;\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 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 for (l1 = 0; l1 < length; l1++) {\n link1 = links[l1];\n for (l2 = l1 + 1; l2 < length; l2++) {\n link2 = links[l2];\n if (link1.target.layer === dlayer) {\n n11 = link1.source;\n n12 = link1.target;\n } else {\n n11 = link1.target;\n n12 = link1.source;\n }\n if (link2.target.layer === dlayer) {\n n21 = link2.source;\n n22 = link2.target;\n } else {\n n21 = link2.target;\n n22 = link2.source;\n }\n var n11gp = n11.gridPosition;\n var n12gp = n12.gridPosition;\n var n21gp = n21.gridPosition;\n var n22gp = n22.gridPosition;\n if ((n11gp - n21gp) * (n12gp - n22gp) < 0) {\n crossings++;\n }\n }\n }\n return crossings;\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 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 return 0;\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 _positionAscendingComparer: function (x, y) {\n return x.k < y.k ? -1 : x.k > y.k ? 1 : 0;\n },\n _positionDescendingComparer: function (x, y) {\n return x.k < y.k ? 1 : x.k > y.k ? -1 : 0;\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 compareByIndex: function (o1, o2) {\n var i1 = o1.index;\n var i2 = o2.index;\n if (i1 < i2) {\n return 1;\n }\n if (i1 > i2) {\n return -1;\n }\n return 0;\n },\n intDiv: function (numerator, denominator) {\n return (numerator - numerator % denominator) / denominator;\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 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 capture: function (diagramOrGraphOrNodes) {\n var node, nodes, shape, i, conn, link, links;\n if (diagramOrGraphOrNodes instanceof diagram.Graph) {\n for (i = 0; i < diagramOrGraphOrNodes.nodes.length; i++) {\n node = diagramOrGraphOrNodes.nodes[i];\n shape = node.associatedShape;\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 } 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 } 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 } else {\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 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}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('dataviz/diagram/dom', [\n 'kendo.data',\n 'kendo.draganddrop',\n 'kendo.toolbar',\n 'kendo.editable',\n 'kendo.window',\n 'kendo.dropdownlist',\n 'kendo.dataviz.core',\n 'kendo.dataviz.themes',\n 'dataviz/diagram/svg',\n 'dataviz/diagram/services',\n 'dataviz/diagram/layout'\n ], f);\n}(function () {\n (function ($, undefined) {\n var dataviz = kendo.dataviz, draw = kendo.drawing, geom = kendo.geometry, diagram = dataviz.diagram, Widget = kendo.ui.Widget, Class = kendo.Class, proxy = $.proxy, deepExtend = kendo.deepExtend, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, HierarchicalDataSource = kendo.data.HierarchicalDataSource, Canvas = diagram.Canvas, Group = diagram.Group, Rectangle = diagram.Rectangle, Circle = diagram.Circle, CompositeTransform = diagram.CompositeTransform, Rect = diagram.Rect, Path = diagram.Path, DeleteShapeUnit = diagram.DeleteShapeUnit, DeleteConnectionUnit = diagram.DeleteConnectionUnit, TextBlock = diagram.TextBlock, Image = diagram.Image, Point = diagram.Point, Intersect = diagram.Intersect, ConnectionEditAdorner = diagram.ConnectionEditAdorner, UndoRedoService = diagram.UndoRedoService, ToolService = diagram.ToolService, Selector = diagram.Selector, ResizingAdorner = diagram.ResizingAdorner, ConnectorsAdorner = diagram.ConnectorsAdorner, Cursors = diagram.Cursors, Utils = diagram.Utils, Observable = kendo.Observable, ToBackUnit = diagram.ToBackUnit, ToFrontUnit = diagram.ToFrontUnit, PolylineRouter = diagram.PolylineRouter, CascadingRouter = diagram.CascadingRouter, isUndefined = Utils.isUndefined, isDefined = Utils.isDefined, defined = draw.util.defined, isArray = $.isArray, isFunction = kendo.isFunction, isString = Utils.isString, isPlainObject = $.isPlainObject, math = Math;\n var NS = '.kendoDiagram', CASCADING = 'cascading', ITEMBOUNDSCHANGE = 'itemBoundsChange', CHANGE = 'change', CLICK = 'click', DRAG = 'drag', DRAG_END = 'dragEnd', DRAG_START = 'dragStart', MOUSE_ENTER = 'mouseEnter', MOUSE_LEAVE = 'mouseLeave', ERROR = 'error', AUTO = 'Auto', TOP = 'Top', RIGHT = 'Right', LEFT = 'Left', BOTTOM = 'Bottom', MAXINT = 9007199254740992, SELECT = 'select', ITEMROTATE = 'itemRotate', PAN = 'pan', ZOOM_START = 'zoomStart', ZOOM_END = 'zoomEnd', NONE = 'none', DEFAULT_CANVAS_WIDTH = 600, DEFAULT_CANVAS_HEIGHT = 600, DEFAULT_SHAPE_TYPE = 'rectangle', DEFAULT_SHAPE_WIDTH = 100, DEFAULT_SHAPE_HEIGHT = 100, DEFAULT_SHAPE_MINWIDTH = 20, DEFAULT_SHAPE_MINHEIGHT = 20, DEFAULT_SHAPE_POSITION = 0, DEFAULT_CONNECTION_BACKGROUND = 'Yellow', MAX_VALUE = Number.MAX_VALUE, MIN_VALUE = -Number.MAX_VALUE, ABSOLUTE = 'absolute', TRANSFORMED = 'transformed', ROTATED = 'rotated', TRANSPARENT = 'transparent', WIDTH = 'width', HEIGHT = 'height', X = 'x', Y = 'y', MOUSEWHEEL_NS = 'DOMMouseScroll' + NS + ' mousewheel' + NS, MOBILE_ZOOM_RATE = 0.05, MOBILE_PAN_DISTANCE = 5, BUTTON_TEMPLATE = '#=text#', CONNECTION_CONTENT_OFFSET = 5;\n diagram.DefaultConnectors = [\n { name: TOP },\n { name: BOTTOM },\n { name: LEFT },\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 imageClass: 'k-i-cancel',\n className: 'k-diagram-cancel',\n iconClass: 'k-icon'\n },\n update: {\n text: 'Update',\n imageClass: 'k-i-checkmark',\n className: 'k-diagram-update',\n iconClass: 'k-icon'\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: { angle: 0 }\n };\n Utils.simpleExtend(defaults, extra);\n return defaults;\n };\n function mwDelta(e) {\n var origEvent = e.originalEvent, delta = 0;\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 return delta;\n }\n function isAutoConnector(connector) {\n return connector.options.name.toLowerCase() === AUTO.toLowerCase();\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 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 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 options: {\n hover: {},\n cursor: Cursors.grip,\n content: { align: 'center middle' },\n selectable: true,\n serializable: true,\n enable: true\n },\n _getCursor: function (point) {\n if (this.adorner) {\n return this.adorner._getCursor(point);\n }\n return this.options.cursor;\n },\n visible: function (value) {\n if (isUndefined(value)) {\n return this.visual.visible();\n } else {\n this.visual.visible(value);\n }\n },\n bounds: function () {\n },\n refresh: function () {\n this.visual.redraw();\n },\n position: function (point) {\n this.options.x = point.x;\n this.options.y = point.y;\n this.visual.position(point);\n },\n toString: function () {\n return this.options.id;\n },\n serialize: function () {\n var json = deepExtend({}, { options: this.options });\n if (this.dataItem) {\n json.dataItem = this.dataItem.toString();\n }\n return json;\n },\n _content: function (content) {\n if (content !== undefined) {\n var options = this.options;\n if (diagram.Utils.isString(content)) {\n options.content.text = content;\n } else {\n deepExtend(options.content, content);\n }\n var contentOptions = options.content;\n var contentVisual = this._contentVisual;\n if (!contentVisual) {\n this._createContentVisual(contentOptions);\n } else {\n this._updateContentVisual(contentOptions);\n }\n }\n return this.options.content.text;\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 _updateContentVisual: function (options) {\n this._contentVisual.redraw(options);\n },\n _hitTest: function (point) {\n var bounds = this.bounds();\n return this.visible() && bounds.contains(point) && this.options.enable;\n },\n _template: function () {\n var that = this;\n if (that.options.content.template) {\n var data = that.dataItem || {}, elementTemplate = kendo.template(that.options.content.template, { paramName: 'dataItem' });\n that.options.content.text = elementTemplate(data);\n }\n },\n _canSelect: function () {\n return this.options.selectable !== false;\n },\n toJSON: function () {\n return { id: this.options.id };\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: { color: DEFAULT_CONNECTION_BACKGROUND },\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 Connector.parse = function (diagram, str) {\n var tempStr = str.split(':'), id = tempStr[0], name = tempStr[1] || AUTO;\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 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 that._createConnectors();\n },\n options: diagram.shapeDefaults(),\n _setOptionsFromModel: function (model) {\n var modelOptions = filterShapeDataItem(model || this.dataItem);\n this.options = deepExtend({}, this.options, modelOptions);\n this.redrawVisual();\n },\n updateOptionsFromModel: function (model, field) {\n if (this.diagram && this.diagram._isEditable) {\n var modelOptions = filterShapeDataItem(model || this.dataItem);\n if (model && field) {\n if (!dataviz.inArray(field, [\n 'x',\n 'y',\n 'width',\n 'height'\n ])) {\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 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 _redrawVisual: function () {\n this.visual.clear();\n this._contentVisual = null;\n this.options.dataItem = this.dataItem;\n this.createShapeVisual();\n this.updateBounds();\n },\n redrawVisual: function () {\n this._redrawVisual();\n if (this.options.content) {\n this._template();\n this.content(this.options.content);\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 if (model) {\n diagram._suspendModelRefresh();\n if (defined(model.x) && bounds.x !== model.x) {\n model.set('x', bounds.x);\n }\n if (defined(model.y) && bounds.y !== model.y) {\n model.set('y', bounds.y);\n }\n if (defined(model.width) && bounds.width !== model.width) {\n model.set('width', bounds.width);\n }\n if (defined(model.height) && bounds.height !== model.height) {\n model.set('height', bounds.height);\n }\n this.dataItem = model;\n diagram._resumeModelRefresh();\n if (syncChanges) {\n diagram._syncShapeChanges();\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 content: function (content) {\n var result = this._content(content);\n this._alignContent();\n return result;\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 var contentRect = new Rect(0, 0, contentBounds.width(), contentBounds.height());\n var alignedBounds = aligner.align(contentRect, contentOptions.align);\n contentVisual.position(alignedBounds.topLeft());\n }\n },\n _createConnectors: function () {\n var options = this.options, length = options.connectors.length, connectorDefaults = options.connectorDefaults, connector, i;\n for (i = 0; i < length; i++) {\n connector = new Connector(this, deepExtend({}, connectorDefaults, options.connectors[i]));\n this.connectors.push(connector);\n }\n },\n bounds: function (value) {\n var bounds;\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 return bounds;\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 this._bounds = new Rect(x, y, width, height);\n this.visual.redraw({\n x: x,\n y: y,\n width: width,\n height: height\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 clone: function () {\n var json = this.serialize();\n json.options.id = diagram.randomId();\n if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n json.options.dataItem = cloneDataItem(this.dataItem);\n }\n return new Shape(json.options);\n },\n select: function (value) {\n var diagram = this.diagram, selected, deselected;\n if (isUndefined(value)) {\n value = true;\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 if (!diagram._internalSelection) {\n diagram._selectionChanged(selected, deselected);\n }\n return true;\n }\n }\n },\n rotate: function (angle, center, undoable) {\n var rotate = this.visual.rotate();\n if (angle !== undefined) {\n if (undoable !== false && this.diagram && this.diagram.undoRedoService && angle !== rotate.angle) {\n this.diagram.undoRedoService.add(new diagram.RotateUnit(this.diagram._resizingAdorner, [this], [rotate.angle]), false);\n }\n var b = this.bounds(), sc = new Point(b.width / 2, b.height / 2), deltaAngle, newPosition;\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 this.visual.rotate(angle, sc);\n this.options.rotation.angle = angle;\n if (this.diagram && this.diagram._connectorsAdorner) {\n this.diagram._connectorsAdorner.refresh();\n }\n this.refreshConnections();\n if (this.diagram) {\n this.diagram.trigger(ITEMROTATE, { item: this });\n }\n }\n return rotate;\n },\n connections: function (type) {\n var result = [], i, j, con, cons, ctr;\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 return result;\n },\n refreshConnections: function () {\n $.each(this.connections(), function () {\n this.refresh();\n });\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 getPosition: function (side) {\n var b = this.bounds(), fnName = side.charAt(0).toLowerCase() + side.slice(1);\n if (isFunction(b[fnName])) {\n return this._transformPoint(b[fnName]());\n }\n return b.center();\n },\n redraw: function (options) {\n if (options) {\n var shapeOptions = this.options;\n var boundsChange;\n this.shapeVisual.redraw(this._visualOptions(options));\n if (this._diffNumericOptions(options, [\n WIDTH,\n HEIGHT,\n X,\n Y\n ])) {\n this.bounds(new Rect(shapeOptions.x, shapeOptions.y, shapeOptions.width, shapeOptions.height));\n boundsChange = true;\n }\n if (options.connectors) {\n shapeOptions.connectors = options.connectors;\n this._updateConnectors();\n }\n shapeOptions = deepExtend(shapeOptions, options);\n if (options.rotation || boundsChange) {\n this._rotate();\n }\n if (shapeOptions.content) {\n this.content(shapeOptions.content);\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 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 _diffNumericOptions: diagram.diffNumericOptions,\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 _triggerBoundsChange: function () {\n if (this.diagram) {\n this.diagram.trigger(ITEMBOUNDSCHANGE, {\n item: this,\n bounds: this._bounds.clone()\n });\n }\n },\n _transformPoint: function (point) {\n var rotate = this.rotate(), bounds = this.bounds(), tl = bounds.topLeft();\n if (rotate.angle) {\n point.rotate(rotate.center().plus(tl), 360 - rotate.angle);\n }\n return point;\n },\n _transformedBounds: function () {\n var bounds = this.bounds(), tl = bounds.topLeft(), br = bounds.bottomRight();\n return Rect.fromPoints(this.diagram.modelToView(tl), this.diagram.modelToView(br));\n },\n _rotatedBounds: function () {\n var bounds = this.bounds().rotatedBounds(this.rotate().angle), tl = bounds.topLeft(), br = bounds.bottomRight();\n return Rect.fromPoints(tl, br);\n },\n _rotate: function () {\n var rotation = this.options.rotation;\n if (rotation && rotation.angle) {\n this.rotate(rotation.angle);\n }\n this._rotationOffset = new Point();\n },\n _hover: function (value) {\n var options = this.options, hover = options.hover, stroke = options.stroke, fill = options.fill;\n if (value && isDefined(hover.stroke)) {\n stroke = deepExtend({}, stroke, hover.stroke);\n }\n if (value && isDefined(hover.fill)) {\n fill = hover.fill;\n }\n this.shapeVisual.redraw({\n stroke: stroke,\n fill: fill\n });\n if (options.editable && options.editable.connect) {\n this.diagram._showConnectors(this, value);\n }\n },\n _hitTest: function (value) {\n if (this.visible()) {\n var bounds = this.bounds(), rotatedPoint, angle = this.rotate().angle;\n if (value.isEmpty && !value.isEmpty()) {\n return Intersect.rects(value, bounds, angle ? angle : 0);\n } else {\n rotatedPoint = value.clone().rotate(bounds.center(), angle);\n if (bounds.contains(rotatedPoint)) {\n return this;\n }\n }\n }\n },\n toJSON: function () {\n return { shapeId: this.options.id };\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 visualOptions.width = options.width;\n visualOptions.height = options.height;\n if (isFunction(visualTemplate)) {\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 this.shapeVisual = shapeVisual;\n this.visual.append(this.shapeVisual);\n }\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 options: {\n hover: { stroke: {} },\n startCap: NONE,\n endCap: NONE,\n points: [],\n selectable: true,\n fromConnector: AUTO,\n toConnector: AUTO\n },\n _setOptionsFromModel: function (model) {\n this.updateOptionsFromModel(model || this.dataItem);\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 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 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 if (defined(options.type) && this.type() !== options.type) {\n this.points([]);\n this.type(options.type);\n }\n this.dataItem = model;\n this._template();\n this.redraw(this.options);\n } else {\n this.options = deepExtend({}, options, this.options);\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 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 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 if (defined(this.options.type) && defined(model.type)) {\n model.set('type', this.options.type);\n }\n this.dataItem = model;\n this.diagram._resumeModelRefresh();\n if (syncChanges) {\n this.diagram._syncConnectionChanges();\n }\n }\n }\n }\n },\n sourcePoint: function () {\n return this._resolvedSourceConnector ? this._resolvedSourceConnector.position() : this._sourcePoint;\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 if (source !== undefined) {\n this.from = source;\n }\n this._removeFromSourceConnector();\n if (source === null) {\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 } else if (shapeSource) {\n dataItem = source.dataItem;\n if (dataItem) {\n this._setFromOptions(dataItem.id);\n }\n this.sourceConnector = source.getConnector(defaultConnector);\n this.sourceConnector.connections.push(this);\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 _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 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);\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 targetPoint: function () {\n return this._resolvedTargetConnector ? this._resolvedTargetConnector.position() : this._targetPoint;\n },\n _setTarget: function (target) {\n var shapeTarget = target instanceof Shape;\n var defaultConnector = this.options.toConnector || AUTO;\n var dataItem;\n if (shapeTarget && !target.getConnector(defaultConnector)) {\n return;\n }\n if (target !== undefined) {\n this.to = target;\n }\n this._removeFromTargetConnector();\n if (target === null) {\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 target: function (target, undoable) {\n if (isDefined(target)) {\n if (undoable && this.diagram) {\n this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, undefined, target));\n }\n this._setTarget(target);\n this.refresh();\n }\n return this.targetConnector ? this.targetConnector : this._targetPoint;\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 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);\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 _updateConnectors: function () {\n this._updateConnector(this.source(), 'source');\n this._updateConnector(this.target(), 'target');\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 content: function (content) {\n var result = this._content(content);\n if (defined(content)) {\n this._alignContent();\n }\n return result;\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 if (visual) {\n this._contentVisual = visual;\n visual._includeInBBox = false;\n this.visual.append(visual);\n }\n return visual;\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 _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 while (startIdx > 0 && points[startIdx].equals(points[endIdx])) {\n startIdx--;\n endIdx++;\n }\n var endPoint = points[endIdx];\n var startPoint = points[startIdx];\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 if (alignToPath && points.length > 2 && distance > 0 && (startPoint.y === endPoint.y && distance < width || startPoint.x === endPoint.x && distance < height)) {\n alignToPath = false;\n offset = 0;\n }\n var point;\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 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 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 point.x += offsetX;\n point.y += offsetY;\n }\n this._contentVisual.position(point);\n }\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;\n deselected.push(this);\n }\n }\n if (this.adorner) {\n this.adorner.refresh();\n }\n if (!diagram._internalSelection) {\n diagram._selectionChanged(selected, deselected);\n }\n return true;\n }\n }\n },\n bounds: function (value) {\n if (value && !isString(value)) {\n this._bounds = value;\n } else {\n return this._bounds;\n }\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 _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 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')) {\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 } 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 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 refresh: function () {\n this._resolveConnectors();\n this._refreshPath();\n this._alignContent();\n if (this.adorner) {\n this.adorner.refresh();\n }\n },\n _resolveConnectors: function () {\n var connection = this, sourcePoint, targetPoint, sourceConnectors, targetConnectors, source = connection.source(), target = connection.target();\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 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 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 _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 for (sourceIdx = 0; sourceIdx < sourceConnectors.length; sourceIdx++) {\n sourceConnector = sourceConnectors[sourceIdx];\n if (!isAutoConnector(sourceConnector)) {\n sourcePoint = sourceConnector.position();\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 if (dist < minNonConflict && this.diagram && this._testRoutePoints(sourcePoint, targetPoint, sourceConnector, targetConnector)) {\n minNonConflict = dist;\n minNonConflictSource = sourceConnector;\n minNonConflictTarget = targetConnector;\n }\n if (dist < minDist) {\n minSource = sourceConnector;\n minTarget = targetConnector;\n minDist = dist;\n }\n }\n }\n }\n }\n if (minNonConflictSource) {\n minSource = minNonConflictSource;\n minTarget = minNonConflictTarget;\n }\n this._resolvedSourceConnector = minSource;\n this._resolvedTargetConnector = minTarget;\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), start, end, rect, exclude;\n exclude = this._getRouteExclude(sourcePoint, targetPoint, sourceConnector.shape, targetConnector.shape);\n points.unshift(sourcePoint);\n points.push(targetPoint);\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), 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 if (!rect.isEmpty() && this.diagram._shapesQuadTree.hitTestRect(rect, exclude)) {\n passRoute = false;\n break;\n }\n }\n }\n return passRoute;\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 _isPointInsideShape: function (point, shape) {\n var bounds = shape.bounds(), rotatedPoint, angle = shape.rotate().angle, pointX, pointY, boundsX = bounds.x, boundsY = bounds.y;\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 redraw: function (options) {\n if (options) {\n this.options = deepExtend({}, this.options, options);\n var points = this.options.points;\n if (defined(points) && points.length > 0) {\n this.points(points);\n this._refreshPath();\n }\n if (options && options.content || options.text) {\n this.content(options.content);\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 clone: function () {\n var json = this.serialize();\n if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n json.options.dataItem = cloneDataItem(this.dataItem);\n }\n return new Connection(this.from, this.to, json.options);\n },\n serialize: function () {\n var from = this.from.toJSON ? this.from.toJSON : this.from.toString(), to = this.to.toJSON ? this.to.toJSON : this.to.toString();\n var json = deepExtend({}, {\n options: this.options,\n from: from,\n to: to\n });\n if (defined(this.dataItem)) {\n json.dataItem = this.dataItem.toString();\n }\n json.options.points = this.points();\n return json;\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 _hover: function (value) {\n var color = (this.options.stroke || {}).color;\n if (value && isDefined(this.options.hover.stroke.color)) {\n color = this.options.hover.stroke.color;\n }\n this.path.redraw({ stroke: { color: color } });\n },\n _refreshPath: function () {\n if (!defined(this.path)) {\n return;\n }\n this._drawPath();\n this.bounds(this._router.getBounds());\n },\n _drawPath: function () {\n if (this._router) {\n this._router.route();\n }\n var source = this.sourcePoint();\n var target = this.targetPoint();\n var points = this.points();\n this.path.redraw({ points: [source].concat(points, [target]) });\n },\n _clearSourceConnector: function () {\n this.sourceConnector = undefined;\n this._resolvedSourceConnector = undefined;\n },\n _clearTargetConnector: function () {\n this.targetConnector = undefined;\n this._resolvedTargetConnector = undefined;\n },\n _removeFromSourceConnector: function () {\n if (this.sourceConnector) {\n Utils.remove(this.sourceConnector.connections, this);\n }\n },\n _removeFromTargetConnector: function () {\n if (this.targetConnector) {\n Utils.remove(this.targetConnector.connections, this);\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 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 return {\n from: from,\n to: to\n };\n }\n });\n var Diagram = Widget.extend({\n init: function (element, userOptions) {\n var that = this;\n kendo.destroy(element);\n Widget.fn.init.call(that, element, userOptions);\n that._initTheme();\n that._initElements();\n that._extendLayoutOptions(that.options);\n that._initDefaults(userOptions);\n that._interactionDefaults();\n that._initCanvas();\n that.mainLayer = new Group({ id: 'main-layer' });\n that.canvas.append(that.mainLayer);\n that._shapesQuadTree = new ShapesQuadTree(that);\n that._pan = new Point();\n that._adorners = [];\n that.adornerLayer = new Group({ id: 'adorner-layer' });\n that.canvas.append(that.adornerLayer);\n that._createHandlers();\n that._initialize();\n that._resizingAdorner = new ResizingAdorner(that, { editable: that.options.editable });\n that._connectorsAdorner = new ConnectorsAdorner(that);\n that._adorn(that._resizingAdorner, true);\n that._adorn(that._connectorsAdorner, true);\n that.selector = new Selector(that);\n that._clipboard = [];\n that.pauseMouseHandlers = false;\n that._fetchFreshData();\n that._createGlobalToolBar();\n that._createOptionElements();\n that.zoom(that.options.zoom);\n that.canvas.draw();\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: { key: 'none' },\n tooltip: {\n enabled: true,\n format: '{0}'\n },\n copy: {\n enabled: true,\n offsetX: 20,\n offsetY: 20\n },\n shapeDefaults: diagram.shapeDefaults({ undoable: true }),\n connectionDefaults: {\n editable: { tools: [] },\n type: CASCADING\n },\n shapes: [],\n connections: []\n },\n events: [\n ZOOM_END,\n ZOOM_START,\n PAN,\n 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 items: function () {\n return $();\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 = [\n 'createShape',\n 'undo',\n 'redo',\n 'rotateClockwise',\n 'rotateAnticlockwise'\n ];\n }\n if (tools && tools.length) {\n this.toolBar = new DiagramToolBar(this, {\n tools: tools || {},\n click: proxy(this._toolBarClick, this),\n modal: false\n });\n this.toolBar.element.css({ textAlign: 'left' });\n this.element.prepend(this.toolBar.element);\n this._resize();\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 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 _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 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 _createConnection: function (dataItem, source, target) {\n var options = deepExtend({}, this.options.connectionDefaults);\n options.dataItem = dataItem;\n var connection = new Connection(source || new Point(), target || new Point(), options);\n return connection;\n },\n editModel: function (dataItem, editorType) {\n this.cancelEdit();\n var editors, template;\n var editable = this.options.editable;\n if (editorType == 'shape') {\n editors = editable.shapeEditors;\n template = editable.shapeTemplate;\n } else if (editorType == 'connection') {\n var connectionSelectorHandler = proxy(connectionSelector, this);\n editors = deepExtend({}, {\n from: connectionSelectorHandler,\n to: connectionSelectorHandler\n }, editable.connectionEditors);\n template = editable.connectionTemplate;\n } else {\n return;\n }\n this.editor = new PopupEditor(this.element, {\n update: proxy(this._update, this),\n cancel: proxy(this._cancel, this),\n model: dataItem,\n type: editorType,\n target: this,\n editors: editors,\n template: template\n });\n this.trigger('edit', this._editArgs());\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 cancelEdit: function () {\n if (this.editor) {\n this._getEditDataSource().cancelChanges(this.editor.model);\n this._destroyEditor();\n }\n },\n saveEdit: function () {\n if (this.editor && this.editor.end() && !this.trigger('save', this._editArgs())) {\n this._getEditDataSource().sync();\n }\n },\n _update: function () {\n if (this.editor && this.editor.end() && !this.trigger('save', this._editArgs())) {\n this._getEditDataSource().sync();\n this._destroyEditor();\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 _getEditDataSource: function () {\n return this.editor.options.type === 'shape' ? this.dataSource : this.connectionsDataSource;\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 _destroyEditor: function () {\n if (this.editor) {\n this.editor.close();\n this.editor = null;\n }\n },\n _initElements: function () {\n this.wrapper = this.element.empty().css('position', 'relative').attr('tabindex', 0).addClass('k-widget k-diagram');\n this.scrollable = $('
').appendTo(this.element);\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, [\n 'drag',\n 'remove',\n 'connect'\n ]);\n copyDefaultOptions(editable, connectionDefaults.editable, [\n 'drag',\n 'remove'\n ]);\n }\n if (userShapeDefaults && userShapeDefaults.connectors) {\n options.shapeDefaults.connectors = userShapeDefaults.connectors;\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 if (selectable && !defined(selectable.multiple)) {\n options.selectable = deepExtend({ multiple: mobile ? false : true }, options.selectable);\n }\n if (pannable && !defined(pannable.key)) {\n options.pannable = deepExtend({ key: mobile ? 'none' : 'ctrl' }, options.pannable);\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 _createHandlers: function () {\n var that = this;\n var element = that.element;\n element.on(MOUSEWHEEL_NS, proxy(that._wheel, that)).on('keydown' + NS, proxy(that._keydown, that));\n that._userEvents = new kendo.UserEvents(this.scrollable, {\n multiTouch: true,\n fastTap: true,\n tap: proxy(that._tap, that),\n start: proxy(that._dragStart, that),\n move: proxy(that._drag, that),\n end: proxy(that._dragEnd, that),\n gesturestart: proxy(that._gestureStart, that),\n gesturechange: proxy(that._gestureChange, that),\n gestureend: proxy(that._gestureEnd, that),\n doubleTap: proxy(that._doubleTap, that),\n supportDoubleTap: true\n });\n that.toolService = new ToolService(that);\n this.scrollable.on('mouseover' + NS, proxy(that._mouseover, that)).on('mouseout' + NS, proxy(that._mouseout, that)).on('mousemove' + NS, proxy(that._mouseMove, that)).on('mousedown' + NS, proxy(that._mouseDown, that)).on('mouseup' + NS, proxy(that._mouseUp, that));\n this._syncHandler = proxy(that._syncChanges, that);\n that._resizeHandler = proxy(that.resize, that, false);\n kendo.onResize(that._resizeHandler);\n this.bind(ZOOM_START, proxy(that._destroyToolBar, that));\n this.bind(PAN, proxy(that._destroyToolBar, that));\n },\n _dragStart: function (e) {\n this._pauseMouseHandlers = true;\n var point = this._eventPositions(e, true);\n var event = e.event;\n if (this.toolService.start(point, this._meta(event))) {\n this._destroyToolBar();\n event.preventDefault();\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 _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 _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 _mouseDown: function () {\n this._pauseMouseHandlers = true;\n },\n _mouseUp: function () {\n this._pauseMouseHandlers = false;\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 toolService._updateHoveredItem(point);\n if (toolService.hoveredItem) {\n var item = toolService.hoveredItem;\n this.trigger('click', {\n item: item,\n point: point,\n meta: this._meta(e.event)\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 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, { addToSelection: multiple && ctrlPressed });\n this._createToolBar(focused);\n }\n }\n } else if (selectable) {\n this._destroyToolBar();\n this.deselect();\n }\n },\n _keydown: function (e) {\n if (this.toolService.keyDown(e.keyCode, this._meta(e))) {\n e.preventDefault();\n }\n },\n _wheel: function (e) {\n var delta = mwDelta(e), p = this._eventPositions(e), meta = deepExtend(this._meta(e), { delta: delta });\n if (this.toolService.wheel(p, meta)) {\n e.preventDefault();\n }\n },\n _meta: function (e) {\n return {\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n altKey: e.altKey,\n shiftKey: e.shiftKey,\n 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 return this.documentToModel(point);\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 if (this.trigger(ZOOM_START, eventArgs)) {\n return;\n }\n this._gesture = e;\n this._initialCenter = initialCenter;\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 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 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 e.preventDefault();\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 = {\n point: pointPosition,\n meta: meta,\n zoom: zoom\n };\n if (diagram.trigger(ZOOM_START, zoomOptions)) {\n return;\n }\n zoom = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, zoom)), 2);\n zoomOptions.zoom = zoom;\n diagram.zoom(zoom, zoomOptions);\n diagram.trigger(ZOOM_END, zoomOptions);\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 _resize: function () {\n var viewport = this.viewport();\n if (this.canvas) {\n this.canvas.size(viewport);\n }\n if (this.scrollable && this.toolBar) {\n this.scrollable.height(viewport.height);\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 _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 _initTheme: function () {\n var that = this;\n var themeName = ((that.options || {}).theme || '').toLowerCase();\n var themes = dataviz.ui.themes || {};\n var themeOptions;\n if (dataviz.SASS_THEMES.indexOf(themeName) != -1) {\n themeOptions = dataviz.autoTheme().diagram;\n } else {\n themeOptions = (themes[themeName] || {}).diagram;\n }\n that.options = deepExtend({}, themeOptions, that.options);\n if (that.options.editable === true) {\n deepExtend(that.options, { editable: (themeOptions || {}).editable });\n }\n },\n _createOptionElements: function () {\n var options = this.options;\n var shapesLength = options.shapes.length;\n if (shapesLength) {\n this._createShapes();\n }\n if (options.connections.length) {\n this._createConnections();\n }\n if (shapesLength && options.layout) {\n this.layout(options.layout);\n }\n },\n _createShapes: function () {\n var that = this, options = that.options, shapes = options.shapes, shape, i;\n for (i = 0; i < shapes.length; i++) {\n shape = shapes[i];\n that.addShape(shape);\n }\n },\n _createConnections: function () {\n var diagram = this, options = diagram.options, defaults = options.connectionDefaults, connections = options.connections, conn, source, target, i;\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 diagram.connect(source, target, deepExtend({}, defaults, conn));\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 return target;\n },\n destroy: function () {\n var that = this;\n Widget.fn.destroy.call(that);\n if (this._userEvents) {\n this._userEvents.destroy();\n }\n kendo.unbindResize(that._resizeHandler);\n that.clear();\n that.element.off(NS);\n that.scroller.wrapper.off(NS);\n that.canvas.destroy(true);\n that.canvas = undefined;\n that._destroyEditor();\n that.destroyScroller();\n that._destroyGlobalToolBar();\n that._destroyToolBar();\n },\n destroyScroller: function () {\n var scroller = this.scroller;\n if (!scroller) {\n return;\n }\n scroller.destroy();\n scroller.element.remove();\n this.scroller = null;\n },\n save: function () {\n var json = {\n shapes: [],\n connections: []\n };\n var i, connection, shape;\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 for (i = 0; i < this.connections.length; i++) {\n connection = this.connections[i];\n json.connections.push(deepExtend({}, connection.options, connection.toJSON()));\n }\n return json;\n },\n focus: function () {\n if (!this.element.is(kendo._activeElement())) {\n var element = this.element, scrollContainer = element[0], containers = [], offsets = [], documentElement = document.documentElement, i;\n do {\n scrollContainer = scrollContainer.parentNode;\n if (scrollContainer.scrollHeight > scrollContainer.clientHeight) {\n containers.push(scrollContainer);\n offsets.push(scrollContainer.scrollTop);\n }\n } while (scrollContainer != documentElement);\n element.focus();\n for (i = 0; i < containers.length; i++) {\n containers[i].scrollTop = offsets[i];\n }\n return true;\n }\n },\n load: function (options) {\n this.clear();\n this.setOptions(options);\n this._createShapes();\n this._createConnections();\n },\n setOptions: function (options) {\n deepExtend(this.options, options);\n },\n clear: function () {\n var that = this;\n that.select(false);\n that.mainLayer.clear();\n that._shapesQuadTree.clear();\n that._initialize();\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, deepExtend({}, this.options.connectionDefaults, options));\n this.addConnection(connection);\n }\n return connection;\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 return false;\n },\n addConnection: function (connection, undoable) {\n if (undoable !== false) {\n this.undoRedoService.add(new diagram.AddConnectionUnit(connection, this), false);\n }\n connection.diagram = this;\n connection._setOptionsFromModel();\n connection.refresh();\n this.mainLayer.append(connection.visual);\n this.connections.push(connection);\n this.trigger(CHANGE, {\n added: [connection],\n removed: []\n });\n return connection;\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 if (!this.trigger('add', { connection: connection })) {\n this._connectionsDataMap[dataItem.uid] = connection;\n connectionsDataSource.add(dataItem);\n this.addConnection(connection, undoable);\n connection._updateConnectors();\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 addShape: function (item, undoable) {\n var shape, shapeDefaults = this.options.shapeDefaults;\n if (item instanceof Shape) {\n shape = item;\n } else if (!(item instanceof kendo.Class)) {\n shapeDefaults = deepExtend({}, shapeDefaults, item || {});\n shape = new Shape(shapeDefaults, this);\n } else {\n return;\n }\n if (undoable !== false) {\n this.undoRedoService.add(new diagram.AddShapeUnit(shape, this), false);\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 this.trigger(CHANGE, {\n added: [shape],\n removed: []\n });\n return shape;\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 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 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 if (!defined(undoable)) {\n undoable = true;\n }\n if (undoable) {\n this.undoRedoService.begin();\n }\n this._suspendModelRefresh();\n for (i = shapes.length - 1; i >= 0; i--) {\n this._removeItem(shapes[i], undoable, connections);\n }\n for (i = connections.length - 1; i >= 0; i--) {\n this._removeItem(connections[i], undoable);\n }\n this._resumeModelRefresh();\n if (undoable) {\n this.undoRedoService.commit(false);\n }\n this.trigger(CHANGE, {\n added: [],\n removed: items\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 _removeConnectionDataItem: function (item) {\n if (this._isEditable) {\n this.connectionsDataSource.remove(item.dataItem);\n delete this._connectionsDataMap[item.dataItem.uid];\n }\n },\n _triggerRemove: function (items) {\n var toRemove = [];\n var item, args, editable;\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 undo: function () {\n this.undoRedoService.undo();\n },\n redo: function () {\n this.undoRedoService.redo();\n },\n select: function (item, options) {\n if (isDefined(item)) {\n options = deepExtend({ addToSelection: false }, options);\n var addToSelection = options.addToSelection, items = [], selected = [], i, element;\n if (!addToSelection) {\n this.deselect();\n }\n this._internalSelection = true;\n if (item instanceof Array) {\n items = item;\n } else if (item instanceof DiagramElement) {\n items = [item];\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 this._selectionChanged(selected, []);\n this._internalSelection = false;\n } else {\n return this._selectedItems;\n }\n },\n selectAll: function () {\n this.select(this.shapes.concat(this.connections));\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 this._selectionChanged(selected, []);\n this._internalSelection = false;\n },\n deselect: function (item) {\n this._internalSelection = true;\n var deselected = [], items = [], element, i;\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 for (i = 0; i < items.length; i++) {\n element = items[i];\n if (element.select(false)) {\n deselected.push(element);\n }\n }\n this._selectionChanged([], deselected);\n this._internalSelection = false;\n },\n toFront: function (items, undoable) {\n if (!items) {\n items = this._selectedItems.slice();\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 toBack: function (items, undoable) {\n if (!items) {\n items = this._selectedItems.slice();\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 bringIntoView: function (item, options) {\n var viewport = this.viewport();\n var aligner = new diagram.RectAlign(viewport);\n var current, rect, original, newPan;\n if (viewport.width === 0 || viewport.height === 0) {\n return;\n }\n options = deepExtend({\n animate: false,\n align: 'center middle'\n }, options);\n if (options.align == 'none') {\n options.align = 'center middle';\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 original = rect.clone();\n rect.zoom(this._zoom);\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 this._zoomMainLayer();\n current = rect.clone();\n aligner.align(rect, options.align);\n newPan = rect.topLeft().minus(current.topLeft());\n this.pan(newPan.times(-1), options.animate);\n },\n alignShapes: function (direction) {\n if (isUndefined(direction)) {\n direction = 'Left';\n }\n var items = this.select(), val, item, i;\n if (items.length === 0) {\n return;\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 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 zoom: function (zoom, options) {\n if (zoom) {\n var staticPoint = options ? options.point : new diagram.Point(0, 0);\n zoom = this._zoom = this._getValidZoom(zoom);\n if (!isUndefined(staticPoint)) {\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);\n this._storePan(new diagram.Point(math.round(raw.x), math.round(raw.y)));\n }\n if (options) {\n options.zoom = zoom;\n }\n this._panTransform();\n this.canvas.surface.hideTooltip();\n this._updateAdorners();\n }\n return this._zoom;\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 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 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 viewport: function () {\n var element = this.element;\n var width = element.width();\n var height = element.height();\n if (this.toolBar) {\n height -= outerHeight(this.toolBar.element);\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 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 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 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 copied.select(true);\n copied.updateModel();\n }\n }\n this._syncChanges();\n this._copyOffset += 1;\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 boundingBox: function (items, origin) {\n var rect = Rect.empty(), temp, 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 _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 documentToView: function (point) {\n var containerOffset = this._containerOffset();\n return new Point(point.x - containerOffset.left, point.y - containerOffset.top);\n },\n viewToDocument: function (point) {\n var containerOffset = this._containerOffset();\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 } else {\n var tl = this._transformWithMatrix(point.topLeft(), matrix), br = this._transformWithMatrix(point.bottomRight(), matrix);\n result = Rect.fromPoints(tl, br);\n }\n return result;\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 setConnectionsDataSource: function (dataSource) {\n this.options.connectionsDataSource = dataSource;\n this._connectionDataSource();\n if (this.options.autoBind) {\n this.connectionsDataSource.fetch();\n }\n },\n layout: function (options) {\n this._layouting = true;\n var type;\n if (isUndefined(options)) {\n options = this.options.layout;\n }\n if (isUndefined(options) || isUndefined(options.type)) {\n type = 'Tree';\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 case 'layered':\n l = new diagram.LayeredLayout(this);\n break;\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 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 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 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 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 getConnectionByModelUid: function (uid) {\n var connection;\n if (this.connectionsDataSource) {\n connection = this._connectionsDataMap[uid];\n }\n return connection;\n },\n _extendLayoutOptions: function (options) {\n if (options.layout) {\n options.layout = deepExtend({}, diagram.LayoutBase.fn.defaultOptions || {}, options.layout);\n }\n },\n _selectionChanged: function (selected, deselected) {\n if (selected.length || deselected.length) {\n this.trigger(SELECT, {\n selected: selected,\n deselected: deselected\n });\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, pan = pos || diagram._pan;\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 _finishPan: function () {\n this.trigger(PAN, {\n total: this._pan,\n delta: Number.NaN\n });\n },\n _storePan: function (pan) {\n this._pan = pan;\n this._storeViewMatrix();\n },\n _zoomMainLayer: function () {\n var zoom = this._zoom;\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, zoom = this._zoom;\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, zoom = this._zoom;\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, conPos = toFront ? this.connections.length - 1 : 0, 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 if (!items) {\n args = this._selectedItems.slice();\n } else if (!isArray(items)) {\n args = [items];\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 return result;\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 this.mainLayer.remove(item.visual);\n },\n _removeShape: function (shape, undoable, removedConnections) {\n var i, connection, connector, sources = [], targets = [];\n this.toolService._removeHover();\n if (undoable) {\n this.undoRedoService.addCompositeItem(new DeleteShapeUnit(shape));\n }\n Utils.remove(this.shapes, shape);\n this._shapesQuadTree.remove(shape);\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 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 _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 Utils.remove(this.connections, connection);\n },\n _removeDataItems: function (items, recursive) {\n var item, children, shape, idx;\n items = isArray(items) ? items : [items];\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 _removeShapeConnections: function (shape) {\n var connections = shape.connections();\n var idx;\n if (connections) {\n for (idx = 0; idx < connections.length; idx++) {\n this._removeItem(connections[idx], false);\n }\n }\n },\n _addDataItem: function (dataItem, undoable) {\n if (!defined(dataItem)) {\n return;\n }\n var shape = this._dataMap[dataItem.id];\n if (shape) {\n return shape;\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 _addDataItemByUid: function (dataItem) {\n if (!defined(dataItem)) {\n return;\n }\n var shape = this._dataMap[dataItem.uid];\n if (shape) {\n return shape;\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 _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)) {\n connection = this.connect(parentShape, shape);\n }\n }\n },\n _refreshSource: function (e) {\n var that = this, node = e.node, action = e.action, items = e.items, options = that.options, idx, dataBound;\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 if (action == 'remove') {\n this._removeDataItems(e.items, true);\n } else {\n if ((!action || action === 'itemloaded') && !this._bindingRoots) {\n this._bindingRoots = true;\n dataBound = true;\n }\n if (!action && !node) {\n that.clear();\n }\n this._addDataItems(items, node);\n for (idx = 0; idx < items.length; idx++) {\n items[idx].load();\n }\n }\n if (options.layout && (dataBound || action == 'remove' || action == 'add')) {\n that.layout(options.layout);\n }\n if (dataBound) {\n this.trigger('dataBound');\n this._bindingRoots = false;\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 _createToolBar: function (preventClosing) {\n var diagram = this.toolService.diagram;\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 = [\n 'edit',\n 'rotateClockwise',\n 'rotateAnticlockwise'\n ];\n } else if (element instanceof Connection) {\n tools = ['edit'];\n }\n if (editable && editable.remove !== false) {\n tools.push('delete');\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: proxy(this._toolBarClick, 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((popupWidth - shapeBounds.width) / 2, popupHeight + padding));\n } else if (element instanceof Connection) {\n var connectionBounds = this.modelToView(element.bounds());\n point = new Point(connectionBounds.x, connectionBounds.y).minus(new Point((popupWidth - connectionBounds.width - 20) / 2, popupHeight + padding));\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 _toolBarClick: function (e) {\n this.trigger('toolBarClick', e);\n this._destroyToolBar();\n },\n _normalizePointZoom: function (point) {\n return point.times(1 / this.zoom());\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 _fetchFreshData: function () {\n var that = this;\n that._dataSource();\n if (that._isEditable) {\n that._connectionDataSource();\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 _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 if (this.dataSource && this._shapesRefreshHandler) {\n this.dataSource.unbind('change', this._shapesRefreshHandler).unbind('requestStart', this._shapesRequestStartHandler).unbind('error', this._shapesErrorHandler);\n } else {\n this._shapesRefreshHandler = proxy(this._refreshShapes, this);\n this._shapesRequestStartHandler = proxy(this._shapesRequestStart, this);\n this._shapesErrorHandler = proxy(this._error, this);\n }\n this.dataSource = kendo.data.DataSource.create(ds).bind('change', this._shapesRefreshHandler).bind('requestStart', this._shapesRequestStartHandler).bind('error', this._shapesErrorHandler);\n } else {\n this._treeDataSource();\n this._isEditable = false;\n }\n },\n _connectionDataSource: function () {\n var dsOptions = this.options.connectionsDataSource;\n if (dsOptions) {\n var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n if (this.connectionsDataSource && this._connectionsRefreshHandler) {\n this.connectionsDataSource.unbind('change', this._connectionsRefreshHandler).unbind('requestStart', this._connectionsRequestStartHandler).unbind('error', this._connectionsErrorHandler);\n } else {\n this._connectionsRefreshHandler = proxy(this._refreshConnections, this);\n this._connectionsRequestStartHandler = proxy(this._connectionsRequestStart, this);\n this._connectionsErrorHandler = proxy(this._connectionsError, this);\n }\n this.connectionsDataSource = kendo.data.DataSource.create(ds).bind('change', this._connectionsRefreshHandler).bind('requestStart', this._connectionsRequestStartHandler).bind('error', this._connectionsErrorHandler);\n }\n },\n _shapesRequestStart: function (e) {\n if (e.type == 'read') {\n this._loadingShapes = true;\n }\n },\n _connectionsRequestStart: function (e) {\n if (e.type == 'read') {\n this._loadingConnections = true;\n }\n },\n _error: function () {\n this._loadingShapes = false;\n },\n _connectionsError: function () {\n this._loadingConnections = false;\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 _shouldRefresh: function () {\n return !this._suspended;\n },\n _suspendModelRefresh: function () {\n this._suspended = (this._suspended || 0) + 1;\n },\n _resumeModelRefresh: function () {\n this._suspended = math.max((this._suspended || 0) - 1, 0);\n },\n refresh: function () {\n this._loadingShapes = false;\n if (!this._loadingConnections) {\n this._rebindShapesAndConnections();\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 if (this.options.layout) {\n this.layout(this.options.layout);\n } else {\n this._redrawConnections();\n }\n this.trigger('dataBound');\n },\n refreshConnections: function () {\n this._loadingConnections = false;\n if (!this._loadingShapes) {\n this._rebindShapesAndConnections();\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 _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 _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 _updateShapes: function (items, field) {\n for (var i = 0; i < items.length; i++) {\n var dataItem = items[i];\n var shape = this._dataMap[dataItem.id];\n if (shape) {\n shape.updateOptionsFromModel(dataItem, field);\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 _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 } else if (e.action === 'itemchange') {\n if (this._shouldRefresh()) {\n this._updateConnections(e.items);\n }\n } else {\n this.refreshConnections();\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 _updateConnections: function (items) {\n for (var i = 0; i < items.length; i++) {\n var dataItem = items[i];\n var connection = this._connectionsDataMap[dataItem.uid];\n connection.updateOptionsFromModel(dataItem);\n }\n },\n _addConnections: function (connections, undoable) {\n var length = connections.length;\n for (var i = 0; i < length; i++) {\n var dataItem = connections[i];\n this._addConnectionDataItem(dataItem, undoable);\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 var to = this._validateConnector(dataItem.to);\n if (!defined(to) || to === null) {\n to = new Point(dataItem.toX, dataItem.toY);\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 this._connectionsDataMap[dataItem.uid] = connection;\n this.addConnection(connection, undoable);\n }\n }\n },\n _validateConnector: function (value) {\n var connector;\n if (defined(value) && value !== null) {\n connector = this._dataMap[value];\n }\n return connector;\n },\n _treeDataSource: function () {\n var that = this, options = that.options, dataSource = options.dataSource;\n dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\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 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 that._refreshHandler = proxy(that._refreshSource, that);\n that._errorHandler = proxy(that._error, that);\n that.dataSource = HierarchicalDataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind(ERROR, that._errorHandler);\n },\n _unbindDataSource: function () {\n var that = this;\n that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(ERROR, that._errorHandler);\n },\n _adorn: function (adorner, isActive) {\n if (isActive !== undefined && adorner) {\n if (isActive) {\n this._adorners.push(adorner);\n this.adornerLayer.append(adorner.visual);\n } else {\n Utils.remove(this._adorners, adorner);\n this.adornerLayer.remove(adorner.visual);\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 _updateAdorners: function () {\n var adorners = this._adorners;\n for (var i = 0; i < adorners.length; i++) {\n var adorner = adorners[i];\n if (adorner.refreshBounds) {\n adorner.refreshBounds();\n }\n adorner.refresh();\n }\n },\n _refresh: function () {\n for (var i = 0; i < this.connections.length; i++) {\n this.connections[i].refresh();\n }\n },\n _destroyToolBar: function () {\n if (this.singleToolBar) {\n this.singleToolBar.hide();\n this.singleToolBar.destroy();\n this.singleToolBar = null;\n }\n },\n _destroyGlobalToolBar: function () {\n if (this.toolBar) {\n this.toolBar.hide();\n this.toolBar.destroy();\n this.toolBar = null;\n }\n },\n exportDOMVisual: function () {\n var viewBox = this.canvas._viewBox;\n var scrollOffset = geom.transform().translate(-viewBox.x, -viewBox.y);\n var viewRect = new geom.Rect([\n 0,\n 0\n ], [\n viewBox.width,\n viewBox.height\n ]);\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 clipWrap.append(wrap);\n wrap.children.push(root);\n return clipWrap;\n },\n exportVisual: function () {\n var scale = geom.transform().scale(1 / this._zoom);\n var wrap = new draw.Group({ transform: scale });\n var root = this.mainLayer.drawingElement;\n wrap.children.push(root);\n return wrap;\n },\n _syncChanges: function () {\n this._syncShapeChanges();\n this._syncConnectionChanges();\n },\n _syncShapeChanges: function () {\n if (this.dataSource && this._isEditable) {\n this.dataSource.sync();\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 dataviz.ExportMixin.extend(Diagram.fn, true);\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(Diagram.fn);\n }\n function filterShapeDataItem(dataItem) {\n var result = {};\n dataItem = dataItem || {};\n if (defined(dataItem.text) && dataItem.text !== null) {\n result.text = dataItem.text;\n }\n if (defined(dataItem.x) && dataItem.x !== null) {\n result.x = dataItem.x;\n }\n if (defined(dataItem.y) && dataItem.y !== null) {\n result.y = dataItem.y;\n }\n if (defined(dataItem.width) && dataItem.width !== null) {\n result.width = dataItem.width;\n }\n if (defined(dataItem.height) && dataItem.height !== null) {\n result.height = dataItem.height;\n }\n if (defined(dataItem.type) && dataItem.type !== null) {\n result.type = dataItem.type;\n }\n return result;\n }\n function filterConnectionDataItem(dataItem) {\n var result = {};\n dataItem = dataItem || {};\n if (defined(dataItem.text) && dataItem.text !== null) {\n result.content = dataItem.text;\n }\n if (defined(dataItem.type) && dataItem.type !== null) {\n result.type = dataItem.type;\n }\n if (defined(dataItem.from) && dataItem.from !== null) {\n result.from = dataItem.from;\n }\n if (defined(dataItem.fromConnector) && dataItem.fromConnector !== null) {\n result.fromConnector = dataItem.fromConnector;\n }\n if (defined(dataItem.fromX) && dataItem.fromX !== null) {\n result.fromX = dataItem.fromX;\n }\n if (defined(dataItem.fromY) && dataItem.fromY !== null) {\n result.fromY = dataItem.fromY;\n }\n if (defined(dataItem.to) && dataItem.to !== null) {\n result.to = dataItem.to;\n }\n if (defined(dataItem.toConnector) && dataItem.toConnector !== null) {\n result.toConnector = dataItem.toConnector;\n }\n if (defined(dataItem.toX) && dataItem.toX !== null) {\n result.toX = dataItem.toX;\n }\n if (defined(dataItem.toY) && dataItem.toY !== null) {\n result.toY = dataItem.toY;\n }\n return result;\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 if (this.options.modal) {\n this.createPopup();\n }\n this.bind(this.events, options);\n },\n events: ['click'],\n createPopup: function () {\n this.container = $('
').append(this.element);\n this._popup = this.container.kendoPopup({}).getKendoPopup();\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 createToolBar: function () {\n this.element = $('
');\n this._toolBar = this.element.kendoToolBar({\n click: proxy(this.click, this),\n resizable: false\n }).getKendoToolBar();\n this.element.css('border', 'none');\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 createTool: function (tool) {\n if (!isPlainObject(tool)) {\n tool = { name: tool };\n }\n var toolName = tool.name + 'Tool';\n if (this[toolName]) {\n this[toolName](tool);\n } else {\n this._tools.push(deepExtend({}, tool, { attributes: this._setAttributes({ action: tool.name }) }));\n }\n },\n showAt: function (point) {\n var popupZIndex = parseInt(this.options.popupZIndex, 10);\n if (this._popup) {\n this._popup.open(point.x, point.y);\n if (popupZIndex) {\n this._popup.wrapper.css('zIndex', popupZIndex);\n }\n }\n },\n hide: function () {\n if (this._popup) {\n this._popup.close();\n }\n },\n newGroup: function () {\n return {\n type: 'buttonGroup',\n buttons: []\n };\n },\n editTool: function () {\n this._tools.push({\n icon: 'edit',\n showText: 'overflow',\n type: 'button',\n text: 'Edit',\n attributes: this._setAttributes({ action: 'edit' })\n });\n },\n deleteTool: function () {\n this._tools.push({\n icon: 'close',\n showText: 'overflow',\n type: 'button',\n text: 'Delete',\n attributes: this._setAttributes({ action: 'delete' })\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({\n action: 'rotateAnticlockwise',\n 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({\n action: 'rotateClockwise',\n step: options.step\n }),\n showText: 'overflow',\n text: 'RotateClockwise',\n group: 'rotate'\n });\n },\n createShapeTool: function () {\n this._appendGroup('create');\n this._createGroup.buttons.push({\n icon: 'shape',\n showText: 'overflow',\n text: 'CreateShape',\n group: 'create',\n attributes: this._setAttributes({ action: 'createShape' })\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 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 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 _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 _setAttributes: function (attributes) {\n var attr = {};\n if (attributes.action) {\n attr[kendo.attr('action')] = attributes.action;\n }\n if (attributes.step) {\n attr[kendo.attr('step')] = attributes.step;\n }\n return attr;\n },\n _getAttributes: function (element) {\n var attr = {};\n var action = element.attr(kendo.attr('action'));\n if (action) {\n attr.action = action;\n }\n var step = element.attr(kendo.attr('step'));\n if (step) {\n attr.step = step;\n }\n return attr;\n },\n click: function (e) {\n var attributes = this._getAttributes($(e.target));\n var action = attributes.action;\n if (action && this[action]) {\n this[action](attributes);\n }\n this.trigger('click', this.eventData(action, e.target));\n },\n eventData: function (action, target) {\n var elements = this.selectedElements(), length = elements.length, shapes = [], connections = [], element;\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 return {\n shapes: shapes,\n connections: connections,\n action: action,\n target: target\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 edit: function () {\n var selectedElemens = this.selectedElements();\n if (selectedElemens.length === 1) {\n this.diagram.edit(selectedElemens[0]);\n }\n },\n rotateClockwise: function (options) {\n var angle = parseFloat(options.step || 90);\n this._rotate(angle);\n },\n rotateAnticlockwise: function (options) {\n var angle = parseFloat(options.step || 90);\n this._rotate(-angle);\n },\n _rotate: function (angle) {\n var adorner = this.diagram._resizingAdorner;\n adorner.angle(adorner.angle() + angle);\n adorner.rotate();\n },\n selectedElements: function () {\n return this.diagram.select();\n },\n createShape: function () {\n this.diagram.createShape();\n },\n createConnection: function () {\n this.diagram.createConnection();\n },\n undo: function () {\n this.diagram.undo();\n },\n redo: function () {\n this.diagram.redo();\n },\n destroy: function () {\n this.diagram = null;\n this.element = null;\n this.options = null;\n if (this._toolBar) {\n this._toolBar.destroy();\n }\n if (this._popup) {\n this._popup.destroy();\n }\n }\n });\n var Editor = kendo.Observable.extend({\n init: function (element, options) {\n kendo.Observable.fn.init.call(this);\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 options: { editors: {} },\n _initContainer: function () {\n this.wrapper = this.element;\n },\n createEditable: function () {\n var options = this.options;\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 _isEditable: function (field) {\n return this.model.editable && this.model.editable(field);\n },\n _getFields: function () {\n var fields = [];\n var modelFields = this.model.fields;\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 return fields;\n },\n end: function () {\n return this.editable.end();\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 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 this.open();\n },\n events: [\n 'update',\n 'cancel'\n ],\n options: {\n window: {\n modal: true,\n resizable: false,\n draggable: true,\n title: 'Edit',\n visible: false\n }\n },\n _initContainer: function () {\n var that = this;\n this.wrapper = $('
').attr(kendo.attr('uid'), this.model.uid);\n var formContent = '';\n if (this.options.template) {\n formContent += this._renderTemplate();\n this.fields = [];\n } else {\n formContent += this._renderFields();\n }\n formContent += this._renderButtons();\n this.wrapper.append($('
').append(formContent));\n this.window = new kendo.ui.Window(this.wrapper.appendTo(this.element), this.options.window);\n this.window.bind('close', function (e) {\n if (e.userTriggered) {\n e.sender.element.focus();\n that._cancelClick(e);\n }\n });\n this._attachButtonEvents();\n },\n _renderTemplate: function () {\n var template = this.options.template;\n if (typeof template === 'string') {\n template = kendo.unescape(template);\n }\n template = kendo.template(template)(this.model);\n return template;\n },\n _renderFields: function () {\n var form = '';\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n form += '
';\n if (this._isEditable(field.field)) {\n form += '
';\n }\n }\n return form;\n },\n _renderButtons: function () {\n var form = '
';\n form += this._createButton('update');\n form += this._createButton('cancel');\n form += '
';\n return form;\n },\n _createButton: function (name) {\n return kendo.template(BUTTON_TEMPLATE)(defaultButtons[name]);\n },\n _attachButtonEvents: function () {\n this._cancelClickHandler = proxy(this._cancelClick, this);\n this.window.element.on(CLICK + NS, 'a.k-diagram-cancel', this._cancelClickHandler);\n this._updateClickHandler = proxy(this._updateClick, this);\n this.window.element.on(CLICK + NS, 'a.k-diagram-update', this._updateClickHandler);\n },\n _updateClick: function (e) {\n e.preventDefault();\n this.trigger('update');\n },\n _cancelClick: function (e) {\n e.preventDefault();\n this.trigger('cancel');\n },\n open: function () {\n this.window.center().open();\n },\n close: function () {\n this.window.bind('deactivate', proxy(this.destroy, this)).close();\n },\n destroy: function () {\n this.window.close().destroy();\n this.window.element.off(CLICK + NS, 'a.k-diagram-cancel', this._cancelClickHandler);\n this.window.element.off(CLICK + NS, 'a.k-diagram-update', this._updateClickHandler);\n this._cancelClickHandler = null;\n this._editUpdateClickHandler = null;\n this.window = null;\n Editor.fn.destroy.call(this);\n }\n });\n function connectionSelector(container, options) {\n var model = this.dataSource.reader.model;\n if (model) {\n var textField = model.fn.fields.text ? 'text' : model.idField;\n $('').appendTo(container).kendoDropDownList({\n dataValueField: model.idField,\n dataTextField: textField,\n dataSource: this.dataSource.data().toJSON(),\n optionLabel: ' ',\n valuePrimitive: true\n });\n }\n }\n function InactiveItem(dataItem) {\n this.dataItem = dataItem;\n this.callbacks = [];\n }\n InactiveItem.fn = InactiveItem.prototype = {\n onActivate: function (callback) {\n var deffered = $.Deferred();\n this.callbacks.push({\n callback: callback,\n deferred: deffered\n });\n return deffered;\n },\n activate: function () {\n var callbacks = this.callbacks;\n var item;\n for (var idx = 0; idx < callbacks.length; idx++) {\n item = this.callbacks[idx];\n item.callback(this.dataItem);\n item.deferred.resolve();\n }\n this.callbacks = [];\n }\n };\n function InactiveItemsCollection() {\n this.items = {};\n }\n InactiveItemsCollection.fn = InactiveItemsCollection.prototype = {\n add: function (items) {\n for (var idx = 0; idx < items.length; idx++) {\n this.items[items[idx].uid] = new InactiveItem(items[idx]);\n }\n },\n forEach: function (callback) {\n for (var uid in this.items) {\n callback(this.items[uid]);\n }\n },\n getByUid: function (uid) {\n return this.items[uid];\n },\n remove: function (item) {\n delete this.items[item.uid];\n }\n };\n var QuadRoot = Class.extend({\n init: function () {\n this.shapes = [];\n },\n _add: function (shape, bounds) {\n this.shapes.push({\n bounds: bounds,\n shape: shape\n });\n shape._quadNode = this;\n },\n insert: function (shape, bounds) {\n this._add(shape, bounds);\n },\n remove: function (shape) {\n var shapes = this.shapes;\n var length = shapes.length;\n for (var idx = 0; idx < length; idx++) {\n if (shapes[idx].shape === shape) {\n shapes.splice(idx, 1);\n break;\n }\n }\n },\n hitTestRect: function (rect, exclude) {\n var shapes = this.shapes;\n var length = shapes.length;\n for (var i = 0; i < length; i++) {\n if (this._testRect(shapes[i].shape, rect) && !dataviz.inArray(shapes[i].shape, exclude)) {\n return true;\n }\n }\n },\n _testRect: function (shape, rect) {\n var angle = shape.rotate().angle;\n var bounds = shape.bounds();\n var hit;\n if (!angle) {\n hit = bounds.overlaps(rect);\n } else {\n hit = Intersect.rects(rect, bounds, -angle);\n }\n return hit;\n }\n });\n var QuadNode = QuadRoot.extend({\n init: function (rect) {\n QuadRoot.fn.init.call(this);\n this.children = [];\n this.rect = rect;\n },\n inBounds: function (rect) {\n var nodeRect = this.rect;\n var nodeBottomRight = nodeRect.bottomRight();\n var bottomRight = rect.bottomRight();\n var inBounds = nodeRect.x <= rect.x && nodeRect.y <= rect.y && bottomRight.x <= nodeBottomRight.x && bottomRight.y <= nodeBottomRight.y;\n return inBounds;\n },\n overlapsBounds: function (rect) {\n return this.rect.overlaps(rect);\n },\n insert: function (shape, bounds) {\n var inserted = false;\n var children = this.children;\n var length = children.length;\n if (this.inBounds(bounds)) {\n if (!length && this.shapes.length < 4) {\n this._add(shape, bounds);\n } else {\n if (!length) {\n this._initChildren();\n }\n for (var idx = 0; idx < children.length; idx++) {\n if (children[idx].insert(shape, bounds)) {\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n this._add(shape, bounds);\n }\n }\n inserted = true;\n }\n return inserted;\n },\n _initChildren: function () {\n var rect = this.rect, children = this.children, shapes = this.shapes, center = rect.center(), halfWidth = rect.width / 2, halfHeight = rect.height / 2, childIdx, shapeIdx;\n children.push(new QuadNode(new Rect(rect.x, rect.y, halfWidth, halfHeight)), new QuadNode(new Rect(center.x, rect.y, halfWidth, halfHeight)), new QuadNode(new Rect(rect.x, center.y, halfWidth, halfHeight)), new QuadNode(new Rect(center.x, center.y, halfWidth, halfHeight)));\n for (shapeIdx = shapes.length - 1; shapeIdx >= 0; shapeIdx--) {\n for (childIdx = 0; childIdx < children.length; childIdx++) {\n if (children[childIdx].insert(shapes[shapeIdx].shape, shapes[shapeIdx].bounds)) {\n shapes.splice(shapeIdx, 1);\n break;\n }\n }\n }\n },\n hitTestRect: function (rect, exclude) {\n var idx;\n var children = this.children;\n var length = children.length;\n var hit = false;\n if (this.overlapsBounds(rect)) {\n if (QuadRoot.fn.hitTestRect.call(this, rect, exclude)) {\n hit = true;\n } else {\n for (idx = 0; idx < length; idx++) {\n if (children[idx].hitTestRect(rect, exclude)) {\n hit = true;\n break;\n }\n }\n }\n }\n return hit;\n }\n });\n var ShapesQuadTree = Class.extend({\n ROOT_SIZE: 1000,\n init: function (diagram) {\n var boundsChangeHandler = proxy(this._boundsChange, this);\n diagram.bind(ITEMBOUNDSCHANGE, boundsChangeHandler);\n diagram.bind(ITEMROTATE, boundsChangeHandler);\n this.initRoots();\n },\n initRoots: function () {\n this.rootMap = {};\n this.root = new QuadRoot();\n },\n clear: function () {\n this.initRoots();\n },\n _boundsChange: function (e) {\n if (e.item._quadNode) {\n e.item._quadNode.remove(e.item);\n }\n this.insert(e.item);\n },\n insert: function (shape) {\n var bounds = shape.bounds(ROTATED);\n var rootSize = this.ROOT_SIZE;\n var sectors = this.getSectors(bounds);\n var x = sectors[0][0];\n var y = sectors[1][0];\n if (this.inRoot(sectors)) {\n this.root.insert(shape, bounds);\n } else {\n if (!this.rootMap[x]) {\n this.rootMap[x] = {};\n }\n if (!this.rootMap[x][y]) {\n this.rootMap[x][y] = new QuadNode(new Rect(x * rootSize, y * rootSize, rootSize, rootSize));\n }\n this.rootMap[x][y].insert(shape, bounds);\n }\n },\n remove: function (shape) {\n if (shape._quadNode) {\n shape._quadNode.remove(shape);\n }\n },\n inRoot: function (sectors) {\n return sectors[0].length > 1 || sectors[1].length > 1;\n },\n getSectors: function (rect) {\n var rootSize = this.ROOT_SIZE;\n var bottomRight = rect.bottomRight();\n var bottomX = math.floor(bottomRight.x / rootSize);\n var bottomY = math.floor(bottomRight.y / rootSize);\n var sectors = [\n [],\n []\n ];\n for (var x = math.floor(rect.x / rootSize); x <= bottomX; x++) {\n sectors[0].push(x);\n }\n for (var y = math.floor(rect.y / rootSize); y <= bottomY; y++) {\n sectors[1].push(y);\n }\n return sectors;\n },\n hitTestRect: function (rect, exclude) {\n var sectors = this.getSectors(rect);\n var xIdx, yIdx, x, y;\n var root;\n if (this.root.hitTestRect(rect, exclude)) {\n return true;\n }\n for (xIdx = 0; xIdx < sectors[0].length; xIdx++) {\n x = sectors[0][xIdx];\n for (yIdx = 0; yIdx < sectors[1].length; yIdx++) {\n y = sectors[1][yIdx];\n root = (this.rootMap[x] || {})[y];\n if (root && root.hitTestRect(rect, exclude)) {\n return true;\n }\n }\n }\n return false;\n }\n });\n function cloneDataItem(dataItem) {\n var result = dataItem;\n if (dataItem instanceof kendo.data.Model) {\n result = dataItem.toJSON();\n result[dataItem.idField] = dataItem._defaultId;\n }\n return result;\n }\n function splitDiagramElements(elements) {\n var connections = [];\n var shapes = [];\n var element, idx;\n for (idx = 0; idx < elements.length; idx++) {\n element = elements[idx];\n if (element instanceof Shape) {\n shapes.push(element);\n } else {\n connections.push(element);\n }\n }\n return {\n shapes: shapes,\n connections: connections\n };\n }\n function createModel(dataSource, model) {\n if (dataSource.reader.model) {\n return new dataSource.reader.model(model);\n }\n return new kendo.data.ObservableObject(model);\n }\n function clearField(field, model) {\n if (defined(model[field])) {\n model.set(field, null);\n }\n }\n function copyDefaultOptions(mainOptions, elementOptions, fields) {\n var field;\n for (var idx = 0; idx < fields.length; idx++) {\n field = fields[idx];\n if (elementOptions && !defined(elementOptions[field])) {\n elementOptions[field] = mainOptions[field];\n }\n }\n }\n function translateToOrigin(visual) {\n var bbox = visual.drawingContainer().clippedBBox(null);\n if (bbox.origin.x !== 0 || bbox.origin.y !== 0) {\n visual.position(-bbox.origin.x, -bbox.origin.y);\n }\n }\n function preventDefault(e) {\n e.preventDefault();\n }\n dataviz.ui.plugin(Diagram);\n deepExtend(diagram, {\n Shape: Shape,\n Connection: Connection,\n Connector: Connector,\n DiagramToolBar: DiagramToolBar,\n QuadNode: QuadNode,\n QuadRoot: QuadRoot,\n ShapesQuadTree: ShapesQuadTree,\n PopupEditor: PopupEditor\n });\n }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.dataviz.diagram', [\n 'kendo.data',\n 'kendo.draganddrop',\n 'kendo.userevents',\n 'kendo.mobile.scroller',\n 'kendo.drawing',\n 'dataviz/diagram/utils',\n 'dataviz/diagram/math',\n 'dataviz/diagram/svg',\n 'dataviz/diagram/services',\n 'dataviz/diagram/layout',\n 'dataviz/diagram/dom'\n ], f);\n}(function () {\n var __meta__ = {\n id: 'dataviz.diagram',\n name: 'Diagram',\n category: 'dataviz',\n description: 'The Kendo DataViz Diagram ',\n depends: [\n 'data',\n 'userevents',\n 'mobile.scroller',\n 'draganddrop',\n 'drawing',\n 'dataviz.core',\n 'dataviz.themes',\n 'toolbar'\n ],\n features: [\n {\n id: 'dataviz.diagram-pdf-export',\n name: 'PDF export',\n description: 'Export Diagram as PDF',\n depends: ['pdf']\n },\n {\n id: 'dataviz.diagram-editing',\n name: 'Editing',\n description: 'Support for model editing',\n depends: [\n 'editable',\n 'window',\n 'dropdownlist'\n ]\n }\n ]\n };\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"]}