/*
 *  Page Top JavaScript
 *  Copyright(c) Prisys, Inc.
 *
 *  use prototype.js
 */


var PageTop = Class.create();

PageTop.prototype = {

  element: null,
  targetId: null,
  interval: 20,
  firstSpeed : 2,
  lastSpeed : 0.1,
  miniDistance : 1,
  speedX : null,
  speedY : null,

  initialize: function(element, targetId)
  {
    this.element = $(element);
    this.targetId = $(targetId);
    Event.observe(this.element, 'click', this.accelscroll.bindAsEventListener(this));
  },

  accelscroll: function(event) {
    var node = this.targetId;
    this.targetX = 0;
    this.targetY = 0;

    while (node.tagName != "BODY")
    {
      this.targetX = this.targetX + node.offsetLeft;
      this.targetY = this.targetY + node.offsetTop;
      node = node.offsetParent;
    }

    var positionX = document.body.scrollLeft || document.documentElement.scrollLeft;
    var positionY = document.body.scrollTop || document.documentElement.scrollTop;

    var distanceX = positionX - this.targetX;
    var distanceY = positionY - this.targetY;

    var timeX = 2 * Math.abs(distanceX) / (this.firstSpeed + this.lastSpeed);
    var timeY = 2 * Math.abs(distanceY) / (this.firstSpeed + this.lastSpeed);

    this.accelX = (timeX) ? (this.lastSpeed - this.firstSpeed) / timeX : 0;
    this.accelY = (timeY) ? (this.lastSpeed - this.firstSpeed) / timeY : 0;

    this.intervalId = setInterval(this.moveScroll.bind(this), this.interval);
    Event.stop(event);
  },

  moveScroll: function()
  {
    var speedX = (this.speedX) ? this.speedX : this.firstSpeed;
    var speedY = (this.speedY) ? this.speedY : this.firstSpeed;

    var moveDistanceX = (speedX > 0) ? this.getDistanceX(speedX) : 0;
    var moveDistanceY = (speedY > 0) ? this.getDistanceY(speedY) : 0;

    if (moveDistanceX || moveDistanceY)
    {
      this.moveBy(moveDistanceX, moveDistanceY);
      this.speedX = speedX + this.accelX * this.interval;
      this.speedY = speedY + this.accelY * this.interval;
    }
    else {
      this.moveTo(this.targetX, this.targetY);
      clearInterval(this.intervalId);
      this.speedX = 0;
      this.speedY = 0;
    }
  },

  getDistanceX: function(speed)
  {
    if (!this.accelX)
    {
      return 0;
    }

    var vector = (this.distanceX > 0) ? 1 : -1;
    var moveDistance = Math.round(this.accelX * this.interval * this.interval / 2 + speed * this.interval);

    if (moveDistance > this.miniDistance)
    {
      return vector * moveDistance;
    }
    else {
      return 0;
    }
  },

  getDistanceY: function(speed) {

    if (!this.accelY)
    {
      return 0;
    }

    var vector = (this.distanceY > 0) ? 1 : -1;
    var moveDistance = Math.round(this.accelY * this.interval * this.interval / 2 + speed * this.interval);

    if (moveDistance > this.miniDistance)
    {
      return vector * moveDistance;
    }
    else {
      return 0;
    }
  },

  moveBy: function(x, y)
  {
    window.scrollBy(x, y);
  },

  moveTo: function(x, y)
  {
    window.scrollTo(x, y);
  }

}


Event.observe(window, 'load', function() {
    new PageTop('topagetop', 'header');
});
