(function($) {
    $.extend({
	    tablesorterPager: new function() {
		    
		    function updatePageDisplay(c) {
			var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);
			$(c.cssPageDisplay,c.container).html((c.page+1) + c.seperator + c.totalPages);
		    }
		    
		    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 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;
			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);
		    }
		    
		    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,
			container: null,
			cssNext: '.next',
			cssPrev: '.prev',
			cssFirst: '.first',
			cssLast: '.last',
			cssPageDisplay: '.pagedisplay',
			cssPageSize: '.pagesize',
			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;
				    });
			    });
		    };
		    
		}
		});
    // extend plugin scope
    $.fn.extend({
	    tablesorterPager: $.tablesorterPager.construct
		});
    
})(jQuery);