/* 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,b;for(b in $jit)$jit[b].$extend&&(a[b]=$jit[b])},$jit.version="2.0.1";var a=function(a){return document.getElementById(a)};a.empty=function(){},a.extend=function(a,b){for(var c in b||{})a[c]=b[c];return a},a.lambda=function(a){return typeof a=="function"?a:function(){return a}},a.time=Date.now||function(){return+(new Date)},a.splat=function(b){var c=a.type(b);return c?c!="array"?[b]:b:[]},a.type=function(b){var c=a.type.s.call(b).match(/^\[object\s(.*)\]$/)[1].toLowerCase();return c!="object"?c:b&&b.$$family?b.$$family:b&&b.nodeName&&b.nodeType==1?"element":c},a.type.s=Object.prototype.toString,a.each=function(b,c){if(a.type(b)=="object")for(var d in b)c(b[d],d);else{d=0;for(var e=b.length;d>16,a>>8&255,a&255]},a.destroy=function(b){a.clean(b),b.parentNode&&b.parentNode.removeChild(b),b.clearAttributes&&b.clearAttributes()},a.clean=function(b){for(var b=b.childNodes,c=0,d=b.length;c-1},a.addClass=function(b,c){a.hasClass(b,c)||(b.className=b.className+" "+c)},a.removeClass=function(a,b){a.className=a.className.replace(RegExp("(^|\\s)"+b+"(?:\\s|$)"),"$1")},a.getPos=function(a){var b=function(a){for(var b={x:0,y:0};a&&!/^(?:body|html)$/i.test(a.tagName);)b.x+=a.offsetLeft,b.y+=a.offsetTop,a=a.offsetParent;return b}(a),a=function(a){for(var b={x:0,y:0};a&&!/^(?:body|html)$/i.test(a.tagName);)b.x+=a.scrollLeft,b.y+=a.scrollTop,a=a.parentNode;return b}(a);return{x:b.x-a.x,y:b.y-a.y}},a.event={get:function(a,b){return a||(b||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,b){var b=b||window,a=a||b.event,c=b.document,c=c.documentElement||c.body;return a.touches&&a.touches.length&&(a=a.touches[0]),{x:a.pageX||a.clientX+c.scrollLeft,y:a.pageY||a.clientY+c.scrollTop}},stop:function(a){a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0,a.preventDefault?a.preventDefault():a.returnValue=!1}},$jit.util=$jit.id=a;var b=function(c){var c=c||{},d=function(){for(var c in this)typeof this[c]!="function"&&(this[c]=a.unlink(this[c]));return this.constructor=d,b.prototyping?this:(c=this.initialize?this.initialize.apply(this,arguments):this,this.$$family="class",c)},e;for(e in b.Mutators)c[e]&&(c=b.Mutators[e](c,c[e]),delete c[e]);return a.extend(d,this),d.constructor=b,d.prototype=c,d};b.Mutators={Implements:function(c,d){return a.each(a.splat(d),function(a){b.prototyping=a;var a=typeof a=="function"?new a:a,d;for(d in a)d in c||(c[d]=a[d]);delete b.prototyping}),c}},a.extend(b,{inherit:function(c,d){for(var e in d){var f=d[e],g=c[e],h=a.type(f);g&&h=="function"?f!=g&&b.override(c,e,f):c[e]=h=="object"?a.merge(g,f):f}return c},override:function(a,c,d){var e=b.prototyping;e&&a[c]!=e[c]&&(e=null),a[c]=function(){var b=this.parent;this.parent=e?e[c]:a[c];var f=d.apply(this,arguments);return this.parent=b,f}}}),b.prototype.implement=function(){var c=this.prototype;return a.each(Array.prototype.slice.call(arguments||[]),function(a){b.inherit(c,a)}),this},$jit.Class=b,$jit.json={prune:function(a,b){this.each(a,function(a,c){c==b&&a.children&&(delete a.children,a.children=[])})},getParent:function(a,b){if(a.id==b)return!1;var c=a.children;if(c&&c.length>0)for(var d=0;d=(7-4*c)/11){b=d*d-Math.pow((11-6*c-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(a,d){c[d]=b(a)}),a.each(["Quad","Cubic","Quart","Quint"],function(a,d){c[a]=b(function(a){return Math.pow(a,[d+2])})})})();var d=new b({initialize:function(a){this.setOptions(a)},setOptions:function(b){return this.opt=a.merge({duration:2500,fps:40,transition:c.Quart.easeInOut,compute:a.empty,complete:a.empty,link:"ignore"},b||{}),this},step:function(){var b=a.time(),c=this.opt;be.height?a.y-b.height-d:a.y+d)+"px",c.left=(a.x+b.width+f>e.width?a.x-b.width-f:a.x+f)+"px"},hide:function(a){this.tip.style.display="none",a&&this.config.onHide()}}),i.Classes.NodeStyles=new b({Implements:[f,g],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 d,this.move=this.down=!1},onMouseOut:function(a,b){this.down=this.move=!1;if(this.hoveredNode){this.dom&&this.isLabel(a,b,!0)&&this.toggleStylesOnHover(this.hoveredNode,!1);for(var c=a.relatedTarget,d=this.canvas.getElement();c&&c.parentNode;){if(d==c.parentNode)return;c=c.parentNode}this.toggleStylesOnHover(this.hoveredNode,!1),this.hoveredNode=!1}},onMouseOver:function(a,b){var c;this.dom&&(c=this.isLabel(a,b,!0))&&(c=this.viz.graph.getNode(c.id),!c.selected)&&(this.hoveredNode=c,this.toggleStylesOnHover(this.hoveredNode,!0))},onMouseDown:function(a,b,c,d){if(!d){var e;this.dom&&(e=this.isLabel(a,b))?this.down=this.viz.graph.getNode(e.id):this.dom||(this.down=c.getNode()),this.move=!1}},onMouseUp:function(a,b,c,d){d||(this.move||this.onClick(c.getNode()),this.down=this.move=!1)},getRestoredStyles:function(a,b){var c={},d=this["nodeStylesOn"+b],e;for(e in d)c[e]=a.styles["$"+e];return c},toggleStylesOnHover:function(a,b){this.nodeStylesOnHover&&this.toggleStylesOn("Hover",a,b)},toggleStylesOnClick:function(a,b){this.nodeStylesOnClick&&this.toggleStylesOn("Click",a,b)},toggleStylesOn:function(b,d,e){var f=this.viz;if(e){d.styles||(d.styles=a.merge(d.data,{}));for(var g in this["nodeStylesOn"+b])e="$"+g,e in d.styles||(d.styles[e]=d.getData(g));f.fx.nodeFx(a.extend({elements:{id:d.id,properties:this["nodeStylesOn"+b]},transition:c.Quart.easeOut,duration:300,fps:40},this.config))}else b=this.getRestoredStyles(d,b),f.fx.nodeFx(a.extend({elements:{id:d.id,properties:b},transition:c.Quart.easeOut,duration:300,fps:40},this.config))},onClick:function(a){if(a){var b=this.nodeStylesOnClick;b&&(a.selected?(this.toggleStylesOnClick(a,!1),delete a.selected):(this.viz.graph.eachNode(function(a){if(a.selected){for(var c in b)a.setData(c,a.styles["$"+c],"end");delete a.selected}}),this.toggleStylesOnClick(a,!0),a.selected=!0,delete a.hovered,this.hoveredNode=!1))}},onMouseMove:function(a,b,c){this.down&&(this.move=!0);if(!this.dom||!this.isLabel(a,b)){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,c.getPos()))return;c=c.getNode(),(this.hoveredNode||c)&&!c.hovered&&(c&&!c.selected?(this.fx.nodeFxAnimation.stopTimer(),this.viz.graph.eachNode(function(a){if(a.hovered&&!a.selected){for(var b in d)a.setData(b,a.styles["$"+b],"end");delete a.hovered}}),c.hovered=!0,this.hoveredNode=c,this.toggleStylesOnHover(c,!0)):this.hoveredNode&&!this.hoveredNode.selected&&(this.fx.nodeFxAnimation.stopTimer(),this.toggleStylesOnHover(this.hoveredNode,!1),delete this.hoveredNode.hovered,this.hoveredNode=!1))}}}}),i.Classes.Navigation=new b({Implements:[f,g],initializePost:function(){this.pressed=this.pos=!1},onMouseWheel:function(b,c,d){this.config.zooming&&(a.event.stop(a.event.get(b,c)),b=1+d*(this.config.zooming/1e3),this.canvas.scale(b,b))},onMouseDown:function(a,b,c){if(this.config.panning&&(this.config.panning!="avoid nodes"||(this.dom?!this.isLabel(a,b):!c.getNode()))){this.pressed=!0,this.pos=c.getPos();var a=this.canvas,b=a.translateOffsetX,c=a.translateOffsetY,d=a.scaleOffsetY;this.pos.x*=a.scaleOffsetX,this.pos.x+=b,this.pos.y*=d,this.pos.y+=c}},onMouseMove:function(a,b,c){if(this.config.panning&&this.pressed&&(this.config.panning!="avoid nodes"||(this.dom?!this.isLabel(a,b):!c.getNode()))){var a=this.pos,c=c.getPos(),d=this.canvas,e=d.translateOffsetX,f=d.translateOffsetY,b=d.scaleOffsetX,d=d.scaleOffsetY;c.x*=b,c.y*=d,c.x+=e,c.y+=f,e=c.x-a.x,a=c.y-a.y,this.pos=c,this.canvas.translate(e*1/b,a*1/d)}},onMouseUp:function(){this.config.panning&&(this.pressed=!1)}});var j;(function(){function c(b,c){var d=document.createElement(b),f;for(f in c)typeof c[f]=="object"?a.extend(d[f],c[f]):d[f]=c[f];return b=="canvas"&&!e&&G_vmlCanvasManager&&(d=G_vmlCanvasManager.initElement(document.body.appendChild(d))),d}var d=typeof HTMLCanvasElement,e=d=="object"||d=="function";$jit.Canvas=j=new b({canvases:[],pos:!1,element:!1,labelContainer:!1,translateOffsetX:0,translateOffsetY:0,scaleOffsetX:1,scaleOffsetY:1,initialize:function(b,d){this.viz=b,this.opt=this.config=d;var e=a.type(d.injectInto)=="string"?d.injectInto:d.injectInto.id,f=d.type,g=e+"-label",h=a(e),i=d.width||h.offsetWidth,k=d.height||h.offsetHeight;this.id=e;var l={injectInto:e,width:i,height:k};this.element=c("div",{id:e+"-canvaswidget",style:{position:"relative",width:i+"px",height:k+"px"}}),this.labelContainer=this.createLabelContainer(d.Label.type,g,l),this.canvases.push(new j.Base[f]({config:a.extend({idSuffix:"-canvas"},l),plot:function(){b.fx.plot()},resize:function(){b.refresh()}}));if(e=d.background)l=new j.Background[e.type](b,a.extend(e,l)),this.canvases.push(new j.Base[f](l));for(f=this.canvases.length;f--;)this.element.appendChild(this.canvases[f].canvas),f>0&&this.canvases[f].plot();this.element.appendChild(this.labelContainer),h.appendChild(this.element);var m=null,n=this;a.addEvent(window,"scroll",function(){clearTimeout(m),m=setTimeout(function(){n.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,b){this.getPos(!0),this.translateOffsetX=this.translateOffsetY=0,this.scaleOffsetX=this.scaleOffsetY=1;for(var c=0,d=this.canvases.length;cg?e(g+(f-d-g)*b):e(g-d+(f-g)*b):h>=c?f>g?e(g+(f-d-g)*b):e(g-d+(f-(g-d))*b):e(g+(f-g)*b),rho:(this.rho-a.rho)*b+a.rho}}},k.KER=new k(0,0);var l=function(a,b){this.x=a||0,this.y=b||0};$jit.Complex=l,l.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,b){this.x=a,this.y=b},setp:function(a,b){this.x=Math.cos(a)*b,this.y=Math.sin(a)*b},clone:function(){return new l(this.x,this.y)},toPolar:function(a){var b=this.norm(),c=Math.atan2(this.y,this.x);return c<0&&(c+=Math.PI*2),a?{theta:c,rho:b}:new k(c,b)},norm:function(){return Math.sqrt(this.squaredNorm())},squaredNorm:function(){return this.x*this.x+this.y*this.y},add:function(a){return new l(this.x+a.x,this.y+a.y)},prod:function(a){return new l(this.x*a.x-this.y*a.y,this.y*a.x+this.x*a.y)},conjugate:function(){return new l(this.x,-this.y)},scale:function(a){return new l(this.x*a,this.y*a)},equals:function(a){return this.x==a.x&&this.y==a.y},$add:function(a){return this.x+=a.x,this.y+=a.y,this},$prod:function(a){var b=this.x,c=this.y;return this.x=b*a.x-c*a.y,this.y=c*a.x+b*a.y,this},$conjugate:function(){return this.y=-this.y,this},$scale:function(a){return this.x*=a,this.y*=a,this},$div:function(a){var b=this.x,c=this.y,d=a.squaredNorm();return this.x=b*a.x+c*a.y,this.y=c*a.x-b*a.y,this.$scale(1/d)},isZero:function(){var a=Math.abs;return a(this.x)<1e-4&&a(this.y)<1e-4}},l.KER=new l(0,0),$jit.Graph=new b({initialize:function(b,c,d,e){var f={klass:l,Node:{}};this.Node=c,this.Edge=d,this.Label=e,this.opt=a.merge(f,b||{}),this.nodes={},this.edges={};var g=this;this.nodeList={};for(var h in n)g.nodeList[h]=function(a){return function(){var b=Array.prototype.slice.call(arguments);g.eachNode(function(c){c[a].apply(c,b)})}}(h)},getNode:function(a){return this.hasNode(a)?this.nodes[a]:!1},get:function(a){return this.getNode(a)},getByName:function(a){for(var b in this.nodes){var c=this.nodes[b];if(c.name==a)return c}return!1},getAdjacence:function(a,b){return a in this.edges?this.edges[a][b]:!1},addNode:function(b){if(!this.nodes[b.id]){var c=this.edges[b.id]={};this.nodes[b.id]=new m.Node(a.extend({id:b.id,name:b.name,data:a.merge(b.data||{},{}),adjacencies:c},this.opt.Node),this.opt.klass,this.Node,this.Edge,this.Label)}return this.nodes[b.id]},addAdjacence:function(a,b,c){this.hasNode(a.id)||this.addNode(a),this.hasNode(b.id)||this.addNode(b),a=this.nodes[a.id],b=this.nodes[b.id];if(!a.adjacentTo(b)){var d=this.edges[a.id]=this.edges[a.id]||{},e=this.edges[b.id]=this.edges[b.id]||{};return d[b.id]=e[a.id]=new m.Adjacence(a,b,c,this.Edge,this.Label),d[b.id]}return this.edges[a.id][b.id]},removeNode:function(a){if(this.hasNode(a)){delete this.nodes[a];var b=this.edges[a],c;for(c in b)delete this.edges[c][a];delete this.edges[a]}},removeAdjacence:function(a,b){delete this.edges[a][b],delete this.edges[b][a]},hasNode:function(a){return a in this.nodes},empty:function(){this.nodes={},this.edges={}}});var m=$jit.Graph,n;(function(){var b=function(a,b,c,d,e){var f,c=c||"current";return c=="current"?f=this.data:c=="start"?f=this.startData:c=="end"&&(f=this.endData),a="$"+(a?a+"-":"")+b,d?f[a]:this.Config.overridable?a in f?f[a]:a in this.data?this.data[a]:e[b]||0:e[b]||0},c=function(a,b,c,d){var d=d||"current",e;d=="current"?e=this.data:d=="start"?e=this.startData:d=="end"&&(e=this.endData),e["$"+(a?a+"-":"")+b]=c},d=function(b,c){var b="$"+(b?b+"-":""),d=this;a.each(c,function(a){a=b+a,delete d.data[a],delete d.endData[a],delete d.startData[a]})};n={getData:function(a,c,d){return b.call(this,"",a,c,d,this.Config)},setData:function(a,b,d){c.call(this,"",a,b,d)},setDataset:function(b,c){var b=a.splat(b),d;for(d in c)for(var e=0,f=a.splat(c[d]),g=b.length;e=b&&e<=c&&g(a)&&d(a,e),ee&&i(a,b,c)})})(a,b+f,c+f)},eachSubgraph:function(a,b,c){this.eachLevel(a,0,!1,b,c)},eachSubnode:function(a,b,c){this.eachLevel(a,1,1,b,c)},anySubnode:function(b,c,d){var e=!1,c=c||a.lambda(!0),f=a.type(c)=="string"?function(a){return a[c]}:c;return this.eachSubnode(b,function(a){f(a)&&(e=!0)},d),e},getSubnodes:function(b,c,d){var e=[],c=c||0,f;return a.type(c)=="array"?(f=c[0],c=c[1]):(f=c,c=Number.MAX_VALUE-b._depth),this.eachLevel(b,f,c,function(a){e.push(a)},d),e},getParents:function(a){var b=[];return this.eachAdjacency(a,function(c){c=c.nodeTo,c._depth-1?b.endData[d]=c[d]:b.data[d]=c[d]}else b.setData("alpha",1),b.setData("alpha",1,"start"),b.setData("alpha",0,"end"),b.ignore=!0}),e.graph.eachNode(function(a){a.ignore||a.eachAdjacency(function(a){if(!a.nodeFrom.ignore&&!a.nodeTo.ignore){var b=h.getNode(a.nodeFrom.id),a=h.getNode(a.nodeTo.id);b.adjacentTo(a)||(a=e.graph.getAdjacence(b.id,a.id),j=!0,a.setData("alpha",1),a.setData("alpha",1,"start"),a.setData("alpha",0,"end"))}})});var j=this.preprocessSum(h),b=j?["node-property:alpha","edge-property:alpha"]:["node-property:alpha"];b[0]+="node-property"in d?":"+a.splat(d["node-property"]).join(":"):"",b[1]=(b[1]||"edge-property:alpha")+("edge-property"in d?":"+a.splat(d["edge-property"]).join(":"):""),"label-property"in d&&b.push("label-property:"+a.splat(d["label-property"]).join(":")),e.reposition?e.reposition():e.compute("end"),e.graph.eachNode(function(a){a.id!=g&&a.pos.getp().equals(k.KER)&&(a.pos.set(a.endPos),a.startPos.set(a.endPos))}),e.fx.animate(a.merge(f,{modes:[d.position||"polar"].concat(b),onComplete:function(){e.graph.eachNode(function(a){a.ignore&&e.graph.removeNode(a.id)}),e.graph.eachNode(function(a){a.eachAdjacency(function(a){a.ignore&&e.graph.removeAdjacence(a.nodeFrom.id,a.nodeTo.id)})}),f.onComplete()}}))}},contract:function(b,c){var d=this.viz;!b.collapsed&&b.anySubnode(a.lambda(!0))&&(c=a.merge(this.options,d.config,c||{},{modes:["node-property:alpha:span","linear"]}),b.collapsed=!0,function e(a){a.eachSubnode(function(a){a.ignore=!0,a.setData("alpha",0,c.type=="animate"?"end":"current"),e(a)})}(b),c.type=="animate"?(d.compute("end"),d.rotated&&d.rotate(d.rotated,"none",{property:"end"}),function f(a){a.eachSubnode(function(a){a.setPos(b.getPos("end"),"end"),f(a)})}(b),d.fx.animate(c)):c.type=="replot"&&d.refresh())},expand:function(b,c){if("collapsed"in b){var d=this.viz,c=a.merge(this.options,d.config,c||{},{modes:["node-property:alpha:span","linear"]});delete b.collapsed,function e(a){a.eachSubnode(function(a){delete a.ignore,a.setData("alpha",1,c.type=="animate"?"end":"current"),e(a)})}(b),c.type=="animate"?(d.compute("end"),d.rotated&&d.rotate(d.rotated,"none",{property:"end"}),d.fx.animate(c)):c.type=="replot"&&d.refresh()}},preprocessSum:function(a){var b=this.viz;a.eachNode(function(a){b.graph.hasNode(a.id)||(b.graph.addNode(a),a=b.graph.getNode(a.id),a.setData("alpha",0),a.setData("alpha",0,"start"),a.setData("alpha",1,"end"))});var c=!1;return a.eachNode(function(a){a.eachAdjacency(function(a){var d=b.graph.getNode(a.nodeFrom.id),e=b.graph.getNode(a.nodeTo.id);d.adjacentTo(e)||(a=b.graph.addAdjacence(d,e,a.data),d.startAlpha==d.endAlpha&&e.startAlpha==e.endAlpha&&(c=!0,a.setData("alpha",0),a.setData("alpha",0,"start"),a.setData("alpha",1,"end")))})}),c}};var o={none:{render:a.empty,contains:a.lambda(!1)},circle:{render:function(a,b,c,d){d=d.getCtx(),d.beginPath(),d.arc(b.x,b.y,c,0,Math.PI*2,!0),d.closePath(),d[a]()},contains:function(a,b,c){var d=a.x-b.x,a=a.y-b.y;return d*d+a*a<=c*c}},ellipse:{render:function(a,b,c,d,e){var e=e.getCtx(),f=1,g=1,h=1,i=1,j=0;c>d?(j=c/2,g=d/c,i=c/d):(j=d/2,f=c/d,h=d/c),e.save(),e.scale(f,g),e.beginPath(),e.arc(b.x*h,b.y*i,j,0,Math.PI*2,!0),e.closePath(),e[a](),e.restore()},contains:function(a,b,c,d){var e=0,f=1,g=1,h=0,i=0,e=0;return c>d?(e=c/2,g=d/c):(e=d/2,f=c/d),h=(a.x-b.x)*(1/f),i=(a.y-b.y)*(1/g),h*h+i*i<=e*e}},square:{render:function(a,b,c,d){d.getCtx()[a+"Rect"](b.x-c,b.y-c,2*c,2*c)},contains:function(a,b,c){return Math.abs(b.x-a.x)<=c&&Math.abs(b.y-a.y)<=c}},rectangle:{render:function(a,b,c,d,e){e.getCtx()[a+"Rect"](b.x-c/2,b.y-d/2,c,d)},contains:function(a,b,c,d){return Math.abs(b.x-a.x)<=c/2&&Math.abs(b.y-a.y)<=d/2}},triangle:{render:function(a,b,c,d){var d=d.getCtx(),e=b.x,f=b.y-c,g=e-c,b=b.y+c,c=e+c;d.beginPath(),d.moveTo(e,f),d.lineTo(g,b),d.lineTo(c,b),d.closePath(),d[a]()},contains:function(a,b,c){return o.circle.contains(a,b,c)}},star:{render:function(a,b,c,d){var d=d.getCtx(),e=Math.PI/5;d.save(),d.translate(b.x,b.y),d.beginPath(),d.moveTo(c,0);for(b=0;b<9;b++)d.rotate(e),b%2==0?d.lineTo(c/.525731*.200811,0):d.lineTo(c,0);d.closePath(),d[a](),d.restore()},contains:function(a,b,c){return o.circle.contains(a,b,c)}}},p={line:{render:function(a,b,c){c=c.getCtx(),c.beginPath(),c.moveTo(a.x,a.y),c.lineTo(b.x,b.y),c.stroke()},contains:function(a,b,c,d){var e=Math.min,f=Math.max,g=e(a.x,b.x),h=f(a.x,b.x),e=e(a.y,b.y),f=f(a.y,b.y);return c.x>=g&&c.x<=h&&c.y>=e&&c.y<=f?Math.abs(b.x-a.x)<=d?!0:Math.abs((b.y-a.y)/(b.x-a.x)*(c.x-a.x)+a.y-c.y)<=d:!1}},arrow:{render:function(a,b,c,d,e){e=e.getCtx(),d&&(d=a,a=b,b=d),d=new l(b.x-a.x,b.y-a.y),d.$scale(c/d.norm());var c=new l(b.x-d.x,b.y-d.y),f=new l(-d.y/2,d.x/2),d=c.add(f),c=c.$add(f.$scale(-1));e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(b.x,b.y),e.stroke(),e.beginPath(),e.moveTo(d.x,d.y),e.lineTo(c.x,c.y),e.lineTo(b.x,b.y),e.closePath(),e.fill()},contains:function(a,b,c,d){return p.line.contains(a,b,c,d)}},hyperline:{render:function(a,b,c,d){function e(a,b){return ab?!1:!0:b+Math.PI>a?!0:!1}var d=d.getCtx(),f=function(a,b){var c=a.x*b.y-a.y*b.x,d=a.squaredNorm(),e=b.squaredNorm();if(c==0)return{x:0,y:0,ratio:-1};var f=(a.y*e-b.y*d+a.y-b.y)/c,c=(b.x*d-a.x*e+b.x-a.x)/c,d=(f*f+c*c)/4-1;return d<0?{x:0,y:0,ratio:-1}:(d=Math.sqrt(d),{x:-f/2,y:-c/2,ratio:d>1e3?-1:d,a:f,b:c})}(a,b);f.a>1e3||f.b>1e3||f.ratio<0?(d.beginPath(),d.moveTo(a.x*c,a.y*c),d.lineTo(b.x*c,b.y*c)):(b=Math.atan2(b.y-f.y,b.x-f.x),a=Math.atan2(a.y-f.y,a.x-f.x),e=e(b,a),d.beginPath(),d.arc(f.x*c,f.y*c,f.ratio*c,b,a,e)),d.stroke()},contains:a.lambda(!1)}};m.Plot={initialize:function(a,b){this.viz=a,this.config=a.config,this.node=a.config.Node,this.edge=a.config.Edge,this.animation=new d,this.nodeTypes=new b.Plot.NodeTypes,this.edgeTypes=new b.Plot.EdgeTypes,this.labels=a.labels},nodeHelper:o,edgeHelper:p,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,b,c){return a+(b-a)*c},moebius:function(a,b,c,d){b=d.scale(-c);if(b.norm()<1){var c=b.x,d=b.y,e=a.startPos.getc().moebiusTransformation(b);a.pos.setc(e.x,e.y),b.x=c,b.y=d}},linear:function(a,b,c){var b=a.startPos.getc(!0),d=a.endPos.getc(!0);a.pos.setc(this.compute(b.x,d.x,c),this.compute(b.y,d.y,c))},polar:function(a,b,c){b=a.startPos.getp(!0),c=a.endPos.getp().interpolate(b,c),a.pos.setp(c.theta,c.rho)},number:function(a,b,c,d,e){var f=a[d](b,"start"),d=a[d](b,"end");a[e](b,this.compute(f,d,c))},color:function(b,c,d,e,f){var g=a.hexToRgb(b[e](c,"start")),e=a.hexToRgb(b[e](c,"end")),h=this.compute,d=a.rgbToHex([parseInt(h(g[0],e[0],d)),parseInt(h(g[1],e[1],d)),parseInt(h(g[2],e[2],d))]);b[f](c,d)},"array-number":function(a,b,c,d,e){for(var f=a[d](b,"start"),d=a[d](b,"end"),g=[],h=0,i=f.length;h=.95?f.labels.plotLabel(e,c,a):f.labels.hideLabel(c,!1)),c.visited=!g})}},plotTree:function(a,b,c){var d=this,e=this.viz.canvas;e.getCtx();var f=a.getData("alpha");a.eachSubnode(function(f){if(b.plotSubtree(a,f)&&f.exist&&f.drawn){var g=a.getAdjacency(f.id);!c&&b.onBeforePlotLine(g),d.plotLine(g,e,c),!c&&b.onAfterPlotLine(g),d.plotTree(f,b,c)}}),a.drawn?(!c&&b.onBeforePlotNode(a),this.plotNode(a,e,c),!c&&b.onAfterPlotNode(a),!b.hideLabels&&b.withLabels&&f>=.95?this.labels.plotLabel(e,a,b):this.labels.hideLabel(a,!1)):this.labels.hideLabel(a,!0)},plotNode:function(a,b,c){var d=a.getData("type"),e=this.node.CanvasStyles;if(d!="none"){var f=a.getData("lineWidth"),g=a.getData("color"),h=a.getData("alpha"),i=b.getCtx();i.save(),i.lineWidth=f,i.fillStyle=i.strokeStyle=g,i.globalAlpha=h;for(var j in e)i[j]=a.getCanvasStyle(j);this.nodeTypes[d].render.call(this,a,b,c),i.restore()}},plotLine:function(a,b,c){var d=a.getData("type"),e=this.edge.CanvasStyles;if(d!="none"){var f=a.getData("lineWidth"),g=a.getData("color"),h=b.getCtx(),i=a.nodeFrom,j=a.nodeTo;h.save(),h.lineWidth=f,h.fillStyle=h.strokeStyle=g,h.globalAlpha=Math.min(i.getData("alpha"),j.getData("alpha"),a.getData("alpha"));for(var k in e)h[k]=a.getCanvasStyle(k);this.edgeTypes[d].render.call(this,a,b,c),h.restore()}}},m.Plot3D=a.merge(m.Plot,{Interpolator:{linear:function(a,b,c){var b=a.startPos.getc(!0),d=a.endPos.getc(!0);a.pos.setc(this.compute(b.x,d.x,c),this.compute(b.y,d.y,c),this.compute(b.z,d.z,c))}},plotNode:function(a,b){a.getData("type")!="none"&&this.plotElement(a,b,{getAlpha:function(){return a.getData("alpha")}})},plotLine:function(a,b){a.getData("type")!="none"&&this.plotElement(a,b,{getAlpha:function(){return Math.min(a.nodeFrom.getData("alpha"),a.nodeTo.getData("alpha"),a.getData("alpha"))}})},plotElement:function(b,c,d){var e=c.getCtx(),f=new Matrix4,g=c.config.Scene.Lighting,h=c.canvases[0],c=h.program,h=h.camera;b.geometry||(b.geometry=new(O3D[b.getData("type")])),b.geometry.update(b);if(!b.webGLVertexBuffer){for(var i=[],j=[],k=[],l=0,m=b.geometry,n=0,o=m.vertices,m=m.faces,p=m.length;n=c.width||a.x<0||a.y>=c.height||a.y<0?!1:!0}}),m.Label.HTML=new b({Implements:m.Label.DOM,plotLabel:function(a,b,c){var a=b.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",c.onCreateLabel(d,b),e.appendChild(d),this.labels[b.id]=d}this.placeLabel(d,b,c)}}),m.Label.SVG=new b({Implements:m.Label.DOM,plotLabel:function(a,b,c){var a=b.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),c.onCreateLabel(d,b),this.labels[b.id]=d}this.placeLabel(d,b,c)}});var f=$jit.Layouts={},q={label:null,compute:function(b,c,d){this.initializeLabel(d);var e=this.label,f=e.style;b.eachNode(function(b){var c=b.getData("autoWidth"),d=b.getData("autoHeight");if(c||d){delete b.data.$width,delete b.data.$height,delete b.data.$dim;var g=b.getData("width"),h=b.getData("height");f.width=c?"auto":g+"px",f.height=d?"auto":h+"px",e.innerHTML=b.name,c=e.offsetWidth,d=e.offsetHeight,g=b.getData("type"),a.indexOf(["circle","square","triangle","star"],g)===-1?(b.setData("width",c),b.setData("height",d)):(c=c>d?c:d,b.setData("width",c),b.setData("height",c),b.setData("dim",c))}})},initializeLabel:function(a){this.label||(this.label=document.createElement("div"),document.body.appendChild(this.label)),this.setLabelStyles(a)},setLabelStyles:function(){a.extend(this.label.style,{visibility:"hidden",position:"absolute",width:"auto",height:"auto"}),this.label.className="jit-autoadjust-label"}};f.Radial=new b({compute:function(b){b=a.splat(b||["current","start","end"]),q.compute(this.graph,b,this.config),this.graph.computeLevels(this.root,0,"ignore");var c=this.createLevelDistanceFunc();this.computeAngularWidths(b),this.computePositions(b,c)},computePositions:function(a,b){for(var c=this.graph,d=c.getNode(this.root),e=this.parent,f=0,g=a.length;fj[e]?f:j[e]:f}i.push(b)},"ignore"),e&&e.id==c.id&&i.length>0&&i[0].dist&&i.sort(function(a,b){return(a.dist>=b.dist)-(a.dist<=b.dist)});for(var c=0,l=i.length;c0?a[0]:!1)b=a.pos.getc(),c=c.pos.getc(),b=b.add(c.scale(-1)),b=Math.atan2(b.y,b.x),b<0&&(b+=2*Math.PI);return{parent:a,theta:b}},tagChildren:function(a,b){if(a.angleSpan){var c=[];a.eachAdjacency(function(a){c.push(a.nodeTo)},"ignore");for(var d=c.length,e=0;e1&&f[0]!=a.nodeFrom.id,b)},contains:function(a,b){var c=a.nodeFrom.pos.getc(!0),d=a.nodeTo.pos.getc(!0);return this.edgeHelper.arrow.contains(c,d,b,this.edge.epsilon)}}})}($jit.RGraph)})()