//---------------------------------+
//  CARPE  S l i d e r      1.5.1  |
//  2008 - 07 - 09                 |
//  By Tom Hermansson Snickars     |
//  Copyright CARPE Design         |
//  http://carpe.ambiprospect.com/ |
//---------------------------------+

// 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 carpemouseover                = false;
var carpeDefaultSliderLength      = 100;
var carpeSliderDefaultOrientation = 'horizontal';
var carpeSliderClassName          = 'carpe_slider';
var carpeSliderDisplayClassName   = 'carpe_slider_display';
var carpesliders                  = [];
var carpedisplays                 = [];
var carpeslider                   = {};
var carpedisplay                  = {};

// carpeAddLoadEvent
function carpeAddLoadEvent(func) {
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = func;
		}
		else {
			window.onload = function() {
				oldonload();
				func();
			};
		}
}
// 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 (var 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) {
    var o = objById(elmnt);
    if( !o )
        return 0;
//	if (!(elmnt = document.getElementById(elmnt))) return 0;
	if (o.style && (typeof(o.style.left) == 'string')) {
		if (typeof(pos) == 'number') o.style.left = pos + 'px';
		else {
			pos = parseInt(o.style.left);
			if (isNaN(pos)) pos = 0;
		}
	}
	else if (o.style && o.style.pixelLeft) {
		if (typeof(pos) == 'number') o.style.pixelLeft = pos;
		else pos = o.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) {
    var o = objById(elmnt);
    if( !o )
        return 0;
	if (o.style && (typeof(o.style.top) == 'string')) {
		if (typeof(pos) == 'number') o.style.top = pos + 'px';
		else {
			pos = parseInt(o.style.top);
			if (isNaN(pos)) pos = 0;
		}
	}
	else if (o.style && o.style.pixelTop) {
		if (typeof(pos) == 'number') o.style.pixelTop = pos;
		else pos = o.style.pixelTop;
	}
	return pos;
}
// moveSlider: Handles slider and display while dragging
function moveSlider(evnt) {
    // The mousemove event
	evnt = (!evnt) ? window.event : evnt; 
    // Only if slider is dragged
	if (carpemouseover) { 
        // Horizontal mouse position relative to allowed slider positions
		carpeslider.x = carpeslider.startOffsetX + evnt.screenX; 
        // Horizontal mouse position relative to allowed slider positions
		carpeslider.y = carpeslider.startOffsetY + evnt.screenY;
        // Limit horizontal movement
		if (carpeslider.x > carpeslider.xMax)
            carpeslider.x = carpeslider.xMax;
        // Limit horizontal movement
		if (carpeslider.x < 0)
            carpeslider.x = 0;
        // Limit vertical movement
		if (carpeslider.y > carpeslider.yMax)
            carpeslider.y = carpeslider.yMax;
        // Limit vertical movement
		if (carpeslider.y < 0)
            carpeslider.y = 0;
        // move slider to new horizontal position
		carpeLeft(carpeslider.id, carpeslider.x);
        // move slider to new vertical position
		carpeTop(carpeslider.id, carpeslider.y);
        // pixel value of slider regardless of orientation
		var sliderVal = carpeslider.x + carpeslider.y;
		var sliderPos = (carpeslider.distance / carpedisplay.valuecount) * 
			Math.round(carpedisplay.valuecount * sliderVal / carpeslider.distance);

        // calculate display value
		var v = Math.round((sliderPos * carpeslider.scale + carpeslider.from) * 
			Math.pow(10, carpedisplay.decimals)) / Math.pow(10, carpedisplay.decimals);
		carpedisplay.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; 
	carpeslider = (evnt.target) ? evnt.target : evnt.srcElement; 
	var dist = parseInt(carpeslider.getAttribute('distance'));
	carpeslider.distance = dist ? dist : carpeDefaultSliderLength; 
	var ori = carpeslider.getAttribute('orientation'); 
	var orientation = ((ori == 'horizontal') || (ori == 'vertical')) ? ori :
                        carpeSliderDefaultOrientation;
		// Default orientation from global variable.
	var displayId = carpeslider.getAttribute('display');

	//carpedisplay = document.getElementById(displayId); 
	carpedisplay = objById(displayId); 
	carpedisplay.sliderId = carpeslider.id; 
	var dec = parseInt(carpedisplay.getAttribute('decimals'));
	carpedisplay.decimals = dec ? dec : 0;
	var val = parseInt(carpedisplay.getAttribute('valuecount'));
	carpedisplay.valuecount = val ? val : carpeslider.distance + 1;
	var from = parseFloat(carpedisplay.getAttribute('from'));
	from = from ? from : 0 // Default min/start value: 0.
	var to = parseFloat(carpedisplay.getAttribute('to'));
	to = to ? to : carpeslider.distance;
	carpeslider.scale = (to - from) / carpeslider.distance;
    // Set limits and scale for vertical sliders.
	if (orientation == 'vertical') { 
		carpeslider.from = to;// Invert for vertical sliders. "Higher is more."
		carpeslider.xMax = 0;
		carpeslider.yMax = carpeslider.distance;
        // Invert scale for vertical sliders. "Higher is more."
		carpeslider.scale = -carpeslider.scale;
	} else {
        // Set limits for horizontal sliders.
		carpeslider.from = from;
		carpeslider.xMax = carpeslider.distance;
		carpeslider.yMax = 0;
	}
    // Slider-mouse horizontal offset at start of slide.
	carpeslider.startOffsetX = carpeLeft(carpeslider.id) - evnt.screenX; 
    // Slider-mouse vertical offset at start of slide.
	carpeslider.startOffsetY = carpeTop(carpeslider.id) - evnt.screenY;
	carpemouseover = true;
    carpeslider.onmousemove = moveSlider;
    carpeslider.onmouseup = sliderMouseUp;
	return false;
}
// sliderMouseUp: Handles the mouseup event after moving a slider.
// Snaps the slider position to allowed/displayed value. 
function sliderMouseUp() {
    if( !carpemouseover )
        return;
    // Calculate slider position (regardless of orientation).
    var v = (carpedisplay.value) ? carpedisplay.value : 0;
    var pos = (v - carpeslider.from)/(carpeslider.scale); 
    if (carpeslider.yMax == 0) {
        pos = (pos > carpeslider.xMax) ? carpeslider.xMax : pos;
        pos = (pos < 0) ? 0 : pos;
        carpeLeft(carpeslider.id, pos); // Snap horizontal slider to corresponding display position.
    }
    if (carpeslider.xMax == 0) {
        pos = (pos > carpeslider.yMax) ? carpeslider.yMax : pos;
        pos = (pos < 0) ? 0 : pos;
        carpeTop(carpeslider.id, pos); // Snap vertical slider to corresponding display position.
    }
    // remove mousemove/up handlers from affected slider
    carpeslider.onmousemove = null;
    carpeslider.onmouseup   = null;
	carpemouseover = false; // Stop the sliding.

    // user has settled on a value - now call back to an (optional)
    // installed eventhandler
    var oc  = carpedisplay.getAttribute('update');
    var ocf = null;

    //alert("oc="+oc+" (type:"+typeof(oc)+") [id="+carpedisplay.id+"]");
    if( oc ) {
        if( typeof(oc)=='function' ) {
            ocf = oc;
        } else if( typeof(oc)=='string' ) {
            eval("ocf = "+oc);
            if( typeof(ocf)!='function' )
                ocf = null;
        }
    }
    //alert("ocf is '"+ocf+"' (type: "+typeof(ocf)+")");
    if( ocf )
        ocf(carpedisplay.value);
}

function focusDisplay(evnt) {
	if (!evnt) evnt = window.event; // Get the mouse event causing the display activation.
	var carpedisplay = (evnt.target) ? evnt.target : evnt.srcElement; // Get the activated display element.
	var lock = carpedisplay.getAttribute('typelock'); // Is the user allowed to type into the display?
	if (lock == 'on') {
		carpedisplay.blur();
	}
	return;
}
function carpeInit() {
	carpesliders = carpeGetElementsByClass(carpeSliderClassName) // Find the horizontal sliders.
	for (var i = 0; i < carpesliders.length; i++) {
		carpesliders[i].onmousedown = slide; // Attach event listener.
	}
	carpedisplays = carpeGetElementsByClass(carpeSliderDisplayClassName) // Find the displays.
	for (var i = 0; i < carpedisplays.length; i++) {
		carpedisplays[i].value = carpedisplays[i].defaultValue; // Resets display on page reload.
		//carpedisplays[i].onfocus = focusDisplay; // Attach event listener.
	}
}
/*
carpeAddLoadEvent(carpeInit);
*/
