Enexis.Pagers = {};
Enexis.PagerExtender = {};
Enexis.Pagers.length = 0;
Enexis.Pagers.add = function(pager) {
  Enexis.Pagers[Enexis.Pagers.length] = pager;
  return Enexis.Pagers.length++;
};
Enexis.Pager = function(element, pageSize, extenderClass) {
  var self = this;
  this.pageSize = pageSize;
  this.uid = Enexis.Pagers.add(this);
  this.el = $(element);
  this.list = $(">li", this.el);
  this.start = 0;
  this.hide = function() {
    //Hide the next <pageSize> elements from the current start position
    for (var i = 0; i < self.pageSize; i++) {
      if (self.list.length > self.start + i) {
        $(self.list[self.start + i]).hide();
      }
    }
  };
  this.show = function() {
    //Show the next <pageSize> elements from the current start position
    for (var i = 0; i < self.pageSize; i++) {
      if (self.list.length > self.start + i) {
        $(self.list[self.start + i]).show();
      }
    }
    self.el.attr('start', self.start + 1);
    //Hide previous link if there is no previous page
    if (self.nav.length && self.start == 0) {$(".prev", self.nav).hide();}
    else if (self.nav) {$(".prev", self.nav).show();}
    //Hide next link if there is no next page
    if (self.nav.length && (self.list.length <= (self.start + self.pageSize))) {$(".next", self.nav).hide();}
    else if (self.nav.length) {$(".next", self.nav).show();}
    //Display page set
    if (self.extender) { self.extender.render(); }
  };
  this.previous = function() {
    self.hide();
    self.start -= self.pageSize;
    self.show();
  };
  this.next = function() {
    self.hide();
    self.start += self.pageSize;
    self.show();
  };
  this.gotoPage = function(pageNumber) {
    self.hide();
    self.start = (pageNumber - 1) * self.pageSize;
    self.show();
  };
  this.reset = function() {
    self.start = 0;
    this.list.hide();
    this.show();
  };
  //Only write out pager navigation controls if results > pageSize
  if (!(self.list.length <= this.pageSize)) {
    $(this.el).after("<div id='pager-" + this.uid + "' class='navResults'><a title='vorige " + this.pageSize + "' class='prev' href='javascript:Enexis.Pagers[" + this.uid + "].previous();'>‹ vorige " + this.pageSize + "</a><div class='cntPageLinks'></div><a title='volgende " + this.pageSize + "' class='next' href='javascript:Enexis.Pagers[" + this.uid + "].next();'>volgende " + this.pageSize + " ›</a></div>");
    this.nav = $("#pager-" + this.uid);
    if (extenderClass) { this.extender = eval("new " + extenderClass + "(this)"); }
    this.reset();
  }
};
Enexis.PagerExtender.PageList = function(pager) {
  var self = this;
  var maxPages = 5; //Note : must be uneven!
  this.pager = pager;
  this.el = $("div.cntPageLinks", pager.nav);
  this.pageCount = Math.ceil(pager.list.length / pager.pageSize);
  this.render = function()
  {
    var currentPage = Math.floor(self.pager.start / self.pager.pageSize) + 1;
    //Determine start page
    //Desired effect :
    //<beforePages> <currentPage> <afterPages>
    //Ideally beforePages and afterPages are the same amount, so the current page is the middle page in the set
    var startPage = currentPage - ((maxPages - 1) / 2);
    //This is not possible if afterPages < (maxPages - 1) / 2 :
    //n n+1 n+2 current last OR n n+1 n+2 n+3 current
    //In this case make the start page pageCount - maxPages + 1
    if (startPage + maxPages - 1 > self.pageCount) { startPage = self.pageCount - maxPages + 1; }
    //This is not possible if beforePages < (maxPages - 1) / 2 :
    //current 2 3 4 5 OR 1 current 3 4 5
    //In this case make the start page 1
    if (startPage < 1) { startPage = 1; }
    //End page is start page + maxPages + 1 UNLESS there aren't that many pages; then end page = pageCount
    var endPage = (self.pageCount > maxPages) ? startPage + maxPages - 1 : self.pageCount;
    //Generate unordered list of pages
    var updatedText = "<ul>";
    for (var i = startPage; i <= endPage; i++)
    {
      updatedText += self.generatePage(i, currentPage);
    }
    updatedText += "</ul>";
    self.el.html(updatedText);
  }
  this.generatePage = function(pageNum, currentPageNum)
  {
    if (pageNum == currentPageNum)
    {
      return "<li class='current'>" + pageNum + "</li>";
    }
    else
    {
      return "<li><a href='javascript:Enexis.Pagers[" + self.pager.uid + "].gotoPage(" + pageNum + ");'>" + pageNum + "</a></li>";
    }
  }
};

