(function($) {
	$.extend({
		tablesorterPager: new function() {
			
			function updatePageDisplay(c,table) {
			
			    var c = table.config;
			    
			    //var _pageSize2 = $(config.cssPageSize,c.container).val();
			    //c.size = _pageSize2;
			    c.totalPages = Math.ceil(c.totalRows / c.size);
			    
			    var loaded_rows  = c.size > 0 ? c.size : c.totalPages;
			    var cPage = (c.page + 1);
			    var _start = ( (loaded_rows * (cPage - 1) + 1) );
				var _end   = ( (loaded_rows * cPage) > c.totalRows ? c.totalRows : loaded_rows * cPage );
			    var _pageSize = $(config.cssTestingPages,c.container).val();
			    
			    
			    
			    
				
			    
			    updatePages(c, table);
			    
			    //it total records is less than or = to 20 then hide the
			    //the drop down list
			    if(c.totalRows <=20)
			        $(("#pageSizer"),c.container).hide();
			    
			    //hide page numbers if there is only one page	
				if (c.totalRows <= $(config.cssPageSize,c.container).val())
				    $(config.cssPageNav,c.container).hide();
				else
				    $(config.cssPageNav,c.container).show();
				
			    
			    //shows row viewer Showing x to x of x Results
			    $(c.cssViewRecords,c.container).text('Showing ' + _start + ' to ' + _end + ' of ' + c.totalRows + ' Results');
			
			   
			}
			

			
			function getInterval(c){
			    var numToDisplay = c.numDisplayEntries -1;
			    var half = Math.ceil(numToDisplay/2);
			    var np = c.totalPages;
			    var cPage = c.page + 1;
			    var ulimit = np - numToDisplay;
			    var start = cPage>half?Math.max(Math.min(cPage - half, ulimit), 0):0;
			    var end = cPage>half?Math.min(cPage + half, np):Math.min(numToDisplay, np);
			    

                //fixes issus with a starting integer of 0
			    if (start == 0){
			        start = 1;
			        
			        if (end == 4 && c.numDisplayEntries < np)
			        {
			            end = c.numDisplayEntries;
			        }
			    }

			        
			    return [start,end];
			    
			    

			}
			
			function updatePages(c,table){
			    var c = table.config;
			    var panel = $(c.cssPages,c.container);
			    var cPage = (c.page + 1);
			    
			    var getClickHandler = function(table,page_id) {
				return function(evt){moveToSelectedPage(table,page_id);} 
			    }
			    
			    panel.empty();
			    
			    var interval = getInterval(c);
			    
			    for (var x=interval[0] ; x<=interval[1]; x++ )
			    {
			        if (x == cPage){
			            var lnk = $("<span class='current'>" + x + "</span>");
			        }else{
			            var lnk = $("<span class='pagenumber'>"+x+"</span>")
			                .bind("click", getClickHandler(table,x));
			        }
			        
			        panel.append(lnk);
			    }
			    
			    
			    
			}
			    
			    
			
			
			function setPageSize(table,size) {
				var c = table.config;
				c.size = size;
				c.totalPages = Math.ceil(c.totalRows / c.size);
				c.pagerPositionSet = false;
				moveToPage(table);
				fixPosition(table);
			}
			
			function fixPosition(table) {
				var c = table.config;
				if(!c.pagerPositionSet && c.positionFixed) {
					var c = table.config, o = $(table);
					if(o.offset) {
						c.container.css({
							top: o.offset().top + o.height() + 'px',
							position: 'absolute'
						});
					}
					c.pagerPositionSet = true;
				}
			}
			
			function moveToFirstPage(table) {
				var c = table.config;
				c.page = 0;
				moveToPage(table);
			}
			
			function moveToLastPage(table) {
				var c = table.config;
				c.page = (c.totalPages-1);
				moveToPage(table);
			}
			
			function moveToNextPage(table) {
				var c = table.config;
				c.page++;
				if(c.page >= (c.totalPages-1)) {
					c.page = (c.totalPages-1);
				}
				moveToPage(table);
			}
			
			function moveToPrevPage(table) {
				var c = table.config;
				c.page--;
				if(c.page <= 0) {
					c.page = 0;
				}
				moveToPage(table);
			}
			
			function moveToSelectedPage(table,selPageNumber){
			    var c= table.config;
			    c.page = (selPageNumber - 1);
			    moveToPage(table);
			}
						
			
			function moveToPage(table) {
				var c = table.config;
				if(c.page < 0 || c.page > (c.totalPages-1)) {
					c.page = 0;
				}
				
				renderTable(table,c.rowsCopy);
			}
			
			function renderTable(table,rows) {
				
				var c = table.config;
				//to persist page size when broswer back button is hit
				//var pageSize = $(config.cssPageSize,c.container).val();
				//c.size = pageSize;
				
				var l = rows.length;
				var s = (c.page * c.size);
				var e = (s + c.size);
				if(e > rows.length ) {
					e = rows.length;
				}
				
				
				var tableBody = $(table.tBodies[0]);
				
				// clear the table body
				
				$.tablesorter.clearTableBody(table);
				
				for(var i = s; i < e; i++) {
					
					//tableBody.append(rows[i]);
					
					var o = rows[i];
					var l = o.length;
					for(var j=0; j < l; j++) {
						
						tableBody[0].appendChild(o[j]);

					}
				}
				
				fixPosition(table,tableBody);
				
				$(table).trigger("applyWidgets");
				
				if( c.page >= c.totalPages ) {
        			moveToLastPage(table);
				}
				
				updatePageDisplay(c,table);
			}
			
			this.appender = function(table,rows) {
				
				var c = table.config;
				
				c.rowsCopy = rows;
				c.totalRows = rows.length;
				c.totalPages = Math.ceil(c.totalRows / c.size);
				
				renderTable(table,rows);
			};
			
			this.defaults = {
				size: 10,
				offset: 0,
				page: 0,
				totalRows: 0,
				totalPages: 0,
				numDisplayEntries: 5,
				container: null,
				cssNext: '.next',
				cssPrev: '.prev',
				cssFirst: '.first',
				cssLast: '.last',
				cssPageDisplay: '.pagedisplay',
				cssViewRecords: '.viewRecords',
				cssPageSize: '.pagesize',
				cssPageNumber: '.pagenumber',
				cssTestingPages: '#pagenumber',
				cssPages: '.pages',
				cssPageNav: '#pageNav',
				seperator: "/",
				positionFixed: true,
				appender: this.appender
			};
			
			this.construct = function(settings) {
				
				return this.each(function() {	
					
					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
					
					var table = this, pager = config.container;
				
					$(this).trigger("appendCache");
					
					config.size = parseInt($(".pagesize",pager).val());
					
					$(config.cssFirst,pager).click(function() {
						moveToFirstPage(table);
						return false;
					});
					$(config.cssNext,pager).click(function() {
						moveToNextPage(table);
						return false;
					});
					$(config.cssPrev,pager).click(function() {
						moveToPrevPage(table);
						return false;
					});
					$(config.cssLast,pager).click(function() {
						moveToLastPage(table);
						return false;
					});
					$(config.cssPageSize,pager).change(function() {
						setPageSize(table,parseInt($(this).val()));
						return false;
					});
					$(config.cssPageNumber,pager).change(function() {
						moveToSelectedPage(table,parseInt($(this).val()));
						return false;
					});
					
				});
			};
			
		}
	});
	// extend plugin scope
	$.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
	});
	
})(jQuery);				