diff --git a/build/bubbletree.js b/build/bubbletree.js index e5d52e7..38859e8 100644 --- a/build/bubbletree.js +++ b/build/bubbletree.js @@ -178,7 +178,7 @@ var BubbleTree = function(config, onHover, onUnHover) { else node.color = '#999999'; } // lighten up the color if there are no children - if (node.children.length < 2 && node.color) { + if (node.children.length < 1 && node.color) { node.color = vis4color.fromHex(node.color).saturation('*.86').x; } @@ -453,7 +453,7 @@ var BubbleTree = function(config, onHover, onUnHover) { for (i in me.displayObjects) me.displayObjects[i].hideFlag = true; - if (node == root || node.parent == root && node.children.length < 2) { + if (node == root || node.parent == root && node.children.length < 1) { t.$(me).bubbleScale = 1.0; @@ -489,7 +489,7 @@ var BubbleTree = function(config, onHover, onUnHover) { var origNode = node; // save the reference of the node.. - if (node.children.length < 2) { // ..because if it has no children.. + if (node.children.length < 1) { // ..because if it has no children.. node = node.parent; // ..we center on its parent } diff --git a/build/bubbletree.min.js b/build/bubbletree.min.js index bbc8875..5dc6c6c 100644 --- a/build/bubbletree.min.js +++ b/build/bubbletree.min.js @@ -1,7 +1,2 @@ -/*! - * BubbleTree 2.0.1 - * - * Copyright (c) 2011 Gregor Aisch (http://driven-by-data.net) - * Licensed under the MIT license - * - *//*jshint undef: true, browser:true, jquery: true, devel: true, smarttabs: true *//*global Raphael, TWEEN, vis4, vis4color, vis4loader */var BubbleTree=function(a,b,c){var d=this;d.version="2.0.2",d.$container=$(a.container),d.config=$.extend({rootPath:"",minRadiusLabels:40,minRadiusAmounts:20,minRadiusHideLabels:0,cutLabelsAt:50},a),d.tooltip=a.tooltipCallback?a.tooltipCallback:function(){},a.tooltip&&(d.tooltip=a.tooltip),d.style=a.bubbleStyles,d.ns=BubbleTree,d.nodesByUrlToken={},d.nodeList=[],d.iconsByUrlToken={},d.globalNodeCounter=0,d.displayObjects=[],d.bubbleScale=1,d.globRotation=0,d.currentYear=a.initYear,d.currentCenter=undefined,d.currentTransition=undefined,d.baseUrl="",d.loadData=function(a){$.ajax({url:a,dataType:"json",success:this.setData.bind(this)})},d.setData=function(a){var b=this;a||(a=b.config.data),b.initData(a),b.initPaper(),b.initBubbles(),b.initTween(),b.initHistory()},d.initData=function(a){var b=this;a.level=0,b.preprocessData(a),b.traverse(a,0),b.treeRoot=a},d.preprocessData=function(a){var b=this,c=b.config.maxNodesPerLevel;if(c&&c0?a.color=a.parent.color:a.color="#999999"),a.children.length<2&&a.color&&(a.color=vis4color.fromHex(a.color).saturation("*.86").x),a.level>0&&(e=a.parent.children,e.length>1&&(a.left=e[(b-1+e.length)%e.length],a.right=e[(Number(b)+1)%e.length],a.right==a.left&&(a.right=undefined))),a.label!==undefined&&a.label!==""?g=a.label:a.token!==undefined&&a.token!==""?g=a.token:g=""+f.globalNodeCounter,f.globalNodeCounter++,a.urlToken=g.toLowerCase().replace(/\W/g,"-");while(f.nodesByUrlToken.hasOwnProperty(a.urlToken))a.urlToken+="-";f.nodesByUrlToken[a.urlToken]=a,a.maxChildAmount=0,a.children=f.sortChildren(a.children,!0,f.config.sortBy),$.each(a.children,function(b,c){c.parent=a,a.maxChildAmount=Math.max(a.maxChildAmount,c.amount),f.traverse(c,b)}),a.breakdowns&&(a.breakdownsByName={},$.each(a.breakdowns,function(b,c){c.famount=f.ns.Utils.formatNumber(c.amount),c.name&&(a.breakdownsByName[c.name]=c)}))},d.sortChildren=function(a,b,c){var e=[],f=!0;c=="label"?(c=d.compareLabels,b=!1):c=d.compareAmounts,a.sort(c);if(b){while(a.length>0)e.push(f?a.pop():a.shift()),f=!f;return e}return a},d.compareAmounts=function(a,b){return a.amount>b.amount?1:a.amount==b.amount?0:-1},d.compareLabels=function(a,b){return a.label>b.label?1:a.label==b.label?0:-1},d.initPaper=function(){var a=this,b=a.$container,c=a.treeRoot,d=b.width(),e=b.height(),f=Raphael(b[0],d,e),g=Math.min(d,e)*.5-40,h,i=a.ns.Vector,j=new i(d*.5,e*.5);a.width=d,a.height=e,a.paper=f,h=Math.pow((Math.pow(c.amount,.6)+Math.pow(c.maxChildAmount,.6)*2)/g,1.6666666667),a.a2radBase=a.ns.a2radBase=h,a.origin=j,$(window).resize(a.onResize.bind(a))},d.onResize=function(){var a=this,b=a.$container,c=b.width(),d=b.height(),e=Math.min(c,d)*.5-40,f,g=a.treeRoot,h,i;a.paper.setSize(c,d),a.origin.x=c*.5,a.origin.y=d*.5,a.width=c,a.height=d,f=Math.pow((Math.pow(g.amount,.6)+Math.pow(g.maxChildAmount,.6)*2)/e,1.6666666667),a.a2radBase=a.ns.a2radBase=f,$.each(a.displayObjects,function(b,c){c.className=="bubble"&&(c.bubbleRad=a.ns.Utils.amount2rad(c.node.amount))}),a.currentCenter&&a.changeView(a.currentCenter.urlToken)},d.initTween=function(){this.tweenTimer=setInterval(this.loop,1e3/120)},d.initBubbles=function(){var a=this,b=a.treeRoot,c,d=!1,e=a.ns.Bubbles,f;a.bubbleClasses=[],a.config.hasOwnProperty("bubbleType")||(a.config.bubbleType=["plain"]),$.isArray(a.config.bubbleType)||(a.config.bubbleType=[a.config.bubbleType]),$.isArray(a.config.bubbleType)&&$.each(a.config.bubbleType,function(b){a.config.bubbleType[b]=="icon"&&(d=!0),a.bubbleClasses.push(a.getBubbleType(a.config.bubbleType[b]))});var g=a.createBubble(b,a.origin,0,0,b.color);a.traverseBubbles(g)},d.getBubbleType=function(a){var b=this,c=b.ns.Bubbles;switch(a){case"pie":return c.Pies;case"donut":return c.Donut;case"multi":return c.Multi;case"icon":return c.Icon;default:return c.Plain}},d.traverseBubbles=function(a){var b=this,c,d=b.ns.Utils.amount2rad,e,f,g,h,i=0,j=0,k,l,m=Math.PI*2;g=a.node.children,$.each(g,function(a,b){i+=d(b.amount)}),g.length>0&&(c=b.createRing(a.node,a.pos,0,{stroke:"#888","stroke-dasharray":"-"})),$.each(g,function(c,e){k=d(e.amount)/i*m,l=j+k*.5,isNaN(l)&&vis4.log(j,k,e.amount,i,m),e.centerAngle=l,h=b.createBubble(e,a.pos,0,l,e.color),j+=k,b.traverseBubbles(h)})},d.createBubble=function(a,b,c,d,e){var f=this,g=f.ns,h,i,j,k=a.level;isNaN(k)&&(k=0),k=Math.min(k,f.bubbleClasses.length-1),j=new f.bubbleClasses[k](a,f,b,c,d,e),f.displayObjects.push(j);return j},d.createRing=function(a,b,c,d){var e=this,f=e.ns,g;g=new f.Ring(a,e,b,c,d),e.displayObjects.push(g);return g},d.changeView=function(a){var b=this,c=b.paper,d=Math.min(b.width,b.height)*.35,e=b.ns,f=e.Utils,g=b.origin,h={stroke:"#ccc","stroke-dasharray":"- "},i={stroke:"#ccc","stroke-dasharray":". "},j=f.amount2rad,k=b.treeRoot,l=b.nodesByUrlToken,m=l.hasOwnProperty(a)?l[a]:null,n=new e.Layout,o,p,q,r=Math.PI*2,s=b.getBubble.bind(b),t=b.getRing.bind(b),u=b.unifyAngle;if(m!==null){var v,w,x,y,z,A,B,C,D,E,F,G,H,I=!1,J=!1;for(q in b.displayObjects)b.displayObjects[q].hideFlag=!0;if(m==k||m.parent==k&&m.children.length<2){n.$(b).bubbleScale=1,n.$(g).x=b.width*.5,n.$(g).y=b.height*.5,v=s(k),m!=k&&(v.childRotation=-m.centerAngle),A=j(k.amount)+j(k.maxChildAmount)+20,F=t(k),n.$(F).rad=A;for(q in k.children)z=k.children[q],o=s(z),n.$(o).angle=u(z.centerAngle+v.childRotation),n.$(o).rad=A}else{var K=m;m.children.length<2&&(m=m.parent),G=d/(j(m.amount)+j(m.maxChildAmount)*2),n.$(b).bubbleScale=G,v=s(m),b.currentCenter&&b.currentCenter==m.left?J=!0:b.currentCenter&&b.currentCenter==m.right&&(I=!0);var L=b.shortestAngleTo;n.$(v).angle=L(v.angle,0),A=(j(m.amount)+j(m.maxChildAmount))*G+20,F=t(m),n.$(F).rad=A,w=s(m.parent),w.childRotation=-m.centerAngle;var M=w;while(M&&M.node.parent)M=s(M.node.parent,!0),n.$(M).rad=0;n.$(w).rad=0;var N=b.width*.5;B=0-Math.max(N*.8-G*(j(m.parent.amount)+j(Math.max(m.amount*1.15+m.maxChildAmount*1.15,m.left.amount*.85,m.right.amount*.85))),G*j(m.parent.amount)*-1+N*.15)+N;if(m.left&&m.right)var O=G*j(Math.max(m.left.amount,m.right.amount));H=A+B,n.$(g).x=b.width*.5-B-(m!=K?A*.35:0),n.$(g).y=b.height*.5,new vis4.DelayedTask(1500,vis4,vis4.log,g,w.pos),B+=b.width*.1,F=t(m.parent),n.$(F).rad=B,n.$(v).rad=B;var P=0-(m!=K?K.centerAngle+v.childRotation:0);for(q in m.children)z=m.children[q],o=s(z),n.$(o).angle=b.shortestAngleTo(o.angle,z.centerAngle+v.childRotation+P),n.$(o).rad=A;var Q=b.height*.07;m.left&&(x=m.left,D=j(x.amount)*G,E=r-Math.asin((b.paper.height*.5+D-Q)/B),o=s(x),n.$(o).rad=B,n.$(o).angle=L(o.angle,E)),m.right&&(x=m.right,D=j(x.amount)*G,E=Math.asin((b.paper.height*.5+D-Q)/B),o=s(x),n.$(o).rad=B,n.$(o).angle=L(o.angle,E)),m=K}for(q in b.displayObjects){var R=b.displayObjects[q];R.hideFlag&&R.visible?(n.$(R).alpha=0,R.className=="bubble"&&R.node.level>1&&(n.$(R).rad=0),n.hide(R)):R.hideFlag||(n.$(R).alpha=1,R.visible||(R.alpha=0,n.show(R)))}p=new e.Transitioner($.browser.msie||b.currentCenter==m?0:1e3),p.changeLayout(n),b.currentTransition=p,!b.currentCenter&&$.isFunction(b.config.firstNodeCallback)&&b.config.firstNodeCallback(m),b.currentCenter=m}else f.log("node "+a+" not found")},d.unifyAngle=function(a){var b=Math.PI,c=b*2;while(a>=c)a-=c;while(a<0)a+=c;return a},d.shortestAngle=function(a,b){var c=function(a){return Math.round(a/Math.PI*180)+""},e=Math.PI,f=e*2,g=d.unifyAngle;a=g(a),b=g(b);var h=b-a;h>e&&(h-=f),h<-e&&(h+=f);return h},d.shortestAngleTo=function(a,b){return a+d.shortestAngle(a,b)},d.shortestLeftTurn=function(a,b){var c=d.shortestAngle(a,b);c>0&&(c=c-Math.PI*2);return a+c},d.shortestRightTurn=function(a,b){var c=d.shortestAngle(a,b);c<0&&(c=Math.PI*2+c);return a+c},d.getBubble=function(a,b){return this.getDisplayObject("bubble",a,b)},d.getRing=function(a){return this.getDisplayObject("ring",a)},d.getDisplayObject=function(a,b,c){var d=this,e,f;for(e in d.displayObjects){f=d.displayObjects[e];if(f.className!=a)continue;if(f.node==b){c||(f.hideFlag=!1);return f}}vis4.log(a+" not found for node",b)},d.initHistory=function(){$.history.init(d.urlChanged.bind(d),{unescape:",/"})},d.freshUrl="",d.urlChanged=function(a){var b=this,c=b.currentTransition;b.freshUrl||a.indexOf("/~/")&&(b.baseUrl=a.substr(0,a.indexOf("/~/"))),b.freshUrl=a,c&&c.running?(vis4.log("transition is running at the moment, adding listener"),c.onComplete(b.changeUrl.bind(b))):b.changeUrl()},d.changeUrl=function(){var a=this,b=a.freshUrl.split("/"),c=b[b.length-1],d;a.freshUrl===""&&a.navigateTo(a.treeRoot),a.nodesByUrlToken.hasOwnProperty(c)?(d=a.getUrlForNode(a.nodesByUrlToken[c]),a.freshUrl!=d?$.history.load(d):a.navigateTo(a.nodesByUrlToken[c],!0)):a.navigateTo(a.treeRoot)},d.navigateTo=function(a,b){var c=this;b?c.changeView(a.urlToken):$.history.load(c.getUrlForNode(a)),$(".label, .label2",c.$container).removeClass("current"),$(".label2."+a.id,c.$container).addClass("current"),$(".label."+a.id,c.$container).addClass("current")},d.getUrlForNode=function(a){var b=[];b.push(a.urlToken);while(a.parent)b.push(a.parent.urlToken),a=a.parent;b.reverse();return d.baseUrl+"/~/"+b.join("/")},d.onNodeClick=function(a){$.isFunction(d.config.nodeClickCallback)&&d.config.nodeClickCallback(a)},d.clean=function(){var a=this,b;$(".label").remove()},this.loop=function(){TWEEN.update()};if(!d.config.hasOwnProperty("data"))throw new Error("no data");typeof d.config.data=="string"?d.loadData():new vis4.DelayedTask(1e3,d,d.setData,d.config.data)};BubbleTree.Styles={},BubbleTree.Layout=function(){var a=this;a.objects=[],a.props=[],a.toHide=[],a.toShow=[],a.$=function(a){var b=this,c,d,e;for(c in b.objects){d=b.objects[c];if(d==a)return b.props[c]}b.objects.push(a),e={},b.props.push(e);return e},a.show=function(a){var b=this;b.toShow.push(a)},a.hide=function(a){var b=this;b.toHide.push(a)}},BubbleTree.Line=function(a,b,c,d,e,f){this.bc=a,this.o=c,this.angle=d,this.fromRad=e,this.attr=b,this.toRad=f,this.getXY=function(){this.x1=this.o.x+Math.cos(this.angle)*this.fromRad,this.y1=this.o.y-Math.sin(this.angle)*this.fromRad,this.x2=this.o.x+Math.cos(this.angle)*this.toRad,this.y2=this.o.y-Math.sin(this.angle)*this.toRad},this.init=function(){this.getXY(),console.log("foo","M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2,b),this.path=this.bc.paper.path("M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2).attr(this.attr)},this.draw=function(){this.getXY(),this.path.attr({path:"M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2})},this.init()},BubbleTree.Loader=function(a){var b=this;b.config=a,b.ns=BubbleTree,b.loadData=function(){var a=this,b=a.config.data;console.log("loading url ",b),$.ajax({url:b,context:a,dataType:"json",success:function(a){this.run(a)}})},b.run=function(a){var b=this,c=new BubbleTree(b.config);c.setData(a),b.config.instance=c},!!b.config.hasOwnProperty("data"),typeof b.config.data=="string"?b.loadData():b.run(b.config.data)},BubbleTree.MouseEventGroup=function(a,b){var c=this;c.target=a,c.members=b,c.click=function(a){var b=this,c=b.members,d,e;b.clickCallback=a;for(d in c)e=c[d],$(e).click(b.handleClick.bind(b))},c.handleClick=function(a){var b=this;b.clickCallback({target:b.target,origEvent:a,mouseEventGroup:b})},c.hover=function(a){var b=this,c=b.members,d,e;b.hoverCallback=a;for(d in c)e=c[d],$(e).hover(b.handleMemberHover.bind(b),b.handleMemberUnHover.bind(b))},c.unhover=function(a){var b=this;b.unhoverCallback=a},c.wasHovering=!1,c.mouseIsOver=!1,c.handleMemberHover=function(a){var b=this;new vis4.DelayedTask(25,b,b.handleMemberHoverDelayed,a)},c.handleMemberHoverDelayed=function(a){var b=this;b.mouseIsOver=!0,b.wasHovering||(b.wasHovering=!0,$.isFunction(b.hoverCallback)&&b.hoverCallback({target:b.target,origEvent:a,mouseEventGroup:b}))},c.handleMemberUnHover=function(a){var b=this;b.mouseIsOver=!1,new vis4.DelayedTask(40,b,b.handleMemberUnHoverDelayed,a)},c.handleMemberUnHoverDelayed=function(a){var b=this;b.mouseIsOver||(b.wasHovering=!1,$.isFunction(b.unhoverCallback)&&b.unhoverCallback({target:b.target,origEvent:a,mouseEventGroup:b}))},c.addMember=function(a){var b=this;b.hoverCallback&&$(a).hover(b.handleMemberHover.bind(b),b.handleMemberUnHover.bind(b)),b.members.push(a)},c.removeMember=function(a){var b=this,c=b.members,d,e=[];b.clickCallback&&$(a).unbind("click"),b.hoverCallback&&$(a).unbind("mouseenter mouseleave");for(d in c)c[d]!=a&&e.push(c[d]);b.members=e}},BubbleTree.Ring=function(a,b,c,d,e){var f=this;f.className="ring",f.rad=d,f.bc=b,f.attr=e,f.origin=c,f.alpha=1,f.visible=!1,f.node=a,f.init=function(){},f.draw=function(){var a=this,b=a.origin;!a.visible||a.circle.attr({cx:b.x,cy:b.y,r:a.rad,"stroke-opacity":a.alpha})},f.hide=function(){var a=this;a.circle.remove(),a.visible=!1},f.show=function(){var a=this;a.circle=a.bc.paper.circle(c.x,c.y,a.rad).attr(a.attr),a.visible=!0,a.circle.toBack()},f.init()},BubbleTree.Transitioner=function(a){var b=this;b.duration=a,b.running=!1,b.completeCallbacks=[],b.changeLayout=function(a){var b,c,d,e,f=this;f.running=!0,f.layout=a;for(b in a.toShow)c=a.toShow[b],$.isFunction(c.show)&&c.show();for(b in a.objects){c=a.objects[b];if(c===undefined||c===null)continue;d=a.props[b];if(f.duration>0){var g=new TWEEN.Tween(c),h={};for(e in d)h[e]=d[e];g.to(h,f.duration),g.easing(TWEEN.Easing.Exponential.EaseOut),$.isFunction(c.draw)&&g.onUpdate(c.draw.bind(c)),b==a.objects.length-1&&g.onComplete(f._completed.bind(f)),g.start()}else{for(e in d)c[e]=d[e];c&&$.isFunction(c.draw)&&c.draw()}}if(f.duration===0){for(b in a.objects)c=a.objects[b],c&&$.isFunction(c.draw)&&c.draw();f._completed()}},b.onComplete=function(a){var b=this;try{$.isFunction(a)&&b.completeCallbacks.push(a)}catch(c){}},b._completed=function(){var a=this,b=a.completeCallbacks,c,d;a.running=!1;for(c in a.layout.objects)d=a.layout.objects[c],d&&$.isFunction(d.draw)&&d.draw();for(c in a.layout.toHide)d=a.layout.toHide[c],d&&$.isFunction(d.hide)&&d.hide();for(c in b)b[c]()}},BubbleTree.Utils={},BubbleTree.Utils.log=function(){try{window.hasOwnProperty("console")&&console.log.apply(this,arguments)}catch(a){}},BubbleTree.Utils.amount2rad=function(a){return Math.pow(Math.max(0,a)/BubbleTree.a2radBase,.6)},BubbleTree.Utils.formatNumber=function(a){var b="";a<0&&(a=a*-1,b="-");return a>=1e12?b+Math.round(a/1e11)/10+"t":a>=1e9?b+Math.round(a/1e8)/10+"b":a>=1e6?b+Math.round(a/1e5)/10+"m":a>=1e3?b+Math.round(a/100)/10+"k":b+a},BubbleTree.Vector=function(a,b){var c=this;c.x=a,c.y=b,c.length=function(){var a=this;return Math.sqrt(a.x*a.x+a.y*a.y)},c.normalize=function(a){var b=this,c=b.length();a||(a=1),b.x*=a/c,b.y*=a/c},c.clone=function(){var a=this;return new BubbleTree.Vector(a.x,a.y)}},BubbleTree.Bubbles=BubbleTree.Bubbles||{},BubbleTree.Bubbles.Plain=function(a,b,c,d,e,f){var g=BubbleTree,h=g.Utils,i=this;i.className="bubble",i.node=a,i.paper=b.paper,i.origin=c,i.bc=b,i.rad=d,i.angle=e,i.color=f,i.alpha=1,i.visible=!1,i.ns=g,i.pos=g.Vector(0,0),i.bubbleRad=h.amount2rad(this.node.amount),i.container=i.bc.$container,i.childRotation=0,i.getXY=function(){var a=this,b=a.origin,c=a.angle,d=a.rad;a.pos===undefined&&(a.pos=new a.ns.Vector(0,0)),a.pos.x=b.x+Math.cos(c)*d,a.pos.y=b.y-Math.sin(c)*d},i.init=function(){var a=this;a.getXY();var b=!1;a.node.shortLabel||(a.node.shortLabel=a.node.label.length>a.bc.config.cutLabelsAt+3?a.node.label.substr(0,a.bc.config.cutLabelsAt)+"...":a.node.label),a.initialized=!0},i.onclick=function(a){var b=this;b.bc.onNodeClick(b.node),b.bc.navigateTo(b.node)},i.onhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.target=b,a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},a.type="SHOW",b.bc.tooltip(a)},i.onunhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.type="HIDE",a.target=b,a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},b.bc.tooltip(a)},i.draw=function(){var a=this,b=Math.max(5,a.bubbleRad*a.bc.bubbleScale),c=a.pos.x,d=a.pos.y,e=a.getXY(),f=a.pos.x,g=a.pos.y;if(!!a.visible){a.circle.attr({cx:a.pos.x,cy:a.pos.y,r:b,"fill-opacity":a.alpha}),a.node.children.length>1?a.dashedBorder.attr({cx:a.pos.x,cy:a.pos.y,r:b-4,"stroke-opacity":a.alpha*.9}):a.dashedBorder.attr({"stroke-opacity":0}),a.label.show(),a.label.find("*").show(),a.label2.show(),b>=a.bc.config.minRadiusLabels?a.label2.hide():b>=a.bc.config.minRadiusAmounts?a.label.find(".desc").hide():b>=a.bc.config.minRadiusHideLabels?a.label.hide():(a.label.hide(),a.label2.hide()),a.label.css({width:2*b+"px",opacity:a.alpha}),a.label.css({left:a.pos.x-b+"px",top:a.pos.y-a.label.height()*.5+"px"});var h=Math.max(70,3*b);a.label2.css({width:h+"px",opacity:a.alpha}),a.label2.css({left:f-h*.5+"px",top:g+b+"px"})}},i.hide=function(){var a=this,b;a.circle.remove(),a.dashedBorder.remove(),a.label.remove(),a.label2.remove(),a.visible=!1},i.show=function(){var a=this,b,c=a.pos.x,d=a.pos.y,e=Math.max(5,a.bubbleRad*a.bc.bubbleScale);a.circle=a.paper.circle(c,d,e).attr({stroke:!1,fill:a.color}),a.dashedBorder=a.paper.circle(c,d,e-3).attr({stroke:"#ffffff","stroke-dasharray":"- "}),a.label=$('
'+h.formatNumber(a.node.amount)+'
'+a.node.shortLabel+"
"),a.container.append(a.label),a.node.children.length>0&&($(a.circle.node).css({cursor:"pointer"}),$(a.label).css({cursor:"pointer"})),a.label2=$('
'+a.node.shortLabel+"
"),a.container.append(a.label2);var f=[a.circle.node,a.label,a.dashedBorder.node],g=new a.ns.MouseEventGroup(a,f);g.click(a.onclick.bind(a)),g.hover(a.onhover.bind(a)),g.unhover(a.onunhover.bind(a)),a.visible=!0},i.addOverlay=function(){var a=this;a.overlay=a.paper.circle(a.circle.attrs.cx,a.circle.attrs.cy,a.circle.attrs.r).attr({stroke:!1,fill:"#fff",opacity:0}),Raphael.svg&&a.overlay.node.setAttribute("class",a.node.id),$(a.overlay.node).css({cursor:"pointer"}),$(a.overlay.node).click(a.onclick.bind(a)),$(a.label).click(a.onclick.bind(a))},i.init()},BubbleTree.Bubbles=BubbleTree.Bubbles||{},BubbleTree.Bubbles.Donut=function(a,b,c,d,e,f){var g=BubbleTree,h=g.Utils,i=this;i.className="bubble",i.node=a,i.paper=b.paper,i.origin=c,i.bc=b,i.rad=d,i.angle=e,i.color=f,i.alpha=1,i.visible=!1,i.ns=g,i.bubbleRad=h.amount2rad(this.node.amount),i.childRotation=0,i.getXY=function(){var a=this,b=a.origin,c=a.angle,d=a.rad;a.pos.x=b.x+Math.cos(c)*d,a.pos.y=b.y-Math.sin(c)*d},i.init=function(){var a=this;a.pos=new a.ns.Vector(0,0),a.getXY();var b=[],c,d,e,f=[],g=a.bc.config.bubbleStyles;a.node.shortLabel||(a.node.shortLabel=a.node.label.length>50?a.node.label.substr(0,30)+"...":a.node.label),a.breakdownOpacities=[.2,.7,.45,.6,.35],a.breakdownColors=[!1,!1,!1,!1,!1,!1,!1,!1,!1,!1];for(d in a.node.breakdowns)c=a.node.breakdowns[d],c.famount=h.formatNumber(c.amount),e=c.amount/a.node.amount,b.push(e),f.push(c),g&&g.hasOwnProperty("name")&&g.name.hasOwnProperty(c.name)&&g.name[c.name].hasOwnProperty("opacity")&&(a.breakdownOpacities[f.length-1]=g.name[c.name].opacity),g&&g.hasOwnProperty("name")&&g.name.hasOwnProperty(c.name)&&g.name[c.name].hasOwnProperty("color")&&(a.breakdownColors[f.length-1]=g.name[c.name].color,a.breakdownOpacities[f.length-1]=1);a.node.breakdowns=f,a.breakdown=b;var i=!1;a.initialized=!0},i.onclick=function(a){var b=this;b.bc.navigateTo(b.node)},i.onhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.target=b,a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},a.type="SHOW",b.bc.tooltip(a)},i.onunhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.target=b,a.type="HIDE",a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},b.bc.tooltip(a)},this.draw=function(){var a=this,b=Math.max(5,a.bubbleRad*a.bc.bubbleScale),c=a.pos.x,d=a.pos.y,e=a.getXY(),f=b>20,g=a.pos.x,h=a.pos.y;if(!!a.visible){a.circle.attr({cx:g,cy:h,r:b,"fill-opacity":a.alpha}),a.node.children.length>1?a.dashedBorder.attr({cx:g,cy:h,r:b*.85,"stroke-opacity":a.alpha*.8}):a.dashedBorder.attr({"stroke-opacity":0});if(a.breakdown.length>1){var i,j,k,l,m,n,o,p,q,r=b*.85,s=-Math.PI*.5,t;for(i in a.breakdown){t=a.breakdown[i]*Math.PI*2,j=g+Math.cos(s)*r,n=h+Math.sin(s)*r,k=g+Math.cos(s+t)*r,o=h+Math.sin(s+t)*r,l=g+Math.cos(s+t)*b,p=h+Math.sin(s+t)*b,m=g+Math.cos(s)*b,q=h+Math.sin(s)*b,s+=t;var u="M"+j+" "+n+" A"+r+","+r+" 0 "+(t>Math.PI?"1,1":"0,1")+" "+k+","+o+" L"+l+" "+p+" A"+b+","+b+" 0 "+(t>Math.PI?"1,0":"0,0")+" "+m+" "+q+" Z";a.breakdownArcs[i].attr({path:u,"stroke-opacity":a.alpha*.2,"fill-opacity":a.breakdownOpacities[i]*a.alpha})}}f?(a.label.show(),b<40?(a.label.find(".desc").hide(),a.label2.show()):(a.label.find(".desc").show(),a.label2.hide())):(a.label.hide(),a.label2.show()),a.label.css({width:2*b*.9+"px",opacity:a.alpha}),a.label.css({left:a.pos.x-b*.9+"px",top:a.pos.y-a.label.height()*.53+"px"});var v=Math.max(80,3*b);a.label2.css({width:v+"px",opacity:a.alpha}),a.label2.css({left:g-v*.5+"px",top:h+b+"px"})}},this.hide=function(){var a=this,b;a.circle.remove(),a.dashedBorder.remove(),a.label.remove(),a.label2.remove(),a.visible=!1;for(b in a.breakdownArcs)a.breakdownArcs[b].remove()},i.show=function(){var a=this,b,c=Math.max(5,a.bubbleRad*a.bc.bubbleScale);a.circle=a.paper.circle(a.pos.x,a.pos.y,c).attr({stroke:!1,fill:a.color}),$.isFunction(a.bc.config.initTooltip)&&a.bc.config.initTooltip(a.node,a.circle.node),a.dashedBorder=a.paper.circle(a.pos.x,a.pos.y,c*.85).attr({stroke:"#fff","stroke-opacity":a.alpha*.4,"stroke-dasharray":". ",fill:!1}),a.label=$('
'+h.formatNumber(a.node.amount)+'
'+a.node.shortLabel+"
"),a.bc.$container.append(a.label),a.node.children.length>1&&($(a.circle.node).css({cursor:"pointer"}),$(a.label).css({cursor:"pointer"})),a.label2=$('
'+a.node.shortLabel+"
"),a.bc.$container.append(a.label2);var d=[a.circle.node,a.label];if(a.breakdown.length>1){a.breakdownArcs={};for(b in a.breakdown){var e=a.breakdownColors[b]?a.breakdownColors[b]:"#fff",f=a.paper.path("M 0 0 L 2 2").attr({fill:e,"fill-opacity":Math.random()*.4+.3,stroke:"#fff"});a.breakdownArcs[b]=f,$.isFunction(a.bc.config.initTooltip)&&a.bc.config.initTooltip(a.node.breakdowns[b],f.node)}for(b in a.breakdownArcs)$(a.breakdownArcs[b].node).click(a.onclick.bind(a))}var g=new a.ns.MouseEventGroup(a,d);g.click(a.onclick.bind(a)),g.hover(a.onhover.bind(a)),g.unhover(a.onunhover.bind(a)),a.visible=!0},i.arcHover=function(a){var b=this,c=b.bc.$container[0],d,e=b.breakdownArcs,f,g=b.node.breakdowns;for(d in e)if(e[d].node==a.target){a.node=g[d],a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.pageX-c.offsetLeft,y:a.pageY-c.offsetTop},a.target=b,a.type="SHOW",b.bc.tooltip(a);return}vis4.log("cant find the breakdown node")},i.arcUnhover=function(a){var b=this,c=b.bc.$container[0],d,e=b.breakdownArcs,f,g=b.node.breakdowns;for(d in e)if(e[d].node==a.target){a.node=g[d],a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.pageX-c.offsetLeft,y:a.pageY-c.offsetTop},a.type="HIDE",a.target=b,b.bc.tooltip(a);return}vis4.log("cant find the breakdown node")},i.init()},BubbleTree.Bubbles=BubbleTree.Bubbles||{},BubbleTree.Bubbles.Icon=function(a,b,c,d,e,f){var g=BubbleTree,h=g.Utils,i=this;i.className="bubble",i.node=a,i.paper=b.paper,i.origin=c,i.bc=b,i.rad=d,i.angle=e,i.color=f,i.alpha=1,i.visible=!1,i.ns=g,i.pos=g.Vector(0,0),i.bubbleRad=h.amount2rad(this.node.amount),i.iconLoaded=!1,i.childRotation=0,i.getXY=function(){var a=this,b=a.origin,c=a.angle,d=a.rad;a.pos===undefined&&(a.pos=new a.ns.Vector(0,0)),a.pos.x=b.x+Math.cos(c)*d,a.pos.y=b.y-Math.sin(c)*d},i.init=function(){var a=this;a.getXY(),a.hasIcon=a.node.hasOwnProperty("icon"),a.node.shortLabel||(a.node.shortLabel=a.node.label.length>50?a.node.label.substr(0,30)+"...":a.node.label),a.initialized=!0},i.show=function(){var a=this,b,c=a.pos.x,d,e=a.pos.y,f=Math.max(5,a.bubbleRad*a.bc.bubbleScale);a.circle=a.paper.circle(c,e,f).attr({stroke:!1,fill:a.color}),a.dashedBorder=a.paper.circle(c,e,Math.min(f-3,f*.95)).attr({stroke:"#ffffff","stroke-dasharray":"- "}),$.isFunction(a.bc.config.initTooltip)&&a.bc.config.initTooltip(a.node,a.circle.node),a.label=$('
'+h.formatNumber(a.node.amount)+'
'+a.node.shortLabel+"
"),a.bc.$container.append(a.label),$.isFunction(a.bc.config.initTooltip)&&a.bc.config.initTooltip(a.node,a.label[0]),a.label2=$('
'+a.node.shortLabel+"
"),a.bc.$container.append(a.label2),a.node.children.length>0&&($(a.circle.node).css({cursor:"pointer"}),$(a.label).css({cursor:"pointer"})),a.visible=!0,a.hasIcon?a.iconLoaded?a.displayIcon():a.loadIcon():a.addOverlay()},i.loadIcon=function(){var a=this,b=new vis4loader;b.add(a.bc.config.rootPath+a.node.icon),b.load(a.iconLoadComplete.bind(a))},i.iconLoadComplete=function(a){var b=this,c,d,e;c=a.items[0].data,b.iconPathData="",c=$(c),e=$("path",c);for(d in e)e[d]&&$.isFunction(e[d].getAttribute)&&(b.iconPathData+=String(e[d].getAttribute("d"))+" ");b.iconLoaded=!0,b.displayIcon()},i.displayIcon=function(){var a=this,b,c;a.iconPaths=[],c=a.paper.path(a.iconPathData),c.attr({fill:"#fff",stroke:"none"}).translate(-50,-50),a.iconPaths.push(c),a.addOverlay()},i.addOverlay=function(){var a=this;a.overlay=a.paper.circle(a.circle.attrs.cx,a.circle.attrs.cy,a.circle.attrs.r).attr({stroke:!1,fill:"#fff","fill-opacity":0}),Raphael.svg&&a.overlay.node.setAttribute("class",a.node.id),$(a.overlay.node).css({cursor:"pointer"}),$(a.overlay.node).click(a.onclick.bind(a)),$(a.label).click(a.onclick.bind(a)),$(a.label2).click(a.onclick.bind(a));if($.isPlainObject(a.bc.tooltip)){var b=a.bc.tooltip.content(a.node);$(a.overlay.node).qtip({position:{target:"mouse",viewport:$(window),adjust:{x:7,y:7}},show:{delay:a.bc.tooltip.delay||100},content:{title:b[0],text:b[1]}})}},i.removeIcon=function(){var a=this,b,c;for(b in a.iconPaths)a.iconPaths[b].remove();a.iconPaths=[]},i.draw=function(){var a=this,b=Math.max(5,a.bubbleRad*a.bc.bubbleScale),c=a.pos.x,d=a.pos.y,e=a.getXY(),f=a.pos.x,g=a.pos.y,h=a.hasIcon&&b>15,i=a.hasIcon?b>40:b>20,j,k,l,m,n;if(!!a.visible){a.circle.attr({cx:f,cy:g,r:b,"fill-opacity":a.alpha}),a.overlay&&a.overlay.attr({cx:f,cy:g,r:Math.max(10,b)}),a.node.children.length>1?a.dashedBorder.attr({cx:a.pos.x,cy:a.pos.y,r:Math.min(b-3,b-4),"stroke-opacity":a.alpha*.9}):a.dashedBorder.attr({"stroke-opacity":0}),i?(a.label.show(),h&&b<70||!h&&b<40?(a.label.find(".desc").hide(),a.label2.show()):(a.label.find(".desc").show(),a.label2.hide())):(a.label.hide(),a.label2.show()),n=h?g+b*.77-a.label.height():g-a.label.height()*.5,a.label.css({width:(h?b*1.2:2*b)+"px",opacity:a.alpha}),a.label.css({left:(h?f-b*.6:f-b)+"px",top:n+"px"});var o=Math.max(80,3*b);a.label2.css({width:o+"px",opacity:a.alpha}),a.label2.css({left:f-o*.5+"px",top:g+b+"px"});if(a.hasIcon)if(h){l=(b-(i?a.label.height()*.5:0))/60;for(j in a.iconPaths)k=a.iconPaths[j],Raphael.version[0]=="1"?m="scale("+l+") translate("+f/l+", "+(g+(i?a.label.height()*-0.5:0))/l+")":m="scale("+l+") translate("+(f/l-50)+", "+((g+(i?a.label.height()*-0.5:0))/l-50)+")",k.node.setAttribute("transform",m),k.attr({"fill-opacity":a.alpha})}else for(j in a.iconPaths)k=a.iconPaths[j],k.attr({"fill-opacity":0})}},i.hide=function(){var a=this,b;a.circle.remove(),a.dashedBorder.remove(),a.label.remove(),a.label2.remove(),a.visible=!1,a.hasIcon&&a.removeIcon(),a.overlay&&a.overlay.remove()},i.onclick=function(a){var b=this;b.bc.onNodeClick(b.node),b.bc.navigateTo(b.node)},i.onhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},a.type="SHOW",a.target=b,b.bc.tooltip(a)},i.onunhover=function(a){var b=this,c=b.bc.$container[0];a.node=b.node,a.type="HIDE",a.target=b,a.bubblePos={x:b.pos.x,y:b.pos.y},a.mousePos={x:a.origEvent.pageX-c.offsetLeft,y:a.origEvent.pageY-c.offsetTop},b.bc.tooltip(a)},i.init()} \ No newline at end of file +var BubbleTree=function(config,onHover,onUnHover){var me=this;me.version="2.0.2";me.$container=$(config.container);me.config=$.extend({rootPath:"",minRadiusLabels:40,minRadiusAmounts:20,minRadiusHideLabels:0,cutLabelsAt:50},config);me.tooltip=config.tooltipCallback?config.tooltipCallback:function(){};if(config.tooltip)me.tooltip=config.tooltip;me.style=config.bubbleStyles;me.ns=BubbleTree;me.nodesByUrlToken={};me.nodeList=[];me.iconsByUrlToken={};me.globalNodeCounter=0;me.displayObjects=[];me.bubbleScale=1;me.globRotation=0;me.currentYear=config.initYear;me.currentCenter=undefined;me.currentTransition=undefined;me.baseUrl="";me.loadData=function(url){$.ajax({url:url,dataType:"json",success:this.setData.bind(this)})};me.setData=function(data){var me=this;if(!data)data=me.config.data;me.initData(data);me.initPaper();me.initBubbles();me.initTween();me.initHistory()};me.initData=function(root){var me=this;root.level=0;me.preprocessData(root);me.traverse(root,0);me.treeRoot=root};me.preprocessData=function(root){var me=this,maxNodes=me.config.maxNodesPerLevel;if(maxNodes){if(maxNodes0)node.color=node.parent.color;else node.color="#999999"}if(node.children.length<1&&node.color){node.color=vis4color.fromHex(node.color).saturation("*.86").x}if(node.level>0){pc=node.parent.children;if(pc.length>1){node.left=pc[(index-1+pc.length)%pc.length];node.right=pc[(Number(index)+1)%pc.length];if(node.right==node.left)node.right=undefined}}if(node.label!==undefined&&node.label!==""){urlTokenSource=node.label}else if(node.token!==undefined&&node.token!==""){urlTokenSource=node.token}else{urlTokenSource=""+me.globalNodeCounter}me.globalNodeCounter++;node.urlToken=urlTokenSource.toLowerCase().replace(/\W/g,"-");while(me.nodesByUrlToken.hasOwnProperty(node.urlToken)){node.urlToken+="-"}me.nodesByUrlToken[node.urlToken]=node;node.maxChildAmount=0;node.children=me.sortChildren(node.children,true,me.config.sortBy);$.each(node.children,function(c,child){child.parent=node;node.maxChildAmount=Math.max(node.maxChildAmount,child.amount);me.traverse(child,c)});if(node.breakdowns){node.breakdownsByName={};$.each(node.breakdowns,function(c,bd){bd.famount=me.ns.Utils.formatNumber(bd.amount);if(bd.name)node.breakdownsByName[bd.name]=bd})}};me.sortChildren=function(children,alternate,sortBy){var tmp=[],odd=true;if(sortBy=="label"){sortBy=me.compareLabels;alternate=false}else sortBy=me.compareAmounts;children.sort(sortBy);if(alternate){while(children.length>0){tmp.push(odd?children.pop():children.shift());odd=!odd}return tmp}else{return children}};me.compareAmounts=function(a,b){if(a.amount>b.amount)return 1;if(a.amount==b.amount)return 0;return-1};me.compareLabels=function(a,b){if(a.label>b.label)return 1;if(a.label==b.label)return 0;return-1};me.initPaper=function(){var me=this,$c=me.$container,rt=me.treeRoot,w=$c.width(),h=$c.height(),paper=Raphael($c[0],w,h),maxRad=Math.min(w,h)*.5-40,base,Vector=me.ns.Vector,origin=new Vector(w*.5,h*.5);me.width=w;me.height=h;me.paper=paper;base=Math.pow((Math.pow(rt.amount,.6)+Math.pow(rt.maxChildAmount,.6)*2)/maxRad,1.6666666667);me.a2radBase=me.ns.a2radBase=base;me.origin=origin;$(window).resize(me.onResize.bind(me))};me.onResize=function(){var me=this,$c=me.$container,w=$c.width(),h=$c.height(),maxRad=Math.min(w,h)*.5-40,base,rt=me.treeRoot,b,obj;me.paper.setSize(w,h);me.origin.x=w*.5;me.origin.y=h*.5;me.width=w;me.height=h;base=Math.pow((Math.pow(rt.amount,.6)+Math.pow(rt.maxChildAmount,.6)*2)/maxRad,1.6666666667);me.a2radBase=me.ns.a2radBase=base;$.each(me.displayObjects,function(b,obj){if(obj.className=="bubble"){obj.bubbleRad=me.ns.Utils.amount2rad(obj.node.amount)}});if(me.currentCenter){me.changeView(me.currentCenter.urlToken)}};me.initTween=function(){this.tweenTimer=setInterval(this.loop,1e3/120)};me.initBubbles=function(){var me=this,rt=me.treeRoot,i,icons=false,Bubbles=me.ns.Bubbles,bubbleClass;me.bubbleClasses=[];if(!me.config.hasOwnProperty("bubbleType"))me.config.bubbleType=["plain"];if(!$.isArray(me.config.bubbleType))me.config.bubbleType=[me.config.bubbleType];if($.isArray(me.config.bubbleType)){$.each(me.config.bubbleType,function(i){if(me.config.bubbleType[i]=="icon")icons=true;me.bubbleClasses.push(me.getBubbleType(me.config.bubbleType[i]))})}var rootBubble=me.createBubble(rt,me.origin,0,0,rt.color);me.traverseBubbles(rootBubble)};me.getBubbleType=function(id){var me=this,Bubbles=me.ns.Bubbles;switch(id){case"pie":return Bubbles.Pies;case"donut":return Bubbles.Donut;case"multi":return Bubbles.Multi;case"icon":return Bubbles.Icon;default:return Bubbles.Plain}};me.traverseBubbles=function(parentBubble){var me=this,ring,a2rad=me.ns.Utils.amount2rad,i,c,children,childBubble,childRadSum=0,oa=0,da,ca,twopi=Math.PI*2;children=parentBubble.node.children;$.each(children,function(i,c){childRadSum+=a2rad(c.amount)});if(children.length>0){ring=me.createRing(parentBubble.node,parentBubble.pos,0,{stroke:"#888","stroke-dasharray":"-"})}$.each(children,function(i,c){da=a2rad(c.amount)/childRadSum*twopi;ca=oa+da*.5;if(isNaN(ca))vis4.log(oa,da,c.amount,childRadSum,twopi);c.centerAngle=ca;childBubble=me.createBubble(c,parentBubble.pos,0,ca,c.color);oa+=da;me.traverseBubbles(childBubble)})};me.createBubble=function(node,origin,rad,angle,color){var me=this,ns=me.ns,i,b,bubble,classIndex=node.level;if(isNaN(classIndex))classIndex=0;classIndex=Math.min(classIndex,me.bubbleClasses.length-1);bubble=new me.bubbleClasses[classIndex](node,me,origin,rad,angle,color);me.displayObjects.push(bubble);return bubble};me.createRing=function(node,origin,rad,attr){var me=this,ns=me.ns,ring;ring=new ns.Ring(node,me,origin,rad,attr);me.displayObjects.push(ring);return ring};me.changeView=function(token){var me=this,paper=me.paper,maxRad=Math.min(me.width,me.height)*.35,ns=me.ns,utils=ns.Utils,o=me.origin,l1attr={stroke:"#ccc","stroke-dasharray":"- "},l2attr={stroke:"#ccc","stroke-dasharray":". "},a2rad=utils.amount2rad,root=me.treeRoot,nodesByUrlToken=me.nodesByUrlToken,node=nodesByUrlToken.hasOwnProperty(token)?nodesByUrlToken[token]:null,t=new ns.Layout,bubble,tr,i,twopi=Math.PI*2,getBubble=me.getBubble.bind(me),getRing=me.getRing.bind(me),unify=me.unifyAngle;if(node!==null){var parent,grandpa,sibling,c,cn,rad1,rad2,rad,srad,sang,ring,tgtScale,radSum,leftTurn=false,rightTurn=false;for(i in me.displayObjects)me.displayObjects[i].hideFlag=true;if(node==root||node.parent==root&&node.children.length<1){t.$(me).bubbleScale=1;t.$(o).x=me.width*.5;t.$(o).y=me.height*.5;parent=getBubble(root);if(node!=root){parent.childRotation=-node.centerAngle}rad1=a2rad(root.amount)+a2rad(root.maxChildAmount)+20;ring=getRing(root);t.$(ring).rad=rad1;for(i in root.children){cn=root.children[i];bubble=getBubble(cn);t.$(bubble).angle=unify(cn.centerAngle+parent.childRotation);t.$(bubble).rad=rad1}}else{var origNode=node;if(node.children.length<1){node=node.parent}tgtScale=maxRad/(a2rad(node.amount)+a2rad(node.maxChildAmount)*2);t.$(me).bubbleScale=tgtScale;parent=getBubble(node);if(me.currentCenter&&me.currentCenter==node.left)rightTurn=true;else if(me.currentCenter&&me.currentCenter==node.right)leftTurn=true;var sa=me.shortestAngleTo;t.$(parent).angle=sa(parent.angle,0);rad1=(a2rad(node.amount)+a2rad(node.maxChildAmount))*tgtScale+20;ring=getRing(node);t.$(ring).rad=rad1;grandpa=getBubble(node.parent);grandpa.childRotation=-node.centerAngle;var maybeRoot=grandpa;while(maybeRoot&&maybeRoot.node.parent){maybeRoot=getBubble(maybeRoot.node.parent,true);t.$(maybeRoot).rad=0}t.$(grandpa).rad=0;var hw=me.width*.5;rad2=0-Math.max(hw*.8-tgtScale*(a2rad(node.parent.amount)+a2rad(Math.max(node.amount*1.15+node.maxChildAmount*1.15,node.left.amount*.85,node.right.amount*.85))),tgtScale*a2rad(node.parent.amount)*-1+hw*.15)+hw;if(node.left&&node.right){var maxSiblSize=tgtScale*a2rad(Math.max(node.left.amount,node.right.amount))}radSum=rad1+rad2;t.$(o).x=me.width*.5-rad2-(node!=origNode?rad1*.35:0);t.$(o).y=me.height*.5;new vis4.DelayedTask(1500,vis4,vis4.log,o,grandpa.pos);rad2+=me.width*.1;ring=getRing(node.parent);t.$(ring).rad=rad2;t.$(parent).rad=rad2;var ao=0-(node!=origNode?origNode.centerAngle+parent.childRotation:0);for(i in node.children){cn=node.children[i];bubble=getBubble(cn);t.$(bubble).angle=me.shortestAngleTo(bubble.angle,cn.centerAngle+parent.childRotation+ao);t.$(bubble).rad=rad1}var siblCut=me.height*.07;if(node.left){sibling=node.left;srad=a2rad(sibling.amount)*tgtScale;sang=twopi-Math.asin((me.paper.height*.5+srad-siblCut)/rad2);bubble=getBubble(sibling);t.$(bubble).rad=rad2;t.$(bubble).angle=sa(bubble.angle,sang)}if(node.right){sibling=node.right;srad=a2rad(sibling.amount)*tgtScale;sang=Math.asin((me.paper.height*.5+srad-siblCut)/rad2);bubble=getBubble(sibling);t.$(bubble).rad=rad2;t.$(bubble).angle=sa(bubble.angle,sang)}node=origNode}for(i in me.displayObjects){var obj=me.displayObjects[i];if(obj.hideFlag&&obj.visible){t.$(obj).alpha=0;if(obj.className=="bubble"&&obj.node.level>1)t.$(obj).rad=0;t.hide(obj)}else if(!obj.hideFlag){t.$(obj).alpha=1;if(!obj.visible){obj.alpha=0;t.show(obj)}}}tr=new ns.Transitioner($.browser.msie||me.currentCenter==node?0:1e3);tr.changeLayout(t);me.currentTransition=tr;if(!me.currentCenter&&$.isFunction(me.config.firstNodeCallback)){me.config.firstNodeCallback(node)}me.currentCenter=node}else{utils.log("node "+token+" not found")}};me.unifyAngle=function(a){var pi=Math.PI,twopi=pi*2;while(a>=twopi)a-=twopi;while(a<0)a+=twopi;return a};me.shortestAngle=function(f,t){var deg=function(a){return Math.round(a/Math.PI*180)+""};var pi=Math.PI,twopi=pi*2,unify=me.unifyAngle;f=unify(f);t=unify(t);var sa=t-f;if(sa>pi)sa-=twopi;if(sa<-pi)sa+=twopi;return sa};me.shortestAngleTo=function(f,t){return f+me.shortestAngle(f,t)};me.shortestLeftTurn=function(f,t){var sa=me.shortestAngle(f,t);if(sa>0)sa=sa-Math.PI*2;return f+sa};me.shortestRightTurn=function(f,t){var sa=me.shortestAngle(f,t);if(sa<0)sa=Math.PI*2+sa;return f+sa};me.getBubble=function(node,keepHidden){return this.getDisplayObject("bubble",node,keepHidden)};me.getRing=function(node){return this.getDisplayObject("ring",node)};me.getDisplayObject=function(className,node,keepHidden){var me=this,i,o;for(i in me.displayObjects){o=me.displayObjects[i];if(o.className!=className)continue;if(o.node==node){if(!keepHidden)o.hideFlag=false;return o}}vis4.log(className+" not found for node",node)};me.initHistory=function(){$.history.init(me.urlChanged.bind(me),{unescape:",/"})};me.freshUrl="";me.urlChanged=function(hash){var me=this,tr=me.currentTransition;if(!me.freshUrl){if(hash.indexOf("/~/")){me.baseUrl=hash.substr(0,hash.indexOf("/~/"))}}me.freshUrl=hash;if(tr&&tr.running){vis4.log("transition is running at the moment, adding listener");tr.onComplete(me.changeUrl.bind(me))}else{me.changeUrl()}};me.changeUrl=function(){var me=this,parts=me.freshUrl.split("/"),token=parts[parts.length-1],url;if(me.freshUrl==="")me.navigateTo(me.treeRoot);if(me.nodesByUrlToken.hasOwnProperty(token)){url=me.getUrlForNode(me.nodesByUrlToken[token]);if(me.freshUrl!=url){$.history.load(url)}else{me.navigateTo(me.nodesByUrlToken[token],true)}}else{me.navigateTo(me.treeRoot)}};me.navigateTo=function(node,fromUrlChange){var me=this;if(fromUrlChange)me.changeView(node.urlToken);else $.history.load(me.getUrlForNode(node));$(".label, .label2",me.$container).removeClass("current");$(".label2."+node.id,me.$container).addClass("current");$(".label."+node.id,me.$container).addClass("current")};me.getUrlForNode=function(node){var parts=[];parts.push(node.urlToken);while(node.parent){parts.push(node.parent.urlToken);node=node.parent}parts.reverse();return me.baseUrl+"/~/"+parts.join("/")};me.onNodeClick=function(node){if($.isFunction(me.config.nodeClickCallback)){me.config.nodeClickCallback(node)}};me.clean=function(){var me=this,i;$(".label").remove()};this.loop=function(){TWEEN.update()};if(!me.config.hasOwnProperty("data")){throw new Error("no data")}if(typeof me.config.data=="string"){me.loadData()}else{new vis4.DelayedTask(1e3,me,me.setData,me.config.data)}};BubbleTree.Styles={};BubbleTree.Layout=function(){var me=this;me.objects=[];me.props=[];me.toHide=[];me.toShow=[];me.$=function(obj){var me=this,i,o,p;for(i in me.objects){o=me.objects[i];if(o==obj)return me.props[i]}me.objects.push(obj);p={};me.props.push(p);return p};me.show=function(obj){var me=this;me.toShow.push(obj)};me.hide=function(obj){var me=this;me.toHide.push(obj)}};BubbleTree.Line=function(bc,attr,origin,angle,fromRad,toRad){this.bc=bc;this.o=origin;this.angle=angle;this.fromRad=fromRad;this.attr=attr;this.toRad=toRad;this.getXY=function(){this.x1=this.o.x+Math.cos(this.angle)*this.fromRad;this.y1=this.o.y-Math.sin(this.angle)*this.fromRad;this.x2=this.o.x+Math.cos(this.angle)*this.toRad;this.y2=this.o.y-Math.sin(this.angle)*this.toRad};this.init=function(){this.getXY();console.log("foo","M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2,attr);this.path=this.bc.paper.path("M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2).attr(this.attr)};this.draw=function(){this.getXY();this.path.attr({path:"M"+this.x1+" "+this.y1+"L"+this.x2+" "+this.y2})};this.init()};BubbleTree.Loader=function(config){var me=this;me.config=config;me.ns=BubbleTree;me.loadData=function(){var me=this,url=me.config.data;console.log("loading url ",url);$.ajax({url:url,context:me,dataType:"json",success:function(data){this.run(data)}})};me.run=function(data){var me=this;var bubbleChart=new BubbleTree(me.config);bubbleChart.setData(data);me.config.instance=bubbleChart};if(!me.config.hasOwnProperty("data")){}if(typeof me.config.data=="string"){me.loadData()}else{me.run(me.config.data)}};BubbleTree.MouseEventGroup=function(target,members){var me=this;me.target=target;me.members=members;me.click=function(callback){var me=this,members=me.members,i,mem;me.clickCallback=callback;for(i in members){mem=members[i];$(mem).click(me.handleClick.bind(me))}};me.handleClick=function(evt){var me=this;me.clickCallback({target:me.target,origEvent:evt,mouseEventGroup:me})};me.hover=function(callback){var me=this,members=me.members,i,mem;me.hoverCallback=callback;for(i in members){mem=members[i];$(mem).hover(me.handleMemberHover.bind(me),me.handleMemberUnHover.bind(me))}};me.unhover=function(callback){var me=this;me.unhoverCallback=callback};me.wasHovering=false;me.mouseIsOver=false;me.handleMemberHover=function(evt){var me=this;new vis4.DelayedTask(25,me,me.handleMemberHoverDelayed,evt)};me.handleMemberHoverDelayed=function(evt){var me=this;me.mouseIsOver=true;if(!me.wasHovering){me.wasHovering=true;if($.isFunction(me.hoverCallback)){me.hoverCallback({target:me.target,origEvent:evt,mouseEventGroup:me})}}};me.handleMemberUnHover=function(evt){var me=this;me.mouseIsOver=false;new vis4.DelayedTask(40,me,me.handleMemberUnHoverDelayed,evt)};me.handleMemberUnHoverDelayed=function(evt){var me=this;if(!me.mouseIsOver){me.wasHovering=false;if($.isFunction(me.unhoverCallback)){me.unhoverCallback({target:me.target,origEvent:evt,mouseEventGroup:me})}}};me.addMember=function(mem){var me=this;if(me.hoverCallback)$(mem).hover(me.handleMemberHover.bind(me),me.handleMemberUnHover.bind(me));me.members.push(mem)};me.removeMember=function(mem){var me=this,members=me.members,i,tmp=[];if(me.clickCallback)$(mem).unbind("click");if(me.hoverCallback)$(mem).unbind("mouseenter mouseleave");for(i in members){if(members[i]!=mem)tmp.push(members[i])}me.members=tmp}};BubbleTree.Ring=function(node,bc,o,rad,attr){var me=this;me.className="ring";me.rad=rad;me.bc=bc;me.attr=attr;me.origin=o;me.alpha=1;me.visible=false;me.node=node;me.init=function(){};me.draw=function(){var me=this,o=me.origin;if(!me.visible)return;me.circle.attr({cx:o.x,cy:o.y,r:me.rad,"stroke-opacity":me.alpha})};me.hide=function(){var me=this;me.circle.remove();me.visible=false};me.show=function(){var me=this;me.circle=me.bc.paper.circle(o.x,o.y,me.rad).attr(me.attr);me.visible=true;me.circle.toBack()};me.init()};BubbleTree.Transitioner=function(duration){var me=this;me.duration=duration;me.running=false;me.completeCallbacks=[];me.changeLayout=function(layout){var i,o,props,p,me=this;me.running=true;me.layout=layout;for(i in layout.toShow){o=layout.toShow[i];if($.isFunction(o.show))o.show()}for(i in layout.objects){o=layout.objects[i];if(o===undefined||o===null)continue;props=layout.props[i];if(me.duration>0){var tween=new TWEEN.Tween(o),toProps={};for(p in props){toProps[p]=props[p]}tween.to(toProps,me.duration);tween.easing(TWEEN.Easing.Exponential.EaseOut);if($.isFunction(o.draw))tween.onUpdate(o.draw.bind(o));if(i==layout.objects.length-1)tween.onComplete(me._completed.bind(me));tween.start()}else{for(p in props){o[p]=props[p]}if(o&&$.isFunction(o.draw))o.draw()}}if(me.duration===0){for(i in layout.objects){o=layout.objects[i];if(o&&$.isFunction(o.draw))o.draw()}me._completed()}};me.onComplete=function(callback){var me=this;try{if($.isFunction(callback))me.completeCallbacks.push(callback)}catch(e){}};me._completed=function(){var me=this,callbacks=me.completeCallbacks,i,obj;me.running=false;for(i in me.layout.objects){obj=me.layout.objects[i];if(obj&&$.isFunction(obj.draw))obj.draw()}for(i in me.layout.toHide){obj=me.layout.toHide[i];if(obj&&$.isFunction(obj.hide))obj.hide()}for(i in callbacks){callbacks[i]()}}};BubbleTree.Utils={};BubbleTree.Utils.log=function(){try{if(window.hasOwnProperty("console"))console.log.apply(this,arguments)}catch(e){}};BubbleTree.Utils.amount2rad=function(a){return Math.pow(Math.max(0,a)/BubbleTree.a2radBase,.6)};BubbleTree.Utils.formatNumber=function(n){var prefix="";if(n<0){n=n*-1;prefix="-"}if(n>=1e12)return prefix+Math.round(n/1e11)/10+"t";if(n>=1e9)return prefix+Math.round(n/1e8)/10+"b";if(n>=1e6)return prefix+Math.round(n/1e5)/10+"m";if(n>=1e3)return prefix+Math.round(n/100)/10+"k";else return prefix+n};BubbleTree.Vector=function(x,y){var me=this;me.x=x;me.y=y;me.length=function(){var me=this;return Math.sqrt(me.x*me.x+me.y*me.y)};me.normalize=function(len){var me=this,l=me.length();if(!len)len=1;me.x*=len/l;me.y*=len/l};me.clone=function(){var me=this;return new BubbleTree.Vector(me.x,me.y)}};BubbleTree.Bubbles=BubbleTree.Bubbles||{};BubbleTree.Bubbles.Plain=function(node,bubblechart,origin,radius,angle,color){var ns=BubbleTree,utils=ns.Utils,me=this;me.className="bubble";me.node=node;me.paper=bubblechart.paper;me.origin=origin;me.bc=bubblechart;me.rad=radius;me.angle=angle;me.color=color;me.alpha=1;me.visible=false;me.ns=ns;me.pos=ns.Vector(0,0);me.bubbleRad=utils.amount2rad(this.node.amount);me.container=me.bc.$container;me.childRotation=0;me.getXY=function(){var me=this,o=me.origin,a=me.angle,r=me.rad;if(me.pos===undefined)me.pos=new me.ns.Vector(0,0);me.pos.x=o.x+Math.cos(a)*r;me.pos.y=o.y-Math.sin(a)*r};me.init=function(){var me=this;me.getXY();var showIcon=false;if(!me.node.shortLabel)me.node.shortLabel=me.node.label.length>me.bc.config.cutLabelsAt+3?me.node.label.substr(0,me.bc.config.cutLabelsAt)+"...":me.node.label;me.initialized=true};me.onclick=function(e){var me=this;me.bc.onNodeClick(me.node);me.bc.navigateTo(me.node)};me.onhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.target=me;e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};e.type="SHOW";me.bc.tooltip(e)};me.onunhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.type="HIDE";e.target=me;e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};me.bc.tooltip(e)};me.draw=function(){var me=this,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale),ox=me.pos.x,oy=me.pos.y,devnull=me.getXY(),x=me.pos.x,y=me.pos.y;if(!me.visible)return;me.circle.attr({cx:me.pos.x,cy:me.pos.y,r:r,"fill-opacity":me.alpha});if(me.node.children.length>1)me.dashedBorder.attr({cx:me.pos.x,cy:me.pos.y,r:r-4,"stroke-opacity":me.alpha*.9});else me.dashedBorder.attr({"stroke-opacity":0});me.label.show();me.label.find("*").show();me.label2.show();if(r>=me.bc.config.minRadiusLabels){me.label2.hide()}else if(r>=me.bc.config.minRadiusAmounts){me.label.find(".desc").hide()}else if(r>=me.bc.config.minRadiusHideLabels){me.label.hide()}else{me.label.hide();me.label2.hide()}me.label.css({width:2*r+"px",opacity:me.alpha});me.label.css({left:me.pos.x-r+"px",top:me.pos.y-me.label.height()*.5+"px"});var w=Math.max(70,3*r);me.label2.css({width:w+"px",opacity:me.alpha});me.label2.css({left:x-w*.5+"px",top:y+r+"px"})};me.hide=function(){var me=this,i;me.circle.remove();me.dashedBorder.remove();me.label.remove();me.label2.remove();me.visible=false};me.show=function(){var me=this,i,cx=me.pos.x,cy=me.pos.y,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale);me.circle=me.paper.circle(cx,cy,r).attr({stroke:false,fill:me.color});me.dashedBorder=me.paper.circle(cx,cy,r-3).attr({stroke:"#ffffff","stroke-dasharray":"- "});me.label=$('
'+utils.formatNumber(me.node.amount)+'
'+me.node.shortLabel+"
");me.container.append(me.label);if(me.node.children.length>0){$(me.circle.node).css({cursor:"pointer"});$(me.label).css({cursor:"pointer"})}me.label2=$('
'+me.node.shortLabel+"
");me.container.append(me.label2);var list=[me.circle.node,me.label,me.dashedBorder.node];var mgroup=new me.ns.MouseEventGroup(me,list);mgroup.click(me.onclick.bind(me));mgroup.hover(me.onhover.bind(me));mgroup.unhover(me.onunhover.bind(me));me.visible=true};me.addOverlay=function(){var me=this;me.overlay=me.paper.circle(me.circle.attrs.cx,me.circle.attrs.cy,me.circle.attrs.r).attr({stroke:false,fill:"#fff",opacity:0});if(Raphael.svg){me.overlay.node.setAttribute("class",me.node.id)}$(me.overlay.node).css({cursor:"pointer"});$(me.overlay.node).click(me.onclick.bind(me));$(me.label).click(me.onclick.bind(me))};me.init()};BubbleTree.Bubbles=BubbleTree.Bubbles||{};BubbleTree.Bubbles.Donut=function(node,bubblechart,origin,radius,angle,color){var ns=BubbleTree,utils=ns.Utils,me=this;me.className="bubble";me.node=node;me.paper=bubblechart.paper;me.origin=origin;me.bc=bubblechart;me.rad=radius;me.angle=angle;me.color=color;me.alpha=1;me.visible=false;me.ns=ns;me.bubbleRad=utils.amount2rad(this.node.amount);me.childRotation=0;me.getXY=function(){var me=this,o=me.origin,a=me.angle,r=me.rad;me.pos.x=o.x+Math.cos(a)*r;me.pos.y=o.y-Math.sin(a)*r};me.init=function(){var me=this;me.pos=new me.ns.Vector(0,0);me.getXY();var breakdown=[],b,i,val,bd=[],styles=me.bc.config.bubbleStyles;if(!me.node.shortLabel)me.node.shortLabel=me.node.label.length>50?me.node.label.substr(0,30)+"...":me.node.label;me.breakdownOpacities=[.2,.7,.45,.6,.35];me.breakdownColors=[false,false,false,false,false,false,false,false,false,false];for(i in me.node.breakdowns){b=me.node.breakdowns[i];b.famount=utils.formatNumber(b.amount);val=b.amount/me.node.amount;breakdown.push(val);bd.push(b);if(styles&&styles.hasOwnProperty("name")&&styles.name.hasOwnProperty(b.name)&&styles.name[b.name].hasOwnProperty("opacity")){me.breakdownOpacities[bd.length-1]=styles.name[b.name].opacity}if(styles&&styles.hasOwnProperty("name")&&styles.name.hasOwnProperty(b.name)&&styles.name[b.name].hasOwnProperty("color")){me.breakdownColors[bd.length-1]=styles.name[b.name].color;me.breakdownOpacities[bd.length-1]=1}}me.node.breakdowns=bd;me.breakdown=breakdown;var showIcon=false;me.initialized=true};me.onclick=function(e){var me=this;me.bc.navigateTo(me.node)};me.onhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.target=me;e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};e.type="SHOW";me.bc.tooltip(e)};me.onunhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.target=me;e.type="HIDE";e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};me.bc.tooltip(e)};this.draw=function(){var me=this,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale),ox=me.pos.x,oy=me.pos.y,devnull=me.getXY(),showLabel=r>20,x=me.pos.x,y=me.pos.y;if(!me.visible)return;me.circle.attr({cx:x,cy:y,r:r,"fill-opacity":me.alpha});if(me.node.children.length>1)me.dashedBorder.attr({cx:x,cy:y,r:r*.85,"stroke-opacity":me.alpha*.8});else me.dashedBorder.attr({"stroke-opacity":0});if(me.breakdown.length>1){var i,x0,x1,x2,x3,y0,y1,y2,y3,ir=r*.85,oa=-Math.PI*.5,da;for(i in me.breakdown){da=me.breakdown[i]*Math.PI*2;x0=x+Math.cos(oa)*ir;y0=y+Math.sin(oa)*ir;x1=x+Math.cos(oa+da)*ir;y1=y+Math.sin(oa+da)*ir;x2=x+Math.cos(oa+da)*r;y2=y+Math.sin(oa+da)*r;x3=x+Math.cos(oa)*r;y3=y+Math.sin(oa)*r;oa+=da;var path="M"+x0+" "+y0+" A"+ir+","+ir+" 0 "+(da>Math.PI?"1,1":"0,1")+" "+x1+","+y1+" L"+x2+" "+y2+" A"+r+","+r+" 0 "+(da>Math.PI?"1,0":"0,0")+" "+x3+" "+y3+" Z";me.breakdownArcs[i].attr({path:path,"stroke-opacity":me.alpha*.2,"fill-opacity":me.breakdownOpacities[i]*me.alpha})}}if(!showLabel){me.label.hide();me.label2.show()}else{me.label.show();if(r<40){me.label.find(".desc").hide();me.label2.show()}else{me.label.find(".desc").show();me.label2.hide()}}me.label.css({width:2*r*.9+"px",opacity:me.alpha});me.label.css({left:me.pos.x-r*.9+"px",top:me.pos.y-me.label.height()*.53+"px"});var w=Math.max(80,3*r);me.label2.css({width:w+"px",opacity:me.alpha});me.label2.css({left:x-w*.5+"px",top:y+r+"px"})};this.hide=function(){var me=this,i;me.circle.remove();me.dashedBorder.remove();me.label.remove();me.label2.remove();me.visible=false;for(i in me.breakdownArcs){me.breakdownArcs[i].remove()}};me.show=function(){var me=this,i,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale);me.circle=me.paper.circle(me.pos.x,me.pos.y,r).attr({stroke:false,fill:me.color});if($.isFunction(me.bc.config.initTooltip)){me.bc.config.initTooltip(me.node,me.circle.node)}me.dashedBorder=me.paper.circle(me.pos.x,me.pos.y,r*.85).attr({stroke:"#fff","stroke-opacity":me.alpha*.4,"stroke-dasharray":". ",fill:false});me.label=$('
'+utils.formatNumber(me.node.amount)+'
'+me.node.shortLabel+"
");me.bc.$container.append(me.label);if(me.node.children.length>1){$(me.circle.node).css({cursor:"pointer"});$(me.label).css({cursor:"pointer"})}me.label2=$('
'+me.node.shortLabel+"
");me.bc.$container.append(me.label2);var list=[me.circle.node,me.label];if(me.breakdown.length>1){me.breakdownArcs={};for(i in me.breakdown){var col=me.breakdownColors[i]?me.breakdownColors[i]:"#fff",arc=me.paper.path("M 0 0 L 2 2").attr({fill:col,"fill-opacity":Math.random()*.4+.3,stroke:"#fff"});me.breakdownArcs[i]=arc;if($.isFunction(me.bc.config.initTooltip)){me.bc.config.initTooltip(me.node.breakdowns[i],arc.node)}}for(i in me.breakdownArcs){$(me.breakdownArcs[i].node).click(me.onclick.bind(me))}}var mgroup=new me.ns.MouseEventGroup(me,list);mgroup.click(me.onclick.bind(me));mgroup.hover(me.onhover.bind(me));mgroup.unhover(me.onunhover.bind(me));me.visible=true};me.arcHover=function(e){var me=this,c=me.bc.$container[0],i,arcs=me.breakdownArcs,node,bd=me.node.breakdowns;for(i in arcs){if(arcs[i].node==e.target){e.node=bd[i];e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.pageX-c.offsetLeft,y:e.pageY-c.offsetTop};e.target=me;e.type="SHOW";me.bc.tooltip(e);return}}vis4.log("cant find the breakdown node")};me.arcUnhover=function(e){var me=this,c=me.bc.$container[0],i,arcs=me.breakdownArcs,node,bd=me.node.breakdowns;for(i in arcs){if(arcs[i].node==e.target){e.node=bd[i];e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.pageX-c.offsetLeft,y:e.pageY-c.offsetTop};e.type="HIDE";e.target=me;me.bc.tooltip(e);return}}vis4.log("cant find the breakdown node")};me.init()};BubbleTree.Bubbles=BubbleTree.Bubbles||{};BubbleTree.Bubbles.Icon=function(node,bubblechart,origin,radius,angle,color){var ns=BubbleTree,utils=ns.Utils,me=this;me.className="bubble";me.node=node;me.paper=bubblechart.paper;me.origin=origin;me.bc=bubblechart;me.rad=radius;me.angle=angle;me.color=color;me.alpha=1;me.visible=false;me.ns=ns;me.pos=ns.Vector(0,0);me.bubbleRad=utils.amount2rad(this.node.amount);me.iconLoaded=false;me.childRotation=0;me.getXY=function(){var me=this,o=me.origin,a=me.angle,r=me.rad;if(me.pos===undefined)me.pos=new me.ns.Vector(0,0);me.pos.x=o.x+Math.cos(a)*r;me.pos.y=o.y-Math.sin(a)*r};me.init=function(){var me=this;me.getXY();me.hasIcon=me.node.hasOwnProperty("icon");if(!me.node.shortLabel)me.node.shortLabel=me.node.label.length>50?me.node.label.substr(0,30)+"...":me.node.label;me.initialized=true};me.show=function(){var me=this,i,cx=me.pos.x,icon,cy=me.pos.y,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale);me.circle=me.paper.circle(cx,cy,r).attr({stroke:false,fill:me.color});me.dashedBorder=me.paper.circle(cx,cy,Math.min(r-3,r*.95)).attr({stroke:"#ffffff","stroke-dasharray":"- "});if($.isFunction(me.bc.config.initTooltip)){me.bc.config.initTooltip(me.node,me.circle.node)}me.label=$('
'+utils.formatNumber(me.node.amount)+'
'+me.node.shortLabel+"
");me.bc.$container.append(me.label);if($.isFunction(me.bc.config.initTooltip)){me.bc.config.initTooltip(me.node,me.label[0])}me.label2=$('
'+me.node.shortLabel+"
");me.bc.$container.append(me.label2);if(me.node.children.length>0){$(me.circle.node).css({cursor:"pointer"});$(me.label).css({cursor:"pointer"})}me.visible=true;if(me.hasIcon){if(!me.iconLoaded)me.loadIcon();else me.displayIcon()}else{me.addOverlay()}};me.loadIcon=function(){var me=this,ldr=new vis4loader;ldr.add(me.bc.config.rootPath+me.node.icon);ldr.load(me.iconLoadComplete.bind(me))};me.iconLoadComplete=function(ldr){var me=this,svg,j,paths;svg=ldr.items[0].data;me.iconPathData="";svg=$(svg);paths=$("path",svg);for(j in paths){if(paths[j]&&$.isFunction(paths[j].getAttribute)){me.iconPathData+=String(paths[j].getAttribute("d"))+" "}}me.iconLoaded=true;me.displayIcon()};me.displayIcon=function(){var me=this,i,path;me.iconPaths=[];path=me.paper.path(me.iconPathData);path.attr({fill:"#fff",stroke:"none"}).translate(-50,-50);me.iconPaths.push(path);me.addOverlay()};me.addOverlay=function(){var me=this;me.overlay=me.paper.circle(me.circle.attrs.cx,me.circle.attrs.cy,me.circle.attrs.r).attr({stroke:false,fill:"#fff","fill-opacity":0});if(Raphael.svg){me.overlay.node.setAttribute("class",me.node.id)}$(me.overlay.node).css({cursor:"pointer"});$(me.overlay.node).click(me.onclick.bind(me));$(me.label).click(me.onclick.bind(me));$(me.label2).click(me.onclick.bind(me));if($.isPlainObject(me.bc.tooltip)){var tt=me.bc.tooltip.content(me.node);$(me.overlay.node).qtip({position:{target:"mouse",viewport:$(window),adjust:{x:7,y:7}},show:{delay:me.bc.tooltip.delay||100},content:{title:tt[0],text:tt[1]}}) +}};me.removeIcon=function(){var me=this,i,path;for(i in me.iconPaths){me.iconPaths[i].remove()}me.iconPaths=[]};me.draw=function(){var me=this,r=Math.max(5,me.bubbleRad*me.bc.bubbleScale),ox=me.pos.x,oy=me.pos.y,devnull=me.getXY(),x=me.pos.x,y=me.pos.y,showIcon=me.hasIcon&&r>15,showLabel=me.hasIcon?r>40:r>20,i,path,scale,transform,ly;if(!me.visible)return;me.circle.attr({cx:x,cy:y,r:r,"fill-opacity":me.alpha});if(me.overlay)me.overlay.attr({cx:x,cy:y,r:Math.max(10,r)});if(me.node.children.length>1)me.dashedBorder.attr({cx:me.pos.x,cy:me.pos.y,r:Math.min(r-3,r-4),"stroke-opacity":me.alpha*.9});else me.dashedBorder.attr({"stroke-opacity":0});if(!showLabel){me.label.hide();me.label2.show()}else{me.label.show();if(showIcon&&r<70||!showIcon&&r<40){me.label.find(".desc").hide();me.label2.show()}else{me.label.find(".desc").show();me.label2.hide()}}ly=showIcon?y+r*.77-me.label.height():y-me.label.height()*.5;me.label.css({width:(showIcon?r*1.2:2*r)+"px",opacity:me.alpha});me.label.css({left:(showIcon?x-r*.6:x-r)+"px",top:ly+"px"});var w=Math.max(80,3*r);me.label2.css({width:w+"px",opacity:me.alpha});me.label2.css({left:x-w*.5+"px",top:y+r+"px"});if(me.hasIcon){if(showIcon){scale=(r-(showLabel?me.label.height()*.5:0))/60;for(i in me.iconPaths){path=me.iconPaths[i];if(Raphael.version[0]=="1"){transform="scale("+scale+") translate("+x/scale+", "+(y+(showLabel?me.label.height()*-.5:0))/scale+")"}else{transform="scale("+scale+") translate("+(x/scale-50)+", "+((y+(showLabel?me.label.height()*-.5:0))/scale-50)+")"}path.node.setAttribute("transform",transform);path.attr({"fill-opacity":me.alpha})}}else{for(i in me.iconPaths){path=me.iconPaths[i];path.attr({"fill-opacity":0})}}}};me.hide=function(){var me=this,i;me.circle.remove();me.dashedBorder.remove();me.label.remove();me.label2.remove();me.visible=false;if(me.hasIcon)me.removeIcon();if(me.overlay)me.overlay.remove()};me.onclick=function(e){var me=this;me.bc.onNodeClick(me.node);me.bc.navigateTo(me.node)};me.onhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};e.type="SHOW";e.target=me;me.bc.tooltip(e)};me.onunhover=function(e){var me=this,c=me.bc.$container[0];e.node=me.node;e.type="HIDE";e.target=me;e.bubblePos={x:me.pos.x,y:me.pos.y};e.mousePos={x:e.origEvent.pageX-c.offsetLeft,y:e.origEvent.pageY-c.offsetTop};me.bc.tooltip(e)};me.init()}; \ No newline at end of file diff --git a/src/js/bubbletree.js b/src/js/bubbletree.js index ab113f8..13ebebb 100644 --- a/src/js/bubbletree.js +++ b/src/js/bubbletree.js @@ -178,7 +178,7 @@ var BubbleTree = function(config, onHover, onUnHover) { else node.color = '#999999'; } // lighten up the color if there are no children - if (node.children.length < 2 && node.color) { + if (node.children.length < 1 && node.color) { node.color = vis4color.fromHex(node.color).saturation('*.86').x; } @@ -453,7 +453,7 @@ var BubbleTree = function(config, onHover, onUnHover) { for (i in me.displayObjects) me.displayObjects[i].hideFlag = true; - if (node == root || node.parent == root && node.children.length < 2) { + if (node == root || node.parent == root && node.children.length < 1) { t.$(me).bubbleScale = 1.0; @@ -489,7 +489,7 @@ var BubbleTree = function(config, onHover, onUnHover) { var origNode = node; // save the reference of the node.. - if (node.children.length < 2) { // ..because if it has no children.. + if (node.children.length < 1) { // ..because if it has no children.. node = node.parent; // ..we center on its parent }