var sliderWidth = 92;				// CSS: div.slider-bar { width }
var sliderElementWidth = 9;	// CSS: div.slider-element { width }

document.onmousemove = getMouseXY;

var tempX = 0;
var posX = 0;
var adjuststate = 0;

var tempA = 0;
var x = 0;

var topPos = 0;
var offsetPosX = 0;
var iMouseOffset = 0;
var iBrowserOffset = 0;

var rangeMin = 0;
var curKnownPos = 0;
var rangeMax = 0;

var sliderData = {};

var sCurrentSliderId = "";
var iCurrentSliderMinValue = 0;
var iCurrentSliderMaxValue = 0;

/*
* Bei der Initialisierung der Slider (initSlider) wird auf die Sliderelemente
* *-bar, *-element, *-minus, *-plus;
* Da bei der Anzeige des Disclaimers die Slider-Elemente noch nicht vorhanden sind,
* aber die Initialisierung wird in der Initialisierung das Vorhandensein
* der Elemente geprueft.
* ZU Debuggingzwecken kann der Wert auf 'true' gesetzt werden, wodurch der Test entfaellt
* Werte:
* true => Prüfung deaktiviert, sind die Elemente nicht vorhanden fallen JS-Fehler
* false => bei Fehlen von Sliderelementen wird die Initialisierung ohne JS-Fehler abgebrochen
*/
var debug = false;

/* Der Name des Forms in dem sich der Slider befindet, wird benoetigt da von JSF
 * dem Name des Inputfelds fuer den Sliderwert immer der Formname vorangestellt wird
 */
var formName = "";

function initSlider(pElementId, pMinValue, pMaxValue, pFormName, pStep, pValueElementId)
{
	if( debug || (document.getElementById(pElementId +"-bar") &&
		document.getElementById(pElementId +"-element") &&
		document.getElementById(pElementId +"-minus") &&
		document.getElementById(pElementId +"-plus") )){
	sliderData[pElementId] = new createSliderData(pElementId, pMinValue, pMaxValue, pStep, pValueElementId, pFormName);
	document.getElementById(pElementId +"-bar").onmousedown = function() { moveSliderElement(pElementId) };
	document.getElementById(pElementId +"-element").onmousedown = function() { captureStart(pElementId,pMinValue,pMaxValue)};
	document.getElementById(pElementId +"-element").onmouseup = function() { captureStop(); };
	document.getElementById(pElementId +"-element").ondragstart = function() { return false };
	document.getElementById(pElementId +"-minus").onmousedown = function() { minimizeSliderElement(pElementId) };
	document.getElementById(pElementId +"-plus").onmousedown = function() { maximizeSliderElement(pElementId) };
	if ( document.getElementById(pFormName + ":" + pElementId +"-input").value == null ){
		document.getElementById(pFormName + ":" + pElementId +"-input").value = pMinValue;
	}
	formName = pFormName;
	setSliderByInput( pElementId, pValueElementId, pMinValue, pMaxValue, pFormName );
	}
}


function createSliderData(pElementId, pMinValue, pMaxValue, pStep, pValueElementId, pFormName)
{
	this.elementId = pElementId;
	this.minValue = pMinValue;
	this.maxValue = pMaxValue;
	this.step = pStep;
	this.valueelementId = pValueElementId;
	this.formName = pFormName;
}

