
//-------------------------------------------------
//		Quick Pager jquery plugin
//		Created by dan and emanuel @geckonm.com
//		www.geckonewmedia.com
// 
//		v1.1
//		18/09/09 * bug fix by John V - http://blog.geekyjohn.com/
//		v2
//		30/09/10 * Rletham. Added functionality to page navigation - added start, prev, next and end
// 		navigation and allow the number of pages appearing in the navigation to be specified 
//-------------------------------------------------

(function($) {
	    
	$.fn.quickPager = function(options) {
	
		var defaults = {
			pageSize: 10,
			currentPage: 1,
			holder: null,
			pageNavSize: 11,
			pagerLocation: "after"
		};
		
		var options = $.extend(defaults, options);
		
		//hide the content not on this page
		var li = $(this).find('li');
		var i = 0;
		for (i = options.pageSize; i < li.length; i++) {
			li[i].style.display = 'none';
		}
		
		var displayPageNav = function (nav_holder, pageCounter, pageNavSize, currentPage) {
			var i = 0;
			var min_page = Math.max(0, Math.min(pageCounter - pageNavSize, currentPage - Math.floor((pageNavSize+1)/2)));
			//hide and show relevant nav
			if ( currentPage == 1 ) {
				nav_holder.find('li.simplePageNavPrev').hide();
			}
			else {
				nav_holder.find('li.simplePageNavPrev').show();
			}
			for (i = 0; i < min_page ; i++) {
				nav_holder.find('li.simplePageNav'+(i+1)).hide();
			}
			for (i = min_page; i < min_page + options.pageNavSize; i++) {
				nav_holder.find('li.simplePageNav'+(i+1)).show();
			}
			for (i = min_page + options.pageNavSize; i < pageCounter; i++) {
				nav_holder.find('li.simplePageNav'+(i+1)).hide();
			}
			if ( currentPage == pageCounter ) {
				nav_holder.find('li.simplePageNavNext').hide();
			}
			else {
				nav_holder.find('li.simplePageNavNext').show();
			}
		}
		
		
		
		
		//set up the page content and page nav	
		return this.each(function() {
			var selector = $(this);	
			var pageCounter = 1;
			var i = 0;
			
			selector.wrap("<div class='simplePagerContainer'></div>");
			selector.children().each(function(i){ 
				if(i < pageCounter*options.pageSize && i >= (pageCounter-1)*options.pageSize) {
				$(this).addClass("simplePagerPage"+pageCounter);
				}
				else {
					$(this).addClass("simplePagerPage"+(pageCounter+1));
					pageCounter ++;
				}	
			});
			
			// show/hide the appropriate regions 
			selector.children().hide();
			selector.children(".simplePagerPage"+options.currentPage).show();
			if(pageCounter <= 1) {
				return;
			}
			
			//Build pager navigation
			var pageNav = "<ul class='simplePagerNav'>";	
			//show the 'start' link
			pageNav += "<li class='simplePageNavStart'><a rel='"+1+"' href='#' title='Go to Page 1'>Start</a></li>";	
			//show the 'back' link
			var pageprev = options.currentPage -1;
			pageNav += "<li class='simplePageNavPrev'><a rel='"+pageprev+"' href='#' title='Go to Page "+pageprev+"'>Prev</a></li>";
			//show each link
			for (i=1;i<=pageCounter;i++){
				if (i==options.currentPage) {
					pageNav += "<li class='currentPage simplePageNav"+i+"'><a rel='"+i+"' href='#' title='Go to Page "+i+"'>"+i+"</a></li>";	
				}
				else {
					pageNav += "<li class='simplePageNav"+i+"'><a rel='"+i+"' href='#' title='Go to Page "+i+"'>"+i+"</a></li>";
				}
			}
			//show the 'next' link
			var pagenext = options.currentPage +1;	
			pageNav += "<li class='simplePageNavNext'><a rel='"+pagenext+"' href='#' title='Go to Page "+pagenext+"'>Next</a></li>";	
			//show the 'end' link
			pageNav += "<li class='simplePageNavEnd'><a rel='"+pageCounter+"' href='#' title='Go to Page "+pageCounter+"'>End</a></li>";
			pageNav += "</ul>";
			
			//attach the page nav
			if(!options.holder) {
				switch(options.pagerLocation)
				{
				case "before":
					selector.before(pageNav);
				break;
				case "both":
					selector.before(pageNav);
					selector.after(pageNav);
				break;
				default:
					selector.after(pageNav);
				}
			}
			else {
				$(options.holder).append(pageNav);
			}

			//if the holder is specified then use it other wise assume nav is in same div as pager pages - RLetham 24/09/2010
			var nav_holder = selector.parent();
			if(options.holder) { nav_holder = $(options.holder); }
			
			//hide and show relevant nav
			displayPageNav(nav_holder, pageCounter, options.pageNavSize, options.currentPage);

			//pager navigation behaviour
			nav_holder.find(".simplePagerNav a").click(function() {
				var i = 0;
				//grab the REL attribute 
				var clickedLink = $(this).attr("rel");
				options.currentPage = clickedLink;
				
				//mark clicked page as 'current'
				nav_holder.find("li.currentPage").removeClass("currentPage");
				nav_holder.find("li.simplePageNav"+options.currentPage).addClass("currentPage");
				
				//set the appropriate prev/next values (multiple by 1 to force into numeric rather than string)
				var prev = nav_holder.find('.simplePageNavPrev a')[0];
				prev.rel = options.currentPage*1 - 1;
				prev.title='Go to Page ' + prev.rel
				var next = nav_holder.find('.simplePageNavNext a')[0];
				next.rel = options.currentPage*1 + 1;
				next.title='Go to Page ' + next.rel
				
				//hide and show relevant nav
				displayPageNav(nav_holder, pageCounter, options.pageNavSize, options.currentPage);
				
				//hide and show relevant links
				selector.children().hide();			
				selector.find(".simplePagerPage"+clickedLink).show();
				
				return false;
			});
		});
	}
	

})(jQuery);


