var PI=Math.PI,PI_180=PI,PI_360=PI*2,PI_90=PI/2,PI_45=PI/4,PI_270=PI_360-PI_90,RAD=PI/180;function vSet(a,c,b){a.x=c;a.y=b}function vSetv(a,c){a.x=c.x;a.y=c.y}function vAdd(a,c,b){b==0?(a.x+=c.x,a.y+=c.y):(b.x=a.x+c.x,b.y=a.y+c.y)}function vSub(a,c,b){b==0?(a.x-=c.x,a.y-=c.y):(b.x=a.x-c.x,b.y=a.y-c.y)}function vMul(a,c,b){b==0?(a.x*=c.x,a.y*=c.y):(b.x=a.x*c.x,b.y=a.y*c.y)}function vInvert(a){a.x*=-1;a.y*=-1}function vGetLength(a){return Math.sqrt(a.x*a.x+a.y*a.y)} function vNorm(a){var c;c=Math.sqrt(a.x*a.x+a.y*a.y);a.x/=c;a.y/=c}function vSetLength(a,c){var b;b=Math.sqrt(a.x*a.x+a.y*a.y);a.x/=b;a.y/=b;a.x*=c;a.y*=c}function vGetAngle(a){var c;c=Math.sqrt(a.x*a.x+a.y*a.y);if(a.x<=0&&a.y<=0)return(Math.acos(a.y/c)+PI_90)/RAD;else if(a.x>0&&a.y<=0)return(PI_360-Math.acos(a.x/c))/RAD;else if(a.x<=0&&a.y>0)return(Math.acos(a.y/c)+PI_90)/RAD;else if(a.x>0&&a.y>0)return Math.acos(a.x/c)/RAD} function vSetAngle(a,c){var b;c*=RAD;b=Math.sqrt(a.x*a.x+a.y*a.y);a.x=Math.cos(c)*b;a.y=Math.sin(c)*b}var fps=30,redraw=1,canvas,context,interval,Rects=[];$.getDocHeight=function(){return Math.max($(document).height(),$(window).height(),document.documentElement.clientHeight)};function GetRandom(a,c){return a>c?-1:a==c?a:a+parseInt(Math.random()*(c-a+1))} function click(a,c){redraw=1;for(var b=0;b<Rects.length;b++)if(Rects[b].Mode=="implosion"){Rects[b].Mode="explosion";Rects[b].Done=0;$(Rects[b].Element).css("border-style","dashed");$(Rects[b].Element).css("border-width","1px");$(Rects[b].Element).css("border-color","transparent");for(var e=0;e<Rects[b].Lines.length;e++){Rects[b].Lines[e].Dest.Center={x:GetRandom(0,window.innerWidth),y:GetRandom(0,window.innerHeight)};Rects[b].Lines[e].Dest.Angle=GetRandom(0,359);calcStartEnd(Rects[b].Lines[e].Dest); Rects[b].Lines[e].Step={x:0,y:0};Rects[b].Lines[e].AngleStep=0;Rects[b].Lines[e].Steps=fps*(Rects[b].Lines[e].Duration/4)/1E3;Rects[b].Lines[e].Counter=0;Rects[b].Lines[e].Done=0;var f={x:0,y:0};vSub(Rects[b].Lines[e].Dest.Center,Rects[b].Lines[e].Pos.Center,f);vSetLength(f,vGetLength(f)/Rects[b].Lines[e].Steps);vSetv(Rects[b].Lines[e].Step,f);Rects[b].Lines[e].AngleStep=(Rects[b].Lines[e].Dest.Angle-Rects[b].Lines[e].Pos.Angle+360)/Rects[b].Lines[e].Steps}}else{Rects[b].Mode="implosion";Rects[b].Done= 0;$(Rects[b].Element).css("border-style","dashed");$(Rects[b].Element).css("border-width","1px");$(Rects[b].Element).css("border-color","transparent");e=$(Rects[b].Element).position();a=e.left;c=e.top;e=$(Rects[b].Element).outerWidth(true);f=$(Rects[b].Element).outerHeight(true);Rects[b].Lines[0].Pos.Start.x=a;Rects[b].Lines[0].Pos.Start.y=c;Rects[b].Lines[0].Pos.End.x=a+e;Rects[b].Lines[0].Pos.End.y=c;Rects[b].Lines[1].Pos.Start.x=a+e;Rects[b].Lines[1].Pos.Start.y=c;Rects[b].Lines[1].Pos.End.x=a+ e;Rects[b].Lines[1].Pos.End.y=c+f;Rects[b].Lines[2].Pos.Start.x=a+e;Rects[b].Lines[2].Pos.Start.y=c+f;Rects[b].Lines[2].Pos.End.x=a;Rects[b].Lines[2].Pos.End.y=c+f;Rects[b].Lines[3].Pos.Start.x=a;Rects[b].Lines[3].Pos.Start.y=c+f;Rects[b].Lines[3].Pos.End.x=a;Rects[b].Lines[3].Pos.End.y=c;for(e=0;e<Rects[b].Lines.length;e++)Rects[b].Lines[e].Pos.Center={x:0,y:0},Rects[b].Lines[e].Pos.Angle=0,Rects[b].Lines[e].Pos.Radius=0,calcCenter(Rects[b].Lines[e].Pos),Rects[b].Lines[e].Dest.Start=Rects[b].Lines[e].Pos.Start, Rects[b].Lines[e].Dest.End=Rects[b].Lines[e].Pos.End,Rects[b].Lines[e].Dest.Center=Rects[b].Lines[e].Pos.Center,Rects[b].Lines[e].Dest.Angle=Rects[b].Lines[e].Pos.Angle,Rects[b].Lines[e].Dest.Radius=Rects[b].Lines[e].Pos.Radius,Rects[b].Lines[e].Pos.Center=Rects[b].Lines[e].PrevCenter,Rects[b].Lines[e].Pos.Angle=Rects[b].Lines[e].PrevAngle,calcStartEnd(Rects[b].Lines[e].Pos),Rects[b].Lines[e].Step={x:0,y:0},Rects[b].Lines[e].AngleStep=0,Rects[b].Lines[e].Steps=fps*Rects[b].Lines[e].Duration/1E3,Rects[b].Lines[e].Counter= 0,Rects[b].Lines[e].Done=0,f={x:0,y:0},vSub(Rects[b].Lines[e].Dest.Center,Rects[b].Lines[e].Pos.Center,f),vSetLength(f,vGetLength(f)/Rects[b].Lines[e].Steps),vSetv(Rects[b].Lines[e].Step,f),Rects[b].Lines[e].AngleStep=(Rects[b].Lines[e].Dest.Angle-Rects[b].Lines[e].Pos.Angle)/Rects[b].Lines[e].Steps}}function calcCenter(a){var c={x:0,y:0};vSub(a.End,a.Start,c);a.Angle=vGetAngle(c);a.Radius=vGetLength(c)/2;vSetLength(c,a.Radius);vAdd(a.Start,c,a.Center)} function calcStartEnd(a){var c={x:1E4,y:1E4};vSetLength(c,a.Radius);vSetAngle(c,a.Angle);vSub(a.Center,c,a.Start);vAdd(a.Center,c,a.End)} function addLine(a,c,b,e,f,g){var d=a.Lines.length;a.Lines[d]={};a.Lines[d].Pos={};a.Lines[d].Pos.Start={};a.Lines[d].Pos.End={};a.Lines[d].Pos.Center={};a.Lines[d].Pos.Angle={};a.Lines[d].Pos.Radius={};a.Lines[d].Dest={};a.Lines[d].Dest.Start={};a.Lines[d].Dest.End={};a.Lines[d].Dest.Center={};a.Lines[d].Dest.Angle={};a.Lines[d].Dest.Radius={};a.Lines[d].PrevCenter={};a.Lines[d].PrevAngle={};a.Lines[d].PrevCenter={x:0,y:0};a.Lines[d].PrevAngle={x:0,y:0};a.Lines[d].Pos.Start={x:c,y:b};a.Lines[d].Pos.End= {x:e,y:f};a.Lines[d].Pos.Center={x:0,y:0};a.Lines[d].Pos.Angle=0;a.Lines[d].Pos.Radius=0;calcCenter(a.Lines[d].Pos);a.Lines[d].Dest.Start=a.Lines[d].Pos.Start;a.Lines[d].Dest.End=a.Lines[d].Pos.End;a.Lines[d].Dest.Center=a.Lines[d].Pos.Center;a.Lines[d].Dest.Angle=a.Lines[d].Pos.Angle;a.Lines[d].Dest.Radius=a.Lines[d].Pos.Radius;a.Lines[d].Pos.Center={x:GetRandom(0,window.innerWidth),y:GetRandom(0,window.innerHeight)};a.Lines[d].Pos.Angle=GetRandom(0,359);calcStartEnd(a.Lines[d].Pos);a.Lines[d].PrevCenter= a.Lines[d].Pos.Center;a.Lines[d].PrevAngle=a.Lines[d].Pos.Angle;a.Lines[d].Step={x:0,y:0};a.Lines[d].AngleStep=0;a.Lines[d].Duration=g;a.Lines[d].Steps=fps*a.Lines[d].Duration/1E3;a.Lines[d].Counter=0;a.Lines[d].Done=0;c={x:0,y:0};vSub(a.Lines[d].Dest.Center,a.Lines[d].Pos.Center,c);vSetLength(c,vGetLength(c)/a.Lines[d].Steps);vSetv(a.Lines[d].Step,c);a.Lines[d].AngleStep=(a.Lines[d].Dest.Angle-a.Lines[d].Pos.Angle)/a.Lines[d].Steps} function createRect(a,c,b,e,f,g,d,i){var h=Rects.length;Rects[h]={};Rects[h].Lines=[];Rects[h].Element=f;Rects[h].Mode=g;Rects[h].Duration=d;Rects[h].FadeIn=i;Rects[h].HTML=$(Rects[h].Element).html();Rects[h].Done=0;addLine(Rects[h],a,c,a+b,c,d);addLine(Rects[h],a+b,c,a+b,c+e,d);addLine(Rects[h],a+b,c+e,a,c+e,d);addLine(Rects[h],a,c+e,a,c,d)} function drawDottedLine(a){var c=$(document).scrollLeft(),b=$(document).scrollTop(),e=c+window.innerWidth,f=b+window.innerHeight,g={x:0,y:0},d={x:0,y:0};vSub(a.Pos.End,a.Pos.Start,g);var i=Math.abs(vGetLength(g));vSetLength(g,1);vSetv(d,a.Pos.Start);vAdd(d,g,0);for(var h=1,j=0;j==0;)h<i-3?(Math.floor(d.x)>=c&&Math.floor(d.x)<=e&&Math.floor(d.y)>=b&&Math.floor(d.y)<=f?(context.moveTo(Math.floor(d.x+0.5),Math.floor(d.y+0.5)),vAdd(d,g,0),vAdd(d,g,0),vAdd(d,g,0),context.lineTo(Math.floor(d.x+0.5),Math.floor(d.y+ 0.5))):(vAdd(d,g,0),vAdd(d,g,0),vAdd(d,g,0)),vAdd(d,g,0),vAdd(d,g,0),vAdd(d,g,0)):d.x>=c&&d.x<=e&&d.y>=b&&d.y<=f&&(context.moveTo(Math.floor(d.x+0.5),Math.floor(d.y+0.5)),vSetv(d,a.Pos.End),context.lineTo(Math.floor(d.x+0.5),Math.floor(d.y+0.5))),h+=6,h>=i&&(j=1)} function drawLine(a){a.Counter<a.Steps?(vAdd(a.Pos.Center,a.Step,0),a.Counter++,a.Pos.Angle+=a.AngleStep,calcStartEnd(a.Pos)):(a.Done=1,a.Pos.Start=a.Dest.Start,a.Pos.End=a.Dest.End,a.Pos.Center=a.Dest.Center,a.Pos.Angle=a.Dest.Angle,a.Pos.Radius=a.Dest.Radius);a.PrevCenter=a.Pos.Center;a.PrevAngle=a.Pos.Angle;drawDottedLine(a)} function drawRect(a){if(a.Mode=="implosion"){var c=$(a.Element).position(),b=c.left,c=c.top,e=$(a.Element).outerWidth(true),f=$(a.Element).outerHeight(true);a.Lines[0].Dest.Start.x=b;a.Lines[0].Dest.Start.y=c;a.Lines[0].Dest.End.x=b+e;a.Lines[0].Dest.End.y=c;a.Lines[1].Dest.Start.x=b+e;a.Lines[1].Dest.Start.y=c;a.Lines[1].Dest.End.x=b+e;a.Lines[1].Dest.End.y=c+f;a.Lines[2].Dest.Start.x=b+e;a.Lines[2].Dest.Start.y=c+f;a.Lines[2].Dest.End.x=b;a.Lines[2].Dest.End.y=c+f;a.Lines[3].Dest.Start.x=b;a.Lines[3].Dest.Start.y= c+f;a.Lines[3].Dest.End.x=b;a.Lines[3].Dest.End.y=c}for(b=0;b<a.Lines.length;b++)drawLine(a.Lines[b]);if(a.Done==0&&a.Lines[3].Done==1&&(a.Done=1,a.FadeIn>0))$(a.Element).css("visibility","visible"),$(a.Element).fadeOut(0),$(a.Element).fadeIn(a.FadeIn),a.FadeIn=0} function clearAll(){redraw=0;context.clearRect(0,0,canvas.width,canvas.height);for(var a=0;a<Rects.length;a++)$(Rects[a].Element).css("border-style","dashed"),$(Rects[a].Element).css("border-width","1px"),$(Rects[a].Element).css("border-color","grey")} function drawRects(){var a=1;context.beginPath();for(var c=0;c<Rects.length;c++)drawRect(Rects[c]),Rects[c].Done==0&&(a=0);context.strokeWidth=1;context.strokeStyle="grey";context.stroke();a==1&&Rects[0].Mode=="implosion"&&setTimeout("clearAll()",500)}function draw(){if(redraw==1)canvas.width=window.innerWidth,canvas.height=$.getDocHeight(),context.clearRect(0,0,canvas.width,canvas.height),drawRects()} $(document).ready(function(){canvas=document.getElementById("cnvs");context=canvas.getContext("2d");interval=setInterval("draw()",1E3/fps);$("a").bind("click",function(a){click(a.pageX,a.pageY)});$("input[type=submit]").bind("click",function(a){click(a.pageX,a.pageY)});$("[implosion]").each(function(){var a=$(this).position(),c=a.left,a=a.top,b=$(this).outerWidth(true),e=$(this).outerHeight(true);createRect(c,a,b,e,$(this),"implosion",1E3,500);$(this).css("visibility","hidden");$(this).css("border-style", "dashed");$(this).css("border-width","1px");$(this).css("border-color","transparent")})});
