(function($){
	$.fn.slideshow = function(options){
		var opts = $.extend({}, $.fn.slideshow.defaults, options);
		
		return this.each(function(){
			var element = $(this);
			element.css("position","relative");
			element.css("overflow","hidden");
			
			var width = $(opts.frames[0]).width();
			var height = $(opts.frames[0]).height();
			
			var lastFrame = opts.frames.length - 1;
			
			var sliding = false;
			var autoSliding = true;
			
			element.append('<div class="jqslideshow_navigation"></div>');
			var navigation = element.find("div.jqslideshow_navigation");
			navigation.append('<table cellpadding="0" cellspacing="0" border="0"><tr></tr></table>');
			var navList = navigation.find("tr");
			
			navList.append('<td><a href="" class="jqslideshow_prev"><span>&laquo;</span></a></td>');
				
			for( i in opts.frames ){
				$( opts.frames[i] ).addClass("jqslideshow_frame");
				navList.append('<td><a href="" class="jqslideshow_'+i+'"><span>'+(parseInt(i)+1)+'</span></a></td>');
			}
			
			navList.append('<td><a href="" class="jqslideshow_next"><span>&raquo;</span></a></td>');
			
			
			navList.find("a").click(function(){
				if( sliding == true ){
					return(false);
				}
				
				sliding = true;
				
				if( autoSliding == true ){
					clearInterval(autoSlide);
					autoSliding = false;
				}
				
				if( $(this).hasClass("jqslideshow_prev") ){
					slide( -1 );
				}else if( $(this).hasClass("jqslideshow_next") ){
					slide( 1 );
				}else{
					frame = $(this).attr("class").match(/^jqslideshow_(\d+)$/);
					if( opts.transition == "slide" ){
						transition = "none";
					}else{
						transition = opts.transition;
					}
					setFrame( parseInt(frame[1]), transition, 1 );
				}
				return(false);
			});
			
			
			var currentClone = null;
			var currentFrame = null;
			
			if( opts.stretch ){
				element.css("width", width).css("height", height);
				navigation.css("width", width).css("opacity", opts.navigationOpacity).css("z-index","3");
			}else{
				navigation.css("z-index","3");
			}
			
			setFrame( 0, "none", 1 );
			
			if( opts.transition == "none" ){
				var autoSlide = setInterval( function(){slide(1);}, opts.speed );
			}else{
				var autoSlide = setInterval( function(){slide(1);}, opts.speed+opts.transitionSpeed );
			}
			
			
			function slide( amount ){
				newFrame = currentFrame + amount;
				
				if( newFrame < 0 ){
					newFrame = lastFrame;
				}else if( newFrame > lastFrame ){
					newFrame = 0;
				}
				
				setFrame( newFrame, opts.transition, amount );
			}
			
			
			function setFrame( frame, transition, direction ){
				if( transition == "slide" ){
					if( direction == -1 ){
						transition = "slide_right";
					}else{
						transition = "slide_left";
					}
				}
				
				element.find("a.jqslideshow_"+currentFrame).removeClass("jqslideshow_selected");
				element.find("a.jqslideshow_"+frame).addClass("jqslideshow_selected");
				
				currentFrame = frame;
				
				$( opts.frames[currentFrame] ).clone(true).appendTo(element).css("position", "absolute").css("top", "0px").css("left","0px").css("z-index", "1").show();
				
				oldClone = currentClone;
				currentClone = element.find(".jqslideshow_frame:last");
				
				if( transition == "none" ){
					rmOldFrame();
				}else if( transition == "fade" ){
					oldClone.fadeOut(opts.transitionSpeed, rmOldFrame);
				}else if( transition == "slide_left" ){
					currentClone.css("left",width+"px");
					currentClone.animate({left: 0}, opts.transitionSpeed, "swing");
					oldClone.animate({left: -width}, opts.transitionSpeed, "swing", rmOldFrame);
				}else if( transition == "slide_right" ){
					currentClone.css("left","-"+width+"px");
					currentClone.animate({left: 0}, opts.transitionSpeed, "swing");
					oldClone.animate({left: width}, opts.transitionSpeed, "swing", rmOldFrame);
				}
			}
			
			
			function rmOldFrame(){
				if( element.find(".jqslideshow_frame").length > 1 ){
					element.find(".jqslideshow_frame:first").remove();
				}
				currentClone.css("z-index", "2");
				sliding = false;
			}
			
			
		});
	
	};
	
	$.fn.slideshow.defaults = {
		frames: [],
		speed: 2000,
		stretch: true,
		transition: "slide",
		transitionSpeed: 500,
		navigationOpacity: 0.9
	};
    
})(jQuery);
