/*
	Roku.Slider
*/

if(typeof(Roku) == "undefined")
    Roku = { classes : [] };

Roku.Slider =
{
	sliderClassName			: "slider",
	sliderHandleClassName	: "slider_handle",

	disabledAttribName		: "slider_disabled",
	
	dragHandle	: null,
	dragSlider	: null,
	dragPointX	: 0,
	dragHandleX	: 0,
	dragMaxX	: 0
};

Roku.classes.push(Roku.Slider);

Roku.Slider.getPos = function(slider)
{
	var handle = Roku.Util.childClassElement(slider, this.sliderHandleClassName);
	if(!handle)
		return 0;
		
	var width = slider.offsetWidth - handle.offsetWidth;
	if(width <= 0)
		return 0;

	var pos = (handle.offsetLeft / width);
	pos = Math.max(0, pos);  
	pos = Math.min(1, pos);
	return pos;
}

Roku.Slider.setPos = function(slider, value)
{
	var handle = Roku.Util.childClassElement(slider, this.sliderHandleClassName);
	if(!handle)
		return;

	value = Math.max(0, value);  
	value = Math.min(1, value);
	
	handle.style.left = Math.ceil((slider.offsetWidth - handle.offsetWidth) * value) + "px";
	
	if (handle.style.left == "63px")
		handle.style.left = "64px"

	//Roku.Util.Trace("debug_out", handle.style.left);
}

Roku.Slider.on_mouse_down = function(ev)
{
	var element = Roku.Util.srcEventElement(ev);
	var handle = Roku.Util.parentClassElement(element, this.sliderHandleClassName); 
	var slider = Roku.Util.parentClassElement(handle, this.sliderClassName);
	if(this.dragHandle || !ev || !handle || !slider || slider.getAttribute(this.disabledAttribName))
		return;
		
	this.dragHandle = element;
	this.dragSlider = slider; 
	this.dragPointX = ev.clientX;
	this.dragHandleX = element.offsetLeft;
	this.dragMaxX = slider.offsetWidth - handle.offsetWidth 
	
	if(this.dragHandle.setCapture)
		this.dragHandle.setCapture();
}

Roku.Slider.on_mouse_move = function(ev)
{
	if(!this.dragHandle || !ev) 
		return;

	var x = (this.dragHandleX + ev.clientX - this.dragPointX);
	x = Math.max(0, x);   
	x = Math.min(this.dragMaxX, x);
	this.dragHandle.style.left = x + "px";
	
	if(this.dragSlider && (typeof(this.dragSlider.changing_handler) == "function"))
		this.dragSlider.changing_handler(this.dragSlider);
}

Roku.Slider.sliding = function()
{
	return (this.dragHandle);
}

Roku.Slider.need_mouse_move = function()
{
	return this.sliding(); 
}

Roku.Slider.on_mouse_up = function(ev)
{
	if(!this.dragHandle) 
		return;
	
	if(this.dragSlider && (typeof(this.dragSlider.changed_handler) == "function"))
		this.dragSlider.changed_handler(this.dragSlider);
	
	if(this.dragHandle.releaseCapture)
		this.dragHandle.releaseCapture();

	this.dragHandle = null;
	this.dragSlider = null; 
}

Roku.Slider.click = function(ev)
{
	if(this.dragHandle) 
		return;
		
	var element = Roku.Util.srcEventElement(ev);
	var slider = Roku.Util.parentClassElement(element, this.sliderClassName);
	var handle = Roku.Util.childClassElement(slider, this.sliderHandleClassName);
	if(!ev || !slider || !handle || slider.getAttribute(this.disabledAttribName))
		return;
		
	var x;
	if(ev.offsetX)
		x = ev.offsetX;	// IE 
	else if(ev.pageX)
		x = ev.pageX - Roku.Util.elementRect(slider).left;	// Mozilla
	else
		return;
		
	if((handle.offsetLeft <= x) && (x < (handle.offsetLeft + handle.offsetWidth)))
		return;
		
	x -= handle.offsetWidth / 2;
	x = Math.max(0, x); 
	x = Math.min(slider.offsetWidth - handle.offsetWidth, x);
	handle.style.left = x + "px";
	
	if(typeof(slider.changed_handler) == "function")
		slider.changed_handler(slider);

	this.dragHandle = handle;
	this.dragSlider = slider; 
	this.dragPointX = ev.clientX;
	this.dragHandleX = handle.offsetLeft;
	this.dragMaxX = slider.offsetWidth - handle.offsetWidth 
	
	if(this.dragHandle.setCapture)
		this.dragHandle.setCapture();
}

Roku.Slider.need_mouse_up = function()
{
	return (this.dragHandle); 
}

Roku.Slider.get_handle = function(slider)
{
	return Roku.Util.childClassElement(slider, this.sliderHandleClassName);
}

Roku.Slider.show_handle = function(slider, show)
{
	var handle = Roku.Util.childClassElement(slider, this.sliderHandleClassName);
	if(handle)
		handle.style.visibility = show ? "visible" : "hidden"; 
}

Roku.Slider.initialize = function()
{
	var mouseDownHandler  = function() { return Roku.Slider.on_mouse_down((0 < arguments.length) ? arguments[0] : null); };
	var mouseMoveHandler  = function() { return Roku.Slider.on_mouse_move((0 < arguments.length) ? arguments[0] : null); };
	var mouseUpHandler  = function() { return Roku.Slider.on_mouse_up((0 < arguments.length) ? arguments[0] : null); };
	var clickHandler = function() { return Roku.Slider.click((0 < arguments.length) ? arguments[0] : null); };
	
	var sliders = (Roku.Body && Roku.Body.all) ? Roku.Body.all[this.sliderClassName] : Roku.Util.childrenClassElements(document.body, this.sliderClassName);
	var sliders_count = sliders ? sliders.length : 0;  
	for(var iSlider = 0; iSlider < sliders_count; iSlider++)
	{
		var slider = sliders[iSlider];
		Roku.Util.eventHandler(slider, "mousedown", clickHandler);
		
		var slider_handle = Roku.Util.childClassElement(slider, this.sliderHandleClassName);
		if(slider_handle)
		{
			Roku.Util.eventHandler(slider_handle, "mousedown", mouseDownHandler);
			//Roku.Util.eventHandler(slider_handle, "mousemove", mouseMoveHandler);
			//Roku.Util.eventHandler(slider_handle, "mouseup", mouseUpHandler);
		} 
	}
}

