var defaultSliderLength = 100;
var defaultOrientation = 'horizontal';
var slidersList = new Object();

// Returns or sets the horizontal position of an element.
function sliderLeft(elem, pos){
	if(!(elem = GetItemById(elem))) return 0;
	if(elem.style && (typeof(elem.style.left) == 'string')){
		if(typeof(pos) == 'number' && !isNaN(pos)) elem.style.left = pos + 'px';
		else{
			pos = parseInt(elem.style.left);
			if(isNaN(pos)) pos = 0;
		}
	}
	else if(elem.style && elem.style.pixelLeft){
		if(typeof(pos) == 'number' && !isNaN(pos)) elem.style.pixelLeft = pos;
		else pos = elem.style.pixelLeft;
	}
	return pos;
}

// Returns or sets the vertical position of an element.
function sliderTop(elem, pos){
	if(!(elem = GetItemById(elem))) return 0;
	if(elem.style && (typeof(elem.style.top) == 'string')){
		if(typeof(pos) == 'number' && !isNaN(pos)) elem.style.top = pos + 'px';
		else{
			pos = parseInt(elem.style.top);
			if(isNaN(pos)) pos = 0;
		}
	}
	else if(elem.style && elem.style.pixelTop){
		if(typeof(pos) == 'number' && !isNaN(pos)) elem.style.pixelTop = pos;
		else pos = elem.style.pixelTop;
	}
	return pos;
}

// Handles slider and display while dragging
function moveSlider(evnt){
	var evnt = (!evnt) ? window.event : evnt;
	if(mouseover){
		var slider2 = getAttrAsElement(slider, 'slider2');

		x = slider.startOffsetX + evnt.screenX;
		y = slider.startOffsetY + evnt.screenY;

		if(x > slider.xMax) x = slider.xMax;
		if(x < 0) x = 0;
		if(y > slider.yMax) y = slider.yMax;
		if(y < 0) y = 0;

		if(slider.type == 'min'){
			if(x > sliderLeft(slider2.id)){ x = sliderLeft(slider2.id); }
			if(y > sliderTop(slider2.id)){ y = sliderTop(slider2.id); }
		}
		else{
			if(x < sliderLeft(slider2.id)){ x = sliderLeft(slider2.id); }
			if(y < sliderTop(slider2.id)){ y = sliderTop(slider2.id); }
		}

		sliderLeft(slider.id, x);
		sliderTop(slider.id, y);

		sliderVal = x + y;
		sliderPos = (slider.distance / display.valuecount) * Math.round(display.valuecount * sliderVal / slider.distance);
		v = Math.round((sliderPos * slider.scale + slider.from) * Math.pow(10, display.decimals)) / Math.pow(10, display.decimals);
		display.value = v;

		var valueText = GetTime(v)
		getAttrAsElement(display, 'display').innerHTML = valueText;
		setSliderAltText(slider.id, valueText);

		return false;
	}
	return;
}

// Handles slider and display while dragging
function setSliderValue(sliderid, val){
	slider = slidersList[sliderid];
	if(!slider) return;

	initSlider(slider);
	slider2 = getAttrAsElement(slider, 'slider2');
	display = getAttrAsElement(slider, 'display');

	x = parseInt((val - slider.from)/slider.scale);
	y = parseInt((val - slider.from)/slider.scale);

	if(x > slider.xMax) x = slider.xMax;
	if(x < 0) x = 0;
	if(y > slider.yMax) y = slider.yMax;
	if(y < 0) y = 0;

	if(slider.type == 'min'){
		if(x > sliderLeft(slider2.id)){ x = sliderLeft(slider2.id); }
		if(y > sliderTop(slider2.id)){ y = sliderTop(slider2.id); }
	}
	else{
		if(x < sliderLeft(slider2.id)){ x = sliderLeft(slider2.id); }
		if(y < sliderTop(slider2.id)){ y = sliderTop(slider2.id); }
	}

	sliderLeft(slider.id, x);
	sliderTop(slider.id, y);

	sliderVal = x + y;
	sliderPos = (slider.distance / display.valuecount) * Math.round(display.valuecount * sliderVal / slider.distance);
	v = Math.round((sliderPos * slider.scale + slider.from) * Math.pow(10, display.decimals)) / Math.pow(10, display.decimals);
	display.value = v;

	var valueText = GetTime(v)
	getAttrAsElement(display, 'display').innerHTML = valueText;
	setSliderAltText(slider.id, valueText);
}

