(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 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);       
