(function($){
	
	$.fn.easySlider = function(options){
		
		var defaults = {
			prevId:       'previousButton',
			nextId:       'nextButton',
			controlsId:   'controlButtons',
			vertical:     false,
			speed:        750,
			auto:         false,
			pause:        2000,
			continuous:   true
		};
		
		var options = $.extend(defaults, options);
		
		this.each(function(){
			
			var obj = $(this);
			var s   = $('li', obj).length;
			var w   = $('li', obj).width();
			var h   = $('li', obj).height();
			
			obj.width(w);
			obj.height(h);
			obj.css('overflow', 'hidden');
			
			var ts = s - 1;
			var t  = 0;
			$('ul', obj).css('width', s * w);
			if(!options.vertical) $('li', obj).css('float', 'left');
			
			$('#' + options.nextId).click(function(){
				animate('next', true);
			});
			$('#' + options.prevId).click(function(){
				animate('prev', true);
			});
			
			$('a', '#' + options.controlsId).click(function(){
				animate($(this).attr('rel'), true);
			});
			
			function animate(dir, clicked){
				
				var ot = t;
				switch(dir){
					case 'next':
						t = (ot >= ts) ? (options.continuous ? 0 : ts) : t + 1;
						break;
					case 'prev':
						t = (t <= 0)   ? (options.continuous ? ts : 0) : t - 1;
						break;
					default:
						t = dir - 1;
						break;
				};
				
				var diff  = Math.abs(ot - t);
				var speed = diff * options.speed;
				if(!options.vertical){
					p = (t * w * -1);
					$('ul', obj).animate({ marginLeft: p }, speed);
				}
				else{
					p = (t * h * -1);
					$('ul', obj).animate({ marginTop: p }, speed);
				};
				
				if(clicked) clearTimeout(timeout);
				if(options.auto && dir == 'next' && !clicked){
					timeout = setTimeout(function(){
						animate('next',false);
					}, diff * options.speed + options.pause);
				};
				
			};
			
			var timeout;
			if(options.auto){
				timeout = setTimeout(function(){
					animate('next', false);
				}, options.pause);
			};
			
		});
		
	};
	
})(jQuery);