$(document).ready(function(){

	$.fn.Slider = function(options){

		var defaults = {
			speed:  		300,
			pause:  		3500,
			auto:			true,
			vertical:   	true,
			controlsShow:   true,
			numeric: 		true,
			numericId:  	'controls',
			controls:   	""
		}; 

		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();
			var clickable = true;
			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');

			if(options.controlsShow){
				var html = options.controls;
				if(options.numeric){
					html += '<ol id="'+ options.numericId +'"></ol>';
				}
				$(obj).after(html);
			};

			if(options.numeric){
				for(var i=-1;i<s;i++){
					$(document.createElement("li"))
						.attr('id',options.numericId + (i+1))
						.html('<a rel='+ i +' href=\"javascript:void(0);\"></a>')
						.appendTo($("#"+ options.numericId))
						.click(function(){
							animate($("a",$(this)).attr('rel'),true);
						}); 
				};
			}

			function setCurrent(i){
				i = parseInt(i)+1;
				$("li", "#" + options.numericId).removeClass("current");
				$("li#" + options.numericId + i).addClass("current");
			};

			function adjust(){
				if(t>ts) t=0;
				if(t<0) t=ts;
				if(!options.vertical) {
					$("ul",obj).css("margin-top",(t*w*-1));
				} else {
					$("ul",obj).css("margin-top",(t*h*-1));
				}
				clickable = true;
				if(options.numeric) setCurrent(t);
			};

			function animate(dir,clicked){

				var ot = t;
				switch(dir){
					case "next":
						t = (ot>=ts) ? (options.continuous ? t+1 : ts) : t+1;
						break;
					case "prev":
						t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
						break;
					default:
					t = dir;
						break;
				};

				var diff = Math.abs(ot-t);
				var speed = diff*options.speed;
				if(!options.vertical) {
					p = (t*w*-1);
					$("ul",obj).animate(
						{ marginLeft: p },
						{ queue:false, duration:speed, complete:adjust }
					);
				} else {
					p = (t*h*-1);
					$("ul",obj).animate(
						{ marginTop: p },
						{ queue:false, duration:speed, complete:adjust }
					);
				};

				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);
			};

			if(options.numeric) setCurrent(0);
		});

	};

	$("#slider").Slider();

});