function getMouseXY(e)
{
	if (navigator.appName == "Netscape") {
		tempX = e.pageX;
		tempY = e.pageY;
	} else {
		tempX = window.event.clientX + window.document.body.scrollLeft;
		tempY = window.event.clientY + window.document.body.scrollTop;
	}

	if (tempX <= 0) tempX = 0;
	if (tempY <= 0) tempY = 0;

	posX = tempX;
	posY = tempY;

	// we need to move the slider
	if (adjuststate == 1) {
		var oCurrentSliderElement = document.getElementById(sCurrentSliderId +"-element");
		var oCurrentSliderBarfill = document.getElementById(sCurrentSliderId +"-barfill");
		var oCurrentSliderInput = document.getElementById(formName + ":" + sCurrentSliderId +"-input");

		leftPos = parseFloat(oCurrentSliderElement.style.left);
		// having moved we have the captured frozen point.
		lastXPosition = tempA;
		tempA = posX;
		// work out the mouse in relation to the leftpos
		iMouseOffset = lastXPosition - leftPos;
		offsetPosX = posX - iMouseOffset;

		if (offsetPosX < rangeMin) offsetPosX = rangeMin;
		if (offsetPosX > rangeMax) offsetPosX = rangeMax;

		changeSliderElementPosition(sCurrentSliderId, offsetPosX, true);
	}
	return true;
}

function captureStart(sSliderId, iMinValue, iMaxValue)
{
	sCurrentSliderId = sSliderId;
	iCurrentSliderMinValue = iMinValue;
	iCurrentSliderMaxValue = iMaxValue;

	rangeMin = 0;
	rangeMax = sliderWidth-sliderElementWidth;
	adjuststate = 1;

	//gives me frozen point on X axis
	tempA = posX;
}

function captureStop()
{
	adjuststate = 0;
}

function moveSliderElement(sSliderId)
{
	var iSliderLeftPos = parseInt(getPos(sSliderId+"-bar").left);
	var iHalfSilderElement = Math.round(sliderElementWidth/2);
	var iSliderElementLeftPos = parseInt(getPos(sSliderId+"-element").left);

	//balance browser differences
	if (oBrowser.isIE) {
		iSliderLeftPos += 3;
		iSliderElementLeftPos += 2;
	}

	var iSliderRightPos = iSliderLeftPos+sliderWidth;

	if ( tempX < (iSliderLeftPos + iHalfSilderElement) ) {
		offsetPosX = 0;
	}
	if ( tempX == (iSliderLeftPos + iHalfSilderElement) ) {
		offsetPosX = 1;
	}
	if ( tempX > (iSliderLeftPos + iHalfSilderElement) && tempX != (iSliderElementLeftPos + iHalfSilderElement)) {
		offsetPosX = tempX - iSliderLeftPos - iHalfSilderElement;
	}
	if ( tempX == (iSliderRightPos - iHalfSilderElement) ) {
		offsetPosX = sliderWidth - sliderElementWidth-1;
	}
	if ( tempX > (iSliderRightPos - iHalfSilderElement) ){
		offsetPosX = sliderWidth - sliderElementWidth;
	}
	changeSliderElementPosition(sSliderId, offsetPosX, true);
}

function setSliderByInput( pElementId, pValueElementId, pMinValue, pMaxValue, pFormName)
{
	var value = document.getElementById(pFormName + ":" + pValueElementId).value;
	document.getElementById(pFormName + ":" + pValueElementId).value = formatValue(value);
	value = parseFormatedValue(value);


	if( parseFloat(value) > parseFloat(pMaxValue) ){
		value = pMaxValue;
	}
	else if( parseFloat(value) < parseFloat(pMinValue) ){
		value = pMinValue;
	}
	var position = ((value - pMinValue) / (pMaxValue - pMinValue) ) * (sliderWidth-sliderElementWidth);
	changeSliderElementPosition(pElementId, position, false);
}

function minimizeSliderElement(sSliderId)
{
	var data = sliderData[sSliderId];
	var value = document.getElementById(data.formName + ":" + data.valueelementId).value;
	value = parseFormatedValue(value);

	if ( (parseInt(value)-parseInt(data.step)) > data.minValue && (parseInt(value)-parseInt(data.step)) < data.maxValue) {
		var newvalue = parseInt(value)-parseInt(data.step);
	} else {
		newvalue = data.minValue;
	}
	document.getElementById(data.formName + ":" + data.valueelementId).value = formatValue(newvalue);
	var position = ((newvalue-data.minValue) / (data.maxValue-data.minValue)) * (sliderWidth-sliderElementWidth);
	changeSliderElementPosition(sSliderId, position, true);
}

