//This is a AJAX pager that uses jQuery
//should be altered to support templating.
function StarmindPager(navTopSelector, navBottomSelector, pagerContainerSelector, pagerItemSelector, pSize, nPC) {
this.CurrentPage = 1;
this.PageSize = pSize;
this.NavigationPageCount = nPC;
this.NavTopSelector = navTopSelector;
this.NavBottomSelector = navBottomSelector;
this.PagerContainerSelector = pagerContainerSelector;
this.PagerItemWildcardSelector = pagerItemSelector;
this.PagerShowingRangeCallback = null;
this.RefreshContext();
this.TogglePage(1);
}
StarmindPager.prototype.RefreshContext = function() {
this.NavTop = jQuery(this.NavTopSelector);
this.NavBottom = jQuery(this.NavBottomSelector);
this.PagerContainer = jQuery(this.PagerContainerSelector);
this.PagerItems = this.PagerContainer.find(this.PagerItemWildcardSelector);
}
StarmindPager.prototype.BuildNavigation = function() {
if(this.NavTop.size() > 0) this.BuildNavigationFor(this.NavTop);
if(this.NavBottom.size() > 0) this.BuildNavigationFor(this.NavBottom);
}
StarmindPager.prototype.BuildNavigationFor = function(navContainer) {
navContainer.children().remove();
var table = jQuery("
");
var cells = table.find("td");
/*var first = jQuery("", { href: "#", text: "<< First" });*/
/*var last = jQuery("", { href: "#", text: "Last >>" });*/
var prev = jQuery("", { href: "#", text: "<" });
var next = jQuery("", { href: "#", text: ">" });
var prevImg = jQuery("
", { src : PaginationImages.PREV, alt: "Previous", style: "margin-bottom: 1px; cursor: pointer;" });
var nextImg = jQuery("
", { src : PaginationImages.NEXT, alt: "Next", style: "margin-bottom: 1px; cursor: pointer;" });
var pageImg = jQuery("
", { src : PaginationImages.PAGE, alt: "Page" });
var ofImg = jQuery("
", { src : PaginationImages.OF, alt: "Of" });
//first.bind("click", this, function(e) { e.data.TogglePage(1); return false; });
//last.bind("click", this, function(e) { e.data.TogglePage(-1); return false; });
prevImg.bind("click", this, function(e) { e.data.TogglePage(e.data.GetCurrentPageMod(-1)); return false; });
nextImg.bind("click", this, function(e) { e.data.TogglePage(e.data.GetCurrentPageMod(1)); return false; });
//cells.eq(0).append(first);
//cells.eq(0).append(" ");
cells.eq(2).append(prevImg);
cells.eq(2).append(" ");
cells.eq(2).append(pageImg);
cells.eq(2).append(" ");
cells.eq(2).append('
');
cells.eq(2).append(" ");
cells.eq(2).append(ofImg);
cells.eq(2).append(" ");
cells.eq(2).append('
');
cells.eq(2).append(" ");
cells.eq(2).append(nextImg);
var min = (
this.CurrentPage - Math.floor(this.NavigationPageCount / 2) > 0 ?
(this.CurrentPage + Math.floor(this.NavigationPageCount / 2) <= this.GetLastPageNumber() ?
this.CurrentPage - Math.floor(this.NavigationPageCount / 2) :
this.CurrentPage - Math.floor(this.NavigationPageCount / 2) - ((this.CurrentPage + Math.floor(this.NavigationPageCount / 2) - this.GetLastPageNumber()))
) :
1
);
var max = (min + this.NavigationPageCount - 1 <= this.GetLastPageNumber() ? min + this.NavigationPageCount - 1 : this.GetLastPageNumber());
for(var pageNumber = min; pageNumber <= max; pageNumber++) {
var pageLink = jQuery((pageNumber == this.CurrentPage ? "" : ""), { href: "#", text: pageNumber });
pageLink.bind("click", { obj: this, pageNumber: pageNumber }, function(e) { e.data.obj.TogglePage(e.data.pageNumber); return false; });
/*
if(pageNumber == min && pageNumber != 1) cells.eq(2).append("... ")
cells.eq(2).append(pageLink);
if(pageNumber < max) cells.eq(2).append(", ");
if(pageNumber == max && pageNumber != this.GetLastPageNumber()) cells.eq(2).append(" ...")
*/
}
navContainer.append(table);
}
StarmindPager.prototype.TogglePage = function(pageNumber) {
if(pageNumber == -1) pageNumber = this.GetLastPageNumber();
if(pageNumber > 0 && pageNumber <= this.GetLastPageNumber()) {
this.CurrentPage = pageNumber;
this.BuildNavigation();
var min = (this.CurrentPage - 1) * this.PageSize;
var max = this.CurrentPage * this.PageSize;
this.GetItems().hide().filter(function(i) { return (i >= min && i < max); }).show();
if(this.PagerShowingRangeCallback != null) this.PagerShowingRangeCallback(min+1, (this.GetItemCount() < max ? this.GetItemCount() : max));
}
}
StarmindPager.prototype.ShowAll = function() {
this.GetItems().show();
}
StarmindPager.prototype.GetCurrentPageMod = function(mod) {
var pageNumber = this.CurrentPage + mod;
return (pageNumber > 0 ? (pageNumber <= this.GetLastPageNumber() ? pageNumber : this.GetLastPageNumber()) : 1);
}
StarmindPager.prototype.GetLastPageNumber = function() {
return Math.ceil(this.GetItemCount()/this.PageSize);
}
StarmindPager.prototype.GetItemCount = function() {
return this.GetItems().length;
}
StarmindPager.prototype.GetItems = function() {
return this.PagerItems;
}