// Create scrolling variable if it doesn't exist
if (!Scrolling) var Scrolling = {};

//Scroller constructor
Scrolling.Scroller = function (o, w, h, t) {
  //get the container
  var list = o.getElementsByTagName("div");
  for (var i = 0; i < list.length; i++) {
    if (list[i].className.indexOf("Scroller-Container") > -1) {
      o = list[i];
    }
  }

  //private variables
  var self  = this;
  var _vwidth   = w;
  var _vheight  = h;
  var _twidth   = o.offsetWidth
  var _theight  = o.offsetHeight;
  var _hasTween = t ? true : false;
  var _timer, _x, _y;

  //public variables
  this.onScrollStart = function (){};
  this.onScrollStop  = function (){};
  this.onScroll      = function (){};
  this.scrollSpeed   = 30;

  //private functions
  function setPosition (x, y) {
    if (x < _vwidth - _twidth) 
    x = _vwidth - _twidth;
    if (x > 0) x = 0;
    if (y < _vheight - _theight) 
    y = _vheight - _theight;
    if (y > 0) y = 0;

    _x = x;
    _y = y;

    o.style.left = _x +"px";
    o.style.top  = _y +"px";
  };

  //public functions
  this.scrollBy = function (x, y) { 
    setPosition(_x - x, _y - y);
    this.onScroll();
  };

  this.scrollTo = function (x, y) { 
    setPosition(-x, -y);
    this.onScroll();
  };

  this.startScroll = function (x, y) {
    this.stopScroll();
    this.onScrollStart();
    _timer = window.setInterval(
      function () { self.scrollBy(x, y); }, this.scrollSpeed
      );
    };

    this.stopScroll  = function () { 
      if (_timer) window.clearInterval(_timer);
      this.onScrollStop();
    };

    this.reset = function () {
      _twidth  = o.offsetWidth
      _theight = o.offsetHeight;
      _x = 0;
      _y = 0;

      o.style.left = "0px";
      o.style.top  = "0px";

      if (_hasTween) t.apply(this);
    };

    this.swapContent = function (c, w, h) {
      o = c;
      var list = o.getElementsByTagName("div");
      for (var i = 0; i < list.length; i++) {
        if (list[i].className.indexOf("Scroller-Container") > -1) {
          o = list[i];
        }
      }

      if (w) _vwidth  = w;
      if (h) _vheight = h;
      this.reset();
    };

    this.getDimensions = function () {
      return {
        vwidth  : _vwidth,
        vheight : _vheight,
        twidth  : _twidth,
        theight : _theight,
        x : -_x, y : -_y
      };
    };

    this.getContent = function () {
      return o;
    };

    this.reset();
  };