/* chaser.js

 * by Aaron Boodman v1.0 000919

 * Copyright (c) 2000 Aaron Boodman. All Rights Reserved.

 * Created for GreatEqualizer.com (http://www.greatequalizer.com/) and

 * documented at DHTML Lab (http://www.webreference.com/dhtml/)

 * License to use is granted if and only if this entire

 * copyright notice is included.

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation; either version 2 of the License, or

 * (at your option) any later version.

*/



// The chaser object. Since we don't anticipate having more

// than one on a page, we don't bother making this into

// a class definition. All necessary properties are set as

// properties of this object to avoid global variables.



var oChaser = {

	topMargin	: 0,

	callRate	: 10,

	slideTime	: 1800,

	maxDiff		: document.all ? document.body.clientHeight : window.innerHeight,

	isIE		: document.all ? true : false,

	chaserDiv	: document[document.all ? "all" : "layers"]["myChaser"]

}



// Arrange to have the main loop called as often as possible, 

// but not more often than every 35 milliseconds.

// Even though some OS's can acheive better than that, there's no real reason to

// overload them if its not going to improve the animation quality very much.

// I tested, and better than 35ms doesn't do very much visually.

window.setInterval("oChaser.main( )", oChaser.callRate)





// Main loop. Updates targetY, and decides whether to start

// the animation over again, continue an existing animation,

// or do nothing at all.

oChaser.main = function( )

{

	this.currentY	= this.isIE ? this.chaserDiv.style.pixelTop : this.chaserDiv.top

	this.scrollTop	= this.isIE ? document.body.scrollTop : window.pageYOffset

	var newTargetY	= this.scrollTop + this.topMargin

	

	if ( this.currentY != newTargetY ) {



		if ( newTargetY != this.targetY ) {



			this.targetY = newTargetY

			this.slideInit( )

	

		}



		this.slide( )

		

	}

}







// .slideInit( ). Initializes the slide animation. Sets properties

// of the oChaser object that will represent the various paramaters

// for the sine wave function.

oChaser.slideInit = function( )

{

	var now	= new Date( )

	

	this.A		= this.targetY - this.currentY

	this.B		= Math.PI / ( 2 * this.slideTime )

	this.C		= now.getTime( )



	if (Math.abs(this.A) > this.maxDiff) {

		this.D = this.A > 0 ? this.targetY - this.maxDiff : this.targetY + this.maxDiff

		this.A = this.A > 0 ? this.maxDiff : -this.maxDiff

	} else {

		this.D = this.currentY

	}

}







// .slide( ). Moves the oChaser one frame. Its rate decreases and

// is defined by a sine wave.

oChaser.slide = function( )

{

	var now	= new Date( )

	var newY	= this.A * Math.sin( this.B * ( now.getTime( ) - this.C ) ) + this.D

	newY		= Math.round( newY )



	if (( this.A > 0 && newY > this.currentY ) ||

		( this.A < 0 && newY < this.currentY )) {

			

			if ( this.isIE )this.chaserDiv.style.pixelTop = newY

			else			this.chaserDiv.top = newY

	}

}