/* chaser.wjs
 * 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  : 113,
  bottomY    : 681,
  callRate   : 20,
  slideTime  : 1000,
  maxDiff    : document.all ? document.body.clientHeight : window.innerHeight,
  isIE       : document.all ? true : false,
  useStyle   : false,
  chaserDiv  : null,
  chaserDiv1 : null
}

if (document[document.all ? "all" : "layers"]) {
  oChaser.chaserDiv = document[document.all ? "all" : "layers"]["subscribe"];
  oChaser.chaserDiv1 = document[document.all ? "all" : "layers"]["subscribeRef"];
} else {
  oChaser.chaserDiv = document.getElementById("subscribe");
  oChaser.chaserDiv1 = document.getElementById("subscribeRef");
}

if (!oChaser.isIE) {
  oChaser.useStyle = !isNaN(oChaser.chaserDiv.style.top);
  if (oChaser.useStyle) {
    oChaser.chaserDiv.style.top = '113px';
  }
}

// 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.useStyle ? parseInt(this.chaserDiv.style.top) : 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 (newY > oChaser.bottomY) {
    newY = oChaser.bottomY;
  }

  if (
    (this.A > 0 && newY > this.currentY) ||
    (this.A < 0 && newY < this.currentY)
  ) {
      if (this.isIE) {
        this.chaserDiv.style.pixelTop = newY;
        this.chaserDiv1.style.pixelTop = newY;
      } else if (this.useStyle) {
        this.chaserDiv.style.top = newY + 'px';
        this.chaserDiv1.style.top = newY + 'px';
      } else {
        this.chaserDiv.top = newY;
        this.chaserDiv1.top = newY;
      }
  }
}
