/*******************************************************************
*
* File    : JSFX_Halloween.js © JavaScript-FX.com
* Created : 2001/10/16
* Author  : Roy Whittle www.Roy.Whittle.com
* Purpose : To create animated Ghosts on the page using any user supplied image.
* History
* Date         Version        Description
* 2001-10-16	1.0		Created for javascript-fx
***********************************************************************/
 /*** START OF CODE FROM JSFX_Layer.js ***/
 if(!window.JSFX) 	JSFX = new Object();
	JSFX.layerNo=0; 
 /**********************************************************************************/
	
JSFX.createElem = function(htmlStr)
{
var elem = null;
  	if(document.layers) 
	{
		elem = new Layer(2000); 
		elem.document.open(); 
		elem.document.write(htmlStr); 
		elem.document.close(); 
		elem.innerHTML = htmlStr;
	}
 	else if(document.all) 
	{
		var xName = "xLayer" + JSFX.layerNo++; 
		var txt = "<DIV ID='" + xName 
			+ "' STYLE=\"position:absolute;" 
			+ "visibility:hidden\">" 
			+ htmlStr 
			+ "</DIV>"; 
 			document.body.insertAdjacentHTML("BeforeEnd",txt); 
			elem = document.all[xName]; 
	} 
 	else if (document.getElementById)
	{
		var xName="xLayer" + JSFX.layerNo++;
		var txt = ""
			+ "position:absolute;"
			+ "visibility:hidden";
 		var newRange = document.createRange();
			
		elem = document.createElement("DIV");
		elem.setAttribute("style",txt);
		elem.setAttribute("id", xName);
 		document.body.appendChild(elem);  		
		newRange.setStartBefore(elem);
		strFrag = newRange.createContextualFragment(htmlStr);	
		elem.appendChild(strFrag);
	}
 	return elem;
}

/******************************************************************/

 JSFX.Layer = function(newLayer) 
{
	if(!newLayer)
		return;
 	if(typeof newLayer == "string")
		this.elem = JSFX.createElem(newLayer);
 	else
		this.elem=newLayer;
 	if(document.layers)
	{
		this.images = this.elem.document.images; 
		this.style  = this.elem; 	} 
 	else 
	{
		this.images = document.images; 
		this.style  = this.elem.style; 
	}
}

 /**********************************************************************************/
 var ns4 = (navigator.appName.indexOf("Netscape") != -1 && !document.getElementById);
 /**********************************************************************************/

/*** moveTo (x,y) ***/
JSFX.Layer.prototype.moveTo = function(x,y)
{
	this.style.left = x+"px";
	this.style.top = y+"px";
}
 if(ns4) JSFX.Layer.prototype.moveTo = function(x,y) 
{
	this.elem.moveTo(x,y);
}

/********************************************************/

/*** show()/hide() Visibility ***/

JSFX.Layer.prototype.show = function() { this.style.visibility = "visible"; } 
JSFX.Layer.prototype.hide = function() { this.style.visibility = "hidden"; } 
 	if(ns4)
	{
		JSFX.Layer.prototype.show = function() { this.style.visibility = "show"; }
		JSFX.Layer.prototype.hide = function() { this.style.visibility = "hide"; }
	}

/********************************************************/

/*** Opacity ***/

 if(document.all)
{
	JSFX.Layer.prototype.setOpacity = function(pc)
	{
		if(this.style.filter=="")
			this.style.filter="alpha(opacity=5);";	/* orig=100 */
			this.elem.filters.alpha.opacity=pc;
	}
}
 else 
	JSFX.Layer.prototype.setOpacity = function(pc) {return 0;}

/******* END OF CODE FROM JSFX.Layer.js ***/


/*** START OF CODE FROM JSFX.Browser.js ***/

JSFX.Browser = new Object();
 	if(navigator.appName.indexOf("Netscape") != -1)
	{
		JSFX.Browser.getCanvasWidth	= function() {return innerWidth;}
		JSFX.Browser.getCanvasHeight	= function() {return innerHeight;}
		JSFX.Browser.getMinX		= function() {return(pageXOffset);}
		JSFX.Browser.getMinY		= function() {return(pageYOffset);}
		JSFX.Browser.getMaxX		= function() {return(pageXOffset+innerWidth);}
		JSFX.Browser.getMaxY		= function() {return(pageYOffset+innerHeight);}
	}
 	else if(document.all)
	{ 		JSFX.Browser.getCanvasWidth = function() {return document.body.clientWidth;}
		JSFX.Browser.getCanvasHeight = function() {return document.body.clientHeight;}
		JSFX.Browser.getMinX = function() {return(document.body.scrollLeft);}
		JSFX.Browser.getMinY = function() {return(document.body.scrollTop);}
		JSFX.Browser.getMaxX = function() {return(document.body.scrollLeft+document.body.clientWidth);}
		JSFX.Browser.getMaxY = function() {return(document.body.scrollTop+document.body.clientHeight);}
	} 
 /*** END OF CODE FROM JSFX.Browser.js ***/
