//---------------------------------+
//  CARPE  S l i d e r        1.5  |
//  2006 - 01 - 03                 |
//  By Tom Hermansson Snickars     |
//  Copyright CARPE Design         |
//  http://carpe.ambiprospect.com/ |
//  Contact for custom scripts     |
//  or implementation help.        |
//---------------------------------+

// Global vars. You don't need to make changes here to change your sliders.
// Changing the attributes in your (X)HTML file is enough.
var carpeDefaultSliderLength      = 100
var carpeSliderDefaultOrientation = 'horizontal'
var carpeSliderClassName          = 'carpe_slider'
var carpeSliderSlitClassName	  = 'carpe_slider_slit'
var carpeSliderDisplayClassName   = 'carpe_slider_display'
var carpeSliderMaxDefault   = 100

// carpeGetElementsByClass: Cross-browser function that returns
// an array with all elements that have a class attribute that
// contains className
function carpeGetElementsByClass(className)
{
	var classElements = new Array()
	var els = document.getElementsByTagName("*")
	var elsLen = els.length
	var pattern = new RegExp("\\b" + className + "\\b")
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i]
			j++
		}
	}
	return classElements;
}
// carpeLeft: Cross-browser version of "element.style.left"
// Returns or sets the horizontal position of an element.
function carpeLeft(elmnt, pos)
{
	if (!(elmnt = document.getElementById(elmnt))) return 0;
	
	if (elmnt.style && (typeof(elmnt.style.left) == 'string')) {
		if (typeof(pos) == 'number') 
		{
			elmnt.style.left = pos + 'px';
			slider_background = elmnt.parentElement.getElementsByTagName("div").item(0);			
			slider_background.style.width = pos + "px";
		}
		else {
			pos = parseInt(elmnt.style.left);
			if (isNaN(pos)) pos = 0;
		}
	}
	else if (elmnt.style && elmnt.style.pixelLeft) {
		if (typeof(pos) == 'number') elmnt.style.pixelLeft = pos;
		else pos = elmnt.style.pixelLeft;
	}
	return pos;
}
// carpeTop: Cross-browser version of "element.style.top"
// Returns or sets the vertical position of an element.
function carpeTop(elmnt, pos)
{
	if (!(elmnt = document.getElementById(elmnt))) return 0;
	if (elmnt.style && (typeof(elmnt.style.top) == 'string')) {
		if (typeof(pos) == 'number') elmnt.style.top = pos + 'px';
		else {
			pos = parseInt(elmnt.style.top);
			if (isNaN(pos)) pos = 0;
		}
	}
	else if (elmnt.style && elmnt.style.pixelTop) {
		if (typeof(pos) == 'number') elmnt.style.pixelTop = pos;
		else pos = elmnt.style.pixelTop;
	}
	return pos;
}
// moveSlider: Handles slider and display while dragging
function moveSlider(evnt)
{
	var evnt = (!evnt) ? window.event : evnt; // The mousemove event
	if (mouseover) { // Only if slider is dragged
		x = slider.startOffsetX + evnt.screenX // Horizontal mouse position relative to allowed slider positions
		//y = slider.startOffsetY + evnt.screenY // Horizontal mouse position relative to allowed slider positions
		
		if (x > slider.xMax) x = slider.xMax // Limit horizontal movement
		if (x < 0) x = 0 // Limit horizontal movement
		//if (y > slider.yMax) y = slider.yMax // Limit vertical movement
		//if (y < 0) y = 0 // Limit vertical movement
		carpeLeft(slider.id, x)  // move slider to new horizontal position
		
		if (slider.slidertype == "raiseOnDrag")
		{
			slider_slideChanged(slider.id, x);
		}
		
		//carpeTop(slider.id, y) // move slider to new vertical position
		//sliderVal = x + y // pixel value of slider regardless of orientation
		//sliderPos = (slider.distance / display.valuecount) * 
		//	Math.round(display.valuecount * sliderVal / slider.distance)
		//v = Math.round((sliderPos * slider.scale + slider.from) * // calculate display value
		//	Math.pow(10, display.decimals)) / Math.pow(10, display.decimals)
		//display.value = v // put the new value in the slider display element
		return false
	}
	return
}
// slide: Handles the start of a slider move.
function slide(evnt)
{
	if (!evnt) evnt = window.event; // Get the mouse event causing the slider activation.
	slider = (evnt.target) ? evnt.target : evnt.srcElement; // Get the activated slider element.
	dist = parseInt(slider.getAttribute('distance')) // The allowed slider movement in pixels.
	slider.distance = dist ? dist : carpeDefaultSliderLength // Deafault distance from global var.
	ori = slider.getAttribute('orientation') // Slider orientation: 'horizontal' or 'vertical'.
	orientation = ((ori == 'horizontal') || (ori == 'vertical')) ? ori : carpeSliderDefaultOrientation
		// Default orientation from global variable.
	displayId = slider.getAttribute('display') // ID of associated display element.
	display = document.getElementById(displayId) // Get the associated display element.
	display.sliderId = slider.id // Associate the display with the correct slider.
	dec = parseInt(display.getAttribute('decimals')) // Number of decimals to be displayed.
	display.decimals = dec ? dec : 0 // Default number of decimals: 0.
	val = parseInt(display.getAttribute('valuecount'))  // Allowed number of values in the interval.
	display.valuecount = val ? val : slider.distance + 1 // Default number of values: the sliding distance.
	from = parseFloat(display.getAttribute('from')) // Min/start value for the display.
	from = from ? from : 0 // Default min/start value: 0.
	to = parseFloat(display.getAttribute('to')) // Max value for the display.
	to = to ? to : slider.distance // Default number of values: the sliding distance.
	slider.scale = (to - from) / slider.distance // Slider-display scale [value-change per pixel of movement].
	if (orientation == 'vertical') { // Set limits and scale for vertical sliders.
		slider.from = to // Invert for vertical sliders. "Higher is more."
		slider.xMax = 0
		slider.yMax = slider.distance
		slider.scale = -slider.scale // Invert scale for vertical sliders. "Higher is more."
	}
	else { // Set limits for horizontal sliders.
		slider.from = from
		slider.xMax = slider.distance
		slider.yMax = 0
	}
	slider.startOffsetX = carpeLeft(slider.id) - evnt.screenX // Slider-mouse horizontal offset at start of slide.
	//slider.startOffsetY = carpeTop(slider.id) - evnt.screenY // Slider-mouse vertical offset at start of slide.
	mouseover = true
	document.onmousemove = moveSlider // Start the action if the mouse is dragged.
	document.onmouseup = sliderMouseUp // Stop sliding.
	return false
}
// sliderMouseUp: Handles the mouseup event after moving a slider.
// Snaps the slider position to allowed/displayed value. 
function sliderMouseUp(evnt)
{
	var evnt = (!evnt) ? window.event : evnt; // The mousemove event

	if (mouseover) {
		
		// llamamos al evento changed si es de tipo raiseOnDrop
		if (slider.slidertype == "raiseOnDrop")
		{			
			
			var x = slider.style.left.substring(0,slider.style.left.indexOf("p"));
			
			slider_slideChanged(slider.id, x);
		}
		
		if (document.removeEventListener) { // Remove event listeners from 'document' (W3C).
			document.removeEventListener('mousemove', moveSlider, false)
			document.removeEventListener('mouseup', sliderMouseUp, false)
		}
		else if (document.detachEvent) { // Remove event listeners from 'document' (IE).
			document.detachEvent('onmousemove', moveSlider)
			document.detachEvent('onmouseup', sliderMouseUp)
		}
	}
	mouseover = false // Stop the sliding.
}
function focusDisplay(evnt)
{
	if (!evnt) evnt = window.event; // Get the mouse event causing the display activation.
	display = (evnt.target) ? evnt.target : evnt.srcElement; // Get the activated display element.
	lock = display.getAttribute('typelock') // Is the user allowed to type into the display?
	if (lock == 'on') {
		display.blur()
	}
	return
}

