(function($) {
	$.extend({
		tablesorterPager: new function() {

			function updatePageDisplay(c) {
				var s = $(c.cssPageDisplay,c.container).val((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 renderPages(table){
        var c = table.config;
        $(c.pagesContainer).html('');

        if(c.page >= 5) initpage = c.page - 5;
        else initpage = 0;
        
        var exitpage = 0;
        if((c.totalPages - initpage) >= 10){
          exitpage = initpage+10;
        } else {
          exitpage = c.totalPages;
          initpage = c.totalPages-10;
          if(initpage <= 0) initpage = 0;
        }

        for (page = initpage; page < exitpage; page++) {
          var pagestr;
          
          // set page format
          if(page < 9) pagestr = '0' + (page + 1);
          else pagestr = (page + 1);
        	
          $('<li><a id="pageNumber'+page+'" href="javascript:return false;">' + pagestr + '</a></li>')
    			.bind('click', {'newPage': page}, function(event) {
    				c.page = event.data.newPage;
    				moveToPage(table);
            }).appendTo(c.pagesContainer).addClass('clickable');
          if(c.page == page) {
        	$('#pageNumber'+page).addClass('active');  
          }
        }
        
        // append total count
        $('<li> of </li>').appendTo(c.pagesContainer);
        
        // pages format
        if(c.totalPages < 10) pagestr = "0" + c.totalPages;
        else pagestr = c.totalPages;
        
        $('<li><a href="javascript:return false;">' + pagestr + '</a></li>').bind('click', {'newPage': c.totalPages-1}, function(event) {
			c.page = event.data.newPage;
			moveToPage(table);
    }).appendTo(c.pagesContainer)
        
      }

			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);
        renderPages(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,
				container: null,
				cssNext: '.next',
				cssPrev: '.prev',
				cssFirst: '.first',
				cssLast: '.last',
				cssPageDisplay: '.pagedisplay',
				cssPageSize: '.pagesize',
        pagesContainer: null,
				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(config.size);

					$(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;
					});
				});
			};

		}
	});
	// extend plugin scope
	$.fn.extend({
        tablesorterPager: $.tablesorterPager.construct
	});

})(jQuery);				
