
(function($){
$.PaginationCalculator=function(maxentries,opts){
this.maxentries=maxentries;
this.opts=opts;}
$.extend($.PaginationCalculator.prototype,{
numPages:function(){
return Math.ceil(this.maxentries/this.opts.items_per_page);},
getInterval:function(current_page){
var ne_half=Math.ceil(this.opts.num_display_entries/2);
var np=this.numPages();
var upper_limit=np - this.opts.num_display_entries;
var start=current_page>ne_half?Math.max(Math.min(current_page - ne_half,upper_limit),0):0;
var end=current_page>ne_half?Math.min(current_page+ne_half,np):Math.min(this.opts.num_display_entries,np);
return{start:start,end:end};}});
$.PaginationRenderers={}
$.PaginationRenderers.defaultRenderer=function(maxentries,opts){
this.maxentries=maxentries;
this.opts=opts;
this.pc=new $.PaginationCalculator(maxentries,opts);}
$.extend($.PaginationRenderers.defaultRenderer.prototype,{
createLink:function(page_id,current_page,appendopts){
var lnk,np=this.pc.numPages();
page_id=page_id<0?0:(page_id<np?page_id:np-1);
appendopts=$.extend({text:page_id+1,classes:""},appendopts||{});
if(page_id==current_page){
lnk=$("<span class='current'>"+ appendopts.text +"</span>");}
else
{
lnk=$("<a>"+ appendopts.text +"</a>").attr('href',this.opts.link_to.replace(/__id__/,page_id));}
if(appendopts.classes){lnk.addClass(appendopts.classes);}
lnk.data('page_id',page_id);
return lnk;},
appendRange:function(container,current_page,start,end){
var i;
for(i=start;i<end;i++){
this.createLink(i,current_page).appendTo(container);}},
getLinks:function(current_page,eventHandler){
var begin,end,
interval=this.pc.getInterval(current_page),
np=this.pc.numPages(),
fragment=$("<div class='pagination'></div>");
if(np>1)
{
fragment.append(this.createLink(0,current_page,{text:this.opts.first_text,classes:"first"}));
if(this.opts.prev_text&&(current_page>0||this.opts.prev_show_always)){
fragment.append(this.createLink(current_page-1,current_page,{text:this.opts.prev_text,classes:"prev"}));}
if(interval.start>0&&this.opts.num_edge_entries>0)
{
end=Math.min(this.opts.num_edge_entries,interval.start);
this.appendRange(fragment,current_page,0,end);
if(this.opts.num_edge_entries<interval.start&&this.opts.ellipse_text)
{
jQuery("<span>"+this.opts.ellipse_text+"</span>").appendTo(fragment);}}
this.appendRange(fragment,current_page,interval.start,interval.end);
if(interval.end<np&&this.opts.num_edge_entries>0)
{
if(np-this.opts.num_edge_entries>interval.end&&this.opts.ellipse_text)
{
jQuery("<span>"+this.opts.ellipse_text+"</span>").appendTo(fragment);}
begin=Math.max(np-this.opts.num_edge_entries,interval.end);
this.appendRange(fragment,current_page,begin,np);}
if(this.opts.next_text&&(current_page<np-1||this.opts.next_show_always)){
fragment.append(this.createLink(current_page+1,current_page,{text:this.opts.next_text,classes:"next"}));}
fragment.append(this.createLink(np,current_page,{text:this.opts.last_text,classes:"last"}));
$('a',fragment).click(eventHandler);}
return fragment;}});
$.fn.pagination=function(maxentries,opts){
opts=jQuery.extend({
items_per_page:10,
num_display_entries:10,
current_page:0,
num_edge_entries:0,
link_to:"#",
first_text:"|<",
prev_text:"<<",
next_text:">>",
last_text:">|",
ellipse_text:"...",
prev_show_always:true,
next_show_always:true,
renderer:"defaultRenderer",
callback:function(){return false;}},opts||{});
var containers=this,
renderer,links,current_page;
function pageSelected(evt){
var links,current_page=$(evt.target).data('page_id');
containers.data('current_page',current_page);
links=renderer.getLinks(current_page,pageSelected);
containers.empty();
links.appendTo(containers);
var continuePropagation=opts.callback(current_page,containers);
if(!continuePropagation){
if(evt.stopPropagation){
evt.stopPropagation();}
else{
evt.cancelBubble=true;}}
return continuePropagation;}
current_page=opts.current_page;
containers.data('current_page',current_page);
maxentries=(!maxentries||maxentries<0)?1:maxentries;
opts.items_per_page=(!opts.items_per_page||opts.items_per_page<0)?1:opts.items_per_page;
if(!$.PaginationRenderers[opts.renderer])
{
throw new ReferenceError("Pagination renderer '"+ opts.renderer +"' was not found in jQuery.PaginationRenderers object.");}
renderer=new $.PaginationRenderers[opts.renderer](maxentries,opts);
containers.each(function(){
this.selectPage=function(page_id){pageSelected(page_id);}
this.prevPage=function(){
var current_page=containers.data('current_page');
if(current_page>0){
pageSelected(current_page - 1);
return true;}
else{
return false;}}
this.nextPage=function(){
var current_page=containers.data('current_page');
if(current_page<numPages()-1){
pageSelected(current_page+1);
return true;}
else{
return false;}}});
links=renderer.getLinks(current_page,pageSelected);
containers.empty();
links.appendTo(containers);
opts.callback(current_page,containers);}})(jQuery);         

