// JavaScript Document
(function($) {
		  
	$(function() {

		Sprint.pagination = {
			
			/*
				TODO: 
				We probably want to rename "supportPagination" to just "pagination" and move the CSS styles
				from support.css to global.css if pagination should be used as a global element.
			*/
			
			// Returns the currently selected page
			getCurrentPage: function() {
				return parseInt( $( $("div.supportPagination").get(0) ).find("li").not(".pageDirect").not(".pagePrev").not(".pageNext").not(".ellipses").html());
			},
			
			// Returns the last page number in integer format
			getLastPage: function() {
				var lastselectedPage =  $($("div.supportPagination").get(0)).find("li.pageDirect:last a").html();
				if( lastselectedPage==null ){
					lastselectedPage = $($("div.supportPagination").get(0)).find("li.pageDirect:last").html();
				}
				return parseInt( lastselectedPage );
			},
			
			// The rendering function for search results should be passed in since there might be different needs on different pages
			renderResults: function() {},
			
			// Updates the pagination module
			update: function(selectedPage, totalResults, resultsPerPage) {
							
				/*
					TODO: We might want to add options for:
					- Custom Text (It might not always be "articles" that are the results)
				*/
				
				var PAGES_TO_SHOW = 5;
				var PREV_ICON_SRC = "/global/images/icons/ico_pagination_prev.gif";
				var PREV_ICON_DISABLED_SRC = "/global/images/icons/ico_pagination_prev_disabled.gif";
				var NEXT_ICON_SRC = "/global/images/icons/ico_pagination_next.gif";
				var NEXT_ICON_DISABLED_SRC = "/global/images/icons/ico_pagination_next_disabled.gif";
				
				var totalPages = Math.ceil(totalResults/resultsPerPage);
				var lastResult = selectedPage * resultsPerPage;
				var firstResult = (lastResult - resultsPerPage) + 1;
				
				// If we have less than a full page of results
				if (totalResults < lastResult) {
					lastResult = totalResults;
				}
				
				// figure out which "chunk" we're showing
				var firstNum = selectedPage;
				var lastNum = selectedPage;
				
				
				// render result range
				var pageInfo = $("p.pageInfo");
				if (totalResults == 0) {
					pageInfo.html("0 articles so far");
				}
				else  {
					pageInfo.html("Showing " + firstResult + " - " + lastResult + " of " + totalResults + " articles");
				}
				
				var pageList = $("div.supportPagination ul.pageList");
				
			
				// remove the old pagination
				pageList.html("");
				
				// if we have no articles or only 1 page...just show pagination with 1
				if (totalResults == 0 || totalPages == 1) {
					pageList.append("<li class=\"pagePrev\">" +
										"<img src=\"" + PREV_ICON_DISABLED_SRC + "\" alt=\"Previous\" />" +
									"</li>" +
									"<li>1</li>" +
									"<li class=\"pageNext\">" +
										"<img src=\"" + NEXT_ICON_DISABLED_SRC + "\" alt=\"Next\" />" +
									"</li>"
							);
					return true;
				}
							
				if (selectedPage <= PAGES_TO_SHOW) {
					firstNum = 1;
					lastNum = (totalPages < PAGES_TO_SHOW ? totalPages : PAGES_TO_SHOW);
				} else if (selectedPage >= (totalPages-PAGES_TO_SHOW + 1) ) {
					firstNum = totalPages-PAGES_TO_SHOW + 1;
					lastNum = totalPages;
				} else {
					//find the closest multiple of PAGES_TO_SHOW below
					while ((firstNum-1) % PAGES_TO_SHOW!=0) {
						firstNum--;
					}
					lastNum = firstNum + PAGES_TO_SHOW - 1;
				}
				
				//add the previous arrow and first page
				if ( selectedPage == 1 ) {
					pageList.append("<li class=\"pagePrev\">" +
										"<img src=\"" + PREV_ICON_DISABLED_SRC + "\" alt=\"Previous\" />" +
									"</li>" +
									"<li>1</li>"
							);
					
				} else {
					pageList.append("<li class=\"pagePrev\">" +
										"<a href=\"#\"><img src=\"" + PREV_ICON_SRC + "\" alt=\"Previous\" /></a>"+
									"</li>" +
									"<li class=\"pageDirect\"><a href=\"#\">1</a></li>"
							);
				}
				
				//add ellipses if needed
				if (firstNum != 1 && firstNum != 2) {
					pageList.append("<li class=\"ellipses down\"><a href=\"#\">...</a></li>");
				}
				
				//add page numbers
				for (i=firstNum; i<=lastNum; i++){
					//dont generate first or last page num in this loop
					if ( i == 1 || i == totalPages) {
						continue;
					}
					if (i == selectedPage){
						pageList.append("<li>" + i + "</li>");
					}
					else {
						pageList.append("<li class=\"pageDirect\"><a href=\"#\">" + i + "</a></li>");
					}
				}
				
				//add ellipses if needed
				if( lastNum != totalPages && (totalPages - 1 != PAGES_TO_SHOW) ) {
					pageList.append("<li class=\"ellipses up\"><a href=\"#\">...</a></li>");
				}
				
				//add the next arrow and last page
				if( selectedPage == totalPages ) {
					pageList.append("<li>" + totalPages + "</li>\n" +
									"<li class=\"pageNext\">" +
										"<img src=\"" + NEXT_ICON_DISABLED_SRC + "\" alt=\"Next\" />" +
									"</li>"
							);
					
				}
				else {
					pageList.append("<li class=\"pageDirect\"><a href=\"#\">" + totalPages + "</a></li>" +
									"<li class=\"pageNext\">" +
										"<a href=\"#\"><img src=\"" + NEXT_ICON_SRC + "\" alt=\"Next\" /></a>"+
									"</li>"
							);
				}
			}
		}
		
		
		/* Event handlers for pagination
		-------------------------------------*/
		
		// Direct Page
		$("div.supportPagination li.pageDirect a").live("click", function(e){
			e.preventDefault();
			var selectedPage = $(this).html();
			Sprint.pagination.renderResults(selectedPage);
		});
		
		// Previous Page
		$("div.supportPagination li.pagePrev a").live("click", function(e){
			e.preventDefault();
			var selectedPage = Sprint.pagination.getCurrentPage() - 1;
			if( selectedPage  < 1) { 
				return false;
			}
			Sprint.pagination.renderResults(selectedPage);
		});

		// Next Page
		$("div.supportPagination li.pageNext a").live("click", function(e){
			e.preventDefault();
			var selectedPage = Sprint.pagination.getCurrentPage() + 1;
			var lastselectedPage = Sprint.pagination.getLastPage();
			if ( selectedPage  > lastselectedPage) {
				return false;
			}
			Sprint.pagination.renderResults(selectedPage);
		});
		
		// Ellipses
		$("div.supportPagination li.ellipses a").live("click", function(e){
			e.preventDefault();
			
			// Get current page "chunk"
			var firstPage = 1;
			var lastPage = Sprint.pagination.getLastPage();
			var firstEl = $("div.supportPagination li.ellipses.down");
						
			if( firstEl.length > 0 ) {
				firstPage = parseInt(firstEl.next("li").find("a").html());
				if( isNaN(firstPage) ) {firstPage = parseInt(firstEl.next("li").html())	};
			}
			
			// Decide the next page to load
			if ($(this).parent("li").hasClass("up")){
				var newPage = firstPage + 5;
				if ( newPage > lastPage ) {
					newPage = lastPage;
				}
				Sprint.pagination.renderResults(newPage);
			}
			else if ($(this).parent("li").hasClass("down")) {
				var newPage = firstPage - 5;
				if (newPage < 1) {
					newPage = 1;
				}
				Sprint.pagination.renderResults(newPage);
			}
		});
		
	});
	  
})(jQuery);