/*
paginateTable 1.6
Copyright 2010-2011,  Matthew Page
licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php

Thanks to the following contributors:
Greg Pedder, Leon, Annie, Andrea, and pollirrata.

*/
(function ($) {
	/*
    Takes a table full of rows and only displays a subset of rows a page at a time.
    Responds to next page and previous page clicks to change the displayed page.
    Displays total pages and current page. 
    Hides pager if only a single page of rows.
    
    Example:
    
    <table id="myTable">
     <tbody>
        <tr><td>Apples</td></tr>
        <tr><td>Biscuits</td></tr>
        <tr><td>Cabbages</td></tr>
        <tr><td>Dumplings</td></tr>
        <tr><td>Eggs</td></tr>
        <tr><td>Flan</td></tr>
        <tr><td>Goose</td></tr>
        <tr><td>Ham</td></tr>
     <tbody>
    </table>
    <div class='pager'>
        <a href='#' alt='First' class='firstPage'>First</a>
        <a href='#' alt='Previous' class='prevPage'>Prev</a>
        
        <span class='currentPage'></span> of <span class='totalPages'></span>
        <a href='#' alt='Next' class='nextPage'>Next</a>
        <a href='#' alt='Last' class='lastPage'>Last</a>
    </div>
    
    <script>
    
    $(document).ready(function () {
        $('#myTable').paginateTable({ rowsPerPage: 2 });
    });
    </script>
    
    
    Or if you would rather have page numbers instead of the previous/next links:
    
    <div class='pager'>
        <span class='pageNumbers'></span>
    </div>
    
    Feel free to add rows to your tables. Just call paginateTable again. 
     
     var myTable = $('#myTable');
     myTable.paginateTable({ rowsPerPage: 2 }); 
     myTable.children('tbody').append('<tr><td>Hi</td></tr>');
     myTable.paginateTable({ rowsPerPage: 2 }); 
  */
	$.fn.paginateTable = function(options) {
  
		var settings = jQuery.extend({
			rowsPerPage: 5,               /* the number of rows that comprise a page */
			nextPage: ".nextPage", 		/* selector for "Next Page" dom element. Click to change page. */
			prevPage: ".prevPage",		/* selector for "Previous Page" dom element. Click to change page. */ 
          
			firstPage: ".firstPage",		/* selector for "First Page" dom element. Click to change page. */
			lastPage: ".lastPage",		/* selector for "Last Page" dom element. Click to change page. */
          
			currentPage: ".currentPage",	/* selector for "Current Page" dom element. Display only. */
			totalPages: ".totalPages",	/* selector for "Total Pages" dom element. Display only. */
			pageNumbers: ".pageNumbers",  /* selector for container for autogenerated page number links */
			maxPageNumbers: 10,  /* maximum number of page links to show */
			currentPageClass: "current",	/* if using page numbers, class to stylize the current page */
			pager: ".pager",		        /* selector for container of all paging dom elements */
			autoHidePager: true		    /* hides the pager (see selector above) if there is only a single page */
		}, options || {});
  
		return this.each(function(){
          
			var table = $(this);
			var pager = $(settings.pager);
			var nextPage = pager.find(settings.nextPage);
			var prevPage = pager.find(settings.prevPage);
			var currentPage = pager.find(settings.currentPage).first();
          
			var firstPage = pager.find(settings.firstPage);
			var lastPage = pager.find(settings.lastPage);
          
			nextPage.unbind('click');
			nextPage.click(function(){
				var pageNum = getCurrentPage(currentPage.text());
				displayPage(table, pageNum+1, settings);
				return false;
			});
			prevPage.unbind('click');
			prevPage.click(function(){
				var pageNum = getCurrentPage(currentPage.text());
				displayPage(table, pageNum-1, settings);
				return false;
			});
          
			firstPage.unbind('click');
			firstPage.click(function(){
				displayPage(table, 1, settings);
				return false;
			});
			lastPage.unbind('click');
			lastPage.click(function(){
				var rows = table.find("table");
				var totalPages = Math.ceil(rows.size() / settings.rowsPerPage);
				displayPage(table, totalPages, settings);
				return false;
			});
          
			displayPage(table, getCurrentPage(currentPage.text()), settings);
		});
	};
  
	function getCurrentPage(pageText){
		var pageNum = parseInt(pageText,10);
		if (isNaN(pageNum)){
			pageNum = 0;
		}
		return Math.max(1, pageNum);
	}

	function firstVisiblePageNumber(pageNum,totalPages,settings) {
		var p = pageNum - Math.floor(settings.maxPageNumbers/2);
    
		if(p<=1)
			return 1;

		return Math.min(p,totalPages - settings.maxPageNumbers);
	}

	function lastVisiblePageNumber(pageNum,totalPages ,settings) {
		var p = pageNum + Math.floor(settings.maxPageNumbers/2);
		if(p>=totalPages)
			return totalPages;
		return Math.max(p,1+settings.maxPageNumbers);
	}

	function displayPage(table, pageNum, settings){
		pageNum = Math.max(1, pageNum);
		if (settings.rowsPerPage > 0){
			var rows = table.find("table");
			var totalPages = Math.ceil(rows.size() / settings.rowsPerPage);
			if (settings.autoHidePager && totalPages <= 1){
				$(settings.pager).hide();
			}
			else if (totalPages > 0){
              
				pageNum = Math.min(pageNum, totalPages);
				var rowStartIndex = (pageNum - 1) * settings.rowsPerPage;
				var rowEndIndex = pageNum * settings.rowsPerPage;
				$.each(rows, function(index, row){
					if (index >= rowStartIndex && index < rowEndIndex){
						$(row).show();
					}
					else{
						$(row).hide();
					}
				});
              
				var pager = $(settings.pager);
				pager.find(settings.currentPage).text(pageNum);
				pager.find(settings.totalPages).text(totalPages);
              
				var pageNumbers = pager.find(settings.pageNumbers);
				if (pageNumbers.size() > 0){
					pageNumbers.empty();
					var current;
					var firstVisible = firstVisiblePageNumber(pageNum,totalPages,settings);
					var lastVisible = lastVisiblePageNumber(pageNum,totalPages,settings);
	   
					for(var i = firstVisible; i <= lastVisible; i++) {
						current = (pageNum == i)?settings.currentPageClass:'';
						pageNumbers.append("<a href='#' id='" + i + "' class='" + current + "'>" + i + "</a>");
					}
       
					pageNumbers.children('a').click(function(){
						displayPage(table, $(this).attr("id"), settings);
						return false;
					});
				}
			}
          
		}
	}
	
})(jQuery);

