/* PLEASE DO NOT MAKE MODIFICATIONS TO THIS FILE TO ACCOMODATE FEATURES OR BUG FIXES THAT ARE NOT RELEVANT ACCROSS ALL SITES. ALL CHANGES SHOULD BE EXPLAINED IN THE CHANGE HISTORY AND THE REVISION NUMBER SUBSEQUENTLY INCREMENTED. */ /* -------------------------------------------------------------------------------------------------------------------------- StarmindPager Provides general support for enabling client-side content paging using Javascript. Version: 1.1 (Rev. 002) Required libraries: jQuery 1.4, jquery-tmpl Change history: -------------------------------------------------------------------------------------------------------------------------- 1.1.002: BuildNavigationFor updated to use navContainer.empty() (Bug fix) 1.1.001: Initial support for templating and dynamic filtering. 1.0: First draft. Usage examples: -------------------------------------------------------------------------------------------------------------------------- This is the general format of the argument object that is passed when instantiating using new StarmindPager(id, args, ...). args: { Navigation: { TopSelector: jQuery selector, BottomSelector: jQuery selector, TopTemplateSelector: text/x-jquery-tmpl template selector BottomTemplateSelector: text/x-jquery-tmpl template selector }, Items: { ContainerSelector: jQuery selector, ItemSelector: jQuery selector, }, Settings: { PageSize: integer, PageListSize: integer, HideIfEmpty: boolean } } How to create a content pager: var pager = new StarmindPager(args); Template examples: -------------------------------------------------------------------------------------------------------------------------- */ function StarmindPager(setupobject) { var Navigation = (setupobject ? setupobject.Navigation : null); var Items = (setupobject ? setupobject.Items : null); var Settings = (setupobject ? setupobject.Settings : null); this.CurrentPage = 1; this.PageSize = (Settings && Settings.PageSize ? Settings.PageSize : 10); this.NavigationPageCount = (Settings && Settings.PageListSize ? Settings.PageListSize : 5); this.HideIfEmpty = (Settings && Settings.HideIfEmpty ? Settings.HideIfEmpty : false); this.NavTopSelector = (Navigation && Navigation.TopSelector ? Navigation.TopSelector : null); this.NavBottomSelector = (Navigation && Navigation.BottomSelector ? Navigation.BottomSelector : null); this.PagerContainerSelector = (Items && Items.ContainerSelector ? Items.ContainerSelector : null); this.PagerItemWildcardSelector = (Items && Items.ItemSelector ? Items.ItemSelector : null); this.PagerShowingRangeCallback = null; this.FilterIndexes = null; this.NavTemplateTopSelector = (Navigation && Navigation.TopTemplateSelector ? Navigation.TopTemplateSelector : null); this.NavTemplateBottomSelector = (Navigation && Navigation.BottomTemplateSelector ? Navigation.BottomTemplateSelector : null); this.RefreshContext(); this.TogglePage(1); } //call when page content has been updated dynamically (ex. via asyncronous javascript) StarmindPager.prototype.Refresh = function() { 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); this.NavTemplateTop = (this.NavTemplateTopSelector && this.NavTemplateTopSelector != null ? jQuery(this.NavTemplateTopSelector) : null); this.NavTemplateBottom = (this.NavTemplateBottomSelector && this.NavTemplateBottomSelector != null ? jQuery(this.NavTemplateBottomSelector) : null); } StarmindPager.prototype.BuildNavigation = function() { if(this.NavTop.size() > 0) this.BuildNavigationFor(this.NavTop, (this.NavTemplateTop && this.NavTemplateTop != null && this.NavTemplateTop.size() > 0 ? this.NavTemplateTop : undefined)); if(this.NavBottom.size() > 0) this.BuildNavigationFor(this.NavBottom, (this.NavTemplateBottom && this.NavTemplateBottom != null && this.NavTemplateBottom.size() > 0 ? this.NavTemplateBottom : undefined)); } StarmindPager.prototype.BuildNavigationFor = function(navContainer, navTemplate) { navContainer.empty(); if(this.HideIfEmpty && this.GetItemCount() == 0) return; var min = ( this.CurrentPage - Math.floor(this.NavigationPageCount / 2) > 0 && this.GetLastPageNumber(true) > this.NavigationPageCount ? (this.CurrentPage + Math.floor(this.NavigationPageCount / 2) <= this.GetLastPageNumber(true) ? this.CurrentPage - Math.floor(this.NavigationPageCount / 2) : this.CurrentPage - Math.floor(this.NavigationPageCount / 2) - ((this.CurrentPage + Math.floor(this.NavigationPageCount / 2) - this.GetLastPageNumber(true))) ) : 1 ); var max = (min + this.NavigationPageCount - 1 <= this.GetLastPageNumber(true) ? min + this.NavigationPageCount - 1 : this.GetLastPageNumber(true)); var pages = new Array(); for(var pageNumber = min; pageNumber <= max; pageNumber++) { var pageLink = { PageNumber: pageNumber, IsCurrentPage: (pageNumber == this.CurrentPage), IsPrevHidden: (pageNumber == min && pageNumber != 1), IsNextHidden: (pageNumber == max && pageNumber != this.GetLastPageNumber()) }; pages.push(pageLink); } var itemcount = this.GetItemCount(); var templatedata = { CurrentPage: this.CurrentPage, TotalPages: this.GetLastPageNumber(), FirstItem: (itemcount == 0 ? 0 : (this.CurrentPage - 1) * this.PageSize + 1), LastItem: (this.CurrentPage * this.PageSize < itemcount && itemcount != 0 ? this.CurrentPage * this.PageSize : itemcount), TotalItems: itemcount, HasPrev: (this.CurrentPage > 1), HasNext: (this.CurrentPage < this.GetLastPageNumber()), PageSize: this.PageSize, Pages: pages }; var nav = jQuery(navTemplate).tmpl(templatedata); nav.appendTo(navContainer); //this is an optional way of adding click events in a template (needed if the pager object name is unknow such as if the template is generic) /* nav.find(".PagerPrev").bind("click", this, function(e) { e.data.TogglePage(e.data.GetCurrentPageMod(-1)); return false; }); nav.find(".PagerNext").bind("click", this, function(e) { e.data.TogglePage(e.data.GetCurrentPageMod(1)); return false; }); */ } StarmindPager.prototype.SetPageSize = function(pageSize) { this.PageSize = parseInt(pageSize); this.TogglePage(1); } StarmindPager.prototype.SetFilters = function(filterindexes) { this.FilterIndexes = filterindexes; this.TogglePage(1); } StarmindPager.prototype.TogglePageMod = function(mod) { this.TogglePage(this.GetCurrentPageMod(mod)); } StarmindPager.prototype.TogglePage = function(pageNumber) { if(pageNumber == -1) pageNumber = this.GetLastPageNumber(); this.GetItems(true).hide(); 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().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(zeroBase) { var lastpagenumber = Math.ceil(this.GetItemCount()/this.PageSize); return (lastpagenumber == 0 && zeroBase != true ? 1 : lastpagenumber); } StarmindPager.prototype.GetItemCount = function() { return this.GetItems().length; } StarmindPager.prototype.GetItems = function(getFilteredItems) { if(getFilteredItems == true) return this.PagerItems; else { var filterIndexes = this.FilterIndexes; return this.PagerItems.filter(function(i) { return (filterIndexes == null || filterIndexes == 0 ? true : jQuery.inArray(i, filterIndexes) == -1); }); } }