// This work is licensed under the Creative Commons Attribution 2.5 License.
//
// To view a copy of this license, visit:
//   http://creativecommons.org/licenses/by/2.5/
//
// or send a letter to:
//   Creative Commons
//   543 Howard Street, 5th Floor
//   San Francisco, California, 94105, USA.
//
// All copies and derivatives of this source must contain the license statement 
// above and the following attribution:
//
// Author: Kyle Scholz      http://kylescholz.com/
// Copyright: 2006
// *** Some modifications have made by Press Net Japan (http://www.47news.jp). ***
var DataGraph=function(){this.init();}
DataGraph.prototype={init:function(){this.nodes=new Array();this.subscribers=new Array();},subscribe:function(observer){this.subscribers.push(observer);},notifyNode:function(node){for(var i=0,l=this.subscribers.length;i<l;i++){this.subscribers[i].newDataGraphNode(node);}},notifyEdge:function(nodeA,nodeB){for(var i=0,l=this.subscribers.length;i<l;i++){this.subscribers[i].newDataGraphEdge(nodeA,nodeB);}},addNode:function(dataGraphNode){dataGraphNode.id=this.nodes.length;dataGraphNode.rendered=false;this.nodes.push(dataGraphNode);this.notifyNode(dataGraphNode);},addEdge:function(nodeA,nodeB){var success=nodeA.addEdge(nodeB,1);if(success){this.notifyEdge(nodeA,nodeB);}}}
var DataGraphNode=function(fixed,mass){this.fixed=fixed;this.mass=mass;this.edges={};this.edgeCount=0;this.addEdge=function(node){if(!(node.id in this.edges)&&!(this.id in node.edges)&&(this.id!=node.id)){this.edgeCount++;this.edges[node.id]=node;return true;}
return false;}}
var Magnet=function(a,b,g,distanceMin){this.init(a,b,g,distanceMin);}
Magnet.prototype={init:function(a,b,g,distanceMin){this['a']=a;this['b']=b;this['g']=g;this['distanceMin']=distanceMin;this['age']=0;this['forceX']=0;this['forceY']=0;},apply:function(){var dx=this.a.positionX-this.b.positionX;var dy=this.a.positionY-this.b.positionY;var distance=Math.sqrt(dx*dx+dy*dy);if(distance==0){return;}else{dx*=(1/distance);dy*=(1/distance);}
var force=this.g*this.a.mass*this.b.mass;if(distance<this.distanceMin){force*=1/(this.distanceMin*this.distanceMin);}else{force*=1/(distance*distance);}
dx*=force;dy*=force;var dfx=dx-this.forceX;var dfy=dy-this.forceY;if(!this.a.fixed&&!this.a.selected){this.a.forceX-=dfx;this.a.forceY-=dfy;}
if(!this.b.fixed&&!this.b.selected){this.b.forceX+=dfx;this.b.forceY+=dfy;}
this.forceX=dx;this.forceY=dy;}}
var Spring=function(a,b,springConstant,dampingConstant,restLength){this.init(a,b,springConstant,dampingConstant,restLength);}
Spring.prototype={init:function(a,b,springConstant,dampingConstant,restLength){this['springConstant']=springConstant;this['damping']=dampingConstant;this['restLength']=restLength;this['a']=a;this['b']=b;this.forceX=0;this.forceY=0;},apply:function(){var dx=this.a.positionX-this.b.positionX;var dy=this.a.positionY-this.b.positionY;var springLength=Math.sqrt(dx*dx+dy*dy);if(springLength==0){dx=0;dy=0;}else{dx*=(1/springLength);dy*=(1/springLength);}
var springForce=-(springLength-this.restLength)*this.springConstant;var vx=this.a.velocityX-this.b.velocityX;var vy=this.a.velocityY-this.b.velocityY;var dampingForce=-this.damping*(dx*vx+dy*vy);var force=springForce+dampingForce;dx*=force;dy*=force;var dfx=dx-this.forceX;var dfy=dy-this.forceY;if(!this.a.fixed&&!this.a.selected){this.a.forceX+=dfx;this.a.forceY+=dfy;}
if(!this.b.fixed&&!this.b.selected){this.b.forceX-=dfx;this.b.forceY-=dfy;}
this.forceX=dx;this.forceY=dy;}}
var Particle=function(mass,positionX,positionY){this.init(mass,positionX,positionY);}
Particle.prototype={init:function(mass,positionX,positionY){this['positionX']=positionX;this['positionY']=positionY;this['originalPositionX']=positionX;this['originalPositionY']=positionY;this['lastDrawPositionX']=0;this['lastDrawPositionY']=0;this['mass']=mass;this['forceX']=0;this['forceY']=0;this['velocityX']=0;this['velocityY']=0;this['originalVelocityX']=0;this['originalVelocityY']=0;this['fixed']=false;this['selected']=false;this['age']=0;this['width']=0;this['height']=0;}}
var ParticleModel=function(view){this.init(view);}
ParticleModel.prototype={init:function(view){this.view=view;this.particles=new Array();this.nextParticleId=0;this.springs=new Array();this.activeSprings=new Array();this.springLast=0;this.magnets=new Array();this.activeMagnets=new Array();this.magLast=0;this.integrator=new RungeKuttaIntegrator(this,view);this.timer=new Timer(10);this.timer.subscribe(this);},tick:function(){this.integrator.step(1);return this.draw();},draw:function(force){var view=this.view;var particles=this.particles;var moved=0;for(var i=0,l=particles.length;i<l;i++){var particle=particles[i];var newDrawPositionX=Math.round(particle.positionX*2)/2;var newDrawPositionY=Math.round(particle.positionY*2)/2;if(newDrawPositionX!=particle.lastDrawPositionX||newDrawPositionY!=particle.lastDrawPositionY||force){view.drawNode(particle,newDrawPositionX,newDrawPositionY);moved++;}
particle.lastDrawPositionX=newDrawPositionX;particle.lastDrawPositionY=newDrawPositionY;}
return moved;},makeParticle:function(mass,x,y){var particle=new Particle(mass,x,y);particle.id=this.nextParticleId++;this.particles.push(particle);this['integrator'].allocateParticle(particle.id);if(this.timer.interupt){this.timer.start();}
return particle;},makeSpring:function(a,b,springConstant,dampingConstant,restLength){var spring=new Spring(a,b,springConstant,dampingConstant,restLength);this.springs.push(spring);this.activeSprings.push(spring);return(spring);},makeMagnet:function(a,b,g,distanceMin){var magnet=new Magnet(a,b,g,distanceMin);this.magnets.push(magnet);this.activeMagnets.push(magnet);if(this.activeMagnets.length>50){this.activeMagnets.shift();}
return magnet;},applyForces:function(){var activeSprings=this.activeSprings;var springs=this.springs;var springLast=this.springLast;var scanLength=parseInt(springs.length/10);for(var i=0,l=activeSprings.length;i<l;i++){activeSprings[i].apply();activeSprings[i].age++;}
var springLen=this.activeSprings.length;if(springLen>0&&this.activeSprings[0].age>20){this.activeSprings.shift();}
for(var i=springLast,t=springLast+scanLength,l=springs.length;i<t&&i<l;i++){springs[i].apply();}
this['springLast']+=scanLength;if(this['springLast']>=springs.length){this['springLast']=0;}
var activeMagnets=this.activeMagnets;var magnets=this.magnets;var magLast=this['magLast']
scanLength=parseInt(magnets.length/10);for(var i=0,l=activeMagnets.length;i<l;i++){activeMagnets[i].apply();activeMagnets[i].age++;}
var magLen=this.activeMagnets.length;if(magLen>0&&this.activeMagnets[0].age>50){this.activeMagnets.shift();}
for(var i=magLast,t=magLast+scanLength,l=magnets.length;i<t&&i<l;i++){magnets[i].apply();}
this['magLast']+=scanLength;if(this['magLast']>=magnets.length){this['magLast']=0;}},reset:function(){var springs=this.springs;for(var i=0,l=springs.length;i<l;i++){springs[i].forceX=0;springs[i].forceY=0;}
var magnets=this.magnets;for(var i=0,l=magnets.length;i<l;i++){magnets[i].forceX=0;magnets[i].forceY=0;}
var particles=this.particles;for(var i=0,l=particles.length;i<l;i++){particles[i].forceX=0;particles[i].forceY=0;}
var particles=this.particles;for(var i=0,l=particles.length;i<l;i++){this.integrator.allocateParticle(i);}
if(this.timer.interupt){this.timer.start();}},update:function(){var moved=this.tick();var result=1;if(this.particles.length>2){var e=(moved/(this.particles.length));if(e<.1){this.stop();}else if(e<.2){return(1000);}else if(e<.4){return(200);}
return(1);}
return result;},start:function(){this.timer.start();},stop:function(){this.timer.stop();},clear:function(){this.particles=new Array();this.nextParticleId=0;this.springs=new Array();this.activeSprings=new Array();this.springLast=0;this.magnets=new Array();this.activeMagnets=new Array();this.magLast=0;this.view.clear();this.integrator.initialize(this,this.view);}}
var Timer=function(timeout){this.init(timeout);};Timer.prototype={init:function(timeout){this['timer'];this['TIMEOUT']=timeout;this['BASE_TIMEOUT']=timeout;this['interupt']=true;this['subscribers']=new Array();this['ontimeout']=new EventHandler(this,function(){this.notify();if(!this.interupt){this.start();}});},start:function(){this['interupt']=false;this['timer']=window.setTimeout(this.ontimeout,this['TIMEOUT']);},stop:function(){this['interupt']=true;},subscribe:function(observer){this.subscribers.push(observer);},notify:function(){for(var i=0;i<this.subscribers.length;i++){var entropy=this.subscribers[i].update();if(entropy!=null){this['TIMEOUT']=entropy;}}}}
var EventHandler=function(_caller,_handler){var args=new Array();for(var i=2;i<arguments.length;i++){args.push(arguments[i]);}
return(function(e){if(e){args.push(e);}
_handler.apply(_caller,args);});};var HTMLGraphView=function(frameLeft,frameTop,frameWidth,frameHeight,skewView,ownerElement){this.initialize(frameLeft,frameTop,frameWidth,frameHeight,skewView,ownerElement);};HTMLGraphView.prototype={findPosXY:function(obj){var curleft=0;var curtop=0;var parent;while(parent=obj.offsetParent){curleft+=obj.offsetLeft;curtop+=obj.offsetTop;obj=parent;}
return{'left':curleft,'top':curtop};},recalculateOwnerOffset:function(){if(this.ownerElement){var pos=this.findPosXY(this.ownerElement);this.ownerOffsetX=pos.left;this.ownerOffsetY=pos.top;}else{this.ownerOffsetX=0;this.ownerOffsetY=0;}},initialize:function(frameLeft,frameTop,frameWidth,frameHeight,skewView,ownerElement){this.frameLeft=frameLeft;this.frameTop=frameTop;this.skewView=skewView;this.ownerElement=ownerElement;if(ownerElement){var pos=this.findPosXY(ownerElement);this.ownerOffsetX=pos.left;this.ownerOffsetY=pos.top;}else{this.ownerOffsetX=0;this.ownerOffsetY=0;}
this['nodes']={};if(skewView){this.skew=frameWidth/frameHeight;}else{this.skew=1;}
this['edges']={};this.setSize(frameWidth,frameHeight);this.defaultEdgeProperties={'pixelColor':'#c4c4c4','pixelWidth':'2px','pixelHeight':'2px','pixels':4}},setSize:function(frameWidth,frameHeight){this.frameWidth=frameWidth;this.frameHeight=frameHeight;this.centerX=parseInt(frameWidth/2)+0;this.centerY=parseInt(frameHeight/2);if(this.skewView){this.skew=frameWidth/frameHeight;}else{this.skew=1;}},addNode:function(particle,domElement,centerOffsetX,centerOffsetY){if(this.ownerElement){this.ownerElement.appendChild(domElement);}else{document.body.appendChild(domElement);}
domElement.style.zIndex=10;if(centerOffsetX==null){centerOffsetX=parseInt(domElement.offsetWidth/2);}
if(centerOffsetY==null){centerOffsetY=parseInt(domElement.offsetHeight/2);}
this.nodes[particle.id]={domElement:domElement,centerX:centerOffsetX,centerY:centerOffsetY}
this.drawNode(particle);return domElement;},addEdge:function(particleA,particleB,edgeProperties){if(!this['edges'][particleA.id]){this['edges'][particleA.id]={};}
if(!this['edges'][particleA.id][particleB.id]){var edgePixels=new Array();if(!edgeProperties){edgeProperties=this.defaultEdgeProperties;}
var pixelCount=edgeProperties.pixels;for(var k=0,l=pixelCount;k<l;k++){var pixel=document.createElement('div');pixel.style.width=edgeProperties.pixelWidth;pixel.style.height=edgeProperties.pixelHeight;pixel.style.backgroundColor=edgeProperties.pixelColor;pixel.style.position='absolute';pixel.style.margin='0px';pixel.style.padding='0px';pixel.innerHTML="<img height=1 width=1/>";edgePixels.push(pixel);if(this.ownerElement){this.ownerElement.appendChild(pixel);}else{document.body.appendChild(pixel);}}
this['edges'][particleA.id][particleB.id]={source:particleA,target:particleB,edge:edgePixels}
return edgePixels;}else{return this['edges'][particleA.id][particleB.id].edge;}},drawNode:function(particle){var domNodeProps=this['nodes'][particle.id];if(domNodeProps){var domNode=domNodeProps.domElement;domNode.style.left=(particle.positionX*this.skew)+this.centerX-domNodeProps.centerX+'px';domNode.style.top=particle.positionY+this.centerY-domNodeProps.centerY+'px';var e=this.edges[particle.id];for(var t in e){this.drawEdge(particle,e[t]['target']);}}},drawEdge:function(nodeI,nodeJ){var dx=nodeI.positionX-nodeJ.positionX;var dy=nodeI.positionY-nodeJ.positionY;var distance=Math.sqrt(dx*dx+dy*dy);var pixels=this['edges'][nodeI.id][nodeJ.id]['edge'];for(var k=0,l=pixels.length;k<l;k++){var p=(distance/l)*k;pixels[k].style.left=parseInt(nodeI.positionX+(-1)*p*(dx/distance))*this.skew+this.centerX+'px';pixels[k].style.top=parseInt(nodeI.positionY+(-1)*p*(dy/distance)+this.centerY)+'px';}},clear:function(){for(var e in this.edges){for(var eb in this.edges[e]){for(var i=0,l=this.edges[e][eb].edge.length;i<l;i++){if(this.ownerElement){this.ownerElement.removeChild(this.edges[e][eb].edge[i]);}else{document.body.removeChild(this.edges[e][eb].edge[i]);}}}}
this.edges={};for(var n in this.nodes){if(this.ownerElement){this.ownerElement.removeChild(this.nodes[n].domElement);}else{document.body.removeChild(this.nodes[n].domElement);}}
this.nodes={};}}
var RungeKuttaIntegrator=function(particleModel,view){this.initialize(particleModel,view);};RungeKuttaIntegrator.prototype={initialize:function(particleModel,view){this.particleModel=particleModel;this.particles=particleModel.particles;this.view=view;this.setSize(view.frameWidth,view.frameHeight,view.skew);this.k1ForcesX=new Array();this.k2ForcesX=new Array();this.k3ForcesX=new Array();this.k4ForcesX=new Array();this.k1ForcesY=new Array();this.k2ForcesY=new Array();this.k3ForcesY=new Array();this.k4ForcesY=new Array();this.k1VelocitiesX=new Array();this.k2VelocitiesX=new Array();this.k3VelocitiesX=new Array();this.k4VelocitiesX=new Array();this.k1VelocitiesY=new Array();this.k2VelocitiesY=new Array();this.k3VelocitiesY=new Array();this.k4VelocitiesY=new Array();},setSize:function(frameWidth,frameHeight,skew){this.boundsLeft=(-frameWidth/2)/skew;this.boundsRight=(frameWidth/2)/skew;this.boundsTop=-frameHeight/2;this.boundsBottom=frameHeight/2;},allocateParticle:function(i){this.k1ForcesX[i]=0;this.k2ForcesX[i]=0;this.k3ForcesX[i]=0;this.k4ForcesX[i]=0;this.k1ForcesY[i]=0;this.k2ForcesY[i]=0;this.k3ForcesY[i]=0;this.k4ForcesY[i]=0;this.k1VelocitiesX[i]=0;this.k2VelocitiesX[i]=0;this.k3VelocitiesX[i]=0;this.k4VelocitiesX[i]=0;this.k1VelocitiesY[i]=0;this.k2VelocitiesY[i]=0;this.k3VelocitiesY[i]=0;this.k4VelocitiesY[i]=0;},step:function(){var particles=this.particles;var k1ForcesX=this.k1ForcesX;var k2ForcesX=this.k2ForcesX;var k3ForcesX=this.k3ForcesX;var k4ForcesX=this.k4ForcesX;var k1ForcesY=this.k1ForcesY;var k2ForcesY=this.k2ForcesY;var k3ForcesY=this.k3ForcesY;var k4ForcesY=this.k4ForcesY;var k1VelocitiesX=this.k1VelocitiesX;var k2VelocitiesX=this.k2VelocitiesX;var k3VelocitiesX=this.k3VelocitiesX;var k4VelocitiesX=this.k4VelocitiesX;var k1VelocitiesY=this.k1VelocitiesY;var k2VelocitiesY=this.k2VelocitiesY;var k3VelocitiesY=this.k3VelocitiesY;var k4VelocitiesY=this.k4VelocitiesY;for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){particles[i].originalPositionX=particles[i].positionX;particles[i].originalPositionY=particles[i].positionY;particles[i].originalVelocityX=particles[i].velocityX/2;particles[i].originalVelocityY=particles[i].velocityY/2;}}
this.particleModel.applyForces();for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){k1ForcesX[i]=particles[i].forceX;k1ForcesY[i]=particles[i].forceY;k1VelocitiesX[i]=particles[i].velocityX;k1VelocitiesY[i]=particles[i].velocityY;}}
for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){particles[i].positionX=particles[i].originalPositionX+k1VelocitiesX[i]*0.5;particles[i].positionY=particles[i].originalPositionY+k1VelocitiesY[i]*0.5;particles[i].velocityX=particles[i].originalVelocityX+(k1ForcesX[i]*0.5)/particles[i].mass;particles[i].velocityY=particles[i].originalVelocityY+(k1ForcesY[i]*0.5)/particles[i].mass;}}
this.particleModel.applyForces();for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){k2ForcesX[i]=particles[i].forceX;k2ForcesY[i]=particles[i].forceY;k2VelocitiesX[i]=particles[i].velocityX;k2VelocitiesY[i]=particles[i].velocityY;}}
for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){particles[i].positionX=particles[i].originalPositionX+k2VelocitiesX[i]*0.5;particles[i].positionY=particles[i].originalPositionY+k2VelocitiesY[i]*0.5;particles[i].velocityX=particles[i].originalVelocityX+(k2ForcesX[i]*0.5)/particles[i].mass;particles[i].velocityY=particles[i].originalVelocityY+(k2ForcesY[i]*0.5)/particles[i].mass;}}
this.particleModel.applyForces();for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){k3ForcesX[i]=particles[i].forceX;k3ForcesY[i]=particles[i].forceY;k3VelocitiesX[i]=particles[i].velocityX;k3VelocitiesY[i]=particles[i].velocityY;}}
for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){particles[i].positionX=particles[i].originalPositionX+k3VelocitiesX[i];particles[i].positionY=particles[i].originalPositionY+k3VelocitiesY[i];particles[i].velocityX=particles[i].originalVelocityX+(k3ForcesX[i])/particles[i].mass;particles[i].velocityY=particles[i].originalVelocityY+(k3ForcesY[i])/particles[i].mass;}}
this.particleModel.applyForces();for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){k4ForcesX[i]=particles[i].forceX;k4ForcesY[i]=particles[i].forceY;k4VelocitiesX[i]=particles[i].velocityX;k4VelocitiesY[i]=particles[i].velocityY;}}
for(var i=0,l=particles.length;i<l;i++){if(!particles[i].fixed&&!particles[i].selected){particles[i].positionX=particles[i].originalPositionX
+(1/6)*(k1VelocitiesX[i]+2*k2VelocitiesX[i]+2*k3VelocitiesX[i]+k4VelocitiesX[i]);particles[i].positionY=particles[i].originalPositionY
+(1/6)*(k1VelocitiesY[i]+2*k2VelocitiesY[i]+2*k3VelocitiesY[i]+k4VelocitiesY[i]);if(particles[i].positionX<this.boundsLeft+(this.view.nodes[particles[i].id].centerX)){particles[i].positionX=this.boundsLeft+(this.view.nodes[particles[i].id].centerX);}else if(particles[i].positionX>(this.boundsRight-(particles[i].width/2))){particles[i].positionX=this.boundsRight-(particles[i].width/2);}
if(particles[i].positionY<this.boundsTop+(this.view.nodes[particles[i].id].centerY)){particles[i].positionY=this.boundsTop+(this.view.nodes[particles[i].id].centerY);}else if(particles[i].positionY>(this.boundsBottom-(this.view.nodes[particles[i].id].centerY))){particles[i].positionY=this.boundsBottom-(this.view.nodes[particles[i].id].centerY);}
particles[i].velocityX=particles[i].originalVelocityX
+(1/(6*particles[i].mass))*(k1ForcesX[i]+2*k2ForcesX[i]+2*k3ForcesX[i]+k4ForcesX[i]);particles[i].velocityY=particles[i].originalVelocityY
+(1/(6*particles[i].mass))*(k1ForcesY[i]+2*k2ForcesY[i]+2*k3ForcesY[i]+k4ForcesY[i]);}}}}
var Control=function(particleModel,view){this.initialize(particleModel,view);}
Control.prototype={initialize:function(particleModel,view){this.particleModel=particleModel;this.view=view;this.isOpera=navigator.userAgent.indexOf('Opera')!=-1;this.selectedParticle=null;window.onresize=new EventHandler(this,this.handleResizeEvent);if(window.Event){if(typeof document.captureEvents=='function'){document.captureEvents(Event.MOUSEMOVE);}}
if(this.view.ownerElement){this.view.ownerElement.onmousemove=new EventHandler(this,this.handleMouseMoveEvent);}else{document.onmousemove=new EventHandler(this,this.handleMouseMoveEvent);}
document.onmouseup=new EventHandler(this,this.handleMouseUpEvent);},handleResizeEvent:function(){var FRAME_WIDTH;var FRAME_HEIGHT;if(this.view.ownerElement){var graphPane=this.view.ownerElement;var graphStyle=graphPane.style;FRAME_WIDTH=document.layers?graphPane.clip.width:(graphPane.offsetWidth||graphStyle.pixelWidth||0);FRAME_HEIGHT=parseInt(graphStyle.height);}else{if(document.all){FRAME_WIDTH=document.body.offsetWidth-5;FRAME_HEIGHT=document.documentElement.offsetHeight-5;}else{FRAME_WIDTH=window.innerWidth-5;FRAME_HEIGHT=window.innerHeight-5;}}
if(FRAME_WIDTH>10){FRAME_WIDTH-=10;}
this.view.setSize(FRAME_WIDTH,FRAME_HEIGHT);this.particleModel.integrator.setSize(FRAME_WIDTH,FRAME_HEIGHT,this.view.skew);this.particleModel.draw(true);},handleMouseMoveEvent:function(e){if(this.selected&&!this.particleModel.particles[this.selected].fixed){e=arguments[arguments.length-1];var mouseX;var mouseY;if(window.Event){if(typeof e!='undefined'){mouseX=e.pageX;mouseY=e.pageY;}else{mouseX=event.x;mouseY=event.y;}}else{mouseX=event.clientX;mouseY=event.clientY;}
mouseX-=this.view.centerX;mouseY-=this.view.centerY;var scrollLeft=0;var scrollTop=0;if(document.all){if(this.isOpera){scrollLeft=0;scrollTop=0;}else{var iebody=(document.compatMode&&document.compatMode!="BackCompat")?document.documentElement:document.body;scrollLeft=iebody.scrollLeft;scrollTop=iebody.scrollTop;}}
this.particleModel.particles[this.selected].positionX=mouseX/this.view.skew-this.view.ownerOffsetX+scrollLeft;this.particleModel.particles[this.selected].positionY=mouseY-this.view.ownerOffsetY+scrollTop;this.particleModel.tick();}},handleMouseUpEvent:function(){if(this.selected){this.particleModel.particles[this.selected].selected=false;this.particleModel.reset();this.selected=null;}},handleMouseDownEvent:function(id){this.selected=id;this.particleModel.particles[id].selected=true;}}
// Copyright 2008 Press Net Japan (http://www.47news.jp). All rights reserved.
var urlPrefix='http://www.47news.jp/blog/';var mode='firstrun';var graphView;var buildTimer;var dataGraph;var nodeHandler;var particleModel;var rootNode;var initKeyword='index';var currentKeyword;var btModeNames={'hotwords':'旬ワード','name':'人物','geo':'地域','org':'組織','iptc':'カテゴリ','topics':'トピックス','flash':'Kyodo News 速報'};var btModeOrder=['hotwords','name','geo','org','iptc','topics','flash'];function initGraph(){var graphPane=document.getElementById('bt_graphPane');var graphStyle=graphPane.style;var FRAME_WIDTH=document.layers?graphPane.clip.width:(graphPane.offsetWidth||graphStyle.pixelWidth||0);var FRAME_HEIGHT=parseInt(graphStyle.height);var offsetXY=findPosXY(graphPane);if(FRAME_WIDTH>55){FRAME_WIDTH-=55;}
if(false){graphView=new SVGGraphView(offsetXY.left,offsetXY.top,FRAME_WIDTH,FRAME_HEIGHT);}else{graphView=new HTMLGraphView(0,0,FRAME_WIDTH,FRAME_HEIGHT,false,graphPane);}
particleModel=new ParticleModel(graphView);particleModel.start();var control=new Control(particleModel,graphView);dataGraph=new DataGraph();nodeHandler=new NodeHandler(dataGraph,particleModel,graphView,control);dataGraph.subscribe(nodeHandler);buildTimer=new Timer(20);}
function clearGraph(){particleModel.clear();}
function startGraph(){buildTimer.subscribe(nodeHandler);buildTimer.start();particleModel.start();}
function stopGraph(){particleModel.stop();nodeHandler.clearQueue();buildTimer.stop();buildTimer.init();}
function makeRootNode(text,dataGraph){var rootNode=new DataGraphNode(true);rootNode.mass="3";rootNode.color="#dddddd";rootNode.text=text;dataGraph.addNode(rootNode);return rootNode;}
function addChild(text,rootNode,dataGraph){var node=new DataGraphNode(false);node.parent=rootNode;node.mass="3";node.color="#90ee90";node.text=text;dataGraph.addNode(node);}
function findPosXY(obj){var curleft=0;var curtop=0;var parent;while(parent=obj.offsetParent){curleft+=obj.offsetLeft;curtop+=obj.offsetTop;obj=parent;}
return{'left':curleft,'top':curtop};}
var NodeHandler=function(dataGraph,particleModel,view,control){this.dataGraph=dataGraph;this.particleModel=particleModel;this.view=view;this.control=control;this.queue=new Array();this['newDataGraphNode']=function(dataGraphNode){this.enqueueNode(dataGraphNode);}
this['newDataGraphEdge']=function(nodeA,nodeB){}
this['clearQueue']=function(){this.queue=new Array();}
this['enqueueNode']=function(dataGraphNode){this.queue.push(dataGraphNode);}
this['dequeueNode']=function(){var node=this.queue.shift();if(node){this.addParticle(node);}}
this.update=function(){if(this.queue.length==0){return;}
this.dequeueNode();}
this['addParticle']=function(dataGraphNode){particle=this.particleModel.makeParticle(dataGraphNode.mass,0,0);if(false){var bubble=document.createElementNS("http://www.w3.org/2000/svg","circle");bubble.setAttribute('stroke','#888888');bubble.setAttribute('stroke-width','.25px');bubble.setAttribute('fill',dataGraphNode.color);bubble.setAttribute('r',6+'px');var bubbleText=document.createElementNS("http://www.w3.org/2000/svg","text");var bubbleTextData=document.createTextNode(dataGraphNode.text);bubbleText.setAttributeNS(null,"x","0");bubbleText.setAttributeNS(null,"y","0");bubbleText.setAttributeNS(null,"fill","green");bubbleText.setAttributeNS(null,"text-anchor","middle");bubbleText.appendChild(bubbleTextData);bubble.onmousedown=new EventHandler(control,control.handleMouseDownEvent,particle.id)
bubbleText.onmousedown=new EventHandler(control,control.handleMouseDownEvent,particle.id);var viewNode=this.view.addNode(particle,bubbleText);}else{var bubble=document.createElement('div');bubble.style.position="absolute";bubble.style.width="12px";bubble.style.height="12px";bubble.style.zIndex=100;bubble.innerHTML=['<nobr>',dataGraphNode.text,'</nobr>'].join('');bubble.onmousedown=new EventHandler(control,control.handleMouseDownEvent,particle.id)
var viewNode=this.view.addNode(particle,bubble);}
if(dataGraphNode.fixed){particle.fixed=true;}
var rx=Math.random()*2-1;var ry=Math.random()*2-1;particle.positionX=rx;particle.positionY=ry;if(dataGraphNode.parent){particle.positionX=dataGraphNode.parent.particle.positionX+rx;particle.positionY=dataGraphNode.parent.particle.positionY+ry;particleModel.makeSpring(particle,dataGraphNode.parent.particle,.2,.2,10);var props;if(false){props={'stroke':dataGraphNode.parent.color,'stroke-width':'2px','stroke-dasharray':'2,4'}}else{props={'pixelColor':'#cccccc','pixelWidth':'2px','pixelHeight':'2px','pixels':5}}
this.view.addEdge(particle,dataGraphNode.parent.particle,props);}
for(var j=0,l=this.particleModel.particles.length;j<l;j++){if(this.particleModel.particles[j]!=particle){this.particleModel.makeMagnet(particle,this.particleModel.particles[j],-2000,10);}}
dataGraphNode.particle=particle;particle.width=12;particle.height=12;dataGraphNode.viewNode=viewNode;return dataGraphNode;}}
function btsl(url,title){}
function loadHTMLFile(fName){var s=document.createElement('script');s.setAttribute('type','text/javascript');s.setAttribute('src',[urlPrefix,'html2innerhtml.php?d=bt_result&s=',fName,'&t=',new Date().getTime()].join(''));s.setAttribute('charset','utf-8');document.body.appendChild(s);}
function loadHTMLFile3(fName){var s=document.createElement('script');s.setAttribute('type','text/javascript');s.setAttribute('src',[urlPrefix,'html2innerhtml.php?d=bt_result3&s=',fName,'&t=',new Date().getTime()].join(''));s.setAttribute('charset','utf-8');document.body.appendChild(s);}
function loadGraph(w){var s=document.createElement('script');s.setAttribute('type','text/javascript');s.setAttribute('src',[urlPrefix,'loadgraphjs_v2.php?s=',w,'&t=',new Date().getTime()].join(''));s.setAttribute('charset','utf-8');document.body.appendChild(s);}
function setCurrentKeyword(keyword){var permLink=document.getElementById('permanent_link');if(permLink){permLink.href=urlPrefix+'press.html?key='+encodeURIComponent(keyword);}}
function loadGraphPane(category){var w1=null;setCurrentKeyword(category);if(mode=='iptc'){w1="GRA_IPTC/"+encodeURIComponent(category)+".html";}else if(mode=='geo'){w1="GRA_GEO/"+encodeURIComponent(category)+".html";}else if(mode=='access'){}else if(mode=='topics'){}else if(mode=='flash'){}else if(mode=='name'){w1="GRA_NAME/"+encodeURIComponent(category)+".html";}else if(mode=='org'){w1="GRA_ORG/"+encodeURIComponent(category)+".html";}else{w1="GRA/"+encodeURIComponent(category)+".html";}
if(w1){loadGraph(w1);}
loadCategory(category);}
function setMode(set){mode=set;var btModeOrderLength=btModeOrder.length;for(var i=0;i<btModeOrderLength;i++){if(mode==btModeOrder[i]){document.getElementById(['link_',mode].join('')).innerHTML=['■',btModeNames[mode]].join('');}else{document.getElementById(['link_',btModeOrder[i]].join('')).innerHTML=['□',btModeNames[btModeOrder[i]]].join('');}}
if(mode!='hotwords'){document.getElementById('link_fullscreen').href=[urlPrefix,'press.html?',mode].join('');}else{document.getElementById('link_fullscreen').href=[urlPrefix,'press.html'].join('');}
initBlogTool();}
function loadCategory(category){var w2=null;if(mode=='iptc'){w2="OUT_IPTC/"+encodeURIComponent(category)+".html";}else if(mode=='geo'){w2="OUT_GEO/"+encodeURIComponent(category)+".html";}else if(mode=='access'){}else if(mode=='topics'){}else if(mode=='flash'){}else if(mode=='name'){w2="OUT_NAME/"+encodeURIComponent(category)+".html";}else if(mode=='org'){w2="OUT_ORG/"+encodeURIComponent(category)+".html";}else{w2="OUT/"+encodeURIComponent(category)+".html";}
if(w2){loadHTMLFile3(w2);}}
function initBlogTool(){if(mode=='iptc'){loadHTMLFile('top30_IPTC.html');}else if(mode=='geo'){loadHTMLFile('top30_GEO.html');}else if(mode=='access'){loadHTMLFile('top30_CLICK.html');}else if(mode=='topics'){loadHTMLFile('top30_TOPICS.html');}else if(mode=='flash'){loadHTMLFile('top30_FLASH.html');}else if(mode=='name'){loadHTMLFile('top30_NAME.html');}else if(mode=='org'){loadHTMLFile('top30_ORG.html');}else{loadHTMLFile('top30.html');}
if(!particleModel){initGraph();}
if(mode=='access'||mode=='topics'||mode=='flash'){stopGraph();clearGraph();document.getElementById('bt_graphPane').display='none';document.getElementById('bt_graphPane').style.border='0px solid white';document.getElementById('bt_graphPane').style.height='1px';document.getElementById('bt_poweredby').innerHTML='';document.getElementById('bt_result3').innerHTML='';document.getElementById('bt_result3').display='none';}else{document.getElementById('bt_graphPane').display='block';document.getElementById('bt_graphPane').style.border='1px solid #888888';document.getElementById('bt_graphPane').style.height='200px';document.getElementById('bt_poweredby').innerHTML='Powered by <a href="http://kylescholz.com" target="_blank">Kyle Scholz</a>';document.getElementById('bt_result3').display='block';if(initKeyword){loadGraphPane(initKeyword);initKeyword=null;}else{loadGraphPane('index');}}}
function showPermanentLink(){location.search=['?key=',encodeURIComponent(currentKeyword)].join('');}
var bt_origOnLoad=window.onload;window.onload=function(){if(location.search.indexOf('key=')!=-1){if(location.search.search(/key=(.*?)(?:&|$)/)){initKeyword=decodeURIComponent(RegExp.$1);}}
if(location.search.indexOf('?iptc')!=-1){setMode('iptc');}else if(location.search.indexOf('?geo')!=-1){setMode('geo');}else if(location.search.indexOf('?access')!=-1){setMode('access');}else if(location.search.indexOf('?topics')!=-1){setMode('topics');}else if(location.search.indexOf('?flash')!=-1){setMode('flash');}else if(location.search.indexOf('?name')!=-1){setMode('name');}else if(location.search.indexOf('?org')!=-1){setMode('org');}else{setMode('hotwords');}
if(bt_origOnLoad){bt_origOnLoad.apply(this,arguments);}};var btBuf=[];var btModeOrderLength=btModeOrder.length;for(var i=0;i<btModeOrderLength;i++){if(btBuf!=''){btBuf[btBuf.length]=' ';}
btBuf.push('<a href="javascript:void(0)" onclick="setMode(\'',btModeOrder[i],'\');return false;"><span id="link_',btModeOrder[i],'">□',btModeNames[btModeOrder[i]],'</span></a>');}
document.write(['<link rel="stylesheet" type="text/css" href="http://img.47news.jp/blog/common.css"><style type="text/css">html{filter:expression(document.execCommand("BackgroundImageCache",false,true))}</style>','<table align="center" id="bt_rssbox" width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td bgcolor="#FFF9EF"><div class="bt_catetitle" align="center"><img src="http://img.47news.jp/blog/images/wordRankingTitle.gif" usemap="#map_title" border=0><map name="map_title"><area shape="rect" coords="0,0,184,30" alt="47NEWS" href="http://www.47news.jp/"><area shape="rect" coords="185,0,211,30" alt="DIGRAPH" href="',urlPrefix,'DIGRAPH.PNG"><area shape="rect" coords="212,0,238,30" alt="Maximize" href="',urlPrefix,'press.html" id="link_fullscreen"></map></div></td></tr>','<tr><td bgcolor="#FFF9EF"><div class="normalTxt" style="font-size:8pt;border-style:none none solid none;border-width:1px;border-color:silver;margin-bottom:4px">',btBuf.join(''),'</div></td></tr>','<tr><td bgcolor="#FFF9EF"><div class="normalTxt" id="bt_result"></div></td></tr>','<tr><td bgcolor="#FFF9EF"><div class="newstxt" id="bt_cate1" style="font-size:10pt;line-height:140%;"><div id="bt_graphPane" style="border:1px solid #888888;position:relative;overflow:hidden;height:200px;margin-left:-1px"></div><div id="bt_poweredby" class="poweredby" align=right>Powered by <a href="http://kylescholz.com" target=_blank>Kyle Scholz</a></div></div></td></tr>','<tr><td bgcolor="#FFF9EF" style="padding-top:8px"><div class="normalTxt" id="bt_result3"></div></td></tr></table>'].join(''));btBuf=null;
