var HOWF = window.HOWF || {};

HOWF.PageScroll = (function () {

  var stepIncrement = 50;
  var stepDelay = 10;
  var limit = 6 * 1000;

  var running = false;

  function scrollStep(to, dest, down) {

    if (!running || (down && to >= dest) || (!down && to <= dest)) {
      HOWF.PageScroll.killScroll();
      return;
    }

    if ((down && to >= (dest - (2 * stepIncrement))) || (!down && to <= (dest - (2 * stepIncrement)))) {
      stepIncrement = stepIncrement * .55;
    }

    window.scrollTo(0, to);

    HOWF.PageScroll.nextStep = callNext(+to + stepIncrement, dest, down);

    window.setTimeout(HOWF.PageScroll.nextStep, stepDelay);

  }

  function callNext(to, dest, down) {

    return function() {
      scrollStep(to, dest, down);
    };

  }

  return {

    nextStep : null,
    killTimeout : null,

    scrollToElement : function(id) {

      var element = document.getElementById(id);

      if (element) {

        running = true;

        var yCoord = ((HOWF.Utils.getCoords(element)[1] - 6) < 0) ? 0 : HOWF.Utils.getCoords(element)[1] - 6;
        var currentYPosition = (document.all) ? document.body.scrollTop : window.pageYOffset;
        var down = true;

        // reverse direction if going up
        if(currentYPosition > yCoord) {
          stepIncrement *= -1;
          down = false;
        }

        HOWF.PageScroll.killTimeout = window.setTimeout(HOWF.PageScroll.killScroll, limit);

        scrollStep(currentYPosition + stepIncrement, yCoord, down);

      }

      return false;

    },

    killScroll : function() {

      window.clearTimeout(HOWF.PageScroll.killTimeout);
      running = false;
      stepIncrement = 50;

    }

  }

})();
