//Circlesquare, <http://www.circlesquare.biz>. Copyright (c) 2008, circlesquare solutions ltd. BSD Style License.

var Circlesquare=new Class({Implements:[Events,Options],options:{width:300,height:300,density:500,fps:30,minSpeed:1,maxSpeed:10,minSize:5,maxSize:30,zoomRatio:1.01,fadeRatio:0.99,direction:0,padding:[0,30,0,30],rgb:[0,0,100],fill:true},initialize:function(_1,_2){this.setOptions(_2);this.circlesquare=$(_1);this.canvas=new Element("canvas",{width:this.options.width,height:this.options.height}).inject(this.circlesquare);this.x=this.options.width;this.y=this.options.height;this.d=Math.round(Math.sqrt((this.x*this.x)+(this.y*this.y)));this.ctx=this.canvas.getContext("2d");this.shapes=[];for(var i=0;i<this.options.density;i++){this.shapes.push(this.shape());}this.start();},start:function(){this.periodical=this.step.periodical((1000/this.options.fps),this);},stop:function(){$clear(this.periodical);},step:function(){this.ctx.clearRect(0,0,this.options.width,this.options.height);for(var i=0;i<this.options.density;i++){if(Math.abs(this.shapes[i].x)>this.d||Math.abs(this.shapes[i].y)>this.d){this.shapes[i]=this.shape();}else{this.shapes[i].x+=(this.shapes[i].speed*Math.sin(this.options.direction*(Math.PI/180)));this.shapes[i].y-=(this.shapes[i].speed*Math.cos(this.options.direction*(Math.PI/180)));this.shapes[i].size=(this.shapes[i].size<this.options.maxSize)?(this.shapes[i].size*this.options.zoomRatio):this.shapes[i].size;this.shapes[i].alpha=(this.shapes[i].alpha>0)?(this.shapes[i].alpha*this.options.fadeRatio):0;}if(this.shapes[i].x>(this.options.padding[3])&&this.shapes[i].x<(this.x-this.options.padding[1])&&this.shapes[i].y>(this.options.padding[0])&&this.shapes[i].y<(this.y-this.options.padding[2])){this.draw(this.shapes[i]);}}},draw:function(_5){this.ctx.fillStyle="rgba("+_5.rgb[0]+", "+_5.rgb[1]+", "+_5.rgb[2]+", "+_5.alpha+")";this.ctx.strokeStyle="rgba("+_5.rgb[0]+", "+_5.rgb[1]+", "+_5.rgb[2]+", "+_5.alpha+")";switch(_5.type){case "square":if (this.options.fill) {this.ctx.fillRect(_5.x,_5.y,_5.size,_5.size);}else{this.ctx.strokeRect(_5.x,_5.y,_5.size,_5.size);}break;case "circle":this.ctx.beginPath();this.ctx.arc(_5.x,_5.y,(_5.size/2),0,(Math.PI*2),true);if (this.options.fill) {this.ctx.fill();}else{this.ctx.stroke();}break;}},shape:function(){var x=1;var y=1;var _8=(Math.floor(Math.random()*this.options.maxSize)+this.options.minSize);var _9=(Math.floor(Math.random()*this.options.maxSpeed)+this.options.minSpeed);while(x>-_8&&x<(this.x+_8)&&y>-_8&&y<(this.y+_8)){x=(Math.floor(Math.random()*(this.d*3))-this.d);y=(Math.floor(Math.random()*(this.d*3))-this.d);}var _a="square";switch(Math.floor(Math.random()*2)){case 0:_a="circle";break;case 1:_a="square";break;}return {x:x,y:y,size:_8,speed:_9,rgb:this.options.rgb,alpha:1,type:_a};}});