/******************************************************************* 
* 
* File    : pinwheel.js 
* 
* Created : 2000/06/17 
* 
* Author  : Roy Whittle  (Roy@Whittle.com) www.Roy.Whittle.com 
* 
* Purpose : To create a pinwheel firework that follows the cursor.
*
* Requires	: xLayer.js - for layer creation, movement
*		: xMouse.js - to track the mouse x,y coordinates 
* 
* History 
* Date         Version        Description 
* 
* 2000-06-17	1.0		Initial version
* 2000-10-15	1.1		Used xMouse for mouse tracking 
***********************************************************************/ 
var theTimer=null; 
var m = new xMouse();
 
var oneDeg=(2*Math.PI)/360; 
 
/*** Pinwheel type 1 ***/ 
var Radius = 5; 
var NumStars=32; 
var NumSteps=16; 
var StepAngle=(25)*oneDeg; 
 
/*** Pinwheel type 2 ***/ 
//var Radius = 10; 
//var NumStars=16; 
//var NumSteps=8; 
//var StepAngle=(22.5)*oneDeg; 
 
/*** Pinwheel type 3 ***/ 
//var Radius = 5; 
//var NumStars=16; 
//var NumSteps=16; 
//var StepAngle=(22.5)*oneDeg; 
 
/*** Pinwheel type 4 ***/ 
//var Radius = 10; 
//var NumStars=32; 
//var NumSteps=16; 
//var StepAngle=(11.25)*oneDeg; 
 
var StarObject=new Array(); 
 
var hexDigit=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"); 
function dec2hex(dec) 
{ 
	return(hexDigit[dec>>4]+hexDigit[dec&15]); 
} 
function hex2dec(hex) 
{ 
	return(parseInt(hex,16)) 
} 
 
function CreateStar() 
{ 
 
	this.layer 		= new xLayer("X", 100, 100, 10); 
	this.currAngle 	= 0; 
	this.step		= 0; 
	this.x		= 100; 
	this.y		= 100; 
	return (this); 
} 
 
function restart() 
{ 
	for(i=0;i<NumStars;i++) 
	{ 
		StarObject[i].currAngle = (StepAngle*i); 
		StarObject[i].step = (i%NumSteps); 
		StarObject[i].x = m.X; 
		StarObject[i].y = m.Y; 
		StarObject[i].layer.moveTo(m.X, m.Y); 
		StarObject[i].layer.show(); 
	} 
} 
/*** Choose a random pinwheel configuration ***/ 
function next_random() 
{ 
	var num=Math.floor(Math.random()*4); 
	 
	for(i=0;i<NumStars;i++) 
		StarObject[i].layer.hide(); 
 
	if(num==0){ 
		Radius = 5; 
		NumStars=32; 
		NumSteps=16; 
		StepAngle=(25)*oneDeg; 
	} 
	else 
	if(num==1){ 
		Radius = 10; 
		NumStars=16; 
		NumSteps=8; 
		StepAngle=(22.5)*oneDeg; 
	} 
	else 
	if(num==2){ 
		Radius = 5; 
		NumStars=16; 
		NumSteps=16; 
		StepAngle=(22.5)*oneDeg; 
	} 
	else{ 
		Radius = 10; 
		NumStars=32; 
		NumSteps=16; 
		StepAngle=(11.25)*oneDeg; 
	} 
 
 
	for(i=0 ; i<NumStars; i++) 
	{ 
		var s=StarObject[i]; 
		s.currAngle = (StepAngle*i); 
		s.step = (i%NumSteps); 
		s.x=m.X; 
		s.y=m.Y; 
	} 
 
	restart(); 
 
	theTimer=setTimeout("next_random()", 10000); 
} 
var ow ;
function start() 
{ 
	if(document.layers)
		ow = outerWidth;

	for(i=0 ; i<NumStars; i++) 
	{ 
		StarObject[i]=new CreateStar(); 
		StarObject[i].currAngle = (StepAngle*i); 
		StarObject[i].step = (i%NumSteps); 
		StarObject[i].layer.clip(0,0,2,2); 
		StarObject[i].layer.setBgColor("red"); 
	} 
 
	for(i=0 ; i<NumStars ; i++) 
		StarObject[i].layer.show(); 
 
	/*** Remove this if you only 1 type of pinwheel ***/ 
	theTimer=setTimeout("next_random()", 10000); 
 
	Rotate(); 
} 
 
function changeColour(s) 
{ 
	var colour=""; 
 
	r2= Math.floor(Math.random()*2)*255; 
	g2= Math.floor(Math.random()*2)*255; 
	b2= Math.floor(Math.random()*2)*255; 
 
	if(r2==0 && g2==0 && b2==0) 
		r2=255; 
 
	colour = "#" + dec2hex(r2) + dec2hex(g2) + dec2hex(b2); 
	s.layer.setBgColor(colour); 
 
	s.x=m.X; 
	s.y=m.Y; 
} 
function Rotate()  
{ 
	var x; 
	var y; 
	for (i = 0 ; i < NumStars ; i++ ) { 
		var s=StarObject[i]; 
		 
		if(s.step==0) 
			changeColour(s); 
 
		var angle = s.currAngle; 
		var rad   = s.step*Radius + 10; 
		x = s.x + rad*Math.cos(angle); 
		y = s.y + rad*Math.sin(angle); 
 
		s.layer.moveTo(x,y); 
 
		s.step = (s.step+1)%NumSteps; 
	} 
 
	setTimeout("Rotate()", 30); 
} 
 
function handle_resize()
{
	if(document.layers)
		if(outerWidth != ow)
			location.reload();
}

window.onresize=handle_resize;
window.onload=start;

