
function  bbdrawBall(context,x,y,r,color,alpha)
{
 
	context.globalAlpha=alpha;
 	context.beginPath();
  	context.fillStyle = color;
  	context.lineWidth =1;
  	context.arc(x,y, r, (Math.PI/180)*0, (Math.PI/180)*360, false);
  	context.fill();
  	context.closePath();	
}
function bbstartUp(){
	  setInterval(bbdrawScreen, bbspeed );
}
function bbclear()
{
	context.clearRect(0,0,cvs.width,cvs.height);	
}

function bbadjustXY(b)
{
    b.x=Math.min(cvs.width-b.r-1,b.x);
    b.x=Math.max(b.r+1,b.x);
    b.y=Math.min(cvs.height-b.r-1,b.y);
    b.y=Math.max(b.r+1,b.y);    
}
function bbis2BallsTouch(b1,b2) {
	   
    var dx = b1.x - b2.x;
    var dy = b1.y - b2.y;
    var distance = (dx * dx + dy * dy);
    var hit=(distance <= (b1.r + b2.r) * (b1.r + b2.r))?true:false;
    if (hit)
    {
         b1.al=0.5;
         b2.al=0.5;       
         if(bbtransfer)
         {
         var b1c=b1.c;
         b1.c=b2.c;
         b2.c=b1c;
         }
    }
    return hit;
 }
function bbis2BallsHit(b1,b2) {
   
    var dx = b1.x - b2.x;
    var dy = b1.y - b2.y;
    var distance = (dx * dx + dy * dy);
    var hit=(distance <= (b1.r + b2.r) * (b1.r + b2.r))?true:false;
    if (hit&&b1.h!=b2.n&&b2.h!=b1.n)
    {
    	 b1.h=b2.n;
    	 b2.h=b1.n;
         var ba1=b1.a;
         b1.a=b2.a;
         b2.a=ba1;
         if(bbtransfer)
         {
         var b1c=b1.c;
         b1.c=b2.c;
         b2.c=b1c;
         }
         b1.als=0;
         b2.als=0;
    }
    else if (!hit)
    {
    b1.h=b1.h==b2.n?"":b2.n;	
    b2.h=b2.h==b1.n?"":b1.n;
    }
    return hit;
 }
function bbTWOPI(a)
{
	if (a>2*Math.PI)return bbTWOPI(a-2*Math.PI);
	else if (a<-2*Math.PI)return bbTWOPI(a+2*Math.PI); 
	else return a;
}

function bbPI()
{
	var s=Math.random()>=0.5?1:-1;
	return Math.PI+0.1*Math.random()*s;
}
bbcollision=false;
bbedges=false;
bbtransfer=false;

function bbredrawBall(ball)
{
	   
	   var nb1x=ball.x+(incr*Math.cos(ball.a));
 	   var nb1y=ball.y+(incr*Math.sin(ball.a));

 	   ball.als++;
 	   if (ball.als&&ball.als<10)ball.al=0.2;
	   bbdrawBall(context,nb1x,nb1y,ball.r,ball.c,ball.al);
	   if (nb1x>=cvs.width-ball.r)
		   {
		   ball.a=bbTWOPI(bbPI()-ball.a);
		   nb1x=cvs.width-ball.r;
		   if (Math.abs(ball.a)<Math.PI/2)ball.a=bbPI();   
		   if (bbedges)$("#bouncingArea").css("border-right","5px solid "+ball.c);
		   }
	   else if (nb1x<=ball.r)
		   {
		   nb1x=ball.r;
		   ball.a=bbTWOPI(bbPI()-ball.a);
		   if(Math.abs(ball.a)>Math.PI/2)ball.a=0;
		   if (bbedges)$("#bouncingArea").css("border-left","5px solid "+ball.c);
		   }
	   if (nb1y>=cvs.height-ball.r)
		   {
		   nb1y=cvs.height-ball.r;
		   ball.a=bbTWOPI(2*bbPI()-ball.a);
		   if (Math.abs(ball.a)<Math.PI)ball.a=bbPI()/2;
		   if (bbedges)$("#bouncingArea").css("border-bottom","5px solid "+ball.c);		   
		   }
	   else if (nb1y<=ball.r)
		   {
		   nb1y=ball.r;
		   ball.a=bbTWOPI(2*bbPI()-ball.a);
		   if (Math.abs(ball.a)>Math.PI)ball.a=bbPI()/2;
		   if (bbedges)$("#bouncingArea").css("border-top","5px solid "+ball.c);		   
		   }
	 
	   ball.x=nb1x;
	   ball.y=nb1y; 

	   if (ball.a!=ball.pa)ball.pa=ball.a;	   	   
	   if (bbcollision)   
		   {
		   for (var i=0;i<balls.length;i++)balls[i].al=1;
		   for (var i=0;i<balls.length-1;i++)for (var j=i+1;j<balls.length;j++)bbis2BallsHit(balls[i],balls[j]);			   
		   }
	   else {
		   for (var i=0;i<balls.length;i++)balls[i].al=1;
		   for (var i=0;i<balls.length-1;i++)for (var j=i+1;j<balls.length;j++)bbis2BallsTouch(balls[i],balls[j]);		
	   }
}
function bbctogle(a)
{
	bbcollision=a.checked;
}
function bbttogle(a)
{
	bbtransfer=a.checked;
}
function bbsstogle(a)
{
	bbstart=a.checked;
}

function bbetogle(a)
{
	bbedges=a.checked;
	 if (!bbedges)$("#bouncingArea").css("border","5px solid gray");
}
function bbdrawScreen()
{
	  if (bbstart) 
	  {
	   bbclear();
 	   for (var i=0;i<balls.length;i++)bbredrawBall(balls[i]);
	  }
}

