/**
 * Paginator Plugin
 * Plugin to manage the buttons within a paginated set of pages.
 * Requires the 'click' option to be set to a function to be called
 * when the page is changed.
 */

(function($) {
	$.fn.paginate = function(options) {
	
		var curPage = 0;
		var $this;
		
		return this.each(function() {
		
			var settings = $.extend({
				itemsPerPage: 5,
				initialPage: 1,
				numItems: 1,
				ajaxLoad: false,
				textButtons: true,
				makeList: false,
				preText: ''
			}, options);
		
			var mySettings = settings;
			var numPages = Math.ceil(settings.numItems/settings.itemsPerPage);
			
			$this = $(this);
			
			$(this).data('settings', settings);
			
			var curPage = settings.initialPage - 1;
			$(this).data('curPage', curPage);
			
			$(this).find('a.pageButton').die('click').live('click', function(settings) {
				var container = (settings.makeList) ? $(this).parent().parent().parent() : $(this).parent();
				var curPage = container.data('curPage');
				
				var parts = this.id.split('_');
				var page = parts[1];
				
				var idList = [];
			
				if (page == 'prev') {
					page = curPage - 1;
					if (page < 0) return false;
				}
				else if (page == 'next') {
					page = curPage + 1;
					if (page >= numPages) return false;
				} else var page = parseInt(page);	
				
				container.data('curPage', page);
				curPage = page;
				
				renderPages(container, curPage, container.data('settings'));
					
				var newButton = container.find("#page_" + curPage);
				newButton.addClass('page-on');
				// call the user assigned click function
				mySettings.click.call(newButton, page);
				return false;
			});
			
			renderPages($(this), curPage, settings);
			
			if (settings['initialPage'] != 1) {
				if (!settings['ajaxLoad'])
					$("#page_" + (mySettings['initialPage'] - 1)).click();
				else
					$(this).find("#page_" + (mySettings['initialPage'] - 1)).addClass('page-on');
			}
			else {
				$(this).find("#page_0").addClass('page-on');
			}
		});
	
		function renderPages(container, curPage, settings) {
			var buffer = (settings.makeList) ? '<ul>' : '';
			var printPage;
			var numPages = Math.ceil(settings.numItems/settings.itemsPerPage);
			
			buffer += settings.preText;
			
			var prevText = (settings.textButtons) ? '&lt;&lt; Previous' : '';
			var nextText = (settings.textButtons) ? 'Next &gt;&gt;' : '';
				
			if (numPages > 1) {
				if (settings.makeList) buffer += '<li>';
				buffer += '<a href="#" title="Go to Previous Page" class="previous pageButton" id="page_prev">' + prevText + '</a>';
				if (settings.makeList) buffer += '</li>';
			}
			if (settings.makeList) buffer += '<li>';
			buffer += '<a class="pageButton" title="Go to Page 1" href="#" id="page_0">' + 1 + '</a>';
			if (settings.makeList) buffer += '</li>';
			
			var start = curPage - 2;
			if (start < 1) {
				start = 1;	
			}
				
			var end = curPage + 3;
			
			if (end - start < 4)
				end = start + 4;
			
			if (end > numPages - 1) {	
				end = numPages - 1;
				start = end - 5;
				if (start < 1) start = 1;
			}
			
			if (curPage > 3 && start > 1)
				buffer += '<span class="ellipses">...</span>';
			
			// display the numbered pages
			for (printPage = start; printPage < end; printPage++) {
				if (settings.makeList) buffer += '<li>';
				buffer += '<a class="pageButton" title="Go to page ' + (printPage+1) + '" href="#" id="page_' + printPage + '">' + (printPage+1) + '</a>';
				if (settings.makeList) buffer += '</li>';
			}
			
			if (numPages > 5 && end < numPages-1) {
				buffer += '<span class="ellipses">...</span>';
			}
			if (numPages > 1) {
				if (settings.makeList) buffer += '<li>';
				buffer += '<a class="pageButton" title="Go to page ' + numPages + '" href="#" id="page_' + (numPages - 1) + '">' + (numPages) + '</a>';
				if (settings.makeList) buffer += '</li><li>';
				buffer += '<a href="#" class="next pageButton" title="Go to Next Page" id="page_next">' + nextText + '</a>';
				if (settings.makeList) buffer += '</li>';
			}
			if (settings.makeList) buffer += '</ul>';
			container.html(buffer);
		}
	}
	
})(jQuery);
