(function($) {
	jQuery.fn.slideshow = function(options) {
		defaults = {
			timeout: 10000,
			navigation: true,
			slide: "img"
		}
		options = $.extend(defaults, options);

		this.each(function() {
			var $this = $(this).unwrap();
			var $slideshow = $("<div></div>").attr("class", $this.attr("class"));
			var $slides = $this.find(options.slide).hide();
			var $nav = "";
		
			$slideshow.nextSlide = function () {
				var currSlide = $slideshow.data("currSlide");
					
				if (currSlide == undefined)
					//currSlide = -1;
					currSlide = Math.floor(Math.random() * $slides.length) - 1;
				else
					$($slides[currSlide]).fadeOut();
				
				var next = (currSlide + 1) % $slides.length;
				$($slides[next]).fadeIn();
				
				$slideshow.data("currSlide", next);
				
				if (options.navigation) {
					$($nav.children()[currSlide]).removeClass("active");
					$($nav.children()[next]).addClass("active");
				}
				
				$slideshow.timer = setTimeout($slideshow.nextSlide, options.timeout);
				return $slideshow;
			};
			
			$slideshow.generateNavigation = function() {
				$nav = $("<ul class='slideshowNav'></ul>");
				
				for (i = 0; i < $slides.length; i++) {
					$("<li><a href='#'>&nbsp;</a></li>")
						.data("slide", i)
						.appendTo($nav);
				}
				
				$nav.find("a").click(function() {
					$slideshow.switchSlide($(this).parent().data("slide"));
					
					return false;
				});
				
				$nav.appendTo($slideshow);
			}
			
			$slideshow.switchSlide = function(idx) {
				clearTimeout($slideshow.timer);
				
				currSlide = $slideshow.data("currSlide");
					
				if (currSlide != idx) {
					if (currSlide != undefined) {
						$($slides[currSlide]).fadeOut();
						if (options.navigation)
							$($nav.children()[currSlide]).removeClass("active");
					}
					$slideshow.data("currSlide", idx);
					$($slides[idx]).fadeIn();
					if (options.navigation)
						$($nav.children()[idx]).addClass("active");
				}

				$slideshow.timer = setTimeout($slideshow.nextSlide, options.timeout);
			}
			
			$slideshow.init = function() {
				if ($this.length == 0)
					return;
					
				$slideshow.append($slides.parent());
				$this.before($slideshow);
				$this.remove();
				maxWidth=0;
				maxHeight=0;

				$slides
					.css({
						left: -9000
					})
					.show()
					.each(function() {
						$slide = $(this);
						if ($slide.width() > maxWidth)
							maxWidth = $slide.width();
						if ($slide.height() > maxHeight)
							maxHeight = $slide.height();
					});
				
				$slideshow.css({
					position: "relative",
					height: maxHeight,
					width: maxWidth
				});

				$slides.load(function() {
					height = $(this).height();
					if (height > $slideshow.height()) {
						$slideshow.height(height);
					}					
				});
				
				$slides.each(function() {
					if (this.complete || this.readyState === 4) {
						$(this).trigger("load");
					}
				});
				
				$slides.css({
					position: "absolute",
					left: 'auto'
				}).hide();

				if (options.navigation)
					$slideshow.generateNavigation();
				$slideshow.nextSlide();
			}
			
			$slideshow.init();
		});
		
	};
})(jQuery);
