

function EndlessScrolling(startIndex, numPreloadItems /* NYI! */, maxIndex, baseUrl, domClassName) {

  /*********************************
   **         CONSTRUCTOR         **
   *********************************/  

  var _nextIndex = startIndex; 
  var _numPreloadItems = numPreloadItems;
  var _maxIndex = maxIndex;
  var _baseUrl = baseUrl || '/'
  var _domClassName = domClassName || 'listitem';
  var _isActive = true;

  var _bottomPixels = 500;

  $(window).scroll(function() {
    _scrollHandler();
  });


  /*********************************
   **       PRIVATE METHODS       **
   *********************************/  

  var _isInsideTriggerArea = function() {
    return $(document).height() - $(window).height() <= $(window).scrollTop() + _bottomPixels;
  }
  
  var _addLoaderItem = function(lastItem) {
    var loaderItem = $(
      '<div class="' + _domClassName + ' loading">' + 
      '  <div class="' + _domClassName + '_content">' +
      '  </div>' + 
      '  <div class="separator_h above">' +
      '  </div>' + 
      '</div>');
    lastItem.after(loaderItem);
    
    return loaderItem;
  }


  var _loadItem = function(itemIndex) {
    var lastItem = $('.' + _domClassName + ':last');
    var loaderItem = _addLoaderItem(lastItem);

    $.get(_baseUrl + '?' + 'offset=' + itemIndex.toString(),
      function(data) {
        loaderItem.replaceWith(data);
      }
    );
  }

  
  var _scrollHandler = function() {
    if(!_isActive || (_nextIndex > _maxIndex) || !_isInsideTriggerArea()) {
      return;
    }

    for (var i = 0; (i < _numPreloadItems) && (_nextIndex <= _maxIndex); i++) {
      _loadItem(_nextIndex);
      _nextIndex++;
    }
  }
 

  /*********************************
   **        PUBLIC METHODS       **
   *********************************/
  this.deactivate = function() {
    _isActive = false;
  }
  this.activate = function() {
    _isActive = true;
  }
  
/*
  this.loadUntil = function(targetIndex) {
    alert($(document).endlessScroll.callback);
    while(this._nextIndex <= targetIndex) {
      $(document).endlessScroll.callback(0);
    }    
  }
*/  
}

