/* 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.

oChaser = {
    topMargin    : 10,
    minTopMargin : 230, /* can not be less than topMargin*/
    yOffset      : 0,   /* Y Offest */
    callRate     : 35,
    slideTime    : 1200,
    maxDiff      : document.body.clientHeight,
    chaserDiv    : document.getElementById("sidebar")
}

// Prevent the chaser from sliding into its initial place
oChaser.chaserDiv.style.top = oChaser.minTopMargin + "px"

// 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 = 1 * this.chaserDiv.style.top.substring(0,this.chaserDiv.style.top.length-2)
    this.scrollTop  = document.body.scrollTop
    var newTargetY  = this.scrollTop + this.topMargin + this.yOffset

    // Prevent the chaser from sliding above the page header
    if ( newTargetY < this.minTopMargin )
    {
        newTargetY = this.minTopMargin
    }

    if ( this.currentY != newTargetY ) {

        //alert ("need move " + this.currentY + " " + newTargetY)    
        if ( newTargetY != this.targetY ) {
            //alert ("Call slideInit " + newTargetY + " " + this.targetY)    
            this.targetY = newTargetY
            this.slideInit( )    
        }

        this.slide( )        
    }
//alert(    document.getElementById("content").style.right )
}



// .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
    }
    //alert ("slide " + this.A + " " + this.B + " " + this.C + " " + this.D)        
}



// .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 )

    //alert ("slide " + this.A + " " + this.D + " " + newY + " " + this.currentY)    

    if (( this.A > 0 && newY > this.currentY ) ||
        ( this.A < 0 && newY < this.currentY )) {
            this.chaserDiv.style.top = (newY) + "px"
            //alert ("moving " + this.currentY + " " + newY)    
    }
} 

