/*
Ressource:
http://carpe.ambiprospect.com/slider/archive/v1.3/

Author
Tom Hermansson Snickars
Copyright CARPE Design
http://carpe.ambiprospect.com/

Version
CARPE Slider 1.3
*/

var mouseover = false;
var parseTo;

function carpeGetElementById(element){
	if(document.getElementById){element = document.getElementById(element);}
	else if(document.all){element = document.all[element];}
	else{element = null;}
	return element;
}

function carpeLeft(elmnt,pos){
	if(!(elmnt = carpeGetElementById(elmnt))){return 0;}
	if(elmnt.style && (typeof(elmnt.style.left) == 'string')) {
		if(typeof(pos) == 'number'){elmnt.style.left = 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;}
	}
	var elm = document.getElementById(sliderObj.id+'_high');
	if(elm){elm.style.backgroundPosition = (pos - 350) + 'px 50%';}
	return pos;
}

function carpeTop(elmnt,pos){
	if(!(elmnt = carpeGetElementById(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;
}

function moveSlider(evnt){
	var elm = document.getElementById(sliderObj.id+'_high');
	var evnt = (!evnt) ? window.event : evnt; // The mousemove event
	if(mouseover){ // Only if slider is dragged
		x = pxLeft + evnt.screenX - xCoord // Horizontal mouse position relative to allowed slider positions
		y = pxTop + evnt.screenY - yCoord // Horizontal mouse position relative to allowed slider positions
		if(elm){elm.style.backgroundPosition = (x - 350) + 'px 50%';}
		if (x > xMax) x = xMax // Limit horizontal movement
		if (x < 0) x = 0 // Limit horizontal movement
		if (y > yMax) y = yMax // Limit vertical movement
		if (y < 0) y = 0 // Limit vertical movement
		carpeLeft(sliderObj.id, x)  // move slider to new horizontal position
		carpeTop(sliderObj.id, y) // move slider to new vertical position
		sliderVal = x + y // pixel value of slider regardless of orientation
		sliderPos = (sliderObj.pxLen / sliderObj.valCount) * Math.round(sliderObj.valCount * sliderVal / sliderObj.pxLen)
		v = Math.round((sliderPos * sliderObj.scale + sliderObj.fromVal) * // calculate display value
			Math.pow(10, displayObj.dec)) / Math.pow(10, displayObj.dec)
		displayObj.value = v // put the new value in the slider display element
		return false
	}
	return
}

// moveSlider: Handles the start of a slider move.
function slide(evnt,orientation,length,from,to,count,decimals,display,f){
	parseTo = display;
	if (!evnt) evnt = window.event;
	sliderObj = (evnt.target) ? evnt.target : evnt.srcElement; // Get the activated slider element.
	sliderObj.pxLen = length; // The allowed slider movement in pixels.
	sliderObj.valCount = count ? count - 1 : length; // Allowed number of values in the interval.
	displayObj = carpeGetElementById(display); // Get the associated display element.
	displayObj.dec = decimals; // Number of decimals to be displayed.
	sliderObj.scale = (to - from) / length; // Slider-display scale [value-change per pixel of movement].
	if(orientation == 'horizontal'){ // Set limits for horizontal sliders.
		sliderObj.fromVal = from;
		xMax = length;
		yMax = 0;
	}
	if(orientation == 'vertical'){ // Set limits and scale for vertical sliders.
		sliderObj.fromVal = to;
		xMax = 0;
		yMax = length;
		sliderObj.scale = -sliderObj.scale; // Invert scale for vertical sliders. "Higher is more."
	}
	pxLeft = carpeLeft(sliderObj.id); // Sliders horizontal position at start of slide.
	pxTop  = carpeTop(sliderObj.id); // Sliders vertical position at start of slide.
	xCoord = evnt.screenX; // Horizontal mouse position at start of slide.
	yCoord = evnt.screenY; // Vertical mouse position at start of slide.
	mouseover = true;
	document.onmousemove = moveSlider; // Start the action if the mouse is dragged.
	document.onmouseup = function(){
		if(mouseover){
			sliderMouseUp(); // Stop sliding.
		}
	}
}

function findPosX(obj){
	var curleft = 0;
	if(obj.offsetParent){
		while(1){
		  curleft += obj.offsetLeft;
		  if(!obj.offsetParent){break;}
		  obj = obj.offsetParent;
		}
	}else if(obj.x){
		curleft += obj.x;
	}
	return curleft;
}

function clickSlide(ev,f,obj){ //  onclick="clickSlide(event,this,'horizontal_slider_1');"
	if(ev == null){ev = window.event;}
	var _mouseX = ev.clientX;
	var _mouseY = ev.clientY;
	var _elmX = findPosX(f);
	var _elmposX = ((_mouseX - _elmX) - 10);
	if(!mouseover){
		carpeLeft(obj,_elmposX);
	}
}

function sliderMouseUp(){
	mouseover = false; // Stop the sliding.
	v = (displayObj.value) ? displayObj.value : 0; // Find last display value.
	pos = (v - sliderObj.fromVal)/(sliderObj.scale); // Calculate slider position (regardless of orientation).
	if(yMax == 0) carpeLeft(sliderObj.id, pos); // Snap horizontal slider to corresponding display position.
	if(xMax == 0) carpeTop(sliderObj.id, pos); // Snap vertical slider to corresponding display position.
	
	
	var elm = document.getElementById(sliderObj.id+'_high');
	try{
		if(displayObj.value!='3'){
			elm.className = 'horizontal_track_bg_highlight_active';
			updateKey(parseTo,displayObj.value,true);
		}else{
			elm.className = 'horizontal_track_bg_highlight_inactive';
			removeKey(parseTo,displayObj.value,true);
		}
	    // Focus fix
	    var fake = document.getElementById(sliderObj.id+'_high_fake_inp');
	    if(!fake){
		    var dot = document.createElement("input");
		    dot.type = 'text';
		    dot.value = '';
		    dot.id = sliderObj.id+'_high_fake_inp';
		    dot.className = 'fake_inp';
		    elm.appendChild(dot);
	    }
	    var fakevar = sliderObj.id+'_high_fake_inp';
	    setTimeout("fakefocus('"+fakevar+"');", 100);
	
	}catch(e){
		/*alert(e.description);*/
	}
	if(document.removeEventListener){ // Remove event listeners from 'document' (Moz&co).
		document.removeEventListener('mousemove', moveSlider);
		document.removeEventListener('mouseup', sliderMouseUp);
	}
	else if(document.detachEvent){ // Remove event listeners from 'document' (IE&co).
		document.detachEvent('onmousemove', moveSlider);
		document.detachEvent('onmouseup', sliderMouseUp);
	}

}
function fakefocus(f){
	var fake = document.getElementById(f);
	try{
		fake.focus();
		setTimeout("fakeblur('"+f+"');", 10);
	}catch(e){alert(e.description);}
}
function fakeblur(f){
	var fake = document.getElementById(f);
	try{
		fake.blur();
	}catch(e){alert(e.description);}
}

function iniSlidebar(){
	var items = document.getElementsByTagName('input');
	var current = items.length;
	for(d=0;d<current;d+=1){
		if(items[d].className=='slidebar_display'){
			var mother = document.getElementById('horizontal_'+items[d].id);
			var highlight = document.getElementById('horizontal_'+items[d].id+'_high');
			var defaultVal = items[d].value;
			var _x,_x_bg;
			if(defaultVal=='0'){_x = '0px';_x_bg = '-350px 50%';}
			if(defaultVal=='1'){_x = '48px';_x_bg = '-290px 50%';}
			if(defaultVal=='2'){_x = '96px';_x_bg = '-230px 50%';}
			if(defaultVal=='3'){_x = '144px';_x_bg = '-170px 50%';}
			if(defaultVal=='4'){_x = '192px';_x_bg = '-110px 50%';}
			if(defaultVal=='5'){_x = '240px';_x_bg = '-60px 50%';}
			if(defaultVal=='6'){_x = '288px';_x_bg = '-60px 50%';}
			mother.style.left = _x;
			highlight.style.backgroundPosition = _x_bg;	
		}
	}
}

function resetSliders(sliders){
	if(sliders){
		for(var i=0;i<sliders.length;i++){
			var objval = document.getElementById(sliders[i]);
			if(objval){objval.value = '3';}
			
			var objsli = document.getElementById('horizontal_'+sliders[i]+'_high');
			if(objsli){objsli.className = 'horizontal_track_bg_highlight_inactive';}
			
			var objmoth = document.getElementById('horizontal_'+sliders[i]);
			if(objmoth){objmoth.style.left = '144px';}
			
		}
	}
}
