(function($) { 

	/*** Default Configuration Options ***/

	var defaults = {			
		pages : 1,
		defaultPage: 0,
		onClick : $.noop,
		activeClass : 'active',
		clickable : false
	};

	/*** Module API ***/

	var methods = {

		init : function(opt) { 

			var options = $.extend({}, defaults, opt);

			return this.each(function() {

				var $this = $(this);
				var data = {};

				var $ul = $('<ul></ul>').appendTo($this);
				for (var x=0; x<options.pages; ++x) {
					var $li = $('<li></li>').appendTo($ul)
					if (options.clickable) {
						$li.css('cursor','pointer').click((function(y){
							return function() {
								$ul.find('li').removeClass(options.activeClass);
								$(this).addClass(options.activeClass);
								data.index = y;
								options.onClick(data);
							}
						})(x));
					}
				}

				data = { $this: $this, options: options, $ul: $ul, index:options.defaultPage }
				$this.data('toc', data);
				methods.activate.call(this, options.defaultPage);
			})

		},	
		
		activate: function(page) { 
			var data = $(this).data('toc');	
			data.$ul.find('li').removeClass(data.options.activeClass).eq(page).addClass(data.options.activeClass);
			data.index = page;
		},

		next: function() {
			var data = $(this).data('toc');
			var $nodes = data.$ul.find('li').removeClass(data.options.activeClass);
			var page = data.index + 1, page = (page >= data.options.pages) ? 0 : page;
			$nodes.eq(page).addClass(data.options.activeClass);
			data.index = page;
		},

		prev: function() {
			var data = $(this).data('toc');
			var $nodes = data.$ul.find('li').removeClass(data.options.activeClass);
			var page = data.index - 1, page = (page < 0) ? data.options.pages-1 : page;
			$nodes.eq(page).addClass(data.options.activeClass);
			data.index = page;
		}

	}

	/*** Module Definition ***/

	$.fn.Toc = function(method) {
		if ( methods[method] ) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this,arguments);
		} else {
			$.error('Method ' + method + ' does not exist');
		}
	}

})(jQuery);

