(function($) {
	$.extend({
		tablesorterPager: new function() {
			
			function updatePageDisplay(c, table) {
				//NOTE: NORTHEK SOFTWARE, we want pages to be displayed as numbers links and not in a text field
				//var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);	
				
				var html = new Array(c.totalPages);
				for (var i=1; i <= c.totalPages; i++) {
					if (i == c.page+1)
						html[i] = ['&nbsp;<span class="status_info">', i, '</span>&nbsp;'].join('');
					else
						html[i] = ['&nbsp;<a href="#" id="', i, '" class="jump">', i, '</a>&nbsp;'].join('');
				}
				
				$(c.cssPageDisplay,c.container).html(html.join(''));
				$('.jump').click(function() {
					jumpToPage(table, parseInt($(this).attr('id'))-1);
					return false; // return true to send user to the top of the page
				});
				
				window.scroll(0,0);
			}
			
			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);
					//NOTE: NORTHEK SOFTWARE, commented out to avoid absolute positioning
					/*if(o.offset) {
						c.container.css({
							top: o.offset().top + o.height() + 'px',
							position: 'absolute'
						});
					}*/
					c.pagerPositionSet = true;
				}
			}
			
			//NOTE: NORTHEK SOFTWARE, added jump to page support
			function jumpToPage(table, page) {
				var c = table.config;
				c.page = page;
				moveToPage(table);
			}
			
			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);
			}
			
			//NOTE: NORTHEK SOFTWARE, added filter functionality
			function filterTable(table, filterValue) {
				var c = table.config;
				
				if (typeof filterValue != 'undefined' && filterValue != null && filterValue != '') {
					var tableBody = $(table.tBodies[0]);
					
					// clear the table body
					$.tablesorter.clearTableBody(table);
					
					for (var i = 0; i < c.rowsCopy.length; i++) {
						var o = c.rowsCopy[i];
						var l = o.length;
						
						if (o.find('td:containsIgnoreCase("' + filterValue + '")').length > 0) {
							for (var j=0; j < l; j++) {
								tableBody[0].appendChild(o[j]);
							}
						}
					}
					
					fixPosition(table, tableBody);
					
					$(table).trigger("applyWidgets");
					
					if (typeof table.callback != 'undefined') {
						table.callback(table.id);
					}
				}
				else {
					renderTable(table, c.rowsCopy);
				}
			}
			
			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);
				}
				
				// NOTE: NORTHEK SOFTWARE, added table parameter to support jumpToPage
				updatePageDisplay(c, table);
				if (typeof table.callback != 'undefined') {
					table.callback(table.id);
				}
			}
			
			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: 5,
				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, callback, filterSelector) {

				return this.each(function() {
					
					//NOTE: NORTHEK SOFTWARE, added callback functionality
					this.id = $(this).attr('id');
					this.callback = callback;
					
					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
					
					var table = this, pager = config.container;
				
					$(this).trigger("appendCache");
					
					//NOTE: NORTHEK, disabled because size selector is hidden
					//config.size = parseInt($(".pagesize",pager).val());
					config.size = 20;
					
					$(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;
					});
					//NOTE: NORTHEK, disabled because size selector is hidden
					setPageSize(table, 20);
					/*$(config.cssPageSize,pager).change(function() {
						setPageSize(table,parseInt($(this).val()));
						return false;
					});*/
					
					//NOTE: NORTHEK SOFTWARE, added table filter functionality
					if (typeof filterSelector != 'undefined' && filterSelector != null && filterSelector != '') {
						$(filterSelector).keyup(function() {
							filterTable(table, $(this).val());
							return false;
						});
					}
				});
			};
			
		}
	});
	// extend plugin scope
	$.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
	});
	
})(jQuery);	
