-
Notifications
You must be signed in to change notification settings - Fork 77
/
jit-2.0.1.min.js
195 lines (188 loc) · 85.9 KB
/
jit-2.0.1.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
Copyright (c) 2011 Sencha Inc. - Author: Nicolas Garcia Belmonte (http://philogb.github.com/)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
(function(){window.$jit=function(a){var a=a||window,c;for(c in $jit)$jit[c].$extend&&(a[c]=$jit[c])};$jit.version="2.0.1";var f=function(a){return document.getElementById(a)};f.empty=function(){};f.extend=function(a,c){for(var b in c||{})a[b]=c[b];return a};f.lambda=function(a){return typeof a=="function"?a:function(){return a}};f.time=Date.now||function(){return+new Date};f.splat=function(a){var c=f.type(a);return c?c!="array"?[a]:a:[]};f.type=function(a){var c=f.type.s.call(a).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
if(c!="object")return c;if(a&&a.$$family)return a.$$family;return a&&a.nodeName&&a.nodeType==1?"element":c};f.type.s=Object.prototype.toString;f.each=function(a,c){if(f.type(a)=="object")for(var b in a)c(a[b],b);else{b=0;for(var d=a.length;b<d;b++)c(a[b],b)}};f.indexOf=function(a,c){if(Array.indexOf)return a.indexOf(c);for(var b=0,d=a.length;b<d;b++)if(a[b]===c)return b;return-1};f.map=function(a,c){var b=[];f.each(a,function(a,e){b.push(c(a,e))});return b};f.reduce=function(a,c,b){var d=a.length;
if(d==0)return b;for(var e=arguments.length==3?b:a[--d];d--;)e=c(e,a[d]);return e};f.merge=function(){for(var a={},c=0,b=arguments.length;c<b;c++){var d=arguments[c];if(f.type(d)=="object")for(var e in d){var g=d[e],h=a[e];a[e]=h&&f.type(g)=="object"&&f.type(h)=="object"?f.merge(h,g):f.unlink(g)}}return a};f.unlink=function(a){var c;switch(f.type(a)){case "object":c={};for(var b in a)c[b]=f.unlink(a[b]);break;case "array":c=[];b=0;for(var d=a.length;b<d;b++)c[b]=f.unlink(a[b]);break;default:return a}return c};
f.zip=function(){if(arguments.length===0)return[];for(var a=0,c=[],b=arguments.length,d=arguments[0].length;a<d;a++){for(var e=0,g=[];e<b;e++)g.push(arguments[e][a]);c.push(g)}return c};f.rgbToHex=function(a,c){if(a.length<3)return null;if(a.length==4&&a[3]==0&&!c)return"transparent";for(var b=[],d=0;d<3;d++){var e=(a[d]-0).toString(16);b.push(e.length==1?"0"+e:e)}return c?b:"#"+b.join("")};f.hexToRgb=function(a){if(a.length!=7){a=a.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);a.shift();if(a.length!=
3)return null;for(var c=[],b=0;b<3;b++){var d=a[b];d.length==1&&(d+=d);c.push(parseInt(d,16))}return c}else return a=parseInt(a.slice(1),16),[a>>16,a>>8&255,a&255]};f.destroy=function(a){f.clean(a);a.parentNode&&a.parentNode.removeChild(a);a.clearAttributes&&a.clearAttributes()};f.clean=function(a){for(var a=a.childNodes,c=0,b=a.length;c<b;c++)f.destroy(a[c])};f.addEvent=function(a,c,b){a.addEventListener?a.addEventListener(c,b,!1):a.attachEvent("on"+c,b)};f.addEvents=function(a,c){for(var b in c)f.addEvent(a,
b,c[b])};f.hasClass=function(a,c){return(" "+a.className+" ").indexOf(" "+c+" ")>-1};f.addClass=function(a,c){if(!f.hasClass(a,c))a.className=a.className+" "+c};f.removeClass=function(a,c){a.className=a.className.replace(RegExp("(^|\\s)"+c+"(?:\\s|$)"),"$1")};f.getPos=function(a){var c=function(a){for(var d={x:0,y:0};a&&!/^(?:body|html)$/i.test(a.tagName);)d.x+=a.offsetLeft,d.y+=a.offsetTop,a=a.offsetParent;return d}(a),a=function(a){for(var d={x:0,y:0};a&&!/^(?:body|html)$/i.test(a.tagName);)d.x+=
a.scrollLeft,d.y+=a.scrollTop,a=a.parentNode;return d}(a);return{x:c.x-a.x,y:c.y-a.y}};f.event={get:function(a,c){return a||(c||window).event},getWheel:function(a){return a.wheelDelta?a.wheelDelta/120:-(a.detail||0)/3},isRightClick:function(a){return a.which==3||a.button==2},getPos:function(a,c){var c=c||window,a=a||c.event,b=c.document,b=b.documentElement||b.body;a.touches&&a.touches.length&&(a=a.touches[0]);return{x:a.pageX||a.clientX+b.scrollLeft,y:a.pageY||a.clientY+b.scrollTop}},stop:function(a){a.stopPropagation&&
a.stopPropagation();a.cancelBubble=!0;a.preventDefault?a.preventDefault():a.returnValue=!1}};$jit.util=$jit.id=f;var j=function(a){var a=a||{},c=function(){for(var a in this)typeof this[a]!="function"&&(this[a]=f.unlink(this[a]));this.constructor=c;if(j.prototyping)return this;a=this.initialize?this.initialize.apply(this,arguments):this;this.$$family="class";return a},b;for(b in j.Mutators)a[b]&&(a=j.Mutators[b](a,a[b]),delete a[b]);f.extend(c,this);c.constructor=j;c.prototype=a;return c};j.Mutators=
{Implements:function(a,c){f.each(f.splat(c),function(c){j.prototyping=c;var c=typeof c=="function"?new c:c,d;for(d in c)d in a||(a[d]=c[d]);delete j.prototyping});return a}};f.extend(j,{inherit:function(a,c){for(var b in c){var d=c[b],e=a[b],g=f.type(d);e&&g=="function"?d!=e&&j.override(a,b,d):a[b]=g=="object"?f.merge(e,d):d}return a},override:function(a,c,b){var d=j.prototyping;d&&a[c]!=d[c]&&(d=null);a[c]=function(){var e=this.parent;this.parent=d?d[c]:a[c];var g=b.apply(this,arguments);this.parent=
e;return g}}});j.prototype.implement=function(){var a=this.prototype;f.each(Array.prototype.slice.call(arguments||[]),function(c){j.inherit(a,c)});return this};$jit.Class=j;$jit.json={prune:function(a,c){this.each(a,function(a,d){if(d==c&&a.children)delete a.children,a.children=[]})},getParent:function(a,c){if(a.id==c)return!1;var b=a.children;if(b&&b.length>0)for(var d=0;d<b.length;d++)if(b[d].id==c)return a;else{var e=this.getParent(b[d],c);if(e)return e}return!1},getSubtree:function(a,c){if(a.id==
c)return a;for(var b=0,d=a.children;d&&b<d.length;b++){var e=this.getSubtree(d[b],c);if(e!=null)return e}return null},eachLevel:function(a,c,b,d){if(c<=b&&(d(a,c),a.children))for(var e=0,a=a.children;e<a.length;e++)this.eachLevel(a[e],c+1,b,d)},each:function(a,c){this.eachLevel(a,0,Number.MAX_VALUE,c)}};$jit.Trans={$extend:!0,linear:function(a){return a}};var z=$jit.Trans;(function(){var a=function(a,b){b=f.splat(b);return f.extend(a,{easeIn:function(d){return a(d,b)},easeOut:function(d){return 1-
a(1-d,b)},easeInOut:function(d){return d<=0.5?a(2*d,b)/2:(2-a(2*(1-d),b))/2}})};f.each({Pow:function(a,b){return Math.pow(a,b[0]||6)},Expo:function(a){return Math.pow(2,8*(a-1))},Circ:function(a){return 1-Math.sin(Math.acos(a))},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2)},Back:function(a,b){b=b[0]||1.618;return Math.pow(a,2)*((b+1)*a-b)},Bounce:function(a){for(var b,d=0,e=1;;d+=e,e/=2)if(a>=(7-4*d)/11){b=e*e-Math.pow((11-6*d-11*a)/4,2);break}return b},Elastic:function(a,b){return Math.pow(2,
10*--a)*Math.cos(20*a*Math.PI*(b[0]||1)/3)}},function(c,b){z[b]=a(c)});f.each(["Quad","Cubic","Quart","Quint"],function(c,b){z[c]=a(function(a){return Math.pow(a,[b+2])})})})();var G=new j({initialize:function(a){this.setOptions(a)},setOptions:function(a){this.opt=f.merge({duration:2500,fps:40,transition:z.Quart.easeInOut,compute:f.empty,complete:f.empty,link:"ignore"},a||{});return this},step:function(){var a=f.time(),c=this.opt;a<this.time+c.duration?(a=c.transition((a-this.time)/c.duration),c.compute(a)):
(this.timer=clearInterval(this.timer),c.compute(1),c.complete())},start:function(){if(!this.check())return this;this.time=0;this.startTimer();return this},startTimer:function(){var a=this,c=this.opt.fps;if(this.timer)return!1;this.time=f.time()-this.time;this.timer=setInterval(function(){a.step()},Math.round(1E3/c));return!0},pause:function(){this.stopTimer();return this},resume:function(){this.startTimer();return this},stopTimer:function(){if(!this.timer)return!1;this.time=f.time()-this.time;this.timer=
clearInterval(this.timer);return!0},check:function(){if(!this.timer)return!0;if(this.opt.link=="cancel")return this.stopTimer(),!0;return!1}}),p=function(){for(var a=arguments,c=0,b=a.length,d={};c<b;c++){var e=p[a[c]];e.$extend?f.extend(d,e):d[a[c]]=e}return d};p.Canvas={$extend:!0,injectInto:"id",type:"2D",width:!1,height:!1,useCanvas:!1,withLabels:!0,background:!1,Scene:{Lighting:{enable:!1,ambient:[1,1,1],directional:{direction:{x:-100,y:-100,z:-100},color:[0.5,0.3,0.1]}}}};p.Node={$extend:!1,
overridable:!1,type:"circle",color:"#ccb",alpha:1,dim:3,height:20,width:90,autoHeight:!1,autoWidth:!1,lineWidth:1,transform:!0,align:"center",angularWidth:1,span:1,CanvasStyles:{}};p.Edge={$extend:!1,overridable:!1,type:"line",color:"#ccb",lineWidth:1,dim:15,alpha:1,epsilon:7,CanvasStyles:{}};p.Fx={$extend:!0,fps:40,duration:2500,transition:$jit.Trans.Quart.easeInOut,clearCanvas:!0};p.Label={$extend:!1,overridable:!1,type:"HTML",style:" ",size:10,family:"sans-serif",textAlign:"center",textBaseline:"alphabetic",
color:"#fff"};p.Tips={$extend:!1,enable:!1,type:"auto",offsetX:20,offsetY:20,force:!1,onShow:f.empty,onHide:f.empty};p.NodeStyles={$extend:!1,enable:!1,type:"auto",stylesHover:!1,stylesClick:!1};p.Events={$extend:!1,enable:!1,enableForEdges:!1,type:"auto",onClick:f.empty,onRightClick:f.empty,onMouseMove:f.empty,onMouseEnter:f.empty,onMouseLeave:f.empty,onDragStart:f.empty,onDragMove:f.empty,onDragCancel:f.empty,onDragEnd:f.empty,onTouchStart:f.empty,onTouchMove:f.empty,onTouchEnd:f.empty,onMouseWheel:f.empty};
p.Navigation={$extend:!1,enable:!1,type:"auto",panning:!1,zooming:!1};p.Controller={$extend:!0,onBeforeCompute:f.empty,onAfterCompute:f.empty,onCreateLabel:f.empty,onPlaceLabel:f.empty,onComplete:f.empty,onBeforePlotLine:f.empty,onAfterPlotLine:f.empty,onBeforePlotNode:f.empty,onAfterPlotNode:f.empty,request:!1};var B={initialize:function(a,c){this.viz=c;this.canvas=c.canvas;this.config=c.config[a];this.nodeTypes=c.fx.nodeTypes;var b=this.config.type;this.labelContainer=(this.dom=b=="auto"?c.config.Label.type!=
"Native":b!="Native")&&c.labels.getLabelContainer();this.isEnabled()&&this.initializePost()},initializePost:f.empty,setAsProperty:f.lambda(!1),isEnabled:function(){return this.config.enable},isLabel:function(a,c,b){var a=f.event.get(a,c),c=this.labelContainer,d=a.target||a.srcElement,a=a.relatedTarget;return b?a&&a==this.viz.canvas.getCtx().canvas&&!!d&&this.isDescendantOf(d,c):this.isDescendantOf(d,c)},isDescendantOf:function(a,c){for(;a&&a.parentNode;){if(a.parentNode==c)return a;a=a.parentNode}return!1}},
C={onMouseUp:f.empty,onMouseDown:f.empty,onMouseMove:f.empty,onMouseOver:f.empty,onMouseOut:f.empty,onMouseWheel:f.empty,onTouchStart:f.empty,onTouchMove:f.empty,onTouchEnd:f.empty,onTouchCancel:f.empty},L=new j({initialize:function(a){this.viz=a;this.canvas=a.canvas;this.edge=this.node=!1;this.registeredObjects=[];this.attachEvents()},attachEvents:function(){var a=this.canvas.getElement(),c=this;a.oncontextmenu=f.lambda(!1);f.addEvents(a,{mouseup:function(a,b){var g=f.event.get(a,b);c.handleEvent("MouseUp",
a,b,c.makeEventObject(a,b),f.event.isRightClick(g))},mousedown:function(a,b){var g=f.event.get(a,b);c.handleEvent("MouseDown",a,b,c.makeEventObject(a,b),f.event.isRightClick(g))},mousemove:function(a,b){c.handleEvent("MouseMove",a,b,c.makeEventObject(a,b))},mouseover:function(a,b){c.handleEvent("MouseOver",a,b,c.makeEventObject(a,b))},mouseout:function(a,b){c.handleEvent("MouseOut",a,b,c.makeEventObject(a,b))},touchstart:function(a,b){c.handleEvent("TouchStart",a,b,c.makeEventObject(a,b))},touchmove:function(a,
b){c.handleEvent("TouchMove",a,b,c.makeEventObject(a,b))},touchend:function(a,b){c.handleEvent("TouchEnd",a,b,c.makeEventObject(a,b))}});var b=function(a,b){var g=f.event.get(a,b),g=f.event.getWheel(g);c.handleEvent("MouseWheel",a,b,g)};!document.getBoxObjectFor&&window.mozInnerScreenX==null?f.addEvent(a,"mousewheel",b):a.addEventListener("DOMMouseScroll",b,!1)},register:function(a){this.registeredObjects.push(a)},handleEvent:function(){for(var a=Array.prototype.slice.call(arguments),c=a.shift(),
b=0,d=this.registeredObjects,e=d.length;b<e;b++)d[b]["on"+c].apply(d[b],a)},makeEventObject:function(a,c){var b=this,d=this.viz.graph,e=this.viz.fx,g=e.nodeTypes,h=e.edgeTypes;return{pos:!1,node:!1,edge:!1,contains:!1,getNodeCalled:!1,getEdgeCalled:!1,getPos:function(){var d=b.viz.canvas,e=d.getSize(),g=d.getPos(),h=d.translateOffsetX,o=d.translateOffsetY,q=d.scaleOffsetX,d=d.scaleOffsetY,u=f.event.getPos(a,c);return this.pos={x:(u.x-g.x-e.width/2-h)*1/q,y:(u.y-g.y-e.height/2-o)*1/d}},getNode:function(){if(this.getNodeCalled)return this.node;
this.getNodeCalled=!0;for(var a in d.nodes){var c=d.nodes[a],h=c&&g[c.getData("type")];if(h=h&&h.contains&&h.contains.call(e,c,this.getPos()))return this.contains=h,b.node=this.node=c}return b.node=this.node=!1},getEdge:function(){if(this.getEdgeCalled)return this.edge;this.getEdgeCalled=!0;var a={},c;for(c in d.edges){var g=d.edges[c];a[c]=!0;for(var f in g)if(!(f in a)){var o=g[f],q=o&&h[o.getData("type")];if(q=q&&q.contains&&q.contains.call(e,o,this.getPos()))return this.contains=q,b.edge=this.edge=
o}}return b.edge=this.edge=!1},getContains:function(){if(this.getNodeCalled)return this.contains;this.getNode();return this.contains}}}}),x={initializeExtras:function(){var a=new L(this),c=this;f.each(["NodeStyles","Tips","Navigation","Events"],function(b){var d=new x.Classes[b](b,c);d.isEnabled()&&a.register(d);d.setAsProperty()&&(c[b.toLowerCase()]=d)})},Classes:{}};x.Classes.Events=new j({Implements:[B,C],initializePost:function(){this.fx=this.viz.fx;this.ntypes=this.viz.fx.nodeTypes;this.etypes=
this.viz.fx.edgeTypes;this.moved=this.touchMoved=this.touched=this.pressed=this.hovered=!1},setAsProperty:f.lambda(!0),onMouseUp:function(a,c,b,d){a=f.event.get(a,c);if(!this.moved)if(d)this.config.onRightClick(this.hovered,b,a);else this.config.onClick(this.pressed,b,a);if(this.pressed){if(this.moved)this.config.onDragEnd(this.pressed,b,a);else this.config.onDragCancel(this.pressed,b,a);this.pressed=this.moved=!1}},onMouseOut:function(a,c,b){var d=f.event.get(a,c),e;if(this.dom&&(e=this.isLabel(a,
c,!0)))this.config.onMouseLeave(this.viz.graph.getNode(e.id),b,d),this.hovered=!1;else{a=d.relatedTarget;for(c=this.canvas.getElement();a&&a.parentNode;){if(c==a.parentNode)return;a=a.parentNode}if(this.hovered)this.config.onMouseLeave(this.hovered,b,d),this.hovered=!1}},onMouseOver:function(a,c,b){var d=f.event.get(a,c),e;if(this.dom&&(e=this.isLabel(a,c,!0)))this.hovered=this.viz.graph.getNode(e.id),this.config.onMouseEnter(this.hovered,b,d)},onMouseMove:function(a,c,b){a=f.event.get(a,c);if(this.pressed)this.moved=
!0,this.config.onDragMove(this.pressed,b,a);else if(this.dom)this.config.onMouseMove(this.hovered,b,a);else{if(this.hovered){var c=this.hovered,d=c.nodeFrom?this.etypes[c.getData("type")]:this.ntypes[c.getData("type")];if(d&&d.contains&&d.contains.call(this.fx,c,b.getPos())){this.config.onMouseMove(c,b,a);return}else this.config.onMouseLeave(c,b,a),this.hovered=!1}if(this.hovered=b.getNode()||this.config.enableForEdges&&b.getEdge())this.config.onMouseEnter(this.hovered,b,a);else this.config.onMouseMove(!1,
b,a)}},onMouseWheel:function(a,c,b){this.config.onMouseWheel(b,f.event.get(a,c))},onMouseDown:function(a,c,b){var d=f.event.get(a,c);if(this.dom){if(a=this.isLabel(a,c))this.pressed=this.viz.graph.getNode(a.id)}else this.pressed=b.getNode()||this.config.enableForEdges&&b.getEdge();this.pressed&&this.config.onDragStart(this.pressed,b,d)},onTouchStart:function(a,c,b){var d=f.event.get(a,c),e;(this.touched=this.dom&&(e=this.isLabel(a,c))?this.viz.graph.getNode(e.id):b.getNode()||this.config.enableForEdges&&
b.getEdge())&&this.config.onTouchStart(this.touched,b,d)},onTouchMove:function(a,c,b){a=f.event.get(a,c);if(this.touched)this.touchMoved=!0,this.config.onTouchMove(this.touched,b,a)},onTouchEnd:function(a,c,b){a=f.event.get(a,c);if(this.touched){if(this.touchMoved)this.config.onTouchEnd(this.touched,b,a);else this.config.onTouchCancel(this.touched,b,a);this.touched=this.touchMoved=!1}}});x.Classes.Tips=new j({Implements:[B,C],initializePost:function(){if(document.body){var a=f("_tooltip")||document.createElement("div");
a.id="_tooltip";a.className="tip";f.extend(a.style,{position:"absolute",display:"none",zIndex:13E3});document.body.appendChild(a);this.tip=a;this.node=!1}},setAsProperty:f.lambda(!0),onMouseOut:function(a,c){f.event.get(a,c);if(this.dom&&this.isLabel(a,c,!0))this.hide(!0);else{for(var b=a.relatedTarget,d=this.canvas.getElement();b&&b.parentNode;){if(d==b.parentNode)return;b=b.parentNode}this.hide(!1)}},onMouseOver:function(a,c){var b;if(this.dom&&(b=this.isLabel(a,c,!1)))this.node=this.viz.graph.getNode(b.id),
this.config.onShow(this.tip,this.node,b)},onMouseMove:function(a,c,b){this.dom&&this.isLabel(a,c)&&this.setTooltipPosition(f.event.getPos(a,c));if(!this.dom){var d=b.getNode();if(d){if(this.config.force||!this.node||this.node.id!=d.id)this.node=d,this.config.onShow(this.tip,d,b.getContains());this.setTooltipPosition(f.event.getPos(a,c))}else this.hide(!0)}},setTooltipPosition:function(a){var c=this.tip,b=c.style,d=this.config;b.display="";var e={height:document.body.clientHeight,width:document.body.clientWidth},
c={width:c.offsetWidth,height:c.offsetHeight},g=d.offsetX,d=d.offsetY;b.top=(a.y+d+c.height>e.height?a.y-c.height-d:a.y+d)+"px";b.left=(a.x+c.width+g>e.width?a.x-c.width-g:a.x+g)+"px"},hide:function(a){this.tip.style.display="none";a&&this.config.onHide()}});x.Classes.NodeStyles=new j({Implements:[B,C],initializePost:function(){this.fx=this.viz.fx;this.types=this.viz.fx.nodeTypes;this.nStyles=this.config;this.nodeStylesOnHover=this.nStyles.stylesHover;this.nodeStylesOnClick=this.nStyles.stylesClick;
this.hoveredNode=!1;this.fx.nodeFxAnimation=new G;this.move=this.down=!1},onMouseOut:function(a,c){this.down=this.move=!1;if(this.hoveredNode){this.dom&&this.isLabel(a,c,!0)&&this.toggleStylesOnHover(this.hoveredNode,!1);for(var b=a.relatedTarget,d=this.canvas.getElement();b&&b.parentNode;){if(d==b.parentNode)return;b=b.parentNode}this.toggleStylesOnHover(this.hoveredNode,!1);this.hoveredNode=!1}},onMouseOver:function(a,c){var b;if(this.dom&&(b=this.isLabel(a,c,!0)))if(b=this.viz.graph.getNode(b.id),
!b.selected)this.hoveredNode=b,this.toggleStylesOnHover(this.hoveredNode,!0)},onMouseDown:function(a,c,b,d){if(!d){var e;if(this.dom&&(e=this.isLabel(a,c)))this.down=this.viz.graph.getNode(e.id);else if(!this.dom)this.down=b.getNode();this.move=!1}},onMouseUp:function(a,c,b,d){if(!d){if(!this.move)this.onClick(b.getNode());this.down=this.move=!1}},getRestoredStyles:function(a,c){var b={},d=this["nodeStylesOn"+c],e;for(e in d)b[e]=a.styles["$"+e];return b},toggleStylesOnHover:function(a,c){this.nodeStylesOnHover&&
this.toggleStylesOn("Hover",a,c)},toggleStylesOnClick:function(a,c){this.nodeStylesOnClick&&this.toggleStylesOn("Click",a,c)},toggleStylesOn:function(a,c,b){var d=this.viz;if(b){if(!c.styles)c.styles=f.merge(c.data,{});for(var e in this["nodeStylesOn"+a])b="$"+e,b in c.styles||(c.styles[b]=c.getData(e));d.fx.nodeFx(f.extend({elements:{id:c.id,properties:this["nodeStylesOn"+a]},transition:z.Quart.easeOut,duration:300,fps:40},this.config))}else a=this.getRestoredStyles(c,a),d.fx.nodeFx(f.extend({elements:{id:c.id,
properties:a},transition:z.Quart.easeOut,duration:300,fps:40},this.config))},onClick:function(a){if(a){var c=this.nodeStylesOnClick;if(c)a.selected?(this.toggleStylesOnClick(a,!1),delete a.selected):(this.viz.graph.eachNode(function(a){if(a.selected){for(var d in c)a.setData(d,a.styles["$"+d],"end");delete a.selected}}),this.toggleStylesOnClick(a,!0),a.selected=!0,delete a.hovered,this.hoveredNode=!1)}},onMouseMove:function(a,c,b){if(this.down)this.move=!0;if(!this.dom||!this.isLabel(a,c)){var d=
this.nodeStylesOnHover;if(d&&!this.dom){if(this.hoveredNode&&(a=this.types[this.hoveredNode.getData("type")])&&a.contains&&a.contains.call(this.fx,this.hoveredNode,b.getPos()))return;b=b.getNode();if((this.hoveredNode||b)&&!b.hovered)if(b&&!b.selected)this.fx.nodeFxAnimation.stopTimer(),this.viz.graph.eachNode(function(a){if(a.hovered&&!a.selected){for(var c in d)a.setData(c,a.styles["$"+c],"end");delete a.hovered}}),b.hovered=!0,this.hoveredNode=b,this.toggleStylesOnHover(b,!0);else if(this.hoveredNode&&
!this.hoveredNode.selected)this.fx.nodeFxAnimation.stopTimer(),this.toggleStylesOnHover(this.hoveredNode,!1),delete this.hoveredNode.hovered,this.hoveredNode=!1}}}});x.Classes.Navigation=new j({Implements:[B,C],initializePost:function(){this.pressed=this.pos=!1},onMouseWheel:function(a,c,b){this.config.zooming&&(f.event.stop(f.event.get(a,c)),a=1+b*(this.config.zooming/1E3),this.canvas.scale(a,a))},onMouseDown:function(a,c,b){if(this.config.panning&&!(this.config.panning=="avoid nodes"&&(this.dom?
this.isLabel(a,c):b.getNode()))){this.pressed=!0;this.pos=b.getPos();var a=this.canvas,c=a.translateOffsetX,b=a.translateOffsetY,d=a.scaleOffsetY;this.pos.x*=a.scaleOffsetX;this.pos.x+=c;this.pos.y*=d;this.pos.y+=b}},onMouseMove:function(a,c,b){if(this.config.panning&&this.pressed&&!(this.config.panning=="avoid nodes"&&(this.dom?this.isLabel(a,c):b.getNode()))){var a=this.pos,b=b.getPos(),d=this.canvas,e=d.translateOffsetX,g=d.translateOffsetY,c=d.scaleOffsetX,d=d.scaleOffsetY;b.x*=c;b.y*=d;b.x+=
e;b.y+=g;e=b.x-a.x;a=b.y-a.y;this.pos=b;this.canvas.translate(e*1/c,a*1/d)}},onMouseUp:function(){if(this.config.panning)this.pressed=!1}});var w;(function(){function a(a,c){var g=document.createElement(a),h;for(h in c)typeof c[h]=="object"?f.extend(g[h],c[h]):g[h]=c[h];a=="canvas"&&!b&&G_vmlCanvasManager&&(g=G_vmlCanvasManager.initElement(document.body.appendChild(g)));return g}var c=typeof HTMLCanvasElement,b=c=="object"||c=="function";$jit.Canvas=w=new j({canvases:[],pos:!1,element:!1,labelContainer:!1,
translateOffsetX:0,translateOffsetY:0,scaleOffsetX:1,scaleOffsetY:1,initialize:function(d,c){this.viz=d;this.opt=this.config=c;var b=f.type(c.injectInto)=="string"?c.injectInto:c.injectInto.id,h=c.type,k=b+"-label",i=f(b),m=c.width||i.offsetWidth,n=c.height||i.offsetHeight;this.id=b;var o={injectInto:b,width:m,height:n};this.element=a("div",{id:b+"-canvaswidget",style:{position:"relative",width:m+"px",height:n+"px"}});this.labelContainer=this.createLabelContainer(c.Label.type,k,o);this.canvases.push(new w.Base[h]({config:f.extend({idSuffix:"-canvas"},
o),plot:function(){d.fx.plot()},resize:function(){d.refresh()}}));if(b=c.background)o=new w.Background[b.type](d,f.extend(b,o)),this.canvases.push(new w.Base[h](o));for(h=this.canvases.length;h--;)this.element.appendChild(this.canvases[h].canvas),h>0&&this.canvases[h].plot();this.element.appendChild(this.labelContainer);i.appendChild(this.element);var q=null,u=this;f.addEvent(window,"scroll",function(){clearTimeout(q);q=setTimeout(function(){u.getPos(!0)},500)})},getCtx:function(a){return this.canvases[a||
0].getCtx()},getConfig:function(){return this.opt},getElement:function(){return this.element},getSize:function(a){return this.canvases[a||0].getSize()},resize:function(a,c){this.getPos(!0);this.translateOffsetX=this.translateOffsetY=0;this.scaleOffsetX=this.scaleOffsetY=1;for(var b=0,h=this.canvases.length;b<h;b++)this.canvases[b].resize(a,c);b=this.element.style;b.width=a+"px";b.height=c+"px";if(this.labelContainer)this.labelContainer.style.width=a+"px"},translate:function(a,c,b){this.translateOffsetX+=
a*this.scaleOffsetX;this.translateOffsetY+=c*this.scaleOffsetY;for(var h=0,f=this.canvases.length;h<f;h++)this.canvases[h].translate(a,c,b)},scale:function(a,c){var b=this.scaleOffsetX*a,h=this.scaleOffsetY*c,f=this.translateOffsetX*(a-1)/b,i=this.translateOffsetY*(c-1)/h;this.scaleOffsetX=b;this.scaleOffsetY=h;b=0;for(h=this.canvases.length;b<h;b++)this.canvases[b].scale(a,c,!0);this.translate(f,i,!1)},getPos:function(a){if(a||!this.pos)return this.pos=f.getPos(this.getElement());return this.pos},
clear:function(a){this.canvases[a||0].clear()},path:function(a,c){var b=this.canvases[0].getCtx();b.beginPath();c(b);b[a]();b.closePath()},createLabelContainer:function(d,c,b){if(d=="HTML"||d=="Native")return a("div",{id:c,style:{overflow:"visible",position:"absolute",top:0,left:0,width:b.width+"px",height:0}});else if(d=="SVG"){d=document.createElementNS("http://www.w3.org/2000/svg","svg:svg");d.setAttribute("width",b.width);d.setAttribute("height",b.height);var h=d.style;h.position="absolute";h.left=
h.top="0px";h=document.createElementNS("http://www.w3.org/2000/svg","svg:g");h.setAttribute("width",b.width);h.setAttribute("height",b.height);h.setAttribute("x",0);h.setAttribute("y",0);h.setAttribute("id",c);d.appendChild(h);return d}}});w.Base={};w.Base["2D"]=new j({translateOffsetX:0,translateOffsetY:0,scaleOffsetX:1,scaleOffsetY:1,initialize:function(a){this.viz=a;this.opt=a.config;this.size=!1;this.createCanvas();this.translateToCenter()},createCanvas:function(){var d=this.opt,c=d.width,b=d.height;
this.canvas=a("canvas",{id:d.injectInto+d.idSuffix,width:c,height:b,style:{position:"absolute",top:0,left:0,width:c+"px",height:b+"px"}})},getCtx:function(){if(!this.ctx)return this.ctx=this.canvas.getContext("2d");return this.ctx},getSize:function(){if(this.size)return this.size;var a=this.canvas;return this.size={width:a.width,height:a.height}},translateToCenter:function(a){var c=this.getSize(),b=a?c.width-a.width-this.translateOffsetX*2:c.width;height=a?c.height-a.height-this.translateOffsetY*
2:c.height;c=this.getCtx();a&&c.scale(1/this.scaleOffsetX,1/this.scaleOffsetY);c.translate(b/2,height/2)},resize:function(a,c){var g=this.getSize(),h=this.canvas,f=h.style;this.size=!1;h.width=a;h.height=c;f.width=a+"px";f.height=c+"px";b?this.translateToCenter():this.translateToCenter(g);this.translateOffsetX=this.translateOffsetY=0;this.scaleOffsetX=this.scaleOffsetY=1;this.clear();this.viz.resize(a,c,this)},translate:function(a,c,b){var h=this.scaleOffsetY;this.translateOffsetX+=a*this.scaleOffsetX;
this.translateOffsetY+=c*h;this.getCtx().translate(a,c);!b&&this.plot()},scale:function(a,c,b){this.scaleOffsetX*=a;this.scaleOffsetY*=c;this.getCtx().scale(a,c);!b&&this.plot()},clear:function(){var a=this.getSize(),c=this.translateOffsetX,b=this.translateOffsetY,h=this.scaleOffsetX,f=this.scaleOffsetY;this.getCtx().clearRect((-a.width/2-c)*1/h,(-a.height/2-b)*1/f,a.width*1/h,a.height*1/f)},plot:function(){this.clear();this.viz.plot(this)}});w.Background={};w.Background.Circles=new j({initialize:function(a,
c){this.viz=a;this.config=f.merge({idSuffix:"-bkcanvas",levelDistance:100,numberOfCircles:6,CanvasStyles:{},offset:0},c)},resize:function(a,c,b){this.plot(b)},plot:function(a){var a=a.getCtx(),c=this.config,b=c.CanvasStyles,h;for(h in b)a[h]=b[h];h=c.numberOfCircles;c=c.levelDistance;for(b=1;b<=h;b++)a.beginPath(),a.arc(0,0,c*b,0,2*Math.PI,!1),a.stroke(),a.closePath()}})})();var t=function(a,c){this.theta=a||0;this.rho=c||0};$jit.Polar=t;t.prototype={getc:function(a){return this.toComplex(a)},getp:function(){return this},
set:function(a){a=a.getp();this.theta=a.theta;this.rho=a.rho},setc:function(a,c){this.rho=Math.sqrt(a*a+c*c);this.theta=Math.atan2(c,a);this.theta<0&&(this.theta+=Math.PI*2)},setp:function(a,c){this.theta=a;this.rho=c},clone:function(){return new t(this.theta,this.rho)},toComplex:function(a){var c=Math.cos(this.theta)*this.rho,b=Math.sin(this.theta)*this.rho;if(a)return{x:c,y:b};return new r(c,b)},add:function(a){return new t(this.theta+a.theta,this.rho+a.rho)},scale:function(a){return new t(this.theta,
this.rho*a)},equals:function(a){return this.theta==a.theta&&this.rho==a.rho},$add:function(a){this.theta+=a.theta;this.rho+=a.rho;return this},$madd:function(a){this.theta=(this.theta+a.theta)%(Math.PI*2);this.rho+=a.rho;return this},$scale:function(a){this.rho*=a;return this},isZero:function(){var a=Math.abs;return a(this.theta)<1.0E-4&&a(this.rho)<1.0E-4},interpolate:function(a,c){var b=Math.PI,d=b*2,e=function(a){return a<0?a%d+d:a%d},g=this.theta,h=a.theta,f=Math.abs(g-h);return{theta:f==b?g>
h?e(h+(g-d-h)*c):e(h-d+(g-h)*c):f>=b?g>h?e(h+(g-d-h)*c):e(h-d+(g-(h-d))*c):e(h+(g-h)*c),rho:(this.rho-a.rho)*c+a.rho}}};t.KER=new t(0,0);var r=function(a,c){this.x=a||0;this.y=c||0};$jit.Complex=r;r.prototype={getc:function(){return this},getp:function(a){return this.toPolar(a)},set:function(a){a=a.getc(!0);this.x=a.x;this.y=a.y},setc:function(a,c){this.x=a;this.y=c},setp:function(a,c){this.x=Math.cos(a)*c;this.y=Math.sin(a)*c},clone:function(){return new r(this.x,this.y)},toPolar:function(a){var c=
this.norm(),b=Math.atan2(this.y,this.x);b<0&&(b+=Math.PI*2);if(a)return{theta:b,rho:c};return new t(b,c)},norm:function(){return Math.sqrt(this.squaredNorm())},squaredNorm:function(){return this.x*this.x+this.y*this.y},add:function(a){return new r(this.x+a.x,this.y+a.y)},prod:function(a){return new r(this.x*a.x-this.y*a.y,this.y*a.x+this.x*a.y)},conjugate:function(){return new r(this.x,-this.y)},scale:function(a){return new r(this.x*a,this.y*a)},equals:function(a){return this.x==a.x&&this.y==a.y},
$add:function(a){this.x+=a.x;this.y+=a.y;return this},$prod:function(a){var c=this.x,b=this.y;this.x=c*a.x-b*a.y;this.y=b*a.x+c*a.y;return this},$conjugate:function(){this.y=-this.y;return this},$scale:function(a){this.x*=a;this.y*=a;return this},$div:function(a){var c=this.x,b=this.y,d=a.squaredNorm();this.x=c*a.x+b*a.y;this.y=b*a.x-c*a.y;return this.$scale(1/d)},isZero:function(){var a=Math.abs;return a(this.x)<1.0E-4&&a(this.y)<1.0E-4}};r.KER=new r(0,0);$jit.Graph=new j({initialize:function(a,
c,b,d){var e={klass:r,Node:{}};this.Node=c;this.Edge=b;this.Label=d;this.opt=f.merge(e,a||{});this.nodes={};this.edges={};var g=this;this.nodeList={};for(var h in D)g.nodeList[h]=function(a){return function(){var c=Array.prototype.slice.call(arguments);g.eachNode(function(d){d[a].apply(d,c)})}}(h)},getNode:function(a){if(this.hasNode(a))return this.nodes[a];return!1},get:function(a){return this.getNode(a)},getByName:function(a){for(var c in this.nodes){var b=this.nodes[c];if(b.name==a)return b}return!1},
getAdjacence:function(a,c){if(a in this.edges)return this.edges[a][c];return!1},addNode:function(a){if(!this.nodes[a.id]){var c=this.edges[a.id]={};this.nodes[a.id]=new l.Node(f.extend({id:a.id,name:a.name,data:f.merge(a.data||{},{}),adjacencies:c},this.opt.Node),this.opt.klass,this.Node,this.Edge,this.Label)}return this.nodes[a.id]},addAdjacence:function(a,c,b){this.hasNode(a.id)||this.addNode(a);this.hasNode(c.id)||this.addNode(c);a=this.nodes[a.id];c=this.nodes[c.id];if(!a.adjacentTo(c)){var d=
this.edges[a.id]=this.edges[a.id]||{},e=this.edges[c.id]=this.edges[c.id]||{};d[c.id]=e[a.id]=new l.Adjacence(a,c,b,this.Edge,this.Label);return d[c.id]}return this.edges[a.id][c.id]},removeNode:function(a){if(this.hasNode(a)){delete this.nodes[a];var c=this.edges[a],b;for(b in c)delete this.edges[b][a];delete this.edges[a]}},removeAdjacence:function(a,c){delete this.edges[a][c];delete this.edges[c][a]},hasNode:function(a){return a in this.nodes},empty:function(){this.nodes={};this.edges={}}});var l=
$jit.Graph,D;(function(){var a=function(a,c,b,h,f){var i,b=b||"current";if(b=="current")i=this.data;else if(b=="start")i=this.startData;else if(b=="end")i=this.endData;a="$"+(a?a+"-":"")+c;if(h)return i[a];if(!this.Config.overridable)return f[c]||0;return a in i?i[a]:a in this.data?this.data[a]:f[c]||0},c=function(a,c,b,h){var h=h||"current",f;if(h=="current")f=this.data;else if(h=="start")f=this.startData;else if(h=="end")f=this.endData;f["$"+(a?a+"-":"")+c]=b},b=function(a,c){var a="$"+(a?a+"-":
""),b=this;f.each(c,function(c){c=a+c;delete b.data[c];delete b.endData[c];delete b.startData[c]})};D={getData:function(c,b,g){return a.call(this,"",c,b,g,this.Config)},setData:function(a,b,g){c.call(this,"",a,b,g)},setDataset:function(a,c){var a=f.splat(a),b;for(b in c)for(var h=0,k=f.splat(c[b]),i=a.length;h<i;h++)this.setData(b,k[h],a[h])},removeData:function(){b.call(this,"",Array.prototype.slice.call(arguments))},getCanvasStyle:function(c,b,g){return a.call(this,"canvas",c,b,g,this.Config.CanvasStyles)},
setCanvasStyle:function(a,b,g){c.call(this,"canvas",a,b,g)},setCanvasStyles:function(a,c){var a=f.splat(a),b;for(b in c)for(var h=0,k=f.splat(c[b]),i=a.length;h<i;h++)this.setCanvasStyle(b,k[h],a[h])},removeCanvasStyle:function(){b.call(this,"canvas",Array.prototype.slice.call(arguments))},getLabelData:function(c,b,g){return a.call(this,"label",c,b,g,this.Label)},setLabelData:function(a,b,g){c.call(this,"label",a,b,g)},setLabelDataset:function(a,c){var a=f.splat(a),b;for(b in c)for(var h=0,k=f.splat(c[b]),
i=a.length;h<i;h++)this.setLabelData(b,k[h],a[h])},removeLabelData:function(){b.call(this,"label",Array.prototype.slice.call(arguments))}}})();l.Node=new j({initialize:function(a,c,b,d,e){c={id:"",name:"",data:{},startData:{},endData:{},adjacencies:{},selected:!1,drawn:!1,exist:!1,angleSpan:{begin:0,end:0},pos:new c,startPos:new c,endPos:new c};f.extend(this,f.extend(c,a));this.Config=this.Node=b;this.Edge=d;this.Label=e},adjacentTo:function(a){return a.id in this.adjacencies},getAdjacency:function(a){return this.adjacencies[a]},
getPos:function(a){a=a||"current";if(a=="current")return this.pos;else if(a=="end")return this.endPos;else if(a=="start")return this.startPos},setPos:function(a,c){var c=c||"current",b;if(c=="current")b=this.pos;else if(c=="end")b=this.endPos;else if(c=="start")b=this.startPos;b.set(a)}});l.Node.implement(D);l.Adjacence=new j({initialize:function(a,c,b,d,e){this.nodeFrom=a;this.nodeTo=c;this.data=b||{};this.startData={};this.endData={};this.Config=this.Edge=d;this.Label=e}});l.Adjacence.implement(D);
l.Util={filter:function(a){if(!a||f.type(a)!="string")return function(){return!0};var c=a.split(" ");return function(a){for(var d=0;d<c.length;d++)if(a[c[d]])return!1;return!0}},getNode:function(a,c){return a.nodes[c]},eachNode:function(a,c,b){var b=this.filter(b),d;for(d in a.nodes)b(a.nodes[d])&&c(a.nodes[d])},each:function(a,c,b){this.eachNode(a,c,b)},eachAdjacency:function(a,c,b){var d=a.adjacencies,b=this.filter(b),e;for(e in d){var g=d[e];if(b(g)){if(g.nodeFrom!=a){var h=g.nodeFrom;g.nodeFrom=
g.nodeTo;g.nodeTo=h}c(g,e)}}},computeLevels:function(a,c,b,d){var b=b||0,e=this.filter(d);this.eachNode(a,function(a){a._flag=!1;a._depth=-1},d);a=a.getNode(c);a._depth=b;for(var g=[a];g.length!=0;){var h=g.pop();h._flag=!0;this.eachAdjacency(h,function(a){a=a.nodeTo;if(a._flag==!1&&e(a)){if(a._depth<0)a._depth=h._depth+1+b;g.unshift(a)}},d)}},eachBFS:function(a,c,b,d){var e=this.filter(d);this.clean(a);for(var g=[a.getNode(c)];g.length!=0;)a=g.pop(),a._flag=!0,b(a,a._depth),this.eachAdjacency(a,
function(a){a=a.nodeTo;if(a._flag==!1&&e(a))a._flag=!0,g.unshift(a)},d)},eachLevel:function(a,c,b,d,e){var g=a._depth,h=this.filter(e),f=this,b=b===!1?Number.MAX_VALUE-g:b;(function m(a,c,b){var e=a._depth;e>=c&&e<=b&&h(a)&&d(a,e);e<b&&f.eachAdjacency(a,function(a){a=a.nodeTo;a._depth>e&&m(a,c,b)})})(a,c+g,b+g)},eachSubgraph:function(a,c,b){this.eachLevel(a,0,!1,c,b)},eachSubnode:function(a,c,b){this.eachLevel(a,1,1,c,b)},anySubnode:function(a,c,b){var d=!1,c=c||f.lambda(!0),e=f.type(c)=="string"?
function(a){return a[c]}:c;this.eachSubnode(a,function(a){e(a)&&(d=!0)},b);return d},getSubnodes:function(a,c,b){var d=[],c=c||0,e;f.type(c)=="array"?(e=c[0],c=c[1]):(e=c,c=Number.MAX_VALUE-a._depth);this.eachLevel(a,e,c,function(a){d.push(a)},b);return d},getParents:function(a){var c=[];this.eachAdjacency(a,function(b){b=b.nodeTo;b._depth<a._depth&&c.push(b)});return c},isDescendantOf:function(a,c){if(a.id==c)return!0;for(var b=this.getParents(a),d=!1,e=0;!d&&e<b.length;e++)d=d||this.isDescendantOf(b[e],
c);return d},clean:function(a){this.eachNode(a,function(a){a._flag=!1})},getClosestNodeToOrigin:function(a,c,b){return this.getClosestNodeToPos(a,t.KER,c,b)},getClosestNodeToPos:function(a,c,b,d){var e=null,b=b||"current",c=c&&c.getc(!0)||r.KER,g=function(a,c){var b=a.x-c.x,d=a.y-c.y;return b*b+d*d};this.eachNode(a,function(a){e=e==null||g(a.getPos(b).getc(!0),c)<g(e.getPos(b).getc(!0),c)?a:e},d);return e}};f.each(["get","getNode","each","eachNode","computeLevels","eachBFS","clean","getClosestNodeToPos",
"getClosestNodeToOrigin"],function(a){l.prototype[a]=function(){return l.Util[a].apply(l.Util,[this].concat(Array.prototype.slice.call(arguments)))}});f.each(["eachAdjacency","eachLevel","eachSubgraph","eachSubnode","anySubnode","getSubnodes","getParents","isDescendantOf"],function(a){l.Node.prototype[a]=function(){return l.Util[a].apply(l.Util,[this].concat(Array.prototype.slice.call(arguments)))}});l.Op={options:{type:"nothing",duration:2E3,hideLabels:!0,fps:30},initialize:function(a){this.viz=
a},removeNode:function(a,c){var b=this.viz,d=f.merge(this.options,b.controller,c),e=f.splat(a),g,h,k;switch(d.type){case "nothing":for(g=0;g<e.length;g++)b.graph.removeNode(e[g]);break;case "replot":this.removeNode(e,{type:"nothing"});b.labels.clearLabels();b.refresh(!0);break;case "fade:seq":case "fade":h=this;for(g=0;g<e.length;g++)k=b.graph.getNode(e[g]),k.setData("alpha",0,"end");b.fx.animate(f.merge(d,{modes:["node-property:alpha"],onComplete:function(){h.removeNode(e,{type:"nothing"});b.labels.clearLabels();
b.reposition();b.fx.animate(f.merge(d,{modes:["linear"]}))}}));break;case "fade:con":h=this;for(g=0;g<e.length;g++)k=b.graph.getNode(e[g]),k.setData("alpha",0,"end"),k.ignore=!0;b.reposition();b.fx.animate(f.merge(d,{modes:["node-property:alpha","linear"],onComplete:function(){h.removeNode(e,{type:"nothing"});d.onComplete&&d.onComplete()}}));break;case "iter":h=this;b.fx.sequence({condition:function(){return e.length!=0},step:function(){h.removeNode(e.shift(),{type:"nothing"});b.labels.clearLabels()},
onComplete:function(){d.onComplete&&d.onComplete()},duration:Math.ceil(d.duration/e.length)});break;default:this.doError()}},removeEdge:function(a,c){var b=this.viz,d=f.merge(this.options,b.controller,c),e=f.type(a[0])=="string"?[a]:a,g,h,k;switch(d.type){case "nothing":for(g=0;g<e.length;g++)b.graph.removeAdjacence(e[g][0],e[g][1]);break;case "replot":this.removeEdge(e,{type:"nothing"});b.refresh(!0);break;case "fade:seq":case "fade":h=this;for(g=0;g<e.length;g++)(k=b.graph.getAdjacence(e[g][0],
e[g][1]))&&k.setData("alpha",0,"end");b.fx.animate(f.merge(d,{modes:["edge-property:alpha"],onComplete:function(){h.removeEdge(e,{type:"nothing"});b.reposition();b.fx.animate(f.merge(d,{modes:["linear"]}))}}));break;case "fade:con":h=this;for(g=0;g<e.length;g++)if(k=b.graph.getAdjacence(e[g][0],e[g][1]))k.setData("alpha",0,"end"),k.ignore=!0;b.reposition();b.fx.animate(f.merge(d,{modes:["edge-property:alpha","linear"],onComplete:function(){h.removeEdge(e,{type:"nothing"});d.onComplete&&d.onComplete()}}));
break;case "iter":h=this;b.fx.sequence({condition:function(){return e.length!=0},step:function(){h.removeEdge(e.shift(),{type:"nothing"});b.labels.clearLabels()},onComplete:function(){d.onComplete()},duration:Math.ceil(d.duration/e.length)});break;default:this.doError()}},sum:function(a,c){var b=this.viz,d=f.merge(this.options,b.controller,c),e=b.root,g;b.root=c.id||b.root;switch(d.type){case "nothing":g=b.construct(a);g.eachNode(function(a){a.eachAdjacency(function(a){b.graph.addAdjacence(a.nodeFrom,
a.nodeTo,a.data)})});break;case "replot":b.refresh(!0);this.sum(a,{type:"nothing"});b.refresh(!0);break;case "fade:seq":case "fade":case "fade:con":that=this;g=b.construct(a);var h=!this.preprocessSum(g)?["node-property:alpha"]:["node-property:alpha","edge-property:alpha"];b.reposition();d.type!="fade:con"?b.fx.animate(f.merge(d,{modes:["linear"],onComplete:function(){b.fx.animate(f.merge(d,{modes:h,onComplete:function(){d.onComplete()}}))}})):(b.graph.eachNode(function(a){a.id!=e&&a.pos.isZero()&&
(a.pos.set(a.endPos),a.startPos.set(a.endPos))}),b.fx.animate(f.merge(d,{modes:["linear"].concat(h)})));break;default:this.doError()}},morph:function(a,c,b){var b=b||{},d=this.viz,e=f.merge(this.options,d.controller,c),g=d.root,h;d.root=c.id||d.root;switch(e.type){case "nothing":h=d.construct(a);h.eachNode(function(a){var c=d.graph.hasNode(a.id);a.eachAdjacency(function(a){var c=!!d.graph.getAdjacence(a.nodeFrom.id,a.nodeTo.id);d.graph.addAdjacence(a.nodeFrom,a.nodeTo,a.data);if(c){var c=d.graph.getAdjacence(a.nodeFrom.id,
a.nodeTo.id),b;for(b in a.data||{})c.data[b]=a.data[b]}});if(c){var c=d.graph.getNode(a.id),b;for(b in a.data||{})c.data[b]=a.data[b]}});d.graph.eachNode(function(a){a.eachAdjacency(function(a){h.getAdjacence(a.nodeFrom.id,a.nodeTo.id)||d.graph.removeAdjacence(a.nodeFrom.id,a.nodeTo.id)});h.hasNode(a.id)||d.graph.removeNode(a.id)});break;case "replot":d.labels.clearLabels(!0);this.morph(a,{type:"nothing"});d.refresh(!0);d.refresh(!0);break;case "fade:seq":case "fade":case "fade:con":that=this;h=d.construct(a);
var k="node-property"in b&&f.map(f.splat(b["node-property"]),function(a){return"$"+a});d.graph.eachNode(function(a){var c=h.getNode(a.id);if(c){var c=c.data,b;for(b in c)k&&f.indexOf(k,b)>-1?a.endData[b]=c[b]:a.data[b]=c[b]}else a.setData("alpha",1),a.setData("alpha",1,"start"),a.setData("alpha",0,"end"),a.ignore=!0});d.graph.eachNode(function(a){a.ignore||a.eachAdjacency(function(a){if(!a.nodeFrom.ignore&&!a.nodeTo.ignore){var c=h.getNode(a.nodeFrom.id),a=h.getNode(a.nodeTo.id);c.adjacentTo(a)||
(a=d.graph.getAdjacence(c.id,a.id),i=!0,a.setData("alpha",1),a.setData("alpha",1,"start"),a.setData("alpha",0,"end"))}})});var i=this.preprocessSum(h),a=!i?["node-property:alpha"]:["node-property:alpha","edge-property:alpha"];a[0]+="node-property"in b?":"+f.splat(b["node-property"]).join(":"):"";a[1]=(a[1]||"edge-property:alpha")+("edge-property"in b?":"+f.splat(b["edge-property"]).join(":"):"");"label-property"in b&&a.push("label-property:"+f.splat(b["label-property"]).join(":"));d.reposition?d.reposition():
d.compute("end");d.graph.eachNode(function(a){a.id!=g&&a.pos.getp().equals(t.KER)&&(a.pos.set(a.endPos),a.startPos.set(a.endPos))});d.fx.animate(f.merge(e,{modes:[b.position||"polar"].concat(a),onComplete:function(){d.graph.eachNode(function(a){a.ignore&&d.graph.removeNode(a.id)});d.graph.eachNode(function(a){a.eachAdjacency(function(a){a.ignore&&d.graph.removeAdjacence(a.nodeFrom.id,a.nodeTo.id)})});e.onComplete()}}))}},contract:function(a,c){var b=this.viz;if(!a.collapsed&&a.anySubnode(f.lambda(!0)))c=
f.merge(this.options,b.config,c||{},{modes:["node-property:alpha:span","linear"]}),a.collapsed=!0,function e(a){a.eachSubnode(function(a){a.ignore=!0;a.setData("alpha",0,c.type=="animate"?"end":"current");e(a)})}(a),c.type=="animate"?(b.compute("end"),b.rotated&&b.rotate(b.rotated,"none",{property:"end"}),function g(c){c.eachSubnode(function(c){c.setPos(a.getPos("end"),"end");g(c)})}(a),b.fx.animate(c)):c.type=="replot"&&b.refresh()},expand:function(a,c){if("collapsed"in a){var b=this.viz,c=f.merge(this.options,
b.config,c||{},{modes:["node-property:alpha:span","linear"]});delete a.collapsed;(function e(a){a.eachSubnode(function(a){delete a.ignore;a.setData("alpha",1,c.type=="animate"?"end":"current");e(a)})})(a);c.type=="animate"?(b.compute("end"),b.rotated&&b.rotate(b.rotated,"none",{property:"end"}),b.fx.animate(c)):c.type=="replot"&&b.refresh()}},preprocessSum:function(a){var c=this.viz;a.eachNode(function(a){c.graph.hasNode(a.id)||(c.graph.addNode(a),a=c.graph.getNode(a.id),a.setData("alpha",0),a.setData("alpha",
0,"start"),a.setData("alpha",1,"end"))});var b=!1;a.eachNode(function(a){a.eachAdjacency(function(a){var d=c.graph.getNode(a.nodeFrom.id),h=c.graph.getNode(a.nodeTo.id);d.adjacentTo(h)||(a=c.graph.addAdjacence(d,h,a.data),d.startAlpha==d.endAlpha&&h.startAlpha==h.endAlpha&&(b=!0,a.setData("alpha",0),a.setData("alpha",0,"start"),a.setData("alpha",1,"end")))})});return b}};var H={none:{render:f.empty,contains:f.lambda(!1)},circle:{render:function(a,c,b,d){d=d.getCtx();d.beginPath();d.arc(c.x,c.y,b,
0,Math.PI*2,!0);d.closePath();d[a]()},contains:function(a,c,b){var d=a.x-c.x,a=a.y-c.y;return d*d+a*a<=b*b}},ellipse:{render:function(a,c,b,d,e){var e=e.getCtx(),g=1,h=1,f=1,i=1,m=0;b>d?(m=b/2,h=d/b,i=b/d):(m=d/2,g=b/d,f=d/b);e.save();e.scale(g,h);e.beginPath();e.arc(c.x*f,c.y*i,m,0,Math.PI*2,!0);e.closePath();e[a]();e.restore()},contains:function(a,c,b,d){var e=0,g=1,h=1,f=0,i=0,e=0;b>d?(e=b/2,h=d/b):(e=d/2,g=b/d);f=(a.x-c.x)*(1/g);i=(a.y-c.y)*(1/h);return f*f+i*i<=e*e}},square:{render:function(a,
c,b,d){d.getCtx()[a+"Rect"](c.x-b,c.y-b,2*b,2*b)},contains:function(a,c,b){return Math.abs(c.x-a.x)<=b&&Math.abs(c.y-a.y)<=b}},rectangle:{render:function(a,c,b,d,e){e.getCtx()[a+"Rect"](c.x-b/2,c.y-d/2,b,d)},contains:function(a,c,b,d){return Math.abs(c.x-a.x)<=b/2&&Math.abs(c.y-a.y)<=d/2}},triangle:{render:function(a,c,b,d){var d=d.getCtx(),e=c.x,g=c.y-b,h=e-b,c=c.y+b,b=e+b;d.beginPath();d.moveTo(e,g);d.lineTo(h,c);d.lineTo(b,c);d.closePath();d[a]()},contains:function(a,c,b){return H.circle.contains(a,
c,b)}},star:{render:function(a,c,b,d){var d=d.getCtx(),e=Math.PI/5;d.save();d.translate(c.x,c.y);d.beginPath();d.moveTo(b,0);for(c=0;c<9;c++)d.rotate(e),c%2==0?d.lineTo(b/0.525731*0.200811,0):d.lineTo(b,0);d.closePath();d[a]();d.restore()},contains:function(a,c,b){return H.circle.contains(a,c,b)}}},I={line:{render:function(a,c,b){b=b.getCtx();b.beginPath();b.moveTo(a.x,a.y);b.lineTo(c.x,c.y);b.stroke()},contains:function(a,c,b,d){var e=Math.min,g=Math.max,h=e(a.x,c.x),f=g(a.x,c.x),e=e(a.y,c.y),g=
g(a.y,c.y);if(b.x>=h&&b.x<=f&&b.y>=e&&b.y<=g){if(Math.abs(c.x-a.x)<=d)return!0;return Math.abs((c.y-a.y)/(c.x-a.x)*(b.x-a.x)+a.y-b.y)<=d}return!1}},arrow:{render:function(a,c,b,d,e){e=e.getCtx();d&&(d=a,a=c,c=d);d=new r(c.x-a.x,c.y-a.y);d.$scale(b/d.norm());var b=new r(c.x-d.x,c.y-d.y),g=new r(-d.y/2,d.x/2),d=b.add(g),b=b.$add(g.$scale(-1));e.beginPath();e.moveTo(a.x,a.y);e.lineTo(c.x,c.y);e.stroke();e.beginPath();e.moveTo(d.x,d.y);e.lineTo(b.x,b.y);e.lineTo(c.x,c.y);e.closePath();e.fill()},contains:function(a,
c,b,d){return I.line.contains(a,c,b,d)}},hyperline:{render:function(a,c,b,d){function e(a,c){return a<c?a+Math.PI>c?!1:!0:c+Math.PI>a?!0:!1}var d=d.getCtx(),g=function(a,c){var b=a.x*c.y-a.y*c.x,d=a.squaredNorm(),e=c.squaredNorm();if(b==0)return{x:0,y:0,ratio:-1};var g=(a.y*e-c.y*d+a.y-c.y)/b,b=(c.x*d-a.x*e+c.x-a.x)/b,d=(g*g+b*b)/4-1;if(d<0)return{x:0,y:0,ratio:-1};d=Math.sqrt(d);return{x:-g/2,y:-b/2,ratio:d>1E3?-1:d,a:g,b:b}}(a,c);g.a>1E3||g.b>1E3||g.ratio<0?(d.beginPath(),d.moveTo(a.x*b,a.y*b),
d.lineTo(c.x*b,c.y*b)):(c=Math.atan2(c.y-g.y,c.x-g.x),a=Math.atan2(a.y-g.y,a.x-g.x),e=e(c,a),d.beginPath(),d.arc(g.x*b,g.y*b,g.ratio*b,c,a,e));d.stroke()},contains:f.lambda(!1)}};l.Plot={initialize:function(a,c){this.viz=a;this.config=a.config;this.node=a.config.Node;this.edge=a.config.Edge;this.animation=new G;this.nodeTypes=new c.Plot.NodeTypes;this.edgeTypes=new c.Plot.EdgeTypes;this.labels=a.labels},nodeHelper:H,edgeHelper:I,Interpolator:{map:{border:"color",color:"color",width:"number",height:"number",
dim:"number",alpha:"number",lineWidth:"number",angularWidth:"number",span:"number",valueArray:"array-number",dimArray:"array-number"},canvas:{globalAlpha:"number",fillStyle:"color",strokeStyle:"color",lineWidth:"number",shadowBlur:"number",shadowColor:"color",shadowOffsetX:"number",shadowOffsetY:"number",miterLimit:"number"},label:{size:"number",color:"color"},compute:function(a,c,b){return a+(c-a)*b},moebius:function(a,c,b,d){c=d.scale(-b);if(c.norm()<1){var b=c.x,d=c.y,e=a.startPos.getc().moebiusTransformation(c);
a.pos.setc(e.x,e.y);c.x=b;c.y=d}},linear:function(a,c,b){var c=a.startPos.getc(!0),d=a.endPos.getc(!0);a.pos.setc(this.compute(c.x,d.x,b),this.compute(c.y,d.y,b))},polar:function(a,c,b){c=a.startPos.getp(!0);b=a.endPos.getp().interpolate(c,b);a.pos.setp(b.theta,b.rho)},number:function(a,c,b,d,e){var g=a[d](c,"start"),d=a[d](c,"end");a[e](c,this.compute(g,d,b))},color:function(a,c,b,d,e){var g=f.hexToRgb(a[d](c,"start")),d=f.hexToRgb(a[d](c,"end")),h=this.compute,b=f.rgbToHex([parseInt(h(g[0],d[0],
b)),parseInt(h(g[1],d[1],b)),parseInt(h(g[2],d[2],b))]);a[e](c,b)},"array-number":function(a,c,b,d,e){for(var g=a[d](c,"start"),d=a[d](c,"end"),h=[],f=0,i=g.length;f<i;f++){var m=g[f],n=d[f];if(m.length){for(var o=0,q=m.length,u=[];o<q;o++)u.push(this.compute(m[o],n[o],b));h.push(u)}else h.push(this.compute(m,n,b))}a[e](c,h)},node:function(a,c,b,d,e,g){d=this[d];if(c)for(var h=c.length,f=0;f<h;f++){var i=c[f];this[d[i]](a,i,b,e,g)}else for(i in d)this[d[i]](a,i,b,e,g)},edge:function(a,c,b,d,e,g){var a=
a.adjacencies,h;for(h in a)this.node(a[h],c,b,d,e,g)},"node-property":function(a,c,b){this.node(a,c,b,"map","getData","setData")},"edge-property":function(a,c,b){this.edge(a,c,b,"map","getData","setData")},"label-property":function(a,c,b){this.node(a,c,b,"label","getLabelData","setLabelData")},"node-style":function(a,c,b){this.node(a,c,b,"canvas","getCanvasStyle","setCanvasStyle")},"edge-style":function(a,c,b){this.edge(a,c,b,"canvas","getCanvasStyle","setCanvasStyle")}},sequence:function(a){var c=
this,a=f.merge({condition:f.lambda(!1),step:f.empty,onComplete:f.empty,duration:200},a||{}),b=setInterval(function(){a.condition()?a.step():(clearInterval(b),a.onComplete());c.viz.refresh(!0)},a.duration)},prepare:function(a){var c=this.viz.graph,b={"node-property":{getter:"getData",setter:"setData"},"edge-property":{getter:"getData",setter:"setData"},"node-style":{getter:"getCanvasStyle",setter:"setCanvasStyle"},"edge-style":{getter:"getCanvasStyle",setter:"setCanvasStyle"}},d={};if(f.type(a)=="array")for(var e=
0,g=a.length;e<g;e++){var h=a[e].split(":");d[h.shift()]=h}else for(e in a)e=="position"?d[a.position]=[]:d[e]=f.splat(a[e]);c.eachNode(function(a){a.startPos.set(a.pos);f.each(["node-property","node-style"],function(c){if(c in d)for(var e=d[c],g=0,h=e.length;g<h;g++)a[b[c].setter](e[g],a[b[c].getter](e[g]),"start")});f.each(["edge-property","edge-style"],function(c){if(c in d){var e=d[c];a.eachAdjacency(function(a){for(var d=0,g=e.length;d<g;d++)a[b[c].setter](e[d],a[b[c].getter](e[d]),"start")})}})});
return d},animate:function(a,c){var a=f.merge(this.viz.config,a||{}),b=this,d=this.viz.graph,e=this.Interpolator,g=a.type==="nodefx"?this.nodeFxAnimation:this.animation,h=this.prepare(a.modes);a.hideLabels&&this.labels.hideLabels(!0);g.setOptions(f.extend(a,{$animating:!1,compute:function(g){d.eachNode(function(a){for(var b in h)e[b](a,h[b],g,c)});b.plot(a,this.$animating,g);this.$animating=!0},complete:function(){a.hideLabels&&b.labels.hideLabels(!1);b.plot(a);a.onComplete()}})).start()},nodeFx:function(a){var c=
this.viz,b=c.graph,d=this.nodeFxAnimation,e=f.merge(this.viz.config,{elements:{id:!1,properties:{}},reposition:!1}),a=f.merge(e,a||{},{onBeforeCompute:f.empty,onAfterCompute:f.empty});d.stopTimer();var g=a.elements.properties;a.elements.id?(d=f.splat(a.elements.id),f.each(d,function(a){if(a=b.getNode(a))for(var c in g)a.setData(c,g[c],"end")})):b.eachNode(function(a){for(var c in g)a.setData(c,g[c],"end")});var d=[],h;for(h in g)d.push(h);h=["node-property:"+d.join(":")];a.reposition&&(h.push("linear"),
c.compute("end"));this.animate(f.merge(a,{modes:h,type:"nodefx"}))},plot:function(a,c){var b=this.viz,d=b.graph,e=b.canvas,b=b.root,g=this;e.getCtx();a=a||this.viz.controller;a.clearCanvas&&e.clear();if(b=d.getNode(b)){var h=!!b.visited;d.eachNode(function(b){var d=b.getData("alpha");b.eachAdjacency(function(d){var f=d.nodeTo;!!f.visited===h&&b.drawn&&f.drawn&&(!c&&a.onBeforePlotLine(d),g.plotLine(d,e,c),!c&&a.onAfterPlotLine(d))});b.drawn&&(!c&&a.onBeforePlotNode(b),g.plotNode(b,e,c),!c&&a.onAfterPlotNode(b));
!g.labelsHidden&&a.withLabels&&(b.drawn&&d>=0.95?g.labels.plotLabel(e,b,a):g.labels.hideLabel(b,!1));b.visited=!h})}},plotTree:function(a,c,b){var d=this,e=this.viz.canvas;e.getCtx();var g=a.getData("alpha");a.eachSubnode(function(g){if(c.plotSubtree(a,g)&&g.exist&&g.drawn){var f=a.getAdjacency(g.id);!b&&c.onBeforePlotLine(f);d.plotLine(f,e,b);!b&&c.onAfterPlotLine(f);d.plotTree(g,c,b)}});a.drawn?(!b&&c.onBeforePlotNode(a),this.plotNode(a,e,b),!b&&c.onAfterPlotNode(a),!c.hideLabels&&c.withLabels&&
g>=0.95?this.labels.plotLabel(e,a,c):this.labels.hideLabel(a,!1)):this.labels.hideLabel(a,!0)},plotNode:function(a,c,b){var d=a.getData("type"),e=this.node.CanvasStyles;if(d!="none"){var g=a.getData("lineWidth"),h=a.getData("color"),f=a.getData("alpha"),i=c.getCtx();i.save();i.lineWidth=g;i.fillStyle=i.strokeStyle=h;i.globalAlpha=f;for(var m in e)i[m]=a.getCanvasStyle(m);this.nodeTypes[d].render.call(this,a,c,b);i.restore()}},plotLine:function(a,c,b){var d=a.getData("type"),e=this.edge.CanvasStyles;
if(d!="none"){var g=a.getData("lineWidth"),h=a.getData("color"),f=c.getCtx(),i=a.nodeFrom,m=a.nodeTo;f.save();f.lineWidth=g;f.fillStyle=f.strokeStyle=h;f.globalAlpha=Math.min(i.getData("alpha"),m.getData("alpha"),a.getData("alpha"));for(var n in e)f[n]=a.getCanvasStyle(n);this.edgeTypes[d].render.call(this,a,c,b);f.restore()}}};l.Plot3D=f.merge(l.Plot,{Interpolator:{linear:function(a,c,b){var c=a.startPos.getc(!0),d=a.endPos.getc(!0);a.pos.setc(this.compute(c.x,d.x,b),this.compute(c.y,d.y,b),this.compute(c.z,
d.z,b))}},plotNode:function(a,c){a.getData("type")!="none"&&this.plotElement(a,c,{getAlpha:function(){return a.getData("alpha")}})},plotLine:function(a,c){a.getData("type")!="none"&&this.plotElement(a,c,{getAlpha:function(){return Math.min(a.nodeFrom.getData("alpha"),a.nodeTo.getData("alpha"),a.getData("alpha"))}})},plotElement:function(a,c,b){var d=c.getCtx(),e=new Matrix4,g=c.config.Scene.Lighting,h=c.canvases[0],c=h.program,h=h.camera;if(!a.geometry)a.geometry=new (O3D[a.getData("type")]);a.geometry.update(a);
if(!a.webGLVertexBuffer){for(var k=[],i=[],m=[],n=0,o=a.geometry,q=0,u=o.vertices,o=o.faces,M=o.length;q<M;q++){var s=o[q],j=u[s.a],l=u[s.b],y=u[s.c],v=s.d?u[s.d]:!1,s=s.normal;k.push(j.x,j.y,j.z);k.push(l.x,l.y,l.z);k.push(y.x,y.y,y.z);v&&k.push(v.x,v.y,v.z);m.push(s.x,s.y,s.z);m.push(s.x,s.y,s.z);m.push(s.x,s.y,s.z);v&&m.push(s.x,s.y,s.z);i.push(n,n+1,n+2);v?(i.push(n,n+2,n+3),n+=4):n+=3}a.webGLVertexBuffer=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,a.webGLVertexBuffer);d.bufferData(d.ARRAY_BUFFER,
new Float32Array(k),d.STATIC_DRAW);a.webGLFaceBuffer=d.createBuffer();d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,a.webGLFaceBuffer);d.bufferData(d.ELEMENT_ARRAY_BUFFER,new Uint16Array(i),d.STATIC_DRAW);a.webGLFaceCount=i.length;a.webGLNormalBuffer=d.createBuffer();d.bindBuffer(d.ARRAY_BUFFER,a.webGLNormalBuffer);d.bufferData(d.ARRAY_BUFFER,new Float32Array(m),d.STATIC_DRAW)}e.multiply(h.matrix,a.geometry.matrix);d.uniformMatrix4fv(c.viewMatrix,!1,e.flatten());d.uniformMatrix4fv(c.projectionMatrix,!1,h.projectionMatrix.flatten());
e=Matrix4.makeInvert(e);e.$transpose();d.uniformMatrix4fv(c.normalMatrix,!1,e.flatten());e=f.hexToRgb(a.getData("color"));e.push(b.getAlpha());d.uniform4f(c.color,e[0]/255,e[1]/255,e[2]/255,e[3]);d.uniform1i(c.enableLighting,g.enable);if(g.enable){if(g.ambient)b=g.ambient,d.uniform3f(c.ambientColor,b[0],b[1],b[2]);if(g.directional)g=g.directional,e=g.color,g=g.direction,g=(new Vector3(g.x,g.y,g.z)).normalize().$scale(-1),d.uniform3f(c.lightingDirection,g.x,g.y,g.z),d.uniform3f(c.directionalColor,
e[0],e[1],e[2])}d.bindBuffer(d.ARRAY_BUFFER,a.webGLVertexBuffer);d.vertexAttribPointer(c.position,3,d.FLOAT,!1,0,0);d.bindBuffer(d.ARRAY_BUFFER,a.webGLNormalBuffer);d.vertexAttribPointer(c.normal,3,d.FLOAT,!1,0,0);d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,a.webGLFaceBuffer);d.drawElements(d.TRIANGLES,a.webGLFaceCount,d.UNSIGNED_SHORT,0)}});l.Label={};l.Label.Native=new j({initialize:function(a){this.viz=a},plotLabel:function(a,c,b){var d=a.getCtx();c.pos.getc(!0);d.font=c.getLabelData("style")+" "+c.getLabelData("size")+
"px "+c.getLabelData("family");d.textAlign=c.getLabelData("textAlign");d.fillStyle=d.strokeStyle=c.getLabelData("color");d.textBaseline=c.getLabelData("textBaseline");this.renderLabel(a,c,b)},renderLabel:function(a,c){var b=a.getCtx(),d=c.pos.getc(!0);b.fillText(c.name,d.x,d.y+c.getData("height")/2)},hideLabel:f.empty,hideLabels:f.empty});l.Label.DOM=new j({labelsHidden:!1,labelContainer:!1,labels:{},getLabelContainer:function(){return this.labelContainer?this.labelContainer:this.labelContainer=document.getElementById(this.viz.config.labelContainer)},
getLabel:function(a){return a in this.labels&&this.labels[a]!=null?this.labels[a]:this.labels[a]=document.getElementById(a)},hideLabels:function(a){this.getLabelContainer().style.display=a?"none":"";this.labelsHidden=a},clearLabels:function(a){for(var c in this.labels)if(a||!this.viz.graph.hasNode(c))this.disposeLabel(c),delete this.labels[c]},disposeLabel:function(a){(a=this.getLabel(a))&&a.parentNode&&a.parentNode.removeChild(a)},hideLabel:function(a,c){var a=f.splat(a),b=c?"":"none",d=this;f.each(a,
function(a){if(a=d.getLabel(a.id))a.style.display=b})},fitsInCanvas:function(a,c){var b=c.getSize();if(a.x>=b.width||a.x<0||a.y>=b.height||a.y<0)return!1;return!0}});l.Label.HTML=new j({Implements:l.Label.DOM,plotLabel:function(a,c,b){var a=c.id,d=this.getLabel(a);if(!d&&!(d=document.getElementById(a))){var d=document.createElement("div"),e=this.getLabelContainer();d.id=a;d.className="node";d.style.position="absolute";b.onCreateLabel(d,c);e.appendChild(d);this.labels[c.id]=d}this.placeLabel(d,c,b)}});
l.Label.SVG=new j({Implements:l.Label.DOM,plotLabel:function(a,c,b){var a=c.id,d=this.getLabel(a);if(!d&&!(d=document.getElementById(a))){var d=document.createElementNS("http://www.w3.org/2000/svg","svg:text"),e=document.createElementNS("http://www.w3.org/2000/svg","svg:tspan");d.appendChild(e);e=this.getLabelContainer();d.setAttribute("id",a);d.setAttribute("class","node");e.appendChild(d);b.onCreateLabel(d,c);this.labels[c.id]=d}this.placeLabel(d,c,b)}});var J={construct:function(a){var c=f.type(a)==
"array",b=new l(this.graphOptions,this.config.Node,this.config.Edge,this.config.Label);c?function(a,c){for(var b=function(b){for(var g=0,h=c.length;g<h;g++)if(c[g].id==b)return c[g];return a.addNode({id:b,name:b})},h=0,k=c.length;h<k;h++){a.addNode(c[h]);var i=c[h].adjacencies;if(i)for(var m=0,n=i.length;m<n;m++){var o=i[m],q={};if(typeof i[m]!="string")q=f.merge(o.data,{}),o=o.nodeTo;a.addAdjacence(c[h],b(o),q)}}}(b,a):function(a,c){a.addNode(c);if(c.children)for(var b=0,h=c.children;b<h.length;b++)a.addAdjacence(c,
h[b]),arguments.callee(a,h[b])}(b,a);return b},loadJSON:function(a,c){this.json=a;this.labels&&this.labels.clearLabels&&this.labels.clearLabels(!0);this.graph=this.construct(a);this.root=f.type(a)!="array"?a.id:a[c?c:0].id},toJSON:function(a){if((a||"tree")=="tree")var c={},c=function e(a){var c={};c.id=a.id;c.name=a.name;c.data=a.data;var b=[];a.eachSubnode(function(a){b.push(e(a))});c.children=b;return c}(this.graph.getNode(this.root));else{var c=[],b=!!this.graph.getNode(this.root).visited;this.graph.eachNode(function(a){var g=
{};g.id=a.id;g.name=a.name;g.data=a.data;var h=[];a.eachAdjacency(function(a){var c=a.nodeTo;if(!!c.visited===b){var e={};e.nodeTo=c.id;e.data=a.data;h.push(e)}});g.adjacencies=h;c.push(g);a.visited=!b})}return c}},A=$jit.Layouts={},K={label:null,compute:function(a,c,b){this.initializeLabel(b);var d=this.label,e=d.style;a.eachNode(function(a){var c=a.getData("autoWidth"),b=a.getData("autoHeight");if(c||b){delete a.data.$width;delete a.data.$height;delete a.data.$dim;var i=a.getData("width"),m=a.getData("height");
e.width=c?"auto":i+"px";e.height=b?"auto":m+"px";d.innerHTML=a.name;c=d.offsetWidth;b=d.offsetHeight;i=a.getData("type");f.indexOf(["circle","square","triangle","star"],i)===-1?(a.setData("width",c),a.setData("height",b)):(c=c>b?c:b,a.setData("width",c),a.setData("height",c),a.setData("dim",c))}})},initializeLabel:function(a){if(!this.label)this.label=document.createElement("div"),document.body.appendChild(this.label);this.setLabelStyles(a)},setLabelStyles:function(){f.extend(this.label.style,{visibility:"hidden",
position:"absolute",width:"auto",height:"auto"});this.label.className="jit-autoadjust-label"}};A.Radial=new j({compute:function(a){a=f.splat(a||["current","start","end"]);K.compute(this.graph,a,this.config);this.graph.computeLevels(this.root,0,"ignore");var c=this.createLevelDistanceFunc();this.computeAngularWidths(a);this.computePositions(a,c)},computePositions:function(a,c){for(var b=this.graph,d=b.getNode(this.root),e=this.parent,g=0,h=a.length;g<h;g++){var f=a[g];d.setPos(new t(0,0),f);d.setData("span",
Math.PI*2,f)}d.angleSpan={begin:0,end:2*Math.PI};b.eachBFS(this.root,function(b){var d=b.angleSpan.end-b.angleSpan.begin,g=b.angleSpan.begin,h=c(b),f=0,k=[],j={};b.eachSubnode(function(c){f+=c._treeAngularWidth;for(var b=0,d=a.length;b<d;b++){var e=a[b],g=c.getData("dim",e);j[e]=e in j?g>j[e]?g:j[e]:g}k.push(c)},"ignore");e&&e.id==b.id&&k.length>0&&k[0].dist&&k.sort(function(a,c){return(a.dist>=c.dist)-(a.dist<=c.dist)});for(var b=0,s=k.length;b<s;b++){var l=k[b];if(!l._flag){for(var F=l._treeAngularWidth/
f*d,y=g+F/2,v=0,r=a.length;v<r;v++){var p=a[v];l.setPos(new t(y,h),p);l.setData("span",F,p);l.setData("dim-quotient",l.getData("dim",p)/j[p],p)}l.angleSpan={begin:g,end:g+F};g+=F}}},"ignore")},setAngularWidthForNodes:function(a){this.graph.eachBFS(this.root,function(c,b){var d=c.getData("angularWidth",a[0])||5;c._angularWidth=d/b},"ignore")},setSubtreesAngularWidth:function(){var a=this;this.graph.eachNode(function(c){a.setSubtreeAngularWidth(c)},"ignore")},setSubtreeAngularWidth:function(a){var c=
this,b=a._angularWidth,d=0;a.eachSubnode(function(a){c.setSubtreeAngularWidth(a);d+=a._treeAngularWidth},"ignore");a._treeAngularWidth=Math.max(b,d)},computeAngularWidths:function(a){this.setAngularWidthForNodes(a);this.setSubtreesAngularWidth()}});$jit.RGraph=new j({Implements:[J,x,A.Radial],initialize:function(a){var c=$jit.RGraph,a=this.controller=this.config=f.merge(p("Canvas","Node","Edge","Fx","Controller","Tips","NodeStyles","Events","Navigation","Label"),{interpolation:"linear",levelDistance:100},
a);if(a.useCanvas)this.canvas=a.useCanvas,this.config.labelContainer=this.canvas.id+"-label";else{if(a.background)a.background=f.merge({type:"Circles"},a.background);this.canvas=new w(this,a);this.config.labelContainer=(typeof a.injectInto=="string"?a.injectInto:a.injectInto.id)+"-label"}this.graphOptions={klass:t,Node:{selected:!1,exist:!0,drawn:!0}};this.graph=new l(this.graphOptions,this.config.Node,this.config.Edge);this.labels=new c.Label[a.Label.type](this);this.fx=new c.Plot(this,c);this.op=
new c.Op(this);this.root=this.json=null;this.parent=this.busy=!1;this.initializeExtras()},createLevelDistanceFunc:function(){var a=this.config.levelDistance;return function(c){return(c._depth+1)*a}},refresh:function(){this.compute();this.plot()},reposition:function(){this.compute("end")},plot:function(){this.fx.plot()},getNodeAndParentAngle:function(a){var c=!1,b=this.graph.getNode(a),a=b.getParents();if(a=a.length>0?a[0]:!1)c=a.pos.getc(),b=b.pos.getc(),c=c.add(b.scale(-1)),c=Math.atan2(c.y,c.x),
c<0&&(c+=2*Math.PI);return{parent:a,theta:c}},tagChildren:function(a,c){if(a.angleSpan){var b=[];a.eachAdjacency(function(a){b.push(a.nodeTo)},"ignore");for(var d=b.length,e=0;e<d&&c!=b[e].id;e++);for(var e=(e+1)%d,g=0;c!=b[e].id;e=(e+1)%d)b[e].dist=g++}},onClick:function(a,c){if(this.root!=a&&!this.busy){this.busy=!0;this.root=a;var b=this;this.controller.onBeforeCompute(this.graph.getNode(a));var d=this.getNodeAndParentAngle(a);this.tagChildren(d.parent,a);this.parent=d.parent;this.compute("end");
var e=d.theta-d.parent.endPos.theta;this.graph.eachNode(function(a){a.endPos.set(a.endPos.getp().add(new t(e,0)))});d=this.config.interpolation;c=f.merge({onComplete:f.empty},c||{});this.fx.animate(f.merge({hideLabels:!0,modes:[d]},c,{onComplete:function(){b.busy=!1;c.onComplete()}}))}}});$jit.RGraph.$extend=!0;(function(a){a.Op=new j({Implements:l.Op});a.Plot=new j({Implements:l.Plot});a.Label={};a.Label.Native=new j({Implements:l.Label.Native});a.Label.SVG=new j({Implements:l.Label.SVG,initialize:function(a){this.viz=
a},placeLabel:function(a,b,d){var e=b.pos.getc(!0),g=this.viz.canvas,h=g.translateOffsetX,f=g.translateOffsetY,i=g.scaleOffsetX,m=g.scaleOffsetY,g=g.getSize(),e={x:Math.round(e.x*i+h+g.width/2),y:Math.round(e.y*m+f+g.height/2)};a.setAttribute("x",e.x);a.setAttribute("y",e.y);d.onPlaceLabel(a,b)}});a.Label.HTML=new j({Implements:l.Label.HTML,initialize:function(a){this.viz=a},placeLabel:function(a,b,d){var e=b.pos.getc(!0),g=this.viz.canvas,h=g.translateOffsetX,f=g.translateOffsetY,i=g.scaleOffsetX,
m=g.scaleOffsetY,n=g.getSize(),e={x:Math.round(e.x*i+h+n.width/2),y:Math.round(e.y*m+f+n.height/2)},h=a.style;h.left=e.x+"px";h.top=e.y+"px";h.display=this.fitsInCanvas(e,g)?"":"none";d.onPlaceLabel(a,b)}});a.Plot.NodeTypes=new j({none:{render:f.empty,contains:f.lambda(!1)},circle:{render:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");this.nodeHelper.circle.render("fill",d,e,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");return this.nodeHelper.circle.contains(d,b,e)}},ellipse:{render:function(a,
b){var d=a.pos.getc(!0),e=a.getData("width"),g=a.getData("height");this.nodeHelper.ellipse.render("fill",d,e,g,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("width"),g=a.getData("height");return this.nodeHelper.ellipse.contains(d,b,e,g)}},square:{render:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");this.nodeHelper.square.render("fill",d,e,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");return this.nodeHelper.square.contains(d,b,e)}},rectangle:{render:function(a,
b){var d=a.pos.getc(!0),e=a.getData("width"),g=a.getData("height");this.nodeHelper.rectangle.render("fill",d,e,g,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("width"),g=a.getData("height");return this.nodeHelper.rectangle.contains(d,b,e,g)}},triangle:{render:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");this.nodeHelper.triangle.render("fill",d,e,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");return this.nodeHelper.triangle.contains(d,b,e)}},star:{render:function(a,
b){var d=a.pos.getc(!0),e=a.getData("dim");this.nodeHelper.star.render("fill",d,e,b)},contains:function(a,b){var d=a.pos.getc(!0),e=a.getData("dim");return this.nodeHelper.star.contains(d,b,e)}}});a.Plot.EdgeTypes=new j({none:f.empty,line:{render:function(a,b){var d=a.nodeFrom.pos.getc(!0),e=a.nodeTo.pos.getc(!0);this.edgeHelper.line.render(d,e,b)},contains:function(a,b){var d=a.nodeFrom.pos.getc(!0),e=a.nodeTo.pos.getc(!0);return this.edgeHelper.line.contains(d,e,b,this.edge.epsilon)}},arrow:{render:function(a,
b){var d=a.nodeFrom.pos.getc(!0),e=a.nodeTo.pos.getc(!0),g=a.getData("dim"),h=a.data.$direction;this.edgeHelper.arrow.render(d,e,g,h&&h.length>1&&h[0]!=a.nodeFrom.id,b)},contains:function(a,b){var d=a.nodeFrom.pos.getc(!0),e=a.nodeTo.pos.getc(!0);return this.edgeHelper.arrow.contains(d,e,b,this.edge.epsilon)}}})})($jit.RGraph);p.Tree={$extend:!0,orientation:"left",subtreeOffset:8,siblingOffset:5,indent:10,multitree:!1,align:"center"};l.Geom=new j({initialize:function(a){this.viz=a;this.config=a.config;
this.node=a.config.Node;this.edge=a.config.Edge},translate:function(a,c){c=f.splat(c);this.viz.graph.eachNode(function(b){f.each(c,function(c){b.getPos(c).$add(a)})})},setRightLevelToShow:function(a,c,b){var d=this.getRightLevelToShow(a,c),e=this.viz.labels,g=f.merge({execShow:!0,execHide:!0,onHide:f.empty,onShow:f.empty},b||{});a.eachLevel(0,this.config.levelsToShow,function(b){if(b._depth-a._depth>d){if(g.onHide(b),g.execHide)b.drawn=!1,b.exist=!1,e.hideLabel(b,!1)}else if(g.onShow(b),g.execShow)b.exist=
!0});a.drawn=!0},getRightLevelToShow:function(a,c){var b=this.config,d=b.levelsToShow;if(!b.constrained)return d;for(;!this.treeFitsInCanvas(a,c,d)&&d>1;)d--;return d}});A.Tree=function(){function a(a,b,c,d,e){var g=b.Node,h=b.multitree;if(g.overridable){var f=-1,i=-1;a.eachNode(function(a){if(a._depth==c&&(!h||"$orn"in a.data&&a.data.$orn==d)){var b=a.getData("width",e),a=a.getData("height",e);f=f<b?b:f;i=i<a?a:i}});return{width:f<0?g.width:f,height:i<0?g.height:i}}else return g}function c(a,b,c,
d){a.getPos(b)[d=="left"||d=="right"?"y":"x"]+=c}function b(a,b){var c=[];f.each(a,function(a){a=n.call(a);a[0]+=b;a[1]+=b;c.push(a)});return c}function d(a,b){if(a.length==0)return b;if(b.length==0)return a;var c=a.shift(),e=b.shift();return[[c[0],e[1]]].concat(d(a,b))}function e(a,b){b=b||[];if(a.length==0)return b;var c=a.pop();return e(a,d(c,b))}function g(a,b,c,d,e){if(a.length<=e||b.length<=e)return 0;var h=a[e][1],f=b[e][0];return Math.max(g(a,b,c,d,++e)+c,h-f+d)}function h(a,c,e){function h(a,
f,i){if(f.length<=i)return[];var k=f[i],m=g(a,k,c,e,0);return[m].concat(h(d(a,b(k,m)),f,++i))}return h([],a,0)}function k(a,c,e){function h(a,f,i){if(f.length<=i)return[];var k=f[i],m=-g(k,a,c,e,0);return[m].concat(h(d(b(k,m),a),f,++i))}a=n.call(a);return h([],a.reverse(),0).reverse()}function i(a,b,c,d){var e=h(a,b,c),a=k(a,b,c);d=="left"?a=e:d=="right"&&(e=a);d=0;for(b=[];d<e.length;d++)b[d]=(e[d]+a[d])/2;return b}function m(d,g,h,f,k){function m(g,j,l){var q=g.getData(w,h),p=[],v=[],y=!1,D=(j||
g.getData(x,h))+f.levelDistance;g.eachSubnode(function(b){if(b.exist&&(!n||"$orn"in b.data&&b.data.$orn==k))y||(y=a(d,f,b._depth,k,h)),b=m(b,y[x],l+D),p.push(b.tree),v.push(b.extent)});for(var j=i(v,B,z,C),E=0,A=[];E<p.length;E++)c(p[E],h,j[E],k),A.push(b(v[E],j[E]));q=[[-q/2,q/2]].concat(e(A));g.getPos(h)[r]=0;k=="top"||k=="left"?g.getPos(h)[t]=l:g.getPos(h)[t]=-l;return{tree:g,extent:q}}var n=f.multitree,j=["x","y"],l=["width","height"],p=+(k=="left"||k=="right"),r=j[p],t=j[1-p],w=l[p],x=l[1-p],
z=f.siblingOffset,B=f.subtreeOffset,C=f.align;m(g,!1,0)}var n=Array.prototype.slice;return new j({compute:function(a,b){var c=a||"start",d=this.graph.getNode(this.root);f.extend(d,{drawn:!0,exist:!0,selected:!0});K.compute(this.graph,c,this.config);(b||!("_depth"in d))&&this.graph.computeLevels(this.root,0,"ignore");this.computePositions(d,c)},computePositions:function(a,b){var c=this.config,d=c.multitree,e=c.align,g=e!=="center"&&c.indent,c=c.orientation,h=this;f.each(d?["top","right","bottom","left"]:
[c],function(c){m(h.graph,a,b,h.config,c,b);var f=["x","y"][+(c=="left"||c=="right")];(function N(a){a.eachSubnode(function(h){if(h.exist&&(!d||"$orn"in h.data&&h.data.$orn==c))h.getPos(b)[f]+=a.getPos(b)[f],g&&(h.getPos(b)[f]+=e=="left"?g:-g),N(h)})})(a)})}})}();$jit.ST=function(){function a(a){a=a||this.clickedNode;if(!this.config.constrained)return[];var c=this.geom,g=this.canvas,h=a._depth,f=[];this.graph.eachNode(function(b){b.exist&&!b.selected&&(b.isDescendantOf(a.id)?b._depth<=h&&f.push(b):
f.push(b))});c=c.getRightLevelToShow(a,g);a.eachLevel(c,c,function(a){a.exist&&!a.selected&&f.push(a)});for(c=0;c<b.length;c++)g=this.graph.getNode(b[c]),g.isDescendantOf(a.id)||f.push(g);return f}function c(){var a=[],b=this.config;this.clickedNode.eachLevel(0,b.levelsToShow,function(c){b.multitree&&!("$orn"in c.data)&&c.anySubnode(function(a){return a.exist&&!a.drawn})?a.push(c):c.drawn&&!c.anySubnode("drawn")&&a.push(c)});return a}var b=[];return new j({Implements:[J,x,A.Tree],initialize:function(a){var b=
$jit.ST,a=this.controller=this.config=f.merge(p("Canvas","Fx","Tree","Node","Edge","Controller","Tips","NodeStyles","Events","Navigation","Label"),{levelsToShow:2,levelDistance:30,constrained:!0,Node:{type:"rectangle"},duration:700,offsetX:0,offsetY:0},a);if(a.useCanvas)this.canvas=a.useCanvas,this.config.labelContainer=this.canvas.id+"-label";else{if(a.background)a.background=f.merge({type:"Circles"},a.background);this.canvas=new w(this,a);this.config.labelContainer=(typeof a.injectInto=="string"?
a.injectInto:a.injectInto.id)+"-label"}this.graphOptions={klass:r};this.graph=new l(this.graphOptions,this.config.Node,this.config.Edge);this.labels=new b.Label[a.Label.type](this);this.fx=new b.Plot(this,b);this.op=new b.Op(this);this.group=new b.Group(this);this.geom=new b.Geom(this);this.clickedNode=null;this.initializeExtras()},plot:function(){this.fx.plot(this.controller)},switchPosition:function(a,b,c){var f=this.geom,k=this.fx,i=this;if(!k.busy)k.busy=!0,this.contract({onComplete:function(){f.switchOrientation(a);
i.compute("end",!1);k.busy=!1;if(b=="animate")i.onClick(i.clickedNode.id,c);else b=="replot"&&i.select(i.clickedNode.id,c)}},a)},switchAlignment:function(a,b,c){this.config.align=a;if(b=="animate")this.select(this.clickedNode.id,c);else if(b=="replot")this.onClick(this.clickedNode.id,c)},addNodeInPath:function(a){b.push(a);this.select(this.clickedNode&&this.clickedNode.id||this.root)},clearNodesInPath:function(){b.length=0;this.select(this.clickedNode&&this.clickedNode.id||this.root)},refresh:function(){this.reposition();
this.select(this.clickedNode&&this.clickedNode.id||this.root)},reposition:function(){this.graph.computeLevels(this.root,0,"ignore");this.geom.setRightLevelToShow(this.clickedNode,this.canvas);this.graph.eachNode(function(a){if(a.exist)a.drawn=!0});this.compute("end")},requestNodes:function(a,b){var c=f.merge(this.controller,b),h=this.config.levelsToShow;if(c.request){var k=[],i=a._depth;a.eachLevel(0,h,function(a){if(a.drawn&&!a.anySubnode())k.push(a),a._level=h-(a._depth-i)});this.group.requestNodes(k,
c)}else c.onComplete()},contract:function(b,c){var g=this.config.orientation,h=this.geom,k=this.group;c&&h.switchOrientation(c);var i=a.call(this);c&&h.switchOrientation(g);k.contract(i,f.merge(this.controller,b))},move:function(a,b){this.compute("end",!1);var c=b.Move,h={x:c.offsetX,y:c.offsetY};c.enable&&this.geom.translate(a.endPos.add(h).$scale(-1),"end");this.fx.animate(f.merge(this.controller,{modes:["linear"]},b))},expand:function(a,b){this.group.expand(c.call(this,a),f.merge(this.controller,
b))},selectPath:function(a){function c(a){if(!(a==null||a.selected))a.selected=!0,f.each(g.group.getSiblings([a])[a.id],function(a){a.exist=!0;a.drawn=!0}),a=a.getParents(),a=a.length>0?a[0]:null,c(a)}var g=this;this.graph.eachNode(function(a){a.selected=!1});for(var h=0,a=[a.id].concat(b);h<a.length;h++)c(this.graph.getNode(a[h]))},setRoot:function(a,b,c){function f(){if(this.config.multitree&&j.data.$orn){var b={left:"right",right:"left",top:"bottom",bottom:"top"}[j.data.$orn];m.data.$orn=b;(function u(c){c.eachSubnode(function(c){if(c.id!=
a)c.data.$orn=b,u(c)})})(m);delete j.data.$orn}this.root=a;this.clickedNode=j;this.graph.computeLevels(this.root,0,"ignore");this.geom.setRightLevelToShow(j,i,{execHide:!1,onShow:function(a){if(!a.drawn)a.drawn=!0,a.setData("alpha",1,"end"),a.setData("alpha",0),a.pos.setc(j.pos.x,j.pos.y)}});this.compute("end");this.busy=!0;this.fx.animate({modes:["linear","node-property:alpha"],onComplete:function(){k.busy=!1;k.onClick(a,{onComplete:function(){c&&c.onComplete()}})}})}if(!this.busy){this.busy=!0;
var k=this,i=this.canvas,m=this.graph.getNode(this.root),j=this.graph.getNode(a);delete m.data.$orns;b=="animate"?(f.call(this),k.selectPath(j)):b=="replot"&&(f.call(this),this.select(this.root))}},addSubtree:function(a,b,c){b=="replot"?this.op.sum(a,f.extend({type:"replot"},c||{})):b=="animate"&&this.op.sum(a,f.extend({type:"fade:seq"},c||{}))},removeSubtree:function(a,b,c,h){var k=[];this.graph.getNode(a).eachLevel(+!b,!1,function(a){k.push(a.id)});c=="replot"?this.op.removeNode(k,f.extend({type:"replot"},
h||{})):c=="animate"&&this.op.removeNode(k,f.extend({type:"fade:seq"},h||{}))},select:function(b,e){var g=this.group,h=this.geom,k=this.graph.getNode(b),i=this.canvas;this.graph.getNode(this.root);var m=f.merge(this.controller,e),j=this;m.onBeforeCompute(k);this.selectPath(k);this.clickedNode=k;this.requestNodes(k,{onComplete:function(){g.hide(g.prepare(a.call(j)),m);h.setRightLevelToShow(k,i);j.compute("current");j.graph.eachNode(function(a){var b=a.pos.getc(!0);a.startPos.setc(b.x,b.y);a.endPos.setc(b.x,
b.y);a.visited=!1});j.geom.translate(k.endPos.add({x:m.offsetX,y:m.offsetY}).$scale(-1),["start","current","end"]);g.show(c.call(j));j.plot();m.onAfterCompute(j.clickedNode);m.onComplete()}})},onClick:function(a,b){var c=this.canvas,h=this,k=this.geom,i=this.config,j=f.merge(this.controller,{Move:{enable:!0,offsetX:i.offsetX||0,offsetY:i.offsetY||0},setRightLevelToShowConfig:!1,onBeforeRequest:f.empty,onBeforeContract:f.empty,onBeforeMove:f.empty,onBeforeExpand:f.empty},b);if(!this.busy){this.busy=
!0;var l=this.graph.getNode(a);this.selectPath(l,this.clickedNode);this.clickedNode=l;j.onBeforeCompute(l);j.onBeforeRequest(l);this.requestNodes(l,{onComplete:function(){j.onBeforeContract(l);h.contract({onComplete:function(){k.setRightLevelToShow(l,c,j.setRightLevelToShowConfig);j.onBeforeMove(l);h.move(l,{Move:j.Move,onComplete:function(){j.onBeforeExpand(l);h.expand(l,{onComplete:function(){h.busy=!1;j.onAfterCompute(a);j.onComplete()}})}})}})}})}}})}();$jit.ST.$extend=!0;$jit.ST.Op=new j({Implements:l.Op});
$jit.ST.Group=new j({initialize:function(a){this.viz=a;this.canvas=a.canvas;this.config=a.config;this.animation=new G;this.nodes=null},requestNodes:function(a,c){var b=0,d=a.length,e=this.viz;if(d==0)c.onComplete();for(var g=0;g<d;g++)c.request(a[g].id,a[g]._level,{onComplete:function(a,g){if(g&&g.children)g.id=a,e.op.sum(g,{type:"nothing"});++b==d&&(e.graph.computeLevels(e.root,0),c.onComplete())}})},contract:function(a,c){var b=this,a=this.prepare(a);this.animation.setOptions(f.merge(c,{$animating:!1,
compute:function(a){a==1&&(a=0.99);b.plotStep(1-a,c,this.$animating);this.$animating="contract"},complete:function(){b.hide(a,c)}})).start()},hide:function(a,c){for(var b=0;b<a.length;b++)a[b].eachLevel(1,!1,function(a){a.exist&&f.extend(a,{drawn:!1,exist:!1})});c.onComplete()},expand:function(a,c){var b=this;this.show(a);this.animation.setOptions(f.merge(c,{$animating:!1,compute:function(a){b.plotStep(a,c,this.$animating);this.$animating="expand"},complete:function(){b.plotStep(void 0,c,!1);c.onComplete()}})).start()},
show:function(a){var c=this.config;this.prepare(a);f.each(a,function(a){if(c.multitree&&!("$orn"in a.data)){delete a.data.$orns;var d=" ";a.eachSubnode(function(a){"$orn"in a.data&&d.indexOf(a.data.$orn)<0&&a.exist&&!a.drawn&&(d+=a.data.$orn+" ")});a.data.$orns=d}a.eachLevel(0,c.levelsToShow,function(a){if(a.exist)a.drawn=!0})})},prepare:function(a){return this.nodes=this.getNodesWithChildren(a)},getNodesWithChildren:function(a){var c=[],b=this.config;a.sort(function(a,b){return(a._depth<=b._depth)-
(a._depth>=b._depth)});for(var d=0;d<a.length;d++)if(a[d].anySubnode("exist")){for(var e=d+1,g=!1;!g&&e<a.length;e++)if(!b.multitree||"$orn"in a[e].data)g=g||a[d].isDescendantOf(a[e].id);g||c.push(a[d])}return c},plotStep:function(a,c,b){var d=this.viz,e=this.config,g=d.canvas.getCtx(),h=this.nodes,k,i,j={};for(k=0;k<h.length;k++){i=h[k];j[i.id]=[];var l=e.multitree&&!("$orn"in i.data),o=l&&i.data.$orns;i.eachSubgraph(function(a){if(l&&o&&o.indexOf(a.data.$orn)>0&&a.drawn)a.drawn=!1,j[i.id].push(a);
else if((!l||!o)&&a.drawn)a.drawn=!1,j[i.id].push(a)});i.drawn=!0}h.length>0&&d.fx.plot();for(k in j)f.each(j[k],function(a){a.drawn=!0});for(k=0;k<h.length;k++)i=h[k],g.save(),d.fx.plotSubtree(i,c,a,b),g.restore()},getSiblings:function(a){var c={};f.each(a,function(a){var d=a.getParents();if(d.length==0)c[a.id]=[a];else{var e=[];d[0].eachSubnode(function(a){e.push(a)});c[a.id]=e}});return c}});$jit.ST.Geom=new j({Implements:l.Geom,switchOrientation:function(a){this.config.orientation=a},dispatch:function(){var a=
Array.prototype.slice.call(arguments),c=a.shift(),b=a.length,d=function(a){return typeof a=="function"?a():a};if(b==2)return c=="top"||c=="bottom"?d(a[0]):d(a[1]);else if(b==4)switch(c){case "top":return d(a[0]);case "right":return d(a[1]);case "bottom":return d(a[2]);case "left":return d(a[3])}},getSize:function(a,c){var b=a.data,d=this.config,e=d.siblingOffset,b=d.multitree&&"$orn"in b&&b.$orn||d.orientation,d=a.getData("width")+e,e=a.getData("height")+e;return c?this.dispatch(b,d,e):this.dispatch(b,
e,d)},getTreeBaseSize:function(a,c,b){var d=this.getSize(a,!0),e=0,g=this;if(b(c,a))return d;if(c===0)return 0;a.eachSubnode(function(a){e+=g.getTreeBaseSize(a,c-1,b)});return(d>e?d:e)+this.config.subtreeOffset},getEdge:function(a,c,b){var d=function(b,c){return function(){return a.pos.add(new r(b,c))}},e=this.node,g=a.getData("width"),f=a.getData("height");if(c=="begin")if(e.align=="center")return this.dispatch(b,d(0,f/2),d(-g/2,0),d(0,-f/2),d(g/2,0));else if(e.align=="left")return this.dispatch(b,
d(0,f),d(0,0),d(0,0),d(g,0));else if(e.align=="right")return this.dispatch(b,d(0,0),d(-g,0),d(0,-f),d(0,0));else throw"align: not implemented";else if(c=="end")if(e.align=="center")return this.dispatch(b,d(0,-f/2),d(g/2,0),d(0,f/2),d(-g/2,0));else if(e.align=="left")return this.dispatch(b,d(0,0),d(g,0),d(0,f),d(0,0));else if(e.align=="right")return this.dispatch(b,d(0,-f),d(0,0),d(0,0),d(-g,0));else throw"align: not implemented";},getScaledTreePosition:function(a,c){var b=this.node,d=a.getData("width"),
e=a.getData("height"),g=this.config.multitree&&"$orn"in a.data&&a.data.$orn||this.config.orientation,f=function(b,d){return function(){return a.pos.add(new r(b,d)).$scale(1-c)}};if(b.align=="left")return this.dispatch(g,f(0,e),f(0,0),f(0,0),f(d,0));else if(b.align=="center")return this.dispatch(g,f(0,e/2),f(-d/2,0),f(0,-e/2),f(d/2,0));else if(b.align=="right")return this.dispatch(g,f(0,0),f(-d,0),f(0,-e),f(0,0));else throw"align: not implemented";},treeFitsInCanvas:function(a,c,b){c=c.getSize();c=
this.dispatch(this.config.multitree&&"$orn"in a.data&&a.data.$orn||this.config.orientation,c.width,c.height);return this.getTreeBaseSize(a,b,function(a,b){return a===0||!b.anySubnode()})<c}});$jit.ST.Plot=new j({Implements:l.Plot,plotSubtree:function(a,c,b,d){var e=this.viz,g=e.canvas,h=e.config,b=Math.min(Math.max(0.001,b),1);if(b>=0)a.drawn=!1,g=g.getCtx(),e=e.geom.getScaledTreePosition(a,b),g.translate(e.x,e.y),g.scale(b,b);this.plotTree(a,f.merge(c,{withLabels:!0,hideLabels:!!b,plotSubtree:function(){var b=
h.multitree&&!("$orn"in a.data),c=b&&a.getData("orns");return!b||c.indexOf(a.getData("orn"))>-1}}),d);if(b>=0)a.drawn=!0},getAlignedPos:function(a,c,b){var d=this.node;if(d.align=="center")a={x:a.x-c/2,y:a.y-b/2};else if(d.align=="left")d=this.config.orientation,a=d=="bottom"||d=="top"?{x:a.x-c/2,y:a.y}:{x:a.x,y:a.y-b/2};else if(d.align=="right")d=this.config.orientation,a=d=="bottom"||d=="top"?{x:a.x-c/2,y:a.y-b}:{x:a.x-c,y:a.y-b/2};else throw"align: not implemented";return a},getOrientation:function(a){var c=
this.config,b=c.orientation;if(c.multitree)c=a.nodeFrom,a=a.nodeTo,b="$orn"in c.data&&c.data.$orn||"$orn"in a.data&&a.data.$orn;return b}});$jit.ST.Label={};$jit.ST.Label.Native=new j({Implements:l.Label.Native,renderLabel:function(a,c){var b=a.getCtx(),d=c.pos.getc(!0),e=c.getData("width"),g=c.getData("height"),d=this.viz.fx.getAlignedPos(d,e,g);b.fillText(c.name,d.x+e/2,d.y+g/2)}});$jit.ST.Label.DOM=new j({Implements:l.Label.DOM,placeLabel:function(a,c,b){var d=c.pos.getc(!0),e=this.viz.config,
g=e.Node,f=this.viz.canvas,j=c.getData("width"),i=c.getData("height"),l=f.getSize(),n=d.x*f.scaleOffsetX+f.translateOffsetX,d=d.y*f.scaleOffsetY+f.translateOffsetY;if(g.align=="center")j={x:Math.round(n-j/2+l.width/2),y:Math.round(d-i/2+l.height/2)};else if(g.align=="left")e=e.orientation,j=e=="bottom"||e=="top"?{x:Math.round(n-j/2+l.width/2),y:Math.round(d+l.height/2)}:{x:Math.round(n+l.width/2),y:Math.round(d-i/2+l.height/2)};else if(g.align=="right")e=e.orientation,j=e=="bottom"||e=="top"?{x:Math.round(n-
j/2+l.width/2),y:Math.round(d-i+l.height/2)}:{x:Math.round(n-j+l.width/2),y:Math.round(d-i/2+l.height/2)};else throw"align: not implemented";i=a.style;i.left=j.x+"px";i.top=j.y+"px";i.display=this.fitsInCanvas(j,f)?"":"none";b.onPlaceLabel(a,c)}});$jit.ST.Label.SVG=new j({Implements:[$jit.ST.Label.DOM,l.Label.SVG],initialize:function(a){this.viz=a}});$jit.ST.Label.HTML=new j({Implements:[$jit.ST.Label.DOM,l.Label.HTML],initialize:function(a){this.viz=a}});$jit.ST.Plot.NodeTypes=new j({none:{render:f.empty,
contains:f.lambda(!1)},circle:{render:function(a,c){var b=a.getData("dim"),d=this.getAlignedPos(a.pos.getc(!0),b,b);b/=2;this.nodeHelper.circle.render("fill",{x:d.x+b,y:d.y+b},b,c)},contains:function(a,c){var b=a.getData("dim"),d=this.getAlignedPos(a.pos.getc(!0),b,b);b/=2;this.nodeHelper.circle.contains({x:d.x+b,y:d.y+b},c,b)}},square:{render:function(a,c){var b=a.getData("dim"),d=b/2,b=this.getAlignedPos(a.pos.getc(!0),b,b);this.nodeHelper.square.render("fill",{x:b.x+d,y:b.y+d},d,c)},contains:function(a,
c){var b=a.getData("dim"),d=this.getAlignedPos(a.pos.getc(!0),b,b);b/=2;this.nodeHelper.square.contains({x:d.x+b,y:d.y+b},c,b)}},ellipse:{render:function(a,c){var b=a.getData("width"),d=a.getData("height"),e=this.getAlignedPos(a.pos.getc(!0),b,d);this.nodeHelper.ellipse.render("fill",{x:e.x+b/2,y:e.y+d/2},b,d,c)},contains:function(a,c){var b=a.getData("width"),d=a.getData("height"),e=this.getAlignedPos(a.pos.getc(!0),b,d);this.nodeHelper.ellipse.contains({x:e.x+b/2,y:e.y+d/2},c,b,d)}},rectangle:{render:function(a,
c){var b=a.getData("width"),d=a.getData("height"),e=this.getAlignedPos(a.pos.getc(!0),b,d);this.nodeHelper.rectangle.render("fill",{x:e.x+b/2,y:e.y+d/2},b,d,c)},contains:function(a,c){var b=a.getData("width"),d=a.getData("height"),e=this.getAlignedPos(a.pos.getc(!0),b,d);this.nodeHelper.rectangle.contains({x:e.x+b/2,y:e.y+d/2},c,b,d)}}});$jit.ST.Plot.EdgeTypes=new j({none:f.empty,line:{render:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,g=d._depth<e._depth,f=this.viz.geom.getEdge(g?
d:e,"begin",b),b=this.viz.geom.getEdge(g?e:d,"end",b);this.edgeHelper.line.render(f,b,c)},contains:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,g=d._depth<e._depth,f=this.viz.geom.getEdge(g?d:e,"begin",b),b=this.viz.geom.getEdge(g?e:d,"end",b);return this.edgeHelper.line.contains(f,b,c,this.edge.epsilon)}},arrow:{render:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,g=a.getData("dim"),f=this.viz.geom.getEdge(d,"begin",b),b=this.viz.geom.getEdge(e,"end",b),
e=a.data.$direction;this.edgeHelper.arrow.render(f,b,g,e&&e.length>1&&e[0]!=d.id,c)},contains:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,g=d._depth<e._depth,f=this.viz.geom.getEdge(g?d:e,"begin",b),b=this.viz.geom.getEdge(g?e:d,"end",b);return this.edgeHelper.arrow.contains(f,b,c,this.edge.epsilon)}},"quadratic:begin":{render:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,g=d._depth<e._depth,f=this.viz.geom.getEdge(g?d:e,"begin",b),d=this.viz.geom.getEdge(g?
e:d,"end",b),e=a.getData("dim"),g=c.getCtx();g.beginPath();g.moveTo(f.x,f.y);switch(b){case "left":g.quadraticCurveTo(f.x+e,f.y,d.x,d.y);break;case "right":g.quadraticCurveTo(f.x-e,f.y,d.x,d.y);break;case "top":g.quadraticCurveTo(f.x,f.y+e,d.x,d.y);break;case "bottom":g.quadraticCurveTo(f.x,f.y-e,d.x,d.y)}g.stroke()}},"quadratic:end":{render:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,f=d._depth<e._depth,h=this.viz.geom.getEdge(f?d:e,"begin",b),d=this.viz.geom.getEdge(f?e:d,
"end",b),e=a.getData("dim"),f=c.getCtx();f.beginPath();f.moveTo(h.x,h.y);switch(b){case "left":f.quadraticCurveTo(d.x-e,d.y,d.x,d.y);break;case "right":f.quadraticCurveTo(d.x+e,d.y,d.x,d.y);break;case "top":f.quadraticCurveTo(d.x,d.y-e,d.x,d.y);break;case "bottom":f.quadraticCurveTo(d.x,d.y+e,d.x,d.y)}f.stroke()}},bezier:{render:function(a,c){var b=this.getOrientation(a),d=a.nodeFrom,e=a.nodeTo,f=d._depth<e._depth,h=this.viz.geom.getEdge(f?d:e,"begin",b),d=this.viz.geom.getEdge(f?e:d,"end",b),e=a.getData("dim"),
f=c.getCtx();f.beginPath();f.moveTo(h.x,h.y);switch(b){case "left":f.bezierCurveTo(h.x+e,h.y,d.x-e,d.y,d.x,d.y);break;case "right":f.bezierCurveTo(h.x-e,h.y,d.x+e,d.y,d.x,d.y);break;case "top":f.bezierCurveTo(h.x,h.y+e,d.x,d.y-e,d.x,d.y);break;case "bottom":f.bezierCurveTo(h.x,h.y-e,d.x,d.y+e,d.x,d.y)}f.stroke()}}})})();