(function($) {
	$.fn.slideshow = function(options) {
		// Define option defaults
		var defaults = {
			navClass:"nav",
			slideClass:"slide",
			transitionOut:function(s){ s.fadeOut(); },
			transitionIn:function(s){ s.fadeIn(); },
			autoRun:false,
			interval:3000
		}
	  // Extend our default options with those provided.
	  var options = $.extend(defaults, options);
		var slides = this.find('.' + options.slideClass);
		var activeSlideId = 0;
		var slideInterval;
		// Set up auto run, if enabled
		if (options.autoRun) {
			startAutoRun();
			this.mouseover(stopAutoRun);
			this.mouseout(startAutoRun);
		}
		// Create Navigation
		var nav = $("<ul></ul>").appendTo(this.find('.' + options.navClass));
		slides.each(function(i) {
			createNavItem("", i+1).click(function(){ showSlide(i); return false; });
		});
		var navItems = nav.find("li");
		// Activate first item by default
		slides.eq(0).show();
		highlightNav(0);
		// End
		return this;
				
		// Functions
		function createNavItem(className, text) {
			return $("<li><a href='#'>"+text+"</a></li>").addClass(className).appendTo(nav);
		}
		function showSlide(id) {
			if (id == activeSlideId) { return false; }
			slides.removeClass("active");
			activeSlideId = id;
			highlightNav(id);
			options.transitionOut.call(this, slides);
			options.transitionIn.call(this, slides.eq(id));
		}
		function nextSlide() {
			showSlide((activeSlideId + 1) % slides.length);
		}
		function previousSlide() {
			showSlide((activeSlideId + (slides.length-1)) % slides.length);
		}
		function highlightNav(id) {
			navItems.removeClass("active");
			navItems.eq(id).addClass("active");
		}
		function startAutoRun() {
			slideInterval = setInterval(nextSlide, options.interval);
		}
		function stopAutoRun() {
			clearInterval(slideInterval);
		}
	};
})(jQuery);