function maximizeSliderElement(sSliderId)
{
	var data = sliderData[sSliderId];
	var value = document.getElementById(data.formName + ":" + data.valueelementId).value;
	value = parseFormatedValue(value);

	if ( (parseInt(value)+parseInt(data.step)) > data.minValue && (parseInt(value)+parseInt(data.step)) < data.maxValue ) {
		var newvalue = parseInt(value)+parseInt(data.step);
	} else {
		newvalue = data.maxValue;
	}
	document.getElementById(data.formName + ":" + data.valueelementId).value = formatValue(newvalue);
	var position = ((newvalue-data.minValue) / (data.maxValue-data.minValue)) * (sliderWidth-sliderElementWidth);
	changeSliderElementPosition(sSliderId, position, true);

}

/**
* Setzt den Slider und - falls gefordert - das Eingabefeld.
* @param sSliderId - z.B.: "slider-alter"
* @param iOffsetPosX - z.B.: 24
* @param updateInput - true/false Schalter zum Setzen des Eingabefelds
*/
function changeSliderElementPosition(sSliderId, iOffsetPosX, updateInput )
{
	var data = sliderData[sSliderId];

	document.getElementById(sSliderId+'-element').style.left = iOffsetPosX + "px";
	document.getElementById(sSliderId+'-barfill').style.width = iOffsetPosX + "px";
	if(updateInput) {
		neuerWert = computeDisplayValue(sSliderId, iOffsetPosX);
		alterWert = document.getElementById(formName + ":" +sSliderId+'-input').value;
		step = data.step;

		neuerWert = Math.round( neuerWert/step ) * step;
		document.getElementById(formName + ":" +sSliderId+'-input').value = neuerWert;
	}
}

function computeDisplayValue(sSliderId, leftPos)
{
	var data = sliderData[sSliderId];
	var value = Math.round(leftPos / (sliderWidth-sliderElementWidth) * (data.maxValue - data.minValue) + data.minValue);
	return value;
}

function getPos(id)
{
	var obj = document.getElementById(id);
	var pos = {left:0, top:0};

	if(typeof obj.offsetLeft != 'undefined') {

		while (obj) {
			pos.left += obj.offsetLeft;
			pos.top += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else {
		pos.left = obj.left;
		pos.top = obj.top;
	}

	return pos;
}

function resetSlider( pElementId, pValueElementId, pMinValue, pMaxValue, pFormName )
{
	var value = pMinValue;
	document.getElementById(pFormName + ":" + pElementId +"-input").value = 0;
	var position = ((value - pMinValue) / (pMaxValue - pMinValue) ) * (sliderWidth-sliderElementWidth);
	changeSliderElementPosition(pElementId, position, false);
}

/* Setzt den 1000er Punkt */
function formatValue( unformatedValue )
{
	var formatedValue = unformatedValue.toString();
	if( formatedValue.length > 3 && formatedValue.indexOf(".") == -1 ){
		formatedValue = formatedValue.substr(0, formatedValue.length - 3) + "." + formatedValue.substring(formatedValue.length - 3);
	}
	return formatedValue;
}

/* Entfernt den Tausenderpunkt wieder */
function parseFormatedValue( formatedValue )
{
	var unformatedValue = formatedValue;
	pointPos = formatedValue.indexOf(".");
	if(pointPos != -1){
		unformatedValue = formatedValue.substring(0,pointPos) + formatedValue.substring(pointPos + 1);
	}
	return parseInt(unformatedValue);
}


if (window.attachEvent) {
	window.attachEvent("onmouseup", captureStop);//IE compatible
	document.attachEvent("onmouseup", captureStop);
} else if(window.addEventListener) {
	window.addEventListener("mouseup", captureStop, false);//Gecko compatible
}

