
/**
 * jQuery pager
 *
 * @author HAAN <haan@fynskemedier.dk>
 */
(function($) {
	// Simple error handler
	function Error(name, message) {
		this.name = name;
		this.message = message;
	}
	
	// Pager DOM class
	function Pager(contentItems, options) {
		var $this = this; // Wrapper object

		this.settings = $.extend({
			active : 0,
			next : '&raquo;',
			prev : '&laquo;'
		}, options);

		this._contentItems = $(contentItems);
		this._navItems = $([]); // Empty container
		this._pageCount = 0;
		this.pager = $('<ul />')
			.addClass('pager');

		this.addPrev(this.settings.prev);

		this._contentItems.each(function(index) {
			if(index == $this.settings.active) {
				$(this).addClass('active');
			}

			$this.addPage($(this));
		});

		this.addNext(this.settings.next);
	}

	Pager.prototype.addPage = function(item) {
		var $this = this;

		this._pageCount++;

		var page = $('<li />')
			.append($('<a />')
				.attr('href', 'javascript:void(0)')
				.text(this._pageCount)
				.click(function(e) {
					var index = $this._navItems.index($(this).parent());

					$this.navIndex(index);
				})
			)
			.addClass('item')

		if($(item).is('.active')) {
			page.addClass('active');
		}

		if(item) {
			page.data('page', item);
		}

		this._updateClasses();

		this.pager.append(page);
		this._navItems = this._navItems.add(page);

		return page;
	}

	Pager.prototype.addNext = function(title) {
		var $this = this;

		var next = $('<li />')
			.append($('<a />')
				.attr('href', 'javascript:void(0)')
				.append(title)
				.click(function(e) {
					var index = $this._navItems.index($this._navItems.filter('li.active'));
					index++;

					if($this._navItems.eq(index).length == 0) {
						index = 0;
					}

					$this.navIndex(index);	
				})
			)
			.addClass('item next');

		this.pager.append(next);

		this._updateClasses();

		return next;
	}

	Pager.prototype.addPrev = function(title) {
		var $this = this;

		var prev = $('<li />')
			.append($('<a />')
				.attr('href', 'javascript:void(0)')
				.append(title)
				.click(function(e) {
					var index = $this._navItems.index($this._navItems.filter('li.active'));

					$this.navIndex(index -1);
				})
			)
			.addClass('item prev');

		this.pager.prepend(prev);

		this._updateClasses();

		return prev;
	}

	Pager.prototype._updateClasses = function() {
		this.pager.find('li.item').removeClass('first last')

		this.pager.find('li.item:first').addClass('first')
		this.pager.find('li.item:last').addClass('last')
	}

	Pager.prototype.navIndex = function(index) {
		this._navItems.filter('li.active').removeClass('active');
		this._contentItems.filter('.active').removeClass('active');

		var activeItem = this._navItems.eq(index);
		var activePage = activeItem.data('page');

		activeItem.addClass('active');
		activePage.addClass('active');
	}

	// jQuery pager plugin
	$.fn.pager = function(options) {
		var settings = $.extend({
			pager : null, // Pager wrapper selector
			content : '> div', // Content selector
			next : '&raquo;',
			prev : '&laquo;'
		}, options);

		// For each pager found
		$(this).each(function(index) {
			// Find pager wrapper
			switch(settings.pager) {
				case "parent":
					var pager = $(this).parent();
					break;

				case "inline": // Use same wrapper as content
					var pager = $(this);
					break;

				case null:
					throw new Error("Pager has no wrapper.");

				default:
					var pager = $(settings.pager);
					break;
			}
			
			// Find content items inside wrapper
			var contentItems = $(this).find(settings.content);

			var pagerObject = new Pager(contentItems, {
				next : settings.next,
				prev : settings.prev
			});

			pager.append(pagerObject.pager);
		});

		return $(this); // Return selected objects
	 }
})(jQuery);


