$.fn.tablesort = function() {

    var $table = $(this);
    $table.find('th').each(function(column) {
    var findSortKey;

    if ($(this).is('.sort-alpha')) {
      findSortKey = function($cell) {
        return $cell.find('.sort-key').text().toUpperCase() + ' ' + $cell.text().toUpperCase();
      };
    }
    else if ($(this).is('.sort-numeric')) {
      findSortKey = function($cell) {
        var key = parseFloat($cell.text().replace(/[^\d\.]+/gi, ''));
        //alert(key);
        return isNaN(key) ? 0 : key;
      };
    }
    else if ($(this).is('.sort-date')) {
      findSortKey = function($cell) {
        return Date.parse('1 ' + $cell.text());
      };
    }

    if (findSortKey) {
        rows = $table.find('tbody:first > tr:gt(0)').get();

        $.each(rows, function(index, row) {
          row.sortKey = findSortKey($(row).children('td').eq(column));
        });
        rows.sort(function(a, b) {
        if (a.sortKey < b.sortKey) return 1;
        return 0;
        });
        $.each(rows, function(index, row) {
          $table.children('tbody:first').find('tr:first').after(row);
          row.sortKey = null;
        });

        $table.find('td').removeClass('sorted')
          .filter(':nth-child(' + (column + 1) + ')').addClass('sorted');
        $table.trigger('repaginate');
    }
  });

};

$(document).ready(function() {

  $('table.paginated').each(function() {
var currentPage = 0;
var numPerPage = 20;

  var $table = $(this);

  $table.bind('repaginate', function() {
  $table.find('tbody tr').show()
  	.slice(0,currentPage * numPerPage)
  	.hide()
  	.end()
  	.slice((currentPage + 1) * numPerPage)
  	.hide()
  	.end();
});

var numRows = $table.find('tbody tr').length;
var numPages = Math.ceil(numRows / numPerPage);

var $pager = $('<div class="pager"></div>');
for (var page = 0; page < numPages; page++) {
  $('<span class="page-number">' + (page + 1) + '</span>')
   .bind('click', {'newPage': page}, function(event) {
     currentPage = event.data['newPage'];
     numPerPage = 20;
     $table.trigger('repaginate');
     $(this).addClass('active').siblings().removeClass('active');
   })
   .appendTo($pager).addClass('clickable');
}
$('<span class="view-all">View All</span>').bind('click', {'newPage':page}, function(event) {
	$(this).addClass('active').siblings().removeClass('active');
    currentPage = 0;
    numPerPage = numRows;
    $table.trigger('repaginate');
}).appendTo($pager).addClass('clickable');
$pager.find('span.page-number:first').addClass('active');
$pager.insertBefore($table);

  $table.trigger('repaginate');

  });

});