jQuery.fn.paginate = function(options){
	options = jQuery.extend({
		 rowsPerPage:10
		,currentPage:0
		,prevText:"Prev"
		,nextText:"Next"
		,showAll:false
		,position:'both'
	}, options||{});
	
	return this.each(function() {
		var currentPage = options.currentPage;
		var rowsPerPage = options.rowsPerPage;
		var $table = $(this);
		var numRows = $table.find('tbody tr').length;
		
		if (numRows <= rowsPerPage){ return; }
		
		var numPages = Math.ceil(numRows / rowsPerPage);
		var $pager = $('<div class="pager"></div>');


		$table.bind('repaginate', function() {
			var lower = (currentPage * rowsPerPage);
			var upper = (currentPage + 1) * rowsPerPage - 1;
			$table.data('paged', true).find('tbody tr').show().filter(':lt('+ lower +'), :gt('+ upper +')').hide();
		});


		var PrevNext = function(event){
			var direction = event.data['direction'];
			var nextPage = $('.pager .pages a.active:first');
			if (direction > 0) {
				nextPage.next().trigger('click');
			} else { 
				nextPage.prev().trigger('click');
			}
		};
		
		var ShowAllToggle = function(event){
			if ($table.data('paged')) {
				$table.data('paged', false).find('tbody tr').show(); 
				$('.pager .pages, .pager .prev, .pager .next').hide(); 
				$('.pager .showAll').html('Show Paged');
			}
			else {
				$table.trigger('repaginate'); 
				$('.pager .pages, .pager .prev, .pager .next').show(); 
				$('.pager .showAll').html('Show All');
			}
		}
		
		$('<a class="prev">'+ options.prevText +'</a>').bind('click', {'direction': -1}, PrevNext).appendTo($pager);
		
		var $pages = $('<span class="pages" />').appendTo($pager);
		for (var page = 0; page < numPages; page++) { 
			$('<a class="page-number">' + (page + 1) + '</a>').bind('click', {'newPage': page}, function(event) {
					currentPage = event.data['newPage'];
					$table.trigger('repaginate');
					$('.pager .pages').each(function(){ $('.page-number', this).removeClass('active').eq(currentPage).addClass('active'); });
					
			}).appendTo($pages);
		}
		
		$('<a class="next">'+ options.nextText +'</a>').bind('click', {'direction': 1}, PrevNext).appendTo($pager);
		
		if (options.showAll) {
			$('<a class="showAll">Show All</a>').click(ShowAllToggle).appendTo($pager);
		}
		
		switch (options.position.toString()) {
		case 'top': case 'TOP':
			$pager.insertBefore($table);
			break;
		
		case 'bottom': case 'BOTTOM':
			$pager.insertAfter($table);
			break;

		case 'both': case 'BOTH':
			$pager.insertBefore($table).clone(true).insertAfter($table);
			break;		
		}

		$('.pager .pages').each(function(){ $('.page-number:first', this).addClass('active'); });

		$table.trigger('repaginate'); 
	
	});
};