// Handles the start of a slider move.
function slide(evnt){
	if(!evnt) evnt = window.event;
	
	slider = (evnt.target) ? evnt.target : evnt.srcElement;
	if(slider.getAttribute('slider'))
		slider = GetItemById(slider.getAttribute('slider'));

	slider.type = getSliderType(slider);
	orientation = getSliderOrientation(slider);
	slider.distance = readAttrAsInt(slider, 'distance', defaultSliderLength);

	display = getAttrAsElement(slider, 'display');
	display.sliderId = slider.id;
	display.decimals = readAttrAsInt(display, 'decimals', 0);
	display.valuecount = readAttrAsInt(display, 'valuecount', slider.distance + 1);

	from = readAttrAsFloat(display, 'from', 0);
	to = readAttrAsFloat(display, 'to', slider.distance);

	slider.scale = (to - from)/slider.distance;

	if(orientation == 'vertical'){
		slider.from = to;
		slider.xMax = 0;
		slider.yMax = slider.distance;
		slider.scale = -slider.scale;
	}
	else{
		slider.from = from;
		slider.xMax = slider.distance;
		slider.yMax = 0;
	}

	slider.startOffsetX = sliderLeft(slider.id) - evnt.screenX;
	slider.startOffsetY = sliderTop(slider.id) - evnt.screenY;
	mouseover = true;
	document.onmousemove = moveSlider;
	document.onmouseup = sliderMouseUp;
	return false;
}

function initSlider(item){
	item.type = getSliderType(item);
	orientation = getSliderOrientation(item);
	item.distance = readAttrAsInt(item, 'distance', defaultSliderLength);

	displayItem = getAttrAsElement(item, 'display');
	displayItem.sliderId = item.id;
	displayItem.decimals = readAttrAsInt(displayItem, 'decimals', 0);
	displayItem.valuecount = readAttrAsInt(displayItem, 'valuecount', item.distance + 1);

	from = readAttrAsFloat(displayItem, 'from', 0);
	to = readAttrAsFloat(displayItem, 'to', item.distance);

	item.scale = (to - from)/item.distance;

	if(orientation == 'vertical'){
		item.from = to;
		item.xMax = 0;
		item.yMax = item.distance;
		item.scale = -item.scale;
	}
	else{
		item.from = from;
		item.xMax = item.distance;
		item.yMax = 0;
	}

	item.startOffsetX = sliderLeft(item.id);
	item.startOffsetY = sliderTop(item.id);
}

// Snaps the slider position to allowed/displayed value.
function sliderMouseUp(){
	if(mouseover){
		v = (display.value) ? display.value : 0;
		pos = (v - slider.from)/(slider.scale);
		if(slider.yMax == 0){
			pos = (pos > slider.xMax) ? slider.xMax : pos;
			pos = (pos < 0) ? 0 : pos;
			sliderLeft(slider.id, pos);
		}
		if(slider.xMax == 0){
			pos = (pos > slider.yMax) ? slider.yMax : pos;
			pos = (pos < 0) ? 0 : pos;
			sliderTop(slider.id, pos);
		}
		if(document.removeEventListener){
			document.removeEventListener('mousemove', moveSlider, false);
			document.removeEventListener('mouseup', sliderMouseUp, false);
		}
		else if(document.detachEvent){
			document.detachEvent('onmousemove', moveSlider);
			document.detachEvent('onmouseup', sliderMouseUp);
		}
		filter();
	}
	mouseover = false;
}

function setSliderAltText(elem, text){
	if(!(elem = GetItemById(elem))) return 0;
	if(elem){ elem.setAttribute('title', text); }
}

function getSliderOrientation(elem){
	var ori = elem.getAttribute('orientation');
	return ((ori == 'horizontal' || ori == 'vertical') ? ori : defaultOrientation);
}

function getSliderType(elem){
	var t = elem.getAttribute('slidertype')
	return ((t == 'min' || t == 'max') ? t : 'min');
}

function getAttrAsElement(elem, name){
	var id = elem.getAttribute(name);
	return GetItemById(id);
}

function readAttrAsInt(elem, name, defaultVal){
	var val = parseInt(elem.getAttribute(name));
	return (val ? val : defaultVal);
}

function readAttrAsFloat(elem, name, defaultVal){
	var val = parseFloat(elem.getAttribute(name));
	return (val ? val : defaultVal);
}

function getSliderValue(id, defaultVal){
	sl = slidersList[id];
	if(!sl) return defaultVal;
	slDisplay = getAttrAsElement(sl, 'display');
	return (slDisplay ? slDisplay.value : defaultVal);
}

function focusDisplay(evnt){
	if(!evnt) evnt = window.event;
	display = (evnt.target) ? evnt.target : evnt.srcElement;
	lock = display.getAttribute('typelock');
	if(lock == 'on'){ display.blur(); }
	return
}

function setupSliders(sliders){
	for(i = 0; i < sliders.length; i++){
		var sliderItem = GetItemById(sliders[i]);
		if(sliderItem){
			sliderItem.onmousedown = slide;
			itemDisplay = getAttrAsElement(sliderItem, 'display');
			setSliderAltText(sliderItem.id, (itemDisplay ? GetTime(itemDisplay.value) : '00:00'));
			slidersList[sliders[i]] = sliderItem;
		}
	}
}

function GetTime(val){
	return ((val < 10) ? "0" : "") + val + ":00";
}

function GetItemById(id){
	return (document.all ? document.all[id] : document.getElementById(id));
}