text: var smooth = require('./smooth');
  
  var easing = smooth.defaultEasing;
  
  var cancelEvents = require('./cancel-events');
  
  /*
   * Sets the cancel trigger
   */
  
  cancelEvents.register(function() {
    __cancel = true;
  });
  
  /*
   * Wraps window properties to allow server side rendering
   */
  var currentWindowProperties = function() {
    if (typeof window !== 'undefined') {
      return window.requestAnimationFrame || window.webkitRequestAnimationFrame;
    }
  };
  
  /*
   * Helper function to never extend 60fps on the webpage.
   */
  var requestAnimationFrame = (function () {
    return  currentWindowProperties() ||
            function (callback, element, delay) {
                window.setTimeout(callback, delay || (1000/60));
            };
  })();
  
  
  var __currentPositionY  = 0;
  var __startPositionY    = 0;
  var __targetPositionY   = 0;
  var __progress          = 0;
  var __duration          = 0;
  var __cancel            = false;
  
  var __start;
  var __deltaTop;
  var __percent;
  
  var currentPositionY = function() {
    var supportPageOffset = window.pageXOffset !== undefined;
    var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
    return supportPageOffset ? window.pageYOffset : isCSS1Compat ?
           document.documentElement.scrollTop : document.body.scrollTop;
  };
  
  var animateTopScroll = function(timestamp) {
    // Cancel on specific events
    if(__cancel) { return };
  
  
    __deltaTop = Math.round(__targetPositionY - __startPositionY);
  
    if (__start === null) {
      __start = timestamp;
    }
  
    __progress = timestamp - __start;
  
    __percent = (__progress >= __duration ? 1 : easing(__progress/__duration));
  
    __currentPositionY = __startPositionY + Math.ceil(__deltaTop * __percent);
  
    window.scrollTo(0, __currentPositionY);
  
    if(__percent < 1) {
      requestAnimationFrame(animateTopScroll);
    }
  
  };
  
  var startAnimateTopScroll = function(y, options) {
    __start           = null;
    __cancel          = false;
    __startPositionY  = currentPositionY();
    __targetPositionY = y + __startPositionY;
    __duration        = options.duration || 1000;
  
    requestAnimationFrame(animateTopScroll);
  };
  
  module.exports = {
    animateTopScroll: startAnimateTopScroll
  };
  