-
Notifications
You must be signed in to change notification settings - Fork 17
/
buzzmap.min.js
20 lines (20 loc) · 9.8 KB
/
buzzmap.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(function(d){function m(a,b,e){this.obj=a;this.start=b;this.end=e}var l=function(){};l.prototype={bind:function(a,b){this._events=this._events||{};this._events[a]=this._events[a]||[];this._events[a].push(b)},unbind:function(a,b){this._events=this._events||{};a in this._events!==!1&&this._events[a].splice(this._events[a].indexOf(b),1)},trigger:function(a){this._events=this._events||{};if(a in this._events!==!1)for(var b=0;b<this._events[a].length;b++)this._events[a][b].apply(this,Array.prototype.slice.call(arguments,
1))}};l.mixin=function(a){for(var b=["bind","unbind","trigger"],e=0;e<b.length;e++)a.prototype[b[e]]=l.prototype[b[e]]};m.prototype.updatePosition=function(){if(this.start.visible&&this.end.visible)this.strokeStyle=this.obj.options.lineColor,this.strokeWidth=this.obj.options.lineWidth,this.strokeOpacity=this.obj.options.lineOpacity,this.obj.canvas.path("M"+this.start.x+" "+this.start.y+"L"+this.end.x+" "+this.end.y).attr({stroke:this.strokeStyle,opacity:this.strokeOpacity,"stroke-width":this.strokeWidth})};
var g=function(a,b,e){var i=this;this.obj=a;this.parent=b;this.children=[];this.visible=!1;this.moveTimer=0;this.y=this.x=1;this.dy=this.dx=0;this.hasPosition=this.dragging=this.editing=!1;this.el=d("<div></div>");this.el.css("position","absolute");this.el.addClass("node");this.obj.el.prepend(this.el);this.el.hide();this.label(e);this.parent?(this.parent.children.push(this),this.parent.parent?this.obj.lines[this.obj.lines.length]=new m(a,this,b):(this.el.addClass("active"),this.el.addClass("root"))):
this.el.addClass("active");this.el.mouseup(function(){if(i.editing==!0||i.dragging==!0)return!0;if(i.obj.options.editable!==!0)return i.toggleChildren(),!0;i.toggleChildren();return!0});this.el.draggable({cancel:":input,option,button,a",start:function(){i.dragging=!0},drag:function(){i.obj.trigger("ondrag",i);i.obj.animate()},stop:function(){i.dragging=!1}});this.obj.options.editable===!0&&this.el.dblclick(function(a){i.edit();a.preventDefault()})};g.prototype.toggleChildren=function(){return this.children.length>
0&&this.parent.parent?(this.el.toggleClass("active"),this.obj.animate(),!1):!0};g.prototype.label=function(a){typeof a!=="undefined"&&this.el.html(d(a));return d(":eq(0)",this.el).html()};g.prototype.serialize=function(){var a='{"label":"'+d(this.el).html().replace(/"/g,'\\"')+'","children":[',b=0;d.each(this.children,function(){b++;b>1&&(a+=",");a+=this.serialize()});return a+"]}"};g.prototype.edit=function(){var a=this;a.editing=!0;a.obj.editing=!0;var b=this.label();this.label("");var e=function(){a.label("<span>"+
b+"</span>");a.editing=a.obj.editing=!1;a.obj.animate()},i=d('<input class="edit-field" type="text" />').val(b);i.keyup(function(b){b=b.which;if(b===27)e();else if(b===13)b=i.val(),a.label("<span>"+b+"</span>"),a.obj.trigger("onchange",a,a.obj.serialize()),a.obj.editing=a.editing=!1,a.obj.animate();return!0});i.appendTo(a.el).focus().select();d('<button class="edit-button">+</button>').click(function(){e();a.el.addClass("active");a.obj.addNode(a).edit();return!1}).appendTo(a.el);a!==this.obj.root&&
d('<button class="edit-button">x</button>').click(function(){e();a.removeNode();a.obj.animate();return!1}).appendTo(a.el);return!1};g.prototype.removeNode=function(){this.obj.trigger("onremove",this);for(var a=0;a<this.children.length;a++)this.children[a].removeNode();this.parent&&this.parent.children.splice(this.parent.children.indexOf(this),1);this.obj.nodes.splice(this.obj.nodes.indexOf(this),1);var b=this.obj.lines;this.obj.lines=[];for(a=0;a<b.length;a++)b[a].start===this||b[a].end===this||this.obj.lines.push(b[a]);
d(this.el).remove();this.obj.trigger("onchange",this,this.obj.serialize());this.obj.animate()};g.prototype.findEquilibrium=function(){for(var a=!this.parent?!0:this.display(),b=0;b<this.children.length;b++)if(this.children[b].visible||this.el.hasClass("active"))a=this.children[b].findEquilibrium()&&a;return a};g.prototype.hide=function(){this.obj.trigger("onhide",this);this.el.removeClass("active");this.el.hide();this.hasPosition=this.visible=!1};g.prototype.show=function(){this.el.show();this.visible=
!0;this.obj.trigger("onshow",this)};g.prototype.setPosition=function(a,b){this.x=a;this.y=b;this.el.css("left",a+"px");this.el.css("top",b+"px");this.hasPosition=!0};g.prototype.display=function(){this.visible?this.parent.el.hasClass("active")||this.hide():(this.parent.parent===null||this.parent.el.hasClass("active"))&&this.show();if(!this.visible)return!0;if(!this.hasPosition){if(this.parent.parent!==null)var a=parseInt(this.parent.el.css("left")),b=parseInt(this.parent.el.css("top"));else a=this.obj.width/
2,b=this.obj.height/2;this.setPosition(a,b)}var e=Math.PI*2/this.children.length,i=this;d.each(this.children,function(a){if(!this.visible){var b=a*e,a=50*Math.cos(b)+i.x,b=50*Math.sin(b)+i.y;this.setPosition(a,b)}});return this.updatePosition()};g.prototype.updatePosition=function(){if(d(this.el).hasClass("ui-draggable-dragging"))return this.x=parseInt(this.el.css("left"))+d(this.el).width()/2,this.y=parseInt(this.el.css("top"))+d(this.el).height()/2,this.dy=this.dx=0,!1;var a=this.getForceVector();
this.dx+=a.x*this.obj.options.acceleration;this.dy+=a.y*this.obj.options.acceleration;this.dx*=this.obj.options.damping;this.dy*=this.obj.options.damping;if(Math.abs(this.dx)<this.obj.options.minSpeed)this.dx=0;if(Math.abs(this.dy)<this.obj.options.minSpeed)this.dy=0;if(Math.abs(this.dx)+Math.abs(this.dy)==0)return!0;this.x+=this.dx*this.obj.options.acceleration;this.y+=this.dy*this.obj.options.acceleration;this.x=Math.min(this.obj.width,Math.max(1,this.x));this.y=Math.min(this.obj.height,Math.max(1,
this.y));var a=this.x-d(this.el).width()/2,b=this.y-d(this.el).height()/2-10;this.el.css("left",a+"px");this.el.css("top",b+"px");return!1};g.prototype.getForceVector=function(){for(var a=0,b=0,e=this.obj.nodes,d=this.obj.lines,f=0;f<e.length;f++)if(e[f]!==this&&(!this.obj.options.showSublines||e[f].hasPosition)&&e[f].visible){var c=e[f].x-this.x,h=e[f].y-this.y,j=c/Math.abs(c);Math.abs(h);var g=Math.sqrt(c*c+h*h),h=Math.atan(h/c);c===0&&(h=Math.PI/2,j=0);c=this.obj.options.repulse*500/(g*g);Math.abs(g)<
500&&(a+=-c*Math.cos(h)*j,b+=-c*Math.sin(h)*j)}f=this.x+this.el.width();c=this.obj.options.wallrepulse*500/(f*f);a+=Math.min(2,c);f=this.obj.width-f;c=-(this.obj.options.wallrepulse*500)/(f*f);a+=Math.max(-2,c);c=this.obj.options.wallrepulse*500/(this.y*this.y);b+=Math.min(2,c);f=this.obj.height-this.y;c=-(this.obj.options.wallrepulse*500)/(f*f);b+=Math.max(-2,c);for(f=0;f<d.length;f++){e=null;if(d[f].start===this)e=d[f].end;else if(d[f].end===this)e=d[f].start;else continue;e.visible&&(c=e.x-this.x,
h=e.y-this.y,g=Math.sqrt(c*c+h*h),j=c/Math.abs(c),h=Math.atan(h/c),c==0&&(h=Math.PI/2,j=0),c=this.obj.options.attract*g/1E4,Math.abs(g)>0&&(a+=c*Math.cos(h)*j,b+=c*Math.sin(h)*j))}if(!this.parent)e=this.obj.options.mapArea,c=e.x/2-this.obj.options.centerOffset-this.x,h=e.y/2-this.y,g=Math.sqrt(c*c+h*h),j=c/Math.abs(c),h=Math.atan(h/c),c===0&&(h=Math.PI/2,j=0),c=0.1*this.obj.options.attract*g*this.obj.options.centerAttraction/1E3,Math.abs(g)>0&&(a+=c*Math.cos(h)*j,b+=c*Math.sin(h)*j);Math.abs(a)>this.obj.options.maxForce&&
(a=this.obj.options.maxForce*(a/Math.abs(a)));Math.abs(b)>this.obj.options.maxForce&&(b=this.obj.options.maxForce*(b/Math.abs(b)));return{x:a,y:b}};d.fn.buzzmap=function(a){var b=d(this).filter("ul");b.hasClass("buzzmap-active")||b.each(function(){var b=new k(d(this),a);b.el.addClass("buzzmap-active");b.el[0].obj=b;if(b.options.loadData){var g=d.parseJSON(a.loadData),f=function(a,c){d.each(c,function(c,d){node=b.addNode(a,decodeURI(d.label));f(node,d.children)})};d.each(g.children,function(a,c){node=
b.addNode(b.root,decodeURI(c.label));f(node,c.children)})}else{var c=function(){var a=d(this).parents("li").get(0),a=typeof a==="undefined"?b.root:a.mynode;this.mynode=b.addNode(a,d("div:eq(0)",this).html());d(this).hide();d(">ul>li",this).each(c)};d(">li",b.el).each(c)}b.animate()});return b[0].obj};var k=function(a,b){var e=this;this.el=a;this.nodes=[];this.lines=[];this.parseOptions(b);this.movementStopped=this.editing=this.moving=!1;this.fps=0;window.setInterval(function(){var a=e.fps*2;e.fps=
0;e.trigger("fps",a)},500);this.root=this.nodes[0]=new g(this,null,"<span>__ROOT__</span>");d(window).resize(function(){e.createCanvas();e.animate()});e.createCanvas()};l.mixin(k);k.prototype.createCanvas=function(){this.height=this.options.mapArea.y==-1?d(window).height():this.options.mapArea.y;this.width=this.options.mapArea.x==-1?d(window).width():this.options.mapArea.x;this.canvas?this.canvas.setSize(this.width,this.height):this.canvas=Raphael(0,0,this.width,this.height)};k.prototype.addNode=
function(a,b){var d=this.nodes[this.nodes.length]=new g(this,a,b);this.animate();return d};k.prototype.serialize=function(){return this.root.serialize()};k.prototype.animate=function(){var a=this;if(a.options.timeout!=0){var b=a.editing==!0?1.5:a.options.timeout;clearTimeout(a.moveTimer);a.moveTimer=setTimeout(function(){a.movementStopped=!0},b*1E3)}if(!a.moving)a.moving=!0,a.movementStopped=!1,a.animateLoop()};k.prototype.animateLoop=function(){var a=this;this.canvas.clear();for(var b=0;b<this.lines.length;b++)this.lines[b].updatePosition();
this.root.findEquilibrium()||this.movementStopped?this.moving=!1:window.setTimeout(function(){a.fps++;a.animateLoop()},1E3/a.options.maxFps)};k.prototype.parseOptions=function(a){this.options=d.extend({mapArea:{x:-1,y:-1},loadData:null,editable:!1,onchange:function(){},ondrag:function(){},onshow:function(){},onhide:function(){},onremove:function(){},attract:3,repulse:2.5,maxForce:0.15,damping:0.9,acceleration:4,lineWidth:"5px",lineColor:"#FFF",lineOpacity:0.3,wallrepulse:0.5,centerOffset:100,centerAttraction:0,
minSpeed:0.05,frameRate:50,timeout:5},a);this.bind("onchange",this.options.onchange);this.bind("ondrag",this.options.ondrag);this.bind("onshow",this.options.onshow);this.bind("onhide",this.options.onhide);this.bind("onremove",this.options.onremove)}})(jQuery);