(function($) {
	$.fn.easySlider = function(options){
		// default configuration properties
		var defaults = {
			prevId: 'prevBtn',				// id of the element to apply prev rules to
			nextId: 'nextBtn',				// id of the element to apply next rules to
			prevText: 'Previous',		   // text for autogenerated prev link
			nextText: 'Next',				 // text for autogenerated next link
			autogeneratePagination: true, // will automatically generate pagination links
			orientation: '',				  // 'vertical', or anything else will assume horizontal
			speed: 800,						 // duration of a transition
			autoplayDuration: 0,				// auto-play if non-zero, this is the time between transitions
			loop: false						 // loop around the content
		};

		var options = $.extend(defaults, options);
		return this.each(function(){
			// Setup Measurements and Options
			var obj = $(this);
			var totalSlides		= $("li", obj).length;
			var slideWidth		= obj.width();
			var slideHeight		= obj.height();
			var lastSlide		= totalSlides-1;
			var current			= 0;
			// States
			var vertical		= (options.orientation == 'vertical');
			var autogen			= options.autogeneratePagination;
			var loop			= options.loop;
			var speed			= options.speed;
			var autoplayDuration= Math.max(options.autoplayDuration,50)+speed;
			var autoplay		= (options.autoplayDuration > 0);
		
			// Autogenerate Pagination
			if (autogen && !autoplay){ $(obj).after( '<span id="'+options.prevId+'"><a href=\"javascript:void(0);\">'+options.prevText+'</a></span> '+'<span id="'+options.nextId+'"><a href=\"javascript:void(0);\">'+options.nextText+'</a></span>');}
			
			// Important Elements
			var $ul   = $("ul", obj);
			var $next = $("#"+options.nextId);
			var $prev = $("#"+options.prevId);
		
			// Loop - Duplicate the First Slide onto the end
			if (loop) { $ul.append( $("li:first", obj).clone() ); totalSlides += 1; lastSlide += 1; }
		
			// Horizontal - Make them float left and set the width of the ul (for all slides)
			if (!vertical) {
		  		$("li", obj).css('float','left');
		  		$ul.css('width', totalSlides * slideWidth);
			}
		
			// Add Actions to Next and Prev Buttons
			$next.click(function(){ animate("next"); if (current>=lastSlide && !loop) $(this).fadeOut(); $prev.fadeIn(); }).hide();
			$prev.click(function(){ animate("prev"); if (current<=0 && !loop) $(this).fadeOut(); $next.fadeIn(); }).hide();
		
			// Enclosed Slide Animation
			function animate(dir){
				// Special Case for looping
				if ( loop ) {
					if (dir == "next"){
						if ( current == lastSlide ){ (vertical) ? $ul.css('marginTop',0) : $ul.css('marginLeft',0); current = 1; }
						else { current += 1; }
					}
					else {
						if ( current == 0 ){ (vertical) ? $ul.css('marginTop',(totalSlides-1)*slideHeight*-1) : $ul.css('marginLeft',(totalSlides-1)*slideWidth*-1); current = lastSlide-1; }
						else { current -= 1; }
					}
				}
			
				// No Loops
				else {
					if (dir == "next"){ current = (current>=lastSlide) ? lastSlide : current+1; }
					else { current = (current<=0) ? 0 : current-1; }
				}

				// Dispatch jQuery Animation
				if(!vertical) { $ul.animate( { marginLeft: (current*slideWidth*-1) }, speed); } 
				else { $ul.animate( { marginTop: (current*slideHeight*-1) }, speed); }
			};

			// Autoplay
			if (autoplay){
				var interval = null;
				var auto = function() { animate('next'); if (!loop && current>=lastSlide){ clearInterval(interval); } }
				setTimeout(function() { auto(); interval = setInterval(auto, autoplayDuration); }, autoplayDuration-speed); }
				else if (totalSlides>1) { $next.fadeIn(); if(loop) { $prev.fadeIn(); } }
			});
		};
	})
(jQuery);