(function($) {
	$.extend({
		tablesorterPager: new function() {
			
			function updatePageDisplay(c) {
			
				if( c.page == 0 ){
					$j("#prev_link_on").hide();
					$j("#prev_link_off").show();
				}else{
					$j("#prev_link_off").hide();
					$j("#prev_link_on").show();
				}

				if( c.page + 1 == c.totalPages ){
					$j("#next_link_on").hide();
					$j("#next_link_off").show();
				}else{
					$j("#next_link_off").hide();
					$j("#next_link_on").show();
				}
				var begin = c.page * c.size + 1;
				var end = (c.page + 1) * c.size;
				if(c.totalRows < end){
					end = c.totalRows;
				}
				var msg = begin + '～' + end + '件目を表示しています';
				if(begin == end){
					msg = begin + '件目を表示しています';
				}
				
				$j(".dloff").hide();
				$j(".dlon").show();
				$j("#dlink_on_" + (c.page + 1)).hide();
				$j("#dlink_off_" + (c.page + 1)).show();

				var s = $j(c.cssPageDisplay,c.container).html(msg);
			}
			
			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 = $j(table);
					if(o.offset) {
						c.container.css({
							top: o.offset().top + o.height() + 'px',
							width: o.width() + '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 moveToPageN(table, n) {
				var c = table.config;
				c.page = n - 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;
				var l = rows.length;
				var s = (c.page * c.size);
				var e = (s + c.size);
				if(e > rows.length ) {
					e = rows.length;
				}
				
				
				var tableBody = $j(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);
				
				$j(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;
				
					$j(this).trigger("appendCache");
					
					config.size = parseInt($j(".pagesize",pager).val());

					var c = table.config;
					if(c.totalPages == 1){
						$j("#table_pager").hide();
						$j("#directlink").hide();
						$j(".tablesorter").css("margin-bottom", "10px");
					}
					var directlink = '|';
					for (i = 0; i < c.totalPages; i = i +1){
						directlink += '<span class="dlon" id="dlink_on_' + (i + 1) + '"><a class="dlink" href="javascript:void(0);">' + (i + 1) + '</a></span><span class="dloff" id="dlink_off_' + (i + 1) + '">' + (i + 1) + '</span>|'; 
					}
					$j("#directlink").html(directlink);
					updatePageDisplay(c);
					
					$j(config.cssFirst,pager).click(function() {
						moveToFirstPage(table);
						return false;
					});
					$j(config.cssNext,pager).click(function() {
						moveToNextPage(table);
						return false;
					});
					$j(config.cssPrev,pager).click(function() {
						moveToPrevPage(table);
						return false;
					});
					$j(config.cssLast,pager).click(function() {
						moveToLastPage(table);
						return false;
					});
					$j(".dlink").click(function() {
						moveToPageN(table, $j(this).html());
						return false;
					});
					$j(config.cssPageSize,pager).change(function() {
						setPageSize(table,parseInt($j(this).val()));
						return false;
					});
				});
			};
			
		}
	});
	// extend plugin scope
	$.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
	});
	
})(jQuery);				
