/*
	Slider.js expects to find the following CSS classes defined:
	
	.slider
	{
	    height: 20px;
		background: #fff url(/orion/webclient/iui/toggle.png) repeat-x; 
	}
	.slider .progress
	{
		height:100%;
		background: transparent url(/orion/webclient/iui/toggleOn.png) repeat-x; 
	}
	
*/
function Slider(container, value, resolution)
{
	this.resolution = resolution ? resolution : 1;
	
	this.container = container;
		this.div = document.createElement("DIV");
		this.div.className = "slider";
		this.div.jref = this;
			this.progress = document.createElement("DIV");
			this.progress.className = "progress";
			this.progress.jref = this;
		this.div.appendChild(this.progress);
	this.container.appendChild(this.div);
	
	this.setValue(value);
	
	this.unlock();
	
	Util.AddListener(this.div, "mousemove", Slider.mousemove);
	Util.AddListener(this.div, "mousedown", Slider.mousedown);
	Util.AddListener(this.div, "mouseup", Slider.mouseup);
	Util.AddListener(this.div, "mouseout", Slider.mouseout);
	Util.AddListener(this.div, "dragstart", Slider.dragstart);
	
}

Slider.prototype.getWeightedValue = function(max, min)
{
	max = Math.floor(max);
	min = min ? Math.floor(min) : 0;

	return min + Math.round(this.value * (max-min) / 100);
}

Slider.prototype.setValue = function(value, suppressEvent)
{
	var oldValue = value;
	
	this.value = Util.Bound(Util.ForceInt(value), 0, 100);
	this.progress.style.width = this.value + "%";
	
	if (this.onChange && !suppressEvent)
	{
		this.onChange(this, value, oldValue);
	}
}

Slider.prototype.toggleLock = function()
{
	if (this.locked)
	{
		this.unlock();
	}
	else
	{
		this.lock();
	}
}

Slider.prototype.lock = function()
{
	this.locked = true;
	this.div.setAttribute("locked", "true");
	
	if (document.all)
	{
		value = this.value;
		this.setValue(0, true);
		this.setValue(value, true);
	}
}

Slider.prototype.unlock = function()
{
	this.locked = false;
	this.div.setAttribute("locked", "");

	if (document.all)
	{
		value = this.value;
		this.setValue(0, true);
		this.setValue(value, true);
	}
}

Slider.calculate = function(e)
{
	var target = e.target ? e.currentTarget : e.srcElement;
	var slider = target.jref;
	
	if (slider.locked)
	{
		return;
	}

	var x = e.offsetX;
	var width = slider.div.offsetWidth;
	if (!x)
	{
		// FireFox doesn't give us offsetX.  Need to brute force it.
		x = e.clientX - getLeft(slider.div);
	}
	
	var value = Math.round(x/width*100/slider.resolution) * slider.resolution;
	slider.setValue(value);


}

Slider.mousedown = function(e)
{
	var target = e.target ? e.currentTarget : e.srcElement;
	var slider = target.jref;

	Slider.dragging = slider;
	Slider.calculate(e);
	return cancelEvent(e);

}

Slider.mouseup = function(e)
{
	if (Slider.dragging)
	{
		Slider.calculate(e);
	}
	Slider.dragging = null;
}

Slider.mouseout = function(e)
{
	var target = e.target ? e.target : e.srcElement;
	var relatedTarget = e.relatedTarget ? e.relatedTarget : e.toElement;

	if (Slider.dragging)
	{
		if (!relatedTarget || !relatedTarget.jref)
		{
			Slider.calculate(e);
			Slider.dragging = null;
		}
	}
}

Slider.dragstart = function(e)
{
	return cancelEvent(e);
}

Slider.mousemove = function(e)
{
	if (Slider.dragging)
	{
		Slider.calculate(e);
		return(cancelEvent(e));
	}
}