﻿(function($)
{
	jQuery.fn.paginate = function(settings)
	{
		// Set up config defaults
		var config =
		{
			"currentPage": 0,
			"divisor": 20,
			"resultTableElement": "div#resultsTable"
		};
		
		// Extend config object with settings if they were provided
		if(settings)
		{
			jQuery.extend(config, settings);
		}
		
		// Pagination Handler
		function paginationHandler(event)
		{
			jQuery(config.resultTableElement).populate({begin: event.data.begin, end: event.data.end, currentPage: event.data.currentPage, cache: true, enableSort: false, scrollToTop: false});
		}
		
		// Code for plugin
		this.each(function()
		{
			// Unbind all previous pagination events
			jQuery("a.pageLink, div.next, div.prev").unbind();
			
			// Get the object reference
			obj = jQuery(this);
			
			// Get the length of the result set (fix zero offset)
			resultLength = jQuery.dataResource.length;
			
			// Populate the job count div
			jQuery("div.jobCount").text("Found " + resultLength + " Jobs");
			
			// Figure out the amount of pages that are in the result set
			resultPages = resultLength / config.divisor;
			
			// Round up the pages (if there's a decimal)
			if(resultLength % config.divisor)
			{
				resultPages = Math.ceil(resultPages);
			}
			
			// Declare the pagination markup string
			var paginationMarkup = new String();
			
			// Begin the page links div.
			paginationMarkup += "<div class=\"pageLinks\">";
			
			if(resultLength > 20)
			{
				paginationMarkup += "<div class=\"prev";

				if(config.currentPage == 0)
				{
					paginationMarkup += " disabled";
				}

				paginationMarkup += "\"><img src=\"/~/media/Careers/Images/Icons/icon_arrowleft.ashx\" alt=\"Previous\" title=\"Previous\" width=\"24\" height=\"19\" /></div>";
				paginationMarkup += "<div class=\"pages\">";
				
				// Figure out our pagination approach
				if(resultPages <= 10)
				{
					// Print them all out.
					for(var i = 0; i < resultPages; i++)
					{
						paginationMarkup += "<a class=\"pageLink";
						
						if(i == config.currentPage)
						{
							paginationMarkup += " pageOn";
						}
						
						paginationMarkup += " page_" + (i + 1) + "\">" + (i + 1) + "</a>";
						
						if((i + 1) < resultPages)
						{
							paginationMarkup += "&nbsp;";
						}
					}
				}
				else
				{
					// We need to group our pagination by fours
					if(config.currentPage < 3)
					{
						for(var i = 0; i < 3; i++)
						{
							paginationMarkup += "<a class=\"pageLink";
							
							if(i == config.currentPage)
							{
								paginationMarkup += " pageOn";
							}
							
							paginationMarkup += " page_" + (i + 1) + "\">" + (i + 1) + "</a>";
							
							if((i + 1) < resultPages)
							{
								paginationMarkup += "&nbsp;";
							}
						}
						
						// Add the elipsis
						paginationMarkup += "&nbsp;...&nbsp;&nbsp;"
						
						// Add the last page
						paginationMarkup += "<a class=\"pageLink " + "page_" + resultPages + "\">" + resultPages + "</a>";
					}
					else if(config.currentPage > 2 && config.currentPage < (resultPages - 3))
					{
						// Add the first page
						paginationMarkup += "<a class=\"pageLink page_1\">1</a>";
						
						// Add the elipsis
						paginationMarkup += "&nbsp;&nbsp;...&nbsp;&nbsp;"
						
						// Iterate through the next set of three pages
						for(var i = (config.currentPage - 1); i < (config.currentPage + 2); i++)
						{
							paginationMarkup += "<a class=\"pageLink page_" + (i + 1);
							
							if(i == config.currentPage)
							{
								paginationMarkup += " pageOn";
							}
							
							paginationMarkup += "\">" + (i + 1) + "</a>";
							
							if((i + 1) < resultPages)
							{
								paginationMarkup += "&nbsp;";
							}
						}
						
						// Add the elipsis
						paginationMarkup += "&nbsp;...&nbsp;&nbsp;"
						
						// Add the last page
						paginationMarkup += "<a class=\"pageLink page_" + resultPages + "\">" + resultPages + "</a>";
					}
					else
					{
						// Add the first page
						paginationMarkup += "<a class=\"pageLink page_1\">1</a>";
						
						// Add the elipsis
						paginationMarkup += "&nbsp;&nbsp;...&nbsp;&nbsp;"
						
						// Iterate through the last four pages
						for(var i = (resultPages - 3); i < resultPages; i++)
						{
							paginationMarkup += "<a class=\"pageLink";
							
							if(i == config.currentPage)
							{
								paginationMarkup += " pageOn";
							}
							
							paginationMarkup += " page_" + (i + 1) + "\">" + (i + 1) + "</a>";
							
							if((i + 1) < resultPages)
							{
								paginationMarkup += "&nbsp;";
							}
						}
					}
				}
				
				paginationMarkup += "</div>";
				paginationMarkup += "<div class=\"next";
				
				if((config.currentPage + 1) == resultPages)
				{
					paginationMarkup += " disabled";
				}

				paginationMarkup += "\"><img src=\"/~/media/Careers/Images/Icons/icon_arrowright.ashx\" alt=\"Next\" title=\"Next\" width=\"24\" height=\"19\" /></div>";
			}
			else
			{
				paginationMarkup += "<div class=\"prev disabled\"><img src=\"/~/media/Careers/Images/Icons/icon_arrowleft.ashx\" alt=\"Previous\" title=\"Previous\" width=\"24\" height=\"19\" /></div>";
				paginationMarkup += "<div class=\"pages\"><a class=\"pageLink pageOn\">1</a></div>";
				paginationMarkup += "<div class=\"next disabled\"><img src=\"/~/media/Careers/Images/Icons/icon_arrowright.ashx\" alt=\"Previous\" title=\"Next\" width=\"24\" height=\"19\" /></div>";
			}
			
			// Close the pageLinks div
			paginationMarkup += "</div>";
			
			// Print the markup
			obj.html(paginationMarkup);
			
			// Bind events for all button links
			for(var j = 0; j < resultPages; j++)
			{
				jQuery("a.page_" + (j + 1)).bind("click", {begin: (config.divisor * j), end: ((config.divisor * j) + 19), currentPage: j}, paginationHandler);
			}
			
			// Bind previous button
			if(config.currentPage > 0)
			{
				jQuery("div.prev").bind("click", {begin: ((config.divisor * config.currentPage) - 20), end: ((config.divisor * config.currentPage) - 1), currentPage: (config.currentPage - 1)}, paginationHandler);
			}
			
			// Bind next button
			if((config.currentPage + 1) < resultPages)
			{
				jQuery("div.next").bind("click", {begin: ((config.divisor * config.currentPage) + 20), end: ((config.divisor * config.currentPage) + 39), currentPage: (config.currentPage + 1)}, paginationHandler);
			}
			
			// If there are no jobs found, hide the pagination
			if(resultLength <= 20)
			{
				jQuery("div.pagination").css("visibility", "hidden");
			}
			else
			{
				jQuery("div.pagination").css("visibility", "visible");
			}
		});
		
		return this;
	};
})(jQuery);