/**
 * 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: {
			pagination: "#mcmCompanyList .footer .pagination",
			next: "#mcmCompanyList .footer .next",
			prev: "#mcmCompanyList .footer .previous",
			page: "#mcmCompanyList .footer .pageNum",
			count: "#mcmCompanyList .footer .pageCount",
			pageLinks: "#mcmCompanyList .footer .pageLinks"
		},
		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;
				jQuery(this.opts.selectors.page).html(page);
				jQuery(this.opts.selectors.count).html(count);
				var pageLinks = jQuery(this.opts.selectors.pageLinks).children();
				for (i = 0; i < pageLinks.length; i++) {
					if (this.page == jQuery(pageLinks[i]).text()) {
						jQuery(pageLinks[i]).addClass("selected");
					} else {
						jQuery(pageLinks[i]).removeClass("selected");
					}
				
				}
				return jQuery(this);
			},
			next: function(e) {
				e.preventDefault();
				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(e) {
				e.preventDefault();
				var pagedTable = (arguments.length < 1)?jQuery(this):arguments[0].data;
				var page = pagedTable[0].tablePager.page;
				pagedTable[0].tablePager.showPage(page-1);
				return false;
			},
			linkClick: function(e) {
				e.preventDefault();
				var pagedTable = jQuery(e.data.parentContext);
				pagedTable[0].tablePager.showPage(jQuery(this).text());
			},
			initialise: function() {
				var pagedTable = jQuery(this.table);
				var pagesize = this.opts.pagesize;
				var rows = pagedTable.find("tbody tr");
				var count = Math.ceil(rows.length / pagesize);
				if (count > 1) {
					var pageLinks = jQuery("<div></div>");
					for (i = 1; i <= count; i++) {
						var pageLink = jQuery("<a href=\"#\">" + i + "</a>");
						pageLink.bind("click", {parentContext: pagedTable[0]}, pagedTable[0].tablePager.linkClick);
						pageLinks.append(pageLink);
					}
					jQuery(this.opts.selectors.pageLinks).empty().append(pageLinks.children());
					jQuery(this.opts.selectors.pagination).show();
				}
			}
		};
		jQuery(this)[0].tablePager.initialise(); 
		jQuery(this)[0].tablePager.showPage(opts.startpage);
		jQuery(jQuery(this)[0].tablePager.opts.selectors.next).bind("click", jQuery(this), jQuery(this)[0].tablePager.next);
		jQuery(jQuery(this)[0].tablePager.opts.selectors.prev).bind("click", jQuery(this), jQuery(this)[0].tablePager.prev);
	});
};
