{"version":3,"sources":["kendo.dataviz.diagram.js"],"names":["f","define","defined","value","UNDEFINED","round","precision","power","pow","math","p","limitValue","min","max","rad","degrees","DEG_TO_RAD","deg","radians","isNumber","val","isNaN","valueOrDefault","defaultValue","sqr","objectKey","object","key","parts","push","sort","join","hashKey","str","i","hash","length","charCodeAt","hashObject","arrayLimits","arr","MAX_NUM","MIN_NUM","arrayMin","arrayMax","sparseArrayMin","sparseArrayLimits","sparseArrayMax","n","isFinite","undefined","last","array","append","first","second","apply","renderTemplate","text","kendo","template","useWithBlock","paramName","renderAttr","name","renderAllAttr","attrs","output","renderStyle","renderSize","size","renderPos","pos","result","toHyphens","split","isTransparent","color","arabicToRoman","literals",1,10,100,2,20,200,3,30,300,4,40,400,5,50,500,6,60,600,7,70,700,8,80,800,9,90,900,1000,"values","roman","shift","romanToArabic","r","digits","prev","v","toLowerCase","x","l","c","d","m","charAt","memoize","cache","Object","create","id","arguments","this","ucs2decode","string","extra","counter","ucs2encode","map","String","fromCharCode","Math","window","deepExtend","PI","Number","MAX_VALUE","now","Date","getTime","util","drawing","dataviz","amd","a1","a2","a3","$","zeroSize","width","height","baseline","measureText","style","measureBox","TextMetrics","current","measure","loadFonts","fonts","callback","promises","document","font","load","e","logToConsole","Promise","all","then","doc","Class","LRUCache","extend","init","_size","_length","_map","put","lru","entry","_head","_tail","newer","older","get","defaultMeasureBox","options","_cache","_initOptions","baselineMarkerSize","box","styleKey","cacheKey","cachedResult","baselineMarker","_baselineMarker","cloneNode","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","jQuery","encodeBase64","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","encodeUTF8","KEY_STR","inArray","ObserversMixin","observers","_observers","addObserver","element","removeObserver","index","splice","trigger","methodName","event","observer","idx","_suspended","optionsChange","geometryChange","suspend","resume","_observerField","field","mixins","Range","start","stop","step","rangeIntegerScale","k","range","j","Utils","sign","Infinity","abs","findRadian","end","sngXComp","sngYComp","y","atan","Easing","Ticker","diagram","isArray","EPSILON","isNearZero","num","isDefined","obj","isUndefined","isObject","has","hasOwnProperty","call","isString","prototype","toString","isBoolean","isType","type","parseFloat","isEmpty","simpleExtend","destination","source","initArray","serializePoints","points","res","deserializePoints","s","Point","parseInt","randomInteger","lower","upper","floor","random","DFT","el","func","item","childNodes","getMatrixAngle","atan2","b","getMatrixScaling","sX","sqrt","a","sY","number","findAngle","center","forEach","iterator","thisRef","any","predicate","remove","what","ax","indexOf","contains","fold","list","acc","context","initial","find","constraint","insert","position","clear","bisort","sortfunc","addRange","easeInOut","cos","adapters","target","tick","interval","duration","lastTime","handlers","_this","transition","timerDelegate","onTimerEvent","addAdapter","onComplete","handler","removeHandler","grep","h","caller","onStep","seekTo","to","seekFromTo","from","intervalId","setInterval","clearInterval","play","origin","initState","reverse","propagate","update","movement","timePassed","ui","intersectLine","start1","end1","start2","end2","isSegment","num1","num2","tangensdiff","normalVariable","mean","deviation","log","randomId","chars","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","_singleAlign","_align","_left","_center","_right","stretch","_stretch","_top","middle","_middle","_bottom","alignCalc","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","_buckets","add","_createGetBucket","_bucketExists","set","containsKey","hashId","_hash","bucket","hashes","_hashes","ht","_hashString","_objectHashId","ch","_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","shi","clientWidth","clientHeight","SpringLayout","layoutGraph","limitToView","lastAdded","news","parent","treeCount","createRandomConnectedGraph","nodeCount","maxIncidence","isTree","poolNode","randomAdditions","randomDiagram","shapeCount","diffNumericOptions","fields","elementOptions","hasChanges","sizeOptionsOrDefault","normalizeDrawingOptions","drawingOptions","getColor","TRANSPARENT","Color","toHex","lineAngle","xDiff","yDiff","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","Markers","none","arrowStart","filledCircle","arrowEnd","FULL_CIRCLE_ANGLE","START","END","WIDTH","HEIGHT","X","Y","toMatrix","format","invert","toMatrixVector","Length","ZERO","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","fontOptions","fontStyle","fontWeight","sizeChanged","textOptions","_initPath","_setPosition","_drawPath","closed","sizeOptions","elements","anchor","createElement","_transformToPath","path","transformCopy","positionMarker","targetSegment","_linePoints","endPoint","nextSegment","prevSegment","controlOut","controlIn","_getPath","MultiPath","paths","_normalizeMarkerOptions","startCap","endCap","_removeMarker","marker","_markers","_createMarkers","_createMarker","markerType","_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","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","browser","support","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","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","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","sourceConnector","Shape","getConnector","_syncConnectionChanges","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","msie","version","cssText","disabledShape","isNew","selectedConnections","_connectorsAdorner","_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","_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","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","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","_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","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","detail","isAutoConnector","closestConnector","resCtr","minimumDistance","MAXINT","ctrs","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","defaultButtons","DiagramElement","Connector","Diagram","DiagramToolBar","Editor","PopupEditor","QuadRoot","QuadNode","ShapesQuadTree","geom","Widget","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","defaults","_template","serializable","serialize","json","_content","contentOptions","contentVisual","_contentVisual","_updateContentVisual","_createContentVisual","elementTemplate","_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","toConenctor","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","autoSourceShape","autoTargetShape","_resolveAutoConnectors","targetConnectors","minNonConflictSource","minNonConflictTarget","minSource","minTarget","sourceIdx","targetIdx","minNonConflict","sourceConnectors","_testRoutePoints","router","passRoute","_shapesQuadTree","hitTestRect","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","_mouseover","_mouseout","_mouseMove","_syncHandler","_resizeHandler","onResize","_pauseMouseHandlers","_eventPositions","_meta","preventDefault","_createToolBar","which","ctrlPressed","keyCode","touch","pageX","pageY","documentToModel","initialCenter","eventArgs","_gesture","_initialCenter","zoomedPoint","previousGesture","documentToView","scaleDelta","_zoom","updateZoom","_getValidZoom","_panTransform","_updateAdorners","_kendoNode","srcElement","themes","themeName","themeOptions","shapesLength","_createShapes","_createConnections","_findConnectionTarget","unbindResize","off","destroyScroller","_destroyGlobalToolBar","is","_activeElement","scrollContainer","offsets","documentElement","scrollHeight","setOptions","added","removed","_removeItem","_removeShapeDataItem","_removeConnectionDataItem","_getDiagramItems","_fixOrdering","bringIntoView","original","newPan","_zoomMainLayer","alignShapes","viewportVector","raw","hideTooltip","_getPan","animatedScrollTo","scrollTo","outerHeight","_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","padding","popupWidth","popupHeight","connectionBounds","singleToolBar","_popup","outerWidth","showAt","_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","_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","deferredConnectionUpdates","ExportMixin","PDFMixin","_tools","createToolBar","createTools","appendTools","createPopup","kendoPopup","getKendoPopup","buttons","_toolBar","kendoToolBar","resizable","getKendoToolBar","createTool","toolName","attributes","_setAttributes","open","newGroup","editTool","spriteCssClass","showText","deleteTool","rotateAnticlockwiseTool","_appendGroup","_rotateGroup","rotateClockwiseTool","createShapeTool","_createGroup","createConnectionTool","undoTool","_historyGroup","redoTool","prop","_getAttributes","eventData","selectedElements","delete","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","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/main', ['kendo.core'], f);\n}(function () {\n (function () {\n var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend;\n var DEG_TO_RAD = math.PI / 180, MAX_NUM = Number.MAX_VALUE, MIN_NUM = -Number.MAX_VALUE, UNDEFINED = 'undefined';\n function defined(value) {\n return typeof value !== UNDEFINED;\n }\n function round(value, precision) {\n var power = pow(precision);\n return math.round(value * power) / power;\n }\n function pow(p) {\n if (p) {\n return math.pow(10, p);\n } else {\n return 1;\n }\n }\n function limitValue(value, min, max) {\n return math.max(math.min(value, max), min);\n }\n function rad(degrees) {\n return degrees * DEG_TO_RAD;\n }\n function deg(radians) {\n return radians / DEG_TO_RAD;\n }\n function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function valueOrDefault(value, defaultValue) {\n return defined(value) ? value : defaultValue;\n }\n function sqr(value) {\n return value * value;\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 hashObject(object) {\n return hashKey(objectKey(object));\n }\n var now = Date.now;\n if (!now) {\n now = function () {\n return new Date().getTime();\n };\n }\n function arrayLimits(arr) {\n var length = arr.length, i, min = MAX_NUM, max = MIN_NUM;\n for (i = 0; i < length; i++) {\n max = math.max(max, arr[i]);\n min = math.min(min, arr[i]);\n }\n return {\n min: min,\n max: max\n };\n }\n function arrayMin(arr) {\n return arrayLimits(arr).min;\n }\n function arrayMax(arr) {\n return arrayLimits(arr).max;\n }\n function sparseArrayMin(arr) {\n return sparseArrayLimits(arr).min;\n }\n function sparseArrayMax(arr) {\n return sparseArrayLimits(arr).max;\n }\n function sparseArrayLimits(arr) {\n var min = MAX_NUM, max = MIN_NUM;\n for (var i = 0, length = arr.length; i < length; i++) {\n var n = arr[i];\n if (n !== null && isFinite(n)) {\n min = math.min(min, n);\n max = math.max(max, n);\n }\n }\n return {\n min: min === MAX_NUM ? undefined : min,\n max: max === MIN_NUM ? undefined : max\n };\n }\n function last(array) {\n if (array) {\n return array[array.length - 1];\n }\n }\n function append(first, second) {\n first.push.apply(first, second);\n return first;\n }\n function renderTemplate(text) {\n return kendo.template(text, {\n useWithBlock: false,\n paramName: 'd'\n });\n }\n function renderAttr(name, value) {\n return defined(value) && value !== null ? ' ' + name + '=\\'' + value + '\\' ' : '';\n }\n function renderAllAttr(attrs) {\n var output = '';\n for (var i = 0; i < attrs.length; i++) {\n output += renderAttr(attrs[i][0], attrs[i][1]);\n }\n return output;\n }\n function renderStyle(attrs) {\n var output = '';\n for (var i = 0; i < attrs.length; i++) {\n var value = attrs[i][1];\n if (defined(value)) {\n output += attrs[i][0] + ':' + value + ';';\n }\n }\n if (output !== '') {\n return output;\n }\n }\n function renderSize(size) {\n if (typeof size !== 'string') {\n size += 'px';\n }\n return size;\n }\n function renderPos(pos) {\n var result = [];\n if (pos) {\n var parts = kendo.toHyphens(pos).split('-');\n for (var i = 0; i < parts.length; i++) {\n result.push('k-pos-' + parts[i]);\n }\n }\n return result.join(' ');\n }\n function isTransparent(color) {\n return color === '' || color === null || color === 'none' || color === 'transparent' || !defined(color);\n }\n function arabicToRoman(n) {\n var literals = {\n 1: 'i',\n 10: 'x',\n 100: 'c',\n 2: 'ii',\n 20: 'xx',\n 200: 'cc',\n 3: 'iii',\n 30: 'xxx',\n 300: 'ccc',\n 4: 'iv',\n 40: 'xl',\n 400: 'cd',\n 5: 'v',\n 50: 'l',\n 500: 'd',\n 6: 'vi',\n 60: 'lx',\n 600: 'dc',\n 7: 'vii',\n 70: 'lxx',\n 700: 'dcc',\n 8: 'viii',\n 80: 'lxxx',\n 800: 'dccc',\n 9: 'ix',\n 90: 'xc',\n 900: 'cm',\n 1000: 'm'\n };\n var values = [\n 1000,\n 900,\n 800,\n 700,\n 600,\n 500,\n 400,\n 300,\n 200,\n 100,\n 90,\n 80,\n 70,\n 60,\n 50,\n 40,\n 30,\n 20,\n 10,\n 9,\n 8,\n 7,\n 6,\n 5,\n 4,\n 3,\n 2,\n 1\n ];\n var roman = '';\n while (n > 0) {\n if (n < values[0]) {\n values.shift();\n } else {\n roman += literals[values[0]];\n n -= values[0];\n }\n }\n return roman;\n }\n function romanToArabic(r) {\n r = r.toLowerCase();\n var digits = {\n i: 1,\n v: 5,\n x: 10,\n l: 50,\n c: 100,\n d: 500,\n m: 1000\n };\n var value = 0, prev = 0;\n for (var i = 0; i < r.length; ++i) {\n var v = digits[r.charAt(i)];\n if (!v) {\n return null;\n }\n value += v;\n if (v > prev) {\n value -= 2 * prev;\n }\n prev = v;\n }\n return value;\n }\n function memoize(f) {\n var cache = Object.create(null);\n return function () {\n var id = '';\n for (var i = arguments.length; --i >= 0;) {\n id += ':' + arguments[i];\n }\n if (id in cache) {\n return cache[id];\n }\n return f.apply(this, arguments);\n };\n }\n function ucs2decode(string) {\n var output = [], counter = 0, length = string.length, value, extra;\n while (counter < length) {\n value = string.charCodeAt(counter++);\n if (value >= 55296 && value <= 56319 && counter < length) {\n extra = string.charCodeAt(counter++);\n if ((extra & 64512) == 56320) {\n output.push(((value & 1023) << 10) + (extra & 1023) + 65536);\n } else {\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n }\n function ucs2encode(array) {\n return array.map(function (value) {\n var output = '';\n if (value > 65535) {\n value -= 65536;\n output += String.fromCharCode(value >>> 10 & 1023 | 55296);\n value = 56320 | value & 1023;\n }\n output += String.fromCharCode(value);\n return output;\n }).join('');\n }\n deepExtend(kendo, {\n util: {\n MAX_NUM: MAX_NUM,\n MIN_NUM: MIN_NUM,\n append: append,\n arrayLimits: arrayLimits,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n defined: defined,\n deg: deg,\n hashKey: hashKey,\n hashObject: hashObject,\n isNumber: isNumber,\n isTransparent: isTransparent,\n last: last,\n limitValue: limitValue,\n now: now,\n objectKey: objectKey,\n round: round,\n rad: rad,\n renderAttr: renderAttr,\n renderAllAttr: renderAllAttr,\n renderPos: renderPos,\n renderSize: renderSize,\n renderStyle: renderStyle,\n renderTemplate: renderTemplate,\n sparseArrayLimits: sparseArrayLimits,\n sparseArrayMin: sparseArrayMin,\n sparseArrayMax: sparseArrayMax,\n sqr: sqr,\n valueOrDefault: valueOrDefault,\n romanToArabic: romanToArabic,\n arabicToRoman: arabicToRoman,\n memoize: memoize,\n ucs2encode: ucs2encode,\n ucs2decode: ucs2decode\n }\n });\n kendo.drawing.util = kendo.util;\n kendo.dataviz.util = kendo.util;\n }());\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('util/text-metrics', [\n 'kendo.core',\n 'util/main'\n ], f);\n}(function () {\n (function ($) {\n var doc = document, kendo = window.kendo, Class = kendo.Class, util = kendo.util, defined = util.defined;\n var LRUCache = 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 lru = this, map = lru._map, entry = {\n key: key,\n value: value\n };\n map[key] = entry;\n if (!lru._head) {\n lru._head = lru._tail = entry;\n } else {\n lru._tail.newer = entry;\n entry.older = lru._tail;\n lru._tail = entry;\n }\n if (lru._length >= lru._size) {\n map[lru._head.key] = null;\n lru._head = lru._head.newer;\n lru._head.older = null;\n } else {\n lru._length++;\n }\n },\n get: function (key) {\n var lru = this, entry = lru._map[key];\n if (entry) {\n if (entry === lru._head && entry !== lru._tail) {\n lru._head = entry.newer;\n lru._head.older = null;\n }\n if (entry !== lru._tail) {\n if (entry.older) {\n entry.older.newer = entry.newer;\n entry.newer.older = entry.older;\n }\n entry.older = lru._tail;\n entry.newer = null;\n lru._tail.newer = entry;\n lru._tail = entry;\n }\n return entry.value;\n }\n }\n });\n var defaultMeasureBox = $('
')[0];\n function zeroSize() {\n return {\n width: 0,\n height: 0,\n baseline: 0\n };\n }\n var TextMetrics = Class.extend({\n init: function (options) {\n this._cache = new LRUCache(1000);\n this._initOptions(options);\n },\n options: { baselineMarkerSize: 1 },\n measure: function (text, style, box) {\n if (!text) {\n return zeroSize();\n }\n var styleKey = util.objectKey(style), cacheKey = util.hashKey(text + styleKey), cachedResult = this._cache.get(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n var size = zeroSize();\n var measureBox = box ? box : defaultMeasureBox;\n var baselineMarker = this._baselineMarker().cloneNode(false);\n for (var key in style) {\n var value = style[key];\n if (defined(value)) {\n measureBox.style[key] = value;\n }\n }\n $(measureBox).text(text);\n measureBox.appendChild(baselineMarker);\n doc.body.appendChild(measureBox);\n if ((text + '').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 return $('')[0];\n }\n });\n TextMetrics.current = new TextMetrics();\n function measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n }\n function loadFonts(fonts, callback) {\n var promises = [];\n if (fonts.length > 0 && document.fonts) {\n try {\n promises = fonts.map(function (font) {\n return document.fonts.load(font);\n });\n } catch (e) {\n kendo.logToConsole(e);\n }\n Promise.all(promises).then(callback, callback);\n } else {\n callback();\n }\n }\n kendo.util.TextMetrics = TextMetrics;\n kendo.util.LRUCache = LRUCache;\n kendo.util.loadFonts = loadFonts;\n kendo.util.measureText = measureText;\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('util/base64', ['util/main'], f);\n}(function () {\n (function () {\n var kendo = window.kendo, deepExtend = kendo.deepExtend, fromCharCode = String.fromCharCode;\n var KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n function encodeBase64(input) {\n var output = '';\n var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n var i = 0;\n input = encodeUTF8(input);\n while (i < input.length) {\n chr1 = input.charCodeAt(i++);\n chr2 = input.charCodeAt(i++);\n chr3 = input.charCodeAt(i++);\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n output = output + KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) + KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n }\n return output;\n }\n function encodeUTF8(input) {\n var output = '';\n for (var i = 0; i < input.length; i++) {\n var c = input.charCodeAt(i);\n if (c < 128) {\n output += fromCharCode(c);\n } else if (c < 2048) {\n output += fromCharCode(192 | c >>> 6);\n output += fromCharCode(128 | c & 63);\n } else if (c < 65536) {\n output += fromCharCode(224 | c >>> 12);\n output += fromCharCode(128 | c >>> 6 & 63);\n output += fromCharCode(128 | c & 63);\n }\n }\n return output;\n }\n deepExtend(kendo.util, {\n encodeBase64: encodeBase64,\n encodeUTF8: encodeUTF8\n });\n }());\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('mixins/observers', ['kendo.core'], f);\n}(function () {\n (function ($) {\n var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend, inArray = $.inArray;\n var ObserversMixin = {\n observers: function () {\n this._observers = this._observers || [];\n return this._observers;\n },\n addObserver: function (element) {\n if (!this._observers) {\n this._observers = [element];\n } else {\n this._observers.push(element);\n }\n return this;\n },\n removeObserver: function (element) {\n var observers = this.observers();\n var index = inArray(element, observers);\n if (index != -1) {\n observers.splice(index, 1);\n }\n return this;\n },\n trigger: function (methodName, event) {\n var observers = this._observers;\n var observer;\n var idx;\n if (observers && !this._suspended) {\n for (idx = 0; idx < observers.length; idx++) {\n observer = observers[idx];\n if (observer[methodName]) {\n observer[methodName](event);\n }\n }\n }\n return this;\n },\n optionsChange: function (e) {\n e = e || {};\n e.element = this;\n this.trigger('optionsChange', e);\n },\n geometryChange: function () {\n this.trigger('geometryChange', { element: this });\n },\n suspend: function () {\n this._suspended = (this._suspended || 0) + 1;\n return this;\n },\n resume: function () {\n this._suspended = math.max((this._suspended || 0) - 1, 0);\n return this;\n },\n _observerField: function (field, value) {\n if (this[field]) {\n this[field].removeObserver(this);\n }\n this[field] = value;\n value.addObserver(this);\n }\n };\n deepExtend(kendo, { mixins: { ObserversMixin: ObserversMixin } });\n }(window.kendo.jQuery));\n return window.kendo;\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 = kendo.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 = kendo.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, browser = kendo.support.browser, defined = kendo.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 } 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;\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 },\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 if (browser.msie && browser.version == 7) {\n element[0].style.cssText = element[0].style.cssText;\n }\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 = kendo.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.visual.clear();\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 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, 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 = kendo.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-cancel',\n className: 'k-diagram-cancel',\n iconClass: 'k-icon'\n },\n update: {\n text: 'Update',\n imageClass: 'k-update',\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, shape) {\n var minimumDistance = MAXINT, resCtr, ctrs = shape.connectors;\n for (var i = 0; i < ctrs.length; i++) {\n var ctr = ctrs[i];\n if (!isAutoConnector(ctr)) {\n var dist = point.distanceTo(ctr.position());\n if (dist < minimumDistance) {\n minimumDistance = dist;\n resCtr = ctr;\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);\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 toConenctor: 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 = kendo.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, source = connection.source(), target = connection.target(), autoSourceShape, autoTargetShape;\n if (source instanceof Point) {\n sourcePoint = source;\n } else if (source instanceof Connector) {\n if (isAutoConnector(source)) {\n autoSourceShape = source.shape;\n } else {\n connection._resolvedSourceConnector = source;\n sourcePoint = source.position();\n }\n }\n if (target instanceof Point) {\n targetPoint = target;\n } else if (target instanceof Connector) {\n if (isAutoConnector(target)) {\n autoTargetShape = target.shape;\n } else {\n connection._resolvedTargetConnector = target;\n targetPoint = target.position();\n }\n }\n if (sourcePoint) {\n if (autoTargetShape) {\n connection._resolvedTargetConnector = closestConnector(sourcePoint, autoTargetShape);\n }\n } else if (autoSourceShape) {\n if (targetPoint) {\n connection._resolvedSourceConnector = closestConnector(targetPoint, autoSourceShape);\n } else if (autoTargetShape) {\n this._resolveAutoConnectors(autoSourceShape, autoTargetShape);\n }\n }\n },\n _resolveAutoConnectors: function (autoSourceShape, autoTargetShape) {\n var minNonConflict = MAXINT;\n var minDist = MAXINT;\n var sourceConnectors = autoSourceShape.connectors;\n var targetConnectors;\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 targetConnectors = autoTargetShape.connectors;\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;\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)) {\n passRoute = false;\n break;\n }\n }\n }\n return passRoute;\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 });\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));\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 && e.which === 0) {\n var p = this._eventPositions(e);\n this.toolService._updateHoveredItem(p);\n this.toolService._updateCursor(p);\n }\n },\n _tap: function (e) {\n var toolService = this.toolService;\n var selectable = this.options.selectable;\n var point = this._eventPositions(e);\n toolService._updateHoveredItem(point);\n if (toolService.hoveredItem) {\n var item = toolService.hoveredItem;\n this.trigger('click', {\n item: item,\n point: point\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();\n }\n } else {\n this._destroyToolBar();\n this.select(item, { addToSelection: multiple && ctrlPressed });\n this._createToolBar();\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 };\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 point = new Point(e.pageX, e.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 _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, themes = dataviz.ui.themes || {}, themeName = ((that.options || {}).theme || '').toLowerCase(), themeOptions = (themes[themeName] || {}).diagram;\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 }\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 }\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 -= this.toolBar.element.outerHeight();\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 += this.toolBar.element.outerHeight();\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 () {\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 });\n var popupWidth = this.singleToolBar._popup.element.outerWidth();\n var popupHeight = this.singleToolBar._popup.element.outerHeight();\n if (element instanceof Shape) {\n var shapeBounds = this.modelToView(element.bounds(ROTATED));\n point = Point(shapeBounds.x, shapeBounds.y).minus(Point((popupWidth - shapeBounds.width) / 2, popupHeight + padding));\n } else if (element instanceof Connection) {\n var connectionBounds = this.modelToView(element.bounds());\n point = Point(connectionBounds.x, connectionBounds.y).minus(Point((popupWidth - connectionBounds.width - 20) / 2, popupHeight + padding));\n }\n if (point) {\n if (!this.canvas.translate) {\n point = point.minus(Point(this.scroller.scrollLeft, this.scroller.scrollTop));\n }\n point = this.viewToDocument(point);\n point = Point(math.max(point.x, 0), math.max(point.y, 0));\n this.singleToolBar.showAt(point);\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 if (this._popup) {\n this._popup.open(point.x, point.y);\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 spriteCssClass: 'k-icon k-i-pencil',\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 spriteCssClass: 'k-icon k-i-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 spriteCssClass: 'k-icon k-i-rotateccw',\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 spriteCssClass: 'k-icon k-i-rotatecw',\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 spriteCssClass: 'k-icon k-i-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 spriteCssClass: 'k-icon k-i-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 spriteCssClass: 'k-icon k-i-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 spriteCssClass: 'k-icon k-i-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 this.diagram.edit(this.selectedElements()[0]);\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 = $('