(function($) {
  $.paginateTable = {
    defaults: {
      page: 0,
      perPage: 20
    }
  };
  $.fn.paginateTable = function(conf) {
    return this.each(function(){
      var config = $.extend({}, $.paginateTable.defaults, conf);
      var $table = $(this);
      $table.bind('repaginate', function() {
          var numRows = $table.find('tbody tr').length;
          var numPages = Math.ceil(numRows / config.perPage);
  	  $table.find('tbody tr').show();
  	  $table.find('tbody tr:lt(' + (config.page * config.perPage) + ')').hide();
  	  $table.find('tbody tr:gt(' + ((config.page + 1) * config.perPage - 1) + ')').hide();
  	  $table.find('.pager .display').html("Page <strong>" + (config.page + 1) + "</strong> of <strong>" + numPages + "</strong>");
      })
      var numRows = $table.find('tbody tr').length;
      var numPages = Math.ceil(numRows / config.perPage);
      var $pager = $('<div class="pager"></div>');
      $('<div class="previous"></div>').click(function(){
        var numRows = $table.find('tbody tr').length;
        var numPages = Math.ceil(numRows / config.perPage);
        if (config.page > 0) {
          config.page = config.page - 1;
          $table.trigger('repaginate');
        }
      }).appendTo($pager);
      $pager.append('<span class="display"></span>');
      $('<div class="next"></div>').click(function(){
        var numRows = $table.find('tbody tr').length;
        var numPages = Math.ceil(numRows / config.perPage);
        if (config.page + 1 < numPages) {
          config.page = config.page + 1;
          $table.trigger('repaginate');
        }
      }).appendTo($pager);
      $pager.find('span.page-number:first').addClass('active');
      $pager.appendTo($table.find('tfoot tr td'));
      $table.trigger('repaginate');
    });
  };
})(jQuery);