$(function()
{
	$.extend($.fn.slider = function(button, min, max, start, steps, callback, when)
	{
		var element = this;
		if(element.length != 0)
		{
			if(!button)
			{
				if(element.children().length > 0)
				{
					button = element.children(':first');
				}
				else
				{
					alert('A slider needs a slide-button to hold on to!');
				}
			}
			if(button)
			{
				if(!min)
				{
					min = 0;
				}
				if(!max)
				{
					max = 10;
				}
				if(!start)
				{
					start = (max - min) / 2;
				}
				if(!when)
				{
					when = 'mousemove';
				}
				var elWidth = element.width();
				var slWidth = button.width();
				
				var down = false;
				var total = max - min;
				
				element.extend($.fn.position = function(newPosition)
				{
					if(newPosition)
					{
						if(newPosition < min)
						{
							newPosition = min;
						}
						else if(newPosition > max)
						{
							newPosition = max;
						}
						button.css('left', (newPosition-min)/total*elWidth-slWidth/2);
						if(callback)
						{
							callback(newPosition);
						}
					}
					else
					{
						return (parseFloat(button.css('left'))+slWidth/2)/elWidth * total + min;
					}
				});
				
				button.css('left', (start-min)/total*elWidth-slWidth/2);
				
				button.mousedown(function(event)
				{
					if(event.preventDefault)
					{
						event.preventDefault();
					}
					if(callback && when == 'mousedown')
					{
						callback((parseFloat(button.css('left'))+slWidth/2)/elWidth*total+min);
					}
					down = true;
				});
				$('body').mousemove(function(event)
				{
					if(down)
					{
						var left = event.pageX - element.offset().left;
						if(left < 0)
						{
							left = 0;
						}
						else if(left > elWidth)
						{
							left = elWidth;
						}
						if(steps)
						{
							var step = elWidth / Math.ceil(total/steps);
							for(var i=0; i<elWidth; i+=step)
							{
								if(left > i && left < i + step)
								{
									if(left > i + step/2)
									{
										left = i + step;
									}
									else
									{
										left = i;
									}
								}
							}
						}
						left  -= slWidth/2;
						button.stop();
						button.animate({'left': left}, Math.abs(left-parseFloat(button.css('left')))/3);
						if(callback && when == 'mousemove')
						{
							callback((parseFloat(left)+slWidth/2)/elWidth*total+min);
						}
					}
				}).mouseup(function()
				{
					if(down)
					{
						if(callback && when == 'mouseup')
						{
							callback((parseFloat(button.css('left'))+slWidth/2)/elWidth*total+min);
						}
					}
					down = false;
				});
			}
		}
	});
});
