(function($) {

	$.fn.stepper = function(options) {
		
		var defaults = {
			steps: ".step",
			stepperClass: "stepper",
			classShow: "show",
			classOver: "over",
			classActive: "active",
			classPrev: "prev",
			classNext: "next"
		};
		var options = $.extend(defaults, options);
		
		return this.each(function() {
			
			var _idx = 0;
			
			var $steps = $(options.steps, this);
			var $stepper = $("<div/>").attr("class", options.stepperClass).prependTo(this);
			var $prev = $("<span/>").attr("class", options.classPrev).appendTo($stepper);
			var $next = $("<span/>").attr("class", options.classNext).appendTo($stepper);
			var $list = $("<ul/>").appendTo($stepper);
			
			$steps.each(function(idx) {
				var $item = $("<li/>").text(idx + 1).appendTo($list).click(function() {
					_idx = idx;
					
					showStep();
				}).hover(function() {
					$(this).addClass(options.classOver);
				}, function() {
					$(this).removeClass(options.classOver);
				});
				
				if (!idx) {
					$item.click();
				}
			});
			
			$prev.click(function() {
				if (0 < _idx) {
					_idx--;
				} else {
					_idx = $steps.length - 1;
				}
				
				showStep();
			});
			
			$next.click(function() {
				if (_idx < $steps.length - 1) {
					_idx++;
				} else {
					_idx = 0;
				}
				
				showStep();
			});
			
			function showStep() {
				var $item = $("li", $list);
				$item.removeClass(options.classActive);
				$item.eq(_idx).addClass(options.classActive);
				
				$steps.removeClass(options.classShow);
				$steps.eq(_idx).addClass(options.classShow);
			}
		
		});
	
	};

})(jQuery);