//window.onload = function() // Set up the sliders and the displays.
function onloadSliderAsync(){	
	sliders = carpeGetElementsByClass(carpeSliderClassName) // Find the horizontal sliders.
	for (i = 0; i < sliders.length; i++) {
		sliders[i].onmousedown = slide // Attach event listener.		
	}
	sliders_slits = carpeGetElementsByClass(carpeSliderSlitClassName) // Find the horizontal sliders slits.
	for (i = 0; i < sliders_slits.length; i++) {
		sliders_slits[i].onclick = slit_onclick // Attach event listener.		
	}	
}
function onloadSlider(){
	/*
	sliders = carpeGetElementsByClass(carpeSliderClassName) // Find the horizontal sliders.
	for (i = 0; i < sliders.length; i++) {
		sliders[i].onmousedown = slide // Attach event listener.
	}
	sliders_slits = carpeGetElementsByClass(carpeSliderSlitClassName) // Find the horizontal sliders slits.
	for (i = 0; i < sliders_slits.length; i++) {
		sliders_slits[i].onclick = slit_onclick // Attach event listener.
	}
	*/
	setTimeout("onloadSliderAsync();",100);
	
	
	/*
	displays = carpeGetElementsByClass(carpeSliderDisplayClassName) // Find the displays.
	for (i = 0; i < displays.length; i++) {
		displays[i].onfocus = focusDisplay // Attach event listener.
	}
	*/
}

