/* 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.

// floatMargin = distance to go before starting to scroll
// btmMargin = {window height} - {bottom margin}, so the chaser div does not dip below this.

var oChaser = {
	topMargin	: 0,
	floatMargin	: 0,
	btmMargin	: 86,
	callRate	: 10,
	slideTime	: 600,
	maxDiff		: document.all ? document.body.clientHeight : window.innerHeight,
	isIE		: document.all ? true : false,
	chaserDiv	: document[document.all ? "all" : "layers"]["menutext"],
	divHeight	: document.all ? document.all.menutext.scrollHeight : document.menutext.document.height
}

// 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.scrollBottom = this.maxDiff + this.btmMargin;
	this.currentY	= this.isIE ? this.chaserDiv.style.pixelTop : this.chaserDiv.top;
	this.scrollTop	= this.isIE ? document.body.scrollTop : window.pageYOffset;

//## 1/23/03 <ss> don't move the layer unless the screen scrolls past the top margin.
//#

//	var newTargetY	= this.scrollTop + this.topMargin

    var newTargetY;
   
    if (this.scrollTop > (this.topMargin - this.floatMargin) && this.maxDiff > this.divHeight) {
        newTargetY = this.scrollTop + this.floatMargin;
    } else {
        newTargetY = 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.B      = 1.57 / this.slideTime;    // 1/23/03 <ss> why PI/2 when you can 1.57?
	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
	}
}