(function($) {
	$.fn.pager = function(options) {
		var defaults = {
			pageSize: 5,
			currentPage: 1,
			holder: null,
			pagerLocation: "after",
			pad: false,
			pagerPrefix: false
		};
		
		var options = $.extend(defaults, options);
		
		return this.each(function() {
			var selector = $(this);
			var itemCount = selector.children().length;
			var totalPages = Math.ceil(itemCount / options.pageSize);
			if (totalPages <= 1) {
				return;
			}
			var pageCounter = 1;
			selector.wrap('<div class="paged-content"></div>');
			if (options.pad) {
				var appendItems = (totalPages * options.pageSize) - itemCount;
				for (var i=-1; ++i < appendItems;){
					selector.append(options.pad);
				}
			}
			selector.children().each(function(i){ 
				if (i < pageCounter * options.pageSize && i >= (pageCounter - 1) * options.pageSize) {
					$(this).attr('index', pageCounter);
				}
				else {
					$(this).attr('index', pageCounter + 1);
					pageCounter++;
				}
			});
			
			// show/hide the appropriate regions 
			selector.children().hide();
			selector.children('[index=' + options.currentPage + ']').show();
		
			//Build pager navigation
			var pageNav = '<ul class="pager">';
			if (options.pagerPrefix){
				pageNav += '<li>' + options.pagerPrefix + '</li>';
			}
			for (i = 1; i <= pageCounter; i++){
				if (i == options.currentPage) {
					pageNav += '<li index="' + i + '" class="currentPage"><a href="#">' + i + '</a></li>';
				}
				else {
					pageNav += '<li index="' + i + '"><a href="#">' + i + '</a></li>';
				}
			}
			pageNav += '</ul>';
			
			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);
						break;
				}
			}
			else {
				$(options.holder).append(pageNav);
			}

			selector.parent().find('.pager a').click(function() {
				var targetIndex = $(this).parent().attr('index');
				options.currentPage = targetIndex;
				if (options.holder) {
					$(this).parent('li').parent('ul').parent(options.holder).find('li.currentPage').removeClass('currentPage');
					$(this).parent('li').parent('ul').parent(options.holder).find('li[index=' + targetIndex + ']').addClass('currentPage');
				}
				else {
					$(this).parent('li').parent('ul').parent('.paged-content').find('li.currentPage').removeClass('currentPage');
					$(this).parent('li').parent('ul').parent('.paged-content').find('li[index=' + targetIndex + ']').addClass('currentPage');
				}
				
				//hide and show relevant links
				selector.children().hide();
				selector.children('[index=' + targetIndex + ']').show();
				return false;
			});
		});
	}
})(jQuery);