/*** START OF CODE FROM JSFX.Ghosts.js ***/
 JSFX.Halloween = new Object();
JSFX.Halloween.Ghosts = new Array();
 	JSFX.Halloween.start = function()
	{
		if(JSFX.Halloween.theTimer == null)
		{
			JSFX.Halloween.theTimer = setTimeout("JSFX.Halloween.animateAll()", 100);
/* orig=40  They seem a little less crowded with 100 */
		}
	}
 	JSFX.Halloween.animateAll = function()
	{
		JSFX.Halloween.theTimer = setTimeout("JSFX.Halloween.animateAll()", 100);   		
/* orig=40  Controls speed of movement: lg no. is faster */
		var sp = JSFX.Halloween.Ghosts;
		var i;
		for(i=0 ; i<sp.length ; i++) 
/* last item orig = i++ */
		{
			sp[i].animate();
		}
	}
 	JSFX.AddGhost = function(img)
	{
		var myGhost = null;
		var htmlStr = "<IMG SRC='"+img+"'>";
 		myGhost = new JSFX.Layer(htmlStr);
		myGhost.op = 0;    /* op is opacity */
		myGhost.x = Math.random()*JSFX.Browser.getMaxX();
		myGhost.y = Math.random()*JSFX.Browser.getMaxY();
		myGhost.dx = 0;
		myGhost.dy = 0;
		myGhost.w = 30;
		myGhost.h = 30;
		myGhost.targetX = Math.random()*JSFX.Browser.getMaxX();
		myGhost.targetY = Math.random()*JSFX.Browser.getMaxY();
		myGhost.state = "off"
		myGhost.animate = JSFX.animateGhosts;
		myGhost.hide();
		myGhost.setOpacity(this.op);
		myGhost.moveTo(myGhost.x,myGhost.y);
		JSFX.Halloween.Ghosts[JSFX.Halloween.Ghosts.length] = myGhost;
		JSFX.Halloween.start();
	}
 	JSFX.animateGhosts = function()
	{
		if(this.state == "off")
		{
			if(Math.random() > .98)		
/* orig >.99 When set lower they appear for a shorter time */
			{
				this.state="up";
				this.show();
			}
		}
	
		else if(this.state == "on")
		{
			if(Math.random() > .4)			
/* orig=.98  When set lower they disappear for a longer time? */
				this.state="down";
		}
 		else if(this.state == "up")
		{
			this.op += 1;				
/* orig=2  higher no (10) makes them fade into view faster */
			this.setOpacity(this.op);
			if(this.op==10)				/* orig=100 */
				this.state = "on";
		}
 		else if(this.state == "down")
		{
			this.op -= 0.5;				
/* orig=2  higher no (10) makes them fade from view faster */
			if(this.op==0)				
/* orig=0 */
			{
				this.hide();
				this.state = "off";
			}
		
			else 
				this.setOpacity(this.op);
		}
 	m = this;
	var X = (this.targetX - m.x);
	var Y = (this.targetY - m.y);
	var len = Math.sqrt(X*X+Y*Y);
		if(len < 1) len = 1;
			var dx = 20 * (X/len);
			var dy = 40 * (Y/len);			
/* orig=20 I think this is dimension x and y and sets the width and length in which the characters can float */
			var ddx = (dx - this.dx)/10;
			var ddy = (dy - this.dy)/20;   /* orig=10 */
				this.dx += ddx;
				this.dy += ddy;
				m.x += this.dx;
				m.y += this.dy;
				m.moveTo(m.x, m.y);
				
		if(Math.random() >.95 )			
/* orig=.95 */
		{
this.targetX = Math.random()*(JSFX.Browser.getCanvasWidth()-150);
/* orig= -150 */
this.targetY = Math.random()*(JSFX.Browser.getCanvasHeight()+JSFX.Browser.getMinY()-150);
/* orig= -150 By making +500 they come further down the page? */
		}
	}
