/**
 * jQuery Plugin tablePager v1.0
 * Creates pagination for large tables.  tablePage hides all rows in the tbody of your
 * table and displays the rows in the current "page" of the table.  tablePager also
 * binds events and data to specified elements in the tfoot area of the table for paging
 * and information display.
 * 
 * USAGE:
 * 
 * jQuery("table").tablePager(options);
 * 
 * Copyright (c) 2008 David E Still [dave at stilldesigning dot com]
 * Available for use under the LGPL license
 * @author David E. Still, http://www.stilldesigning.com
 */
/**
 * Create pagination for large tables
 * 
 * @uses jQuery
 * 
 * @param Object opts JSON object of paging parameters
 * @param Integer opts_pagesize Number of table rows (<tr> tags) per page (default 15)
 * @param Integer opts_startpage First page displayed (default 1)
 * @param Object opts_selectors jQuery selectors to find buttons and data elements
 * @param String opts_selectors_next jQuery selector for "Next" button for paging forward through table.  All matching elements are captured for click events, and the current page is incremented by 1 when fired. (default ".pageNext")
 * @param String opts_selectors_prev jQuery selector for "Previous" button for paging back through table.  All matching elements are captured for click events, and the current page is decremented by 1 when fired. (default ".pagePrev")
 * @param String opts_selectors_page jQuery selector for elements displaying the current page number.  When the current page is updated, all matching elements are updated to display the current page number. (default ".pageNum")
 * @param String opts_selectors_count jQuery selector for elements displaying the total page count.  When tablePager is first called, all matching elements are updated to display the page count. (default ".pageCount")
 * 
 * @return jQuery element Returns the jQuery object representing the element
 */
jQuery.fn.tablePager = function() {
	var opts = jQuery.extend({
		pagesize: 10,
		startpage: 1,
		selectors: {
			next: ".pageNext",
			prev: ".pagePrev",
			page: ".pageNum",
			count: ".pageCount",
        gopage: ".goPage",
        first: ".first",
        last: ".last"
		},
		rowstyles: []
	}, arguments[0] || {});
	return this.each(function(){
		jQuery(this)[0].tablePager = {
			table: this,
			opts: opts,
			page: 1,
			showPage: function(page){
				var pagedTable = jQuery(this.table);
				var pagesize = this.opts.pagesize;
				var rows = pagedTable.find("tbody tr");
				page = parseInt(page,10);
				if (page < 1) { page = 1; }
				var count = Math.ceil(rows.length / pagesize);
				if (page > count) { page = count; }
				rows.removeClass(this.opts.rowstyles.join(" "));
				for (var i=0; i<rows.length; i++) {
					if (i>=(page-1)*pagesize && i<page*pagesize) {
						jQuery(rows[i]).addClass(this.opts.rowstyles[i % this.opts.rowstyles.length]);
						jQuery(rows[i]).show();
					}
					else { jQuery(rows[i]).hide(); }
				}
				this.page = page;
				pagedTable.find(this.opts.selectors.page).html(page);
				pagedTable.find(this.opts.selectors.count).html(count);
				return jQuery(this);
			},
			next: function() {
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
				var page = pagedTable[0].tablePager.page;
				pagedTable[0].tablePager.showPage(page+1);
				return false;
			},
			prev: function() {
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
				var page = pagedTable[0].tablePager.page;
				pagedTable[0].tablePager.showPage(page-1);
				return false;
			},
        gopage: function() {
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
				var num_page = jQuery(pagedTable[0].tablePager.opts.selectors.gopage).val();
            pagedTable[0].tablePager.showPage(num_page);
				return false;
        },
        first: function() {
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
            pagedTable[0].tablePager.showPage(1);
				return false;
        },
        last: function() {
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
            var rows = pagedTable.find("tbody tr");
            var pagesize = pagedTable[0].tablePager.opts.pagesize;
            var max_page = Math.ceil(rows.length / pagesize);
            pagedTable[0].tablePager.showPage(max_page);
				return false;
        }
		};
		jQuery(this)[0].tablePager.showPage(opts.startpage);
		jQuery(this).find(jQuery(this)[0].tablePager.opts.selectors.next).bind("click", jQuery(this), jQuery(this)[0].tablePager.next);
		jQuery(this).find(jQuery(this)[0].tablePager.opts.selectors.prev).bind("click", jQuery(this), jQuery(this)[0].tablePager.prev);
    jQuery(this).find(jQuery(this)[0].tablePager.opts.selectors.gopage).bind("blur", jQuery(this), jQuery(this)[0].tablePager.gopage);
    jQuery(this).find(jQuery(this)[0].tablePager.opts.selectors.first).bind("click", jQuery(this), jQuery(this)[0].tablePager.first);
    jQuery(this).find(jQuery(this)[0].tablePager.opts.selectors.last).bind("click", jQuery(this), jQuery(this)[0].tablePager.last);
	});
};

