var Paginator = Class.create({
  initialize: function(_name, _offset, _limit, _total, _url) {
    this.name   = _name;
    this.offset = _offset;
    this.limit  = _limit;
    this.total  = _total;
    this.url    = _url;
    this.query  = '';
  },
  refresh: function() {
    var lower = this.offset + 1;
    var upper = lower + this.limit - 1;
    var sum   = this.total;

    if(this.total < this.limit + this.offset) {
      $(this.name+'_limit').innerHTML  = this.total;
    }
    else {
      $(this.name+'_limit').innerHTML  = upper;
    }

    $(this.name+'_total').innerHTML  = sum;

    var selector = $(this.name+'_selector');
    selector.value = this.offset+1;

    var self = this;

    $(this.name+'_pulser').show();

    var page_updater = new Ajax.Updater(
      self.name+'_list',
      self.url+'limit='+self.limit+'&offset='+self.offset+'&query='+self.query, 
      {
        evalScripts: true,
        onSuccess: function() {
          selector.value = self.offset + 1;
          $(self.name+'_pulser').hide();
        }
      }
    );
  },
  search: function(_query) {
    this.offset = 0;
    this.query = _query;
    this.refresh();
  },
  forward: function() {
    var lower = this.offset + this.limit + 1;
    var upper = lower + this.limit - 1;
    var sum   = this.total;

    if(lower <= sum) {
      if(upper > sum) upper = sum;

      this.offset = lower - 1;
      this.refresh();
    }
  },
  back: function() {
    var lower = this.offset + 1 - this.limit;
    var upper = lower + this.limit -1;
    var sum   = this.total;

    if(lower > 0) {
      this.offset = lower - 1;
      this.refresh();
    }
  },
  page_to: function(_item_number) {
    this.offset = _item_number - 1;
    this.refresh();
  },
  page_to_start: function() {
    this.offset = 0;
    this.refresh();
  },
  page_to_end: function() {
    this.offset = this.total - this.limit;
    this.refresh();
  },
  set_total: function(_total) {
    this.total = _total;

    if(this.total > 0) {
      $(this.name+'_controls').style.display = 'block';

      $(this.name+'_total').innerHTML = _total;
    }
    else {
      $(this.name+'_controls').style.display = 'none';
    }
  }
});
