YAHOO.namespace("Youniverse");

YAHOO.Youniverse.paginator = function()
{
	/**
	 * pagination
	 *
	 * e.g. paginator.pagination (12, 2, 'shoutbox.selectPage', 'paginationBlock')
	 */
	this.pagination = function (numPages, currentPage, pageSelectorFn, container)
	{
		var pageBlockSize = 5; // how many page numbers to display
		var minPage = 1, maxPage = numPages, pageBefore, pageAfter, showPrev = false, showNext = false, nextPage, prevPage;
		var paginationBlock = document.getElementById(container); // pagination div id
		
		while (paginationBlock.hasChildNodes()) paginationBlock.removeChild(paginationBlock.firstChild);
		
		var pageCount = document.createElement('div');
		
		if (numPages == 0)
		{
			var currentPageDisplayValue = 0;
		}
		else
		{
			var currentPageDisplayValue = currentPage;
		}
		
		pageCount.innerHTML = 'Page ' + currentPageDisplayValue + ' of ' + numPages;
		
		var listBlock = document.createElement('ul');
		
		// display previous link?
		if (currentPage > 1)
		{
			showPrev = true;
		}
		
		if (numPages >= pageBlockSize)
		{
			maxPage    = pageBlockSize;
			pageBefore = Math.floor((pageBlockSize - 1) / 2);
			pageAfter  = (pageBlockSize - 1) - pageBefore;
			
			if (currentPage == 1)
			{
				maxPage = pageBlockSize;
			}
			else
			{
				if (currentPage + (pageBlockSize - 1) < numPages)
				{
					minPage = ((currentPage - pageBefore) <= 0) ? 1 : currentPage - pageBefore;
					maxPage = minPage + (pageBlockSize - 1);
				}
				else if (currentPage + (pageBlockSize - 1) == numPages)
				{
					minPage = ((currentPage - pageBefore) == 0) ? 1 : currentPage - pageBefore;
					maxPage = currentPage + pageAfter;
					if ((minPage + maxPage) <= numPages)
					{
						if (minPage + pageBlockSize <= numPages)
						{
							maxPage = minPage + (pageBlockSize - 1);
						}
					}
				}
				else
				{
					minPage = ((currentPage - pageBefore) == 0) ? 1 : currentPage - pageBefore;
					maxPage = ((currentPage + pageAfter) > numPages) ? numPages : currentPage + pageAfter;
					if (maxPage - (minPage - 1) < pageBlockSize)
					{
						minPage = numPages - (pageBlockSize - 1);
					}
					
					if ((minPage + maxPage) == numPages)
					{
						maxPage = minPage + (pageBlockSize - 1);
					}
					else if ((minPage + maxPage) < numPages)
					{
						maxPage = numPages;	
					}
				}
			}
		}

		// display previous link?
		if ((currentPage + 1) < numPages)
		{
			showNext = true;
		}
		
		// create previous link
		if (showPrev)
		{
			liPrev   = document.createElement('li');
			prevPage = parseInt(currentPage) - 1;
			liPrev.innerHTML = '<a href="#" onclick="' + pageSelectorFn + '(' + prevPage + ');">Prev</a>';
			listBlock.appendChild(liPrev);
		}
		
		// create page link(s)
		for (page = minPage; page <= maxPage; page++)
		{
			li = document.createElement('li');
			li.className = (currentPage == page) ? 'selected' : '';
			li.innerHTML = '<a href="#" onclick="' + pageSelectorFn + '(' + page + ');">' + page + '</a>';
			listBlock.appendChild(li);
		}
		
		// create next link
		if (showNext)
		{
			liNext   = document.createElement('li');
			nextPage = parseInt(currentPage) + 1;
			liNext.innerHTML = '<a href="#" onclick="' + pageSelectorFn + '(' + nextPage + ');">Next</a>';
			listBlock.appendChild(liNext);
		}
		
		// add links to page
		paginationBlock.appendChild(listBlock);
		paginationBlock.appendChild(pageCount);
	}
}