function Slider(){
}

Slider.sliders = new Array();

Slider.currentSlide = null;

Slider.startPosition = null;
Slider.startLeft = null;

Slider.changeHandle = null;

Slider.startSlide = function(e, sliderId)
{
	if(!Slider.currentSlide)
	{
		
		Slider.currentSlide = Slider.sliders[sliderId];
		Slider.startPosition = mouseCoordinates(e);
		Slider.startLeft = Slider.sliders[sliderId].handle.offsetLeft;

		document.onmousemove = Slider.moveSlide;
		document.onmouseup = Slider.endSlide;
	}
}

Slider.normalize = function(slider, newValue)
{
	return newValue < slider.minValue ? slider.minValue : newValue > slider.maxValue ? slider.maxValue : newValue;
}

Slider.normalizeLeft = function(newLeft)
{
	if(newLeft < 0)
		newLeft = 0;
	else if(newLeft + Slider.currentSlide.handle.offsetWidth >= Slider.currentSlide.slider.offsetWidth)
		newLeft = Slider.currentSlide.slider.offsetWidth - Slider.currentSlide.handle.offsetWidth;
		
	return newLeft;
}

Slider.moveSlide = function(e)
{
	if(Slider.currentSlide)
	{
		var currentPosition = mouseCoordinates(e);

		var newLeft = Slider.startLeft + (currentPosition.x - Slider.startPosition.x);

		Slider.goTo(Slider.currentSlide, newLeft);
	}
}

Slider.clickSlide = function(e, sliderId)
{
	if(!Slider.currentSlide)
	{
		var currentPosition = mouseCoordinates(e);

		Slider.currentSlide = Slider.sliders[sliderId];
		
		var newLeft = currentPosition.x - getOffsetPosition(Slider.currentSlide.slider).x - Slider.currentSlide.handle.offsetWidth / 2;
		
		Slider.goTo(Slider.currentSlide, newLeft);
		
		Slider.currentSlide = null;
	}
}

Slider.goToValue = function(slider, newValue)
{
	newValue = Slider.normalize(slider, newValue);
	
	var sliderLeft = 
	(slider.slider.offsetWidth - slider.handle.offsetWidth)
	*
	(newValue - slider.minValue) / (slider.maxValue - slider.minValue);

	slider.field.value = newValue;

	slider.handle.style.left = sliderLeft + "px";
	
	if(Slider.changeHandle)
		Slider.changeHandle(slider.id);
}

Slider.goTo = function(slider, newLeft)
{
	newLeft = Slider.normalizeLeft(newLeft);
	
	var sliderValue = 
	(slider.maxValue - slider.minValue)
	*
	newLeft / (slider.slider.offsetWidth - slider.handle.offsetWidth);
	
	slider.field.value = Math.round(sliderValue) + slider.minValue;

	slider.handle.style.left = newLeft + "px";
	
	if(Slider.changeHandle)
		Slider.changeHandle(slider.id);
}

Slider.endSlide = function(e)
{
	if(Slider.currentSlide)
	{
		Slider.currentSlide = null;
	}
}

Slider.updateFromInput = function(sliderId)
{
	var sliderValue = /^\d+$/.test($(sliderId + '_input').value) ? $(sliderId + '_input').value : Slider.sliders[sliderId].minValue;
	
	Slider.goToValue(Slider.sliders[sliderId], sliderValue);
}

Slider.createSlider = function(sliderContainer, sliderId, minValue, maxValue, defaultValue)
{
	var sliderDOM = $C(
		['div', {classname: 'slider'},
			['div', {classname: 'slider_left'}],
			['div', {classname: 'slider_center', id: sliderId},
				['div', {classname: 'slider_handle', id: sliderId + '_handle'}]
			],
			['div', {classname: 'slider_right'}]
		]
	);

	var sliderInput = $C(
		['input', 
			{
				type: 'text', classname: 'slider_input', id: sliderId + '_input', 
				name: sliderId + '_input', value: minValue, maxlength: (maxValue + "").length
			}
		]
	);
	
	document.getElementById(sliderContainer).appendChild(sliderDOM);
	document.getElementById(sliderContainer).appendChild(sliderInput);
	
	setEvent(sliderInput, 'blur', function(){Slider.updateFromInput(sliderId);});
	
	Slider.sliders[sliderId] = 
	{
		id: sliderId,
		slider: document.getElementById(sliderId),
		handle: document.getElementById(sliderId + '_handle'),
		field: sliderInput,
		minValue: minValue,
		maxValue: maxValue
	};
	
	Slider.goToValue(Slider.sliders[sliderId], defaultValue);
	
	Slider.sliders[sliderId].handle.onmousedown = function(e){Slider.startSlide(e, sliderId);};
	Slider.sliders[sliderId].slider.onmousedown = function(e){Slider.clickSlide(e, sliderId);};
}