$.fn.fwSlideshow = function(options) {
	var settings = $.extend({
		autoStart: true,
		fadeSpeed: 2000,
		fadeDelay: 5000,
		displayPlayStop: true,
		displayNumbers: true,
		startSlide: 0
	}, options);
	
	this.each(function() {
		var currentNumber = settings.startSlide+1;
		var maxNumber = 0;
		var hover = false;
		var playing = false;
		var skipOnce = false;
		var controls;
		var playButton;
		var numbers;
		
		var slide = function(to) {
			if (typeof to == 'undefined') {
				to = currentNumber + 1;
			}
			else {
				skipOnce = true;
			}
			
			if (to > maxNumber || to < 1) {
				to = 1;
			}
			
			if (to != currentNumber) {
				$(children[currentNumber-1]).fadeOut(settings.fadeSpeed);
				$(children[to-1]).fadeIn(settings.fadeSpeed);
				
				numbers.children().removeClass('current');
				$(numbers.children()[to-1]).addClass('current');
				
				currentNumber = to;
			}
		}
		
		var togglePlay = function() {
			playing = !playing;
			
			if (settings.displayPlayStop) {
				playButton.toggleClass('true');
			}
		}
		
		$(this).css({
			position: 'relative'
		});
		
		$(this).hover(
			function() {
				hover = true;
			},
			function() {
				hover = false;
			}
		);
		
		var children = $(this).children();
		children.css({
			top: 0,
			left: 0,
			position: 'absolute',
			display: 'none'
		});
		maxNumber = children.length;
		
		$(children[settings.startSlide]).css({
			display: 'block'
		});
		
		if (settings.displayPlayStop || settings.displayNumbers) {
			$(this).append('<div class="controls"></div>');
			controls = $(this).children('div.controls');
			if (settings.displayPlayStop) {
				controls.append('<span class="play"></span>');
				playButton = controls.children('span.play');
				playButton.click(togglePlay);
			}
			if (settings.displayNumbers) {
				controls.append('<ul class="numbers"></ul>');
				numbers = controls.children('ul.numbers');
				children.each(function(i) {
					numbers.append('<li>' + (i+1) + '</li>');
				});
				numbers.children().click(function() {
					slide(parseInt($(this).text()));
				});
				$(numbers.children()[settings.startSlide]).addClass('current');
			}
		}
		
		if (settings.autoStart) {
			togglePlay();
		}
		
		window.setInterval(function() {
			if (playing && !hover && !skipOnce) {
				slide();
			}
			skipOnce = false;
		}, settings.fadeDelay);
	});
}
