;(function($) {
	
	$.fn.slider = function(options) {
		
		var settings = $.extend(true, {}, $.fn.slider.defaults, options);
		
		return this.each(function() {
			var $this = $(this);
			var $handle = $(".handle", $this);
			var $links = $("a", $this);
			var oldValue;
			var value;
			
			var offsetLeft = $this.offset().left;
			var range = settings.max - settings.min + 1;
			var segmentWidth = $this.outerWidth() / range;
						
			var scrollOptions = {
				target: settings.target,
				items: settings.items,
				axis: "x",
				duration: 500,
				hash: true,
				easing: "swing",
				onBefore: function(e, anchor, $target) {
					$links.each(function(i) {
						if (this == e.target) updateHandle(i);
					});
					return true;
				}
			};
			$.localScroll(scrollOptions);
			
			$.localScroll.hash({
				target: settings.target,
				items: settings.items,
				axis: "x",
				duration: 1, 
				easing: "swing",
				onBefore: function(e, anchor, $target) {
					var go = $(anchor).attr("id");
					$links.each(function(i) {
						if ($(this).attr("href").indexOf(go) != -1) updateHandle(i);
					});
				}
			});
			
			$links.each(function(i) {
				var $link = $(this);
				var id = i;
				
				$link.bind('startdrag', function() {
					if (id == value) return $handle;
					else return false;
				});
				
				$link.bind("drag", function(e) {
					var dragX = normalizeHandleLocation(e.offsetX - offsetLeft);
					$handle.css('left', dragX);
					
					var actualX = normalizeHandleLocation(e.pageX - offsetLeft);
					settings.onSlide(Math.floor(actualX / segmentWidth), value);
				});
				
				$link.bind("dragend", function(e) {
					var actualX = normalizeHandleLocation(e.pageX - offsetLeft);
					var value = Math.floor(actualX / segmentWidth);
					$(".slider a:eq(" + value + ")").trigger("click"); 
				});
				
			});
			
			function normalizeHandleLocation(x) {
				if (x < 0) return 0;
				if (x > $this.outerWidth() - $handle.outerWidth() + 3) return ($this.outerWidth() - $handle.outerWidth() + 3);
				return x;
			}
			
			function updateHandle(newValue) {
				oldValue = value || 0;
				value = newValue;
				$handle.stop().animate({left:segmentWidth * newValue}, 100, "swing");
				settings.onChange(value, oldValue);
			}
			
			
		});
	};
		
	$.fn.slider.defaults = {
		min:0,
		max:4,
		onChange:function(value, oldValue) {},
		onSlide:function(value, oldValue) {}
	};

})(jQuery);