//
//----------------------------------------------------------------------------------------
//

// Funciones agregadas para darle m?s funcionalidad
// Rodrigo Uroz

// establece el rango de valores del slider
// recibe:
//	iValue		el valor m?ximo
//	sSlider		el nombre del slider destino
function slider_setMaxValue(sSlider,iValue)
{
	slider = document.getElementById(sSlider);
	if (slider)
	{
		slider.maxValue = iValue;
	}
}

// establece el valor actual del slider
// recibe:
//	iValue		el valor actual
//	sSlider		el nombre del slider destino
function slider_setCurrentValue(sSlider,iValue)
{
	var slider = document.getElementById(sSlider);
	
	if (slider)
	{
		if (!slider.maxValue)
		{
			slider_setMaxValue(sSlider,carpeSliderMaxDefault);
		}
		
		var iNewPos = (slider.maxValue&&slider.maxValue>=iValue&&iValue>=0)?((iValue*slider.distance)/slider.maxValue):-1;
	
		if (iNewPos != -1)
			carpeLeft(sSlider,iNewPos);
	}
}

// slit_onclick: Maneja el click sobre la barra de desplazamiento
function slit_onclick(evnt)
{
	
	if (!evnt) evnt = window.event; // Get the mouse event causing the slider activation.
	
	slider_slit = (evnt.target) ? evnt.target : evnt.srcElement; // Get the activated slider element.
	
	if (slider_slit.id && slider_slit.id.indexOf("slit") == -1)
	{
		return false;
	}
	else if (slider_slit.id.indexOf("slit") == -1)
	{	
		slider_slit = slider_slit.parentElement;		
	}
	
	slider_slit_id = slider_slit.id;
	
	slider = document.getElementById(slider_slit_id.substring(0,slider_slit_id.lastIndexOf("_")));
		
	dist = parseInt(slider.getAttribute('distance')) // The allowed slider movement in pixels.	
	slider.distance = dist ? dist : carpeDefaultSliderLength // Deafault distance from global var.
		
	x = evnt.x-slider_slit.offsetLeft;
	//alert("Click="+evnt.x+"|Offset="+slider_slit.offsetLeft+"|Resultado="+x);
	
	var iPos = x;
	var iMax = Math.round(slider.distance);
	
	if (iPos > iMax)
	{
		x = slider.distance;	
	}
	if (x < 0)
		x = 0;
	
	carpeLeft(slider.id,x);	
	
	slider_slideChanged(slider.id,x);	
	
}

// se llama cuando se cambia la posicion del slide
// recibe:
//	sSlider		el nombre del slider destino
//	iValue		el valor actual
function slider_slideChanged(sSlider,iValue)
{	
	slider = document.getElementById(sSlider);
	if (slider)
	{		
		if (!slider.maxValue)
		{
			slider_setMaxValue(sSlider,carpeSliderMaxDefault);
		}
				
		var iPos = Math.round((iValue*slider.maxValue)/slider.distance);
		// llamar a la funcion del player
		if (!isNaN(iPos))
			eval(slider.notify+"("+iPos+")");		
	}
}






/*IMPORTS*/
/*VARIABLES*/
window.carpeDefaultSliderLength=carpeDefaultSliderLength;
window.carpeSliderDefaultOrientation=carpeSliderDefaultOrientation;
window.carpeSliderClassName=carpeSliderClassName;
window.carpeSliderSlitClassName=carpeSliderSlitClassName;
window.carpeSliderDisplayClassName=carpeSliderDisplayClassName;
window.carpeSliderMaxDefault=carpeSliderMaxDefault;
/*FUNCIONES*/
window.carpeGetElementsByClass=carpeGetElementsByClass;
window.carpeLeft=carpeLeft;
window.carpeTop=carpeTop;
window.moveSlider=moveSlider;
window.slide=slide;
window.sliderMouseUp=sliderMouseUp;
window.focusDisplay=focusDisplay;
window.slider_setMaxValue=slider_setMaxValue;
window.slider_setCurrentValue=slider_setCurrentValue;
window.slit_onclick=slit_onclick;
window.slider_slideChanged=slider_slideChanged;
window.onloadSlider=onloadSlider;
window.onloadSliderAsync=onloadSliderAsync;