Mercurial > hg > Members > nobuyasu > TwitterBootstrap
view viewer/ishida/DimViewerV2.html @ 14:595ea7792a42 draft default tip
add ishida's files and scenario.json
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 Sep 2012 15:01:42 +0900 |
parents | |
children |
line wrap: on
line source
<script> function PopNode(title,content,color){ var element=document.createElement("div"); this.element=element; element.className='node' element.innerHTML="<div class='nodeFocus'></div><div class='nodePoint'></div><div class='popup'><center></center><pre></pre></div>" var point=element.childNodes[1]; point.style.backgroundColor=color; element.lastChild.firstChild.textContent=title; point.textContent=title; element.lastChild.lastChild.textContent=content; var showhideInfo=this.showhideInfo={cnt:0,speed:0}; var obj=this; point.onclick=function(){ obj.onMarkClick(); } var func=function(){ showhideInfo.cnt+=showhideInfo.speed; if(showhideInfo.cnt<=0&&showhideInfo.speed<0){ showhideInfo.speed=0; showhideInfo.cnt=0; element.lastChild.style.opacity=0; element.lastChild.style.display="none"; }else if(showhideInfo.cnt>=10&&showhideInfo.speed>0){ showhideInfo.speed=0; showhideInfo.cnt=10; element.lastChild.style.display="block"; element.lastChild.style.opacity=1; }else{ element.lastChild.style.display="block"; element.lastChild.style.opacity=Math.min(showhideInfo.cnt/10,1); setTimeout(func,10); } } this.showhideFunc=func; element.onmouseover=function(){ obj.show(); } element.onmouseout=function(e){ var e=e.relatedTarget; while(e){ if(e==element)return; e=e.parentNode; } obj.hide(); } this.setLocation(0,0); } PopNode.prototype.showhide=function(d){ if(this.showhideInfo.speed)this.showhideInfo.speed=d; else{ this.showhideInfo.speed=d; this.showhideFunc(); } } PopNode.prototype.hide=function(){this.showhide(-1);}; PopNode.prototype.show=function(){this.showhide(1);}; PopNode.prototype.onMarkClick=function(){}; PopNode.prototype.setLocation=function(x,y){ this.x=x;this.y=y; this.element.style.left=x; this.element.style.top=y; } PopNode.prototype.appendTo=function(parent){parent.appendChild(this.element)}; PopNode.prototype.remove=function(){if(this.element.parentNode)this.element.parentNode.removeChild(this.element)} PopNode.prototype.setTarget=function(flag){ var e=this.element; if(flag)e.firstChild.style.display='block';//'0 0 100px black' else e.firstChild.style.display='none'; } function genRandString(){ var s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; var str=""; for(var len=12*Math.random();len>=0;len--)str+=s[Math.floor(s.length*Math.random())]; return str; } function genRandLine(){ var arr=[]; for(var len=6*Math.random();len>=0;len--)arr.push(genRandString()); return arr.join(" "); } var rootNode; var targetNode; function MyNode(level,childlength,parent){ var obj=this; if(parent)this.parent=parent; this.childs=[]; var len=Math.random()*childlength; if(level)for(var i=0;i<len;i++)this.childs[i]=new MyNode(level-1,childlength,this); var title=genRandString(); var content=genRandLine()+"\n"+genRandLine(); this.agreeInfo={ok:[],ng:[],pend:[]}; for(var i=0;i<userList.length;i++){ var uname=userList[i].name; var rnd=(1234*title.charCodeAt(title.length-1-i%title.length)*Math.cos(9876*i)+9876*title.charCodeAt(i%title.length)*Math.sin(1234*i)); rnd-=Math.floor(rnd); while(rnd<0)rnd++; while(rnd>1)rnd--; if(rnd<0.5)continue; else if(rnd<0.55)this.agreeInfo.pend.push(uname); else if(rnd<0.998)this.agreeInfo.ok.push(uname); else this.agreeInfo.ng.push(uname); } this.calcAgreeInfo(); this.color={ng:'red',ok:'blue',pend:'black'}[this.agreeInfo.status]; var bgcolor={ng:'red',ok:'blue',pend:'gray'}[this.agreeInfo.status]; var pnode=this.pnode=new PopNode(title,content,bgcolor); this.childshown=false; this.pnode.onMarkClick=function(){ if(targetNode)targetNode.setTarget(false); (targetNode=obj).setTarget(true); if(obj.parent)obj.parent.closeGrandChilds(obj); // obj.closeGrandChilds(); var len=obj.childs.length; for(var i=0;i<len;i++){ var p=obj.childs[i].pnode; p.appendTo(pnode.element.parentNode); var x2=pnode.x-(i-(len-1)/2)*100,y2=pnode.y+200; p.setLocation(x2,y2); } obj.childshown=!obj.childshown; redrawLine(); updateUserColor(obj.agreeInfo); } } MyNode.prototype.closeGrandChilds=function(except){ for(var i=0;i<this.childs.length;i++){ if(this.childs[i]!=except)this.childs[i].closeChilds(); } } MyNode.prototype.closeChilds=function(except){ for(var i=0;i<this.childs.length;i++){ if(this.childs[i]!=except){ this.childs[i].closeChilds(); this.childs[i].pnode.remove(); } } this.childshown=false; } MyNode.prototype.setTarget=function(flag){ this.pnode.setTarget(flag); } MyNode.prototype.drawLineRecursive=function(){ for(var i=0;i<this.childs.length;i++){ var child=this.childs[i]; if(child.pnode.element.parentNode){ drawArrow(this.pnode.x+40,this.pnode.y+30,child.pnode.x+40,child.pnode.y+30,child.color); child.drawLineRecursive(); } } } MyNode.prototype.calcAgreeInfo=function(){ if(this.agreeInfo.status)return this.agreeInfo.status; var agreePend=false; var agreeNG=false; for(var i=0;i<this.childs.length;i++){ var result=this.childs[i].calcAgreeInfo(); if(result=='ok')agreePend=true; if(result=='ng')agreeNG=true; } if(this.agreeInfo.ng.length)agreeNG=true; if(this.agreeInfo.pend.length)agreePend=true; this.agreeInfo.status=agreeNG?'ng':agreePend?'pend':'ok'; return this.agreeInfo.status; } function redrawLine(){ clearCanvas(); rootNode.drawLineRecursive(); } var userList=[]; function UserItem(name){ this.name=name; var element=document.createElement("div"); this.element=element; element.textContent=name; element.className="userItem-none"; } function updateUserColor(info){ console.log(info) var arrok=info.ok,arrng=info.ng,arrpend=info.pend; var map={}; for(var i=0;i<arrok.length;i++)map[arrok[i]]='ok'; for(var i=0;i<arrng.length;i++)map[arrng[i]]='ng'; for(var i=0;i<arrpend.length;i++)map[arrpend[i]]='pend'; for(var i=0;i<userList.length;i++){ var u=userList[i]; u.setType(map[u.name]||'none'); } } UserItem.prototype.appendTo=function(parent){parent.appendChild(this.element)} UserItem.prototype.setType=function(mode){this.element.className="userItem-"+mode} onload=function(){ var listdiv=document.getElementById("userList"); for(var i=0;i<10;i++){ var u=new UserItem(i+genRandString()); u.appendTo(listdiv); userList.push(u); } var mn=new MyNode(3,6); mn.pnode.setLocation(512-40,100); mn.pnode.appendTo(document.getElementById("graphMain")); rootNode=mn; } var g,canvas; function clearCanvas(){ if(!g){ canvas=document.getElementsByTagName("canvas")[0]; g=canvas.getContext("2d"); } g.clearRect(0,0,canvas.width,canvas.height); } function drawArrow(x1,y1,x2,y2,color){ if(!g){ canvas=document.getElementsByTagName("canvas")[0]; g=canvas.getContext("2d"); } g.beginPath(); g.moveTo(x1,y1); g.lineTo(x2,y2); g.strokeStyle=color g.stroke(); } </script> <style> #graph{position:absolute;left:0;top:0;} #graphmain{position:absolute;left:0;top:0;} div.node{ position:absolute; } div.nodeFocus{ z-index:0; position:absolute;left:-10;top:-10; width:80px;height:50px;border-radius:18px; border:10px solid black; display:none; } div.nodePoint{ z-index:0; position:absolute;left:0;top:0; background:gray; width:80px;height:50px;border-radius:8px; font-size:32px;line-height:50px;overflow:hidden;text-align:center; cursor:pointer; } div.popup{ z-index:10; display:none; position:absolute;left:-60px;top:40px; width:200px;height:160px;border-radius:8px;background:white;border:4px solid silver; } div.popup center{ position:absolute;left:10px;top:10px; background:#eef; width:180px;height:40px;line-height:40px;font-size:32px; overflow:hidden; } div.popup pre{ margin:0;padding:0; position:absolute; left:10px;top:60px;width:180px;height:90px; overflow:scroll; } #userList{ position:fixed;right:0;top:0;width:200px;height:100%;overflow-x:hidden;overflow-y:scroll; } div.userItem-none,div.userItem-pend,div.userItem-ok,div.userItem-ng{ border-radius:4px; font-size:32px; line-height:40px; margin:4px 0; } div.userItem-none{ background:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#ddf)); color:#aaa; } div.userItem-ok{ background:-webkit-gradient(linear,left top,left bottom,from(#88f),to(#88a)); } div.userItem-pend{ background:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#888)); } div.userItem-ng{ background:-webkit-gradient(linear,left top,left bottom,from(#f88),to(#a88)); } </style> <body style='margin:0;padding:0;width:100%;height:100%;overflow:hidden;'> <div id='graph'> <canvas style='position:absolute;left:0;top:0;' width=1024 height=1024></canvas> <div id='graphMain'></div> </div> <div id='userList'></div>