/* 
Modifiziert von Markus Hanses
date: 27.04.07
*/
function slider (a_init, a_tpl) {
	this.active = 'true';
	this.sliderListener='';
	this.oldValue='';
	this.newValue='';
	this.f_setValue  = f_sliderSetValue;
	this.f_getPos    = f_sliderGetPos;
	this.setSliderListener = setSliderListener;
	this.notifySliderListener = notifySliderListener;
	this.getInput = getInput;
	this.setSliderInactive = setSliderInactive;
	this.setSliderActive = setSliderActive;
	this.resetSlider = resetSlider;
	this.unsetSlider = unsetSlider;
	// register in the global collection	
	if (!window.A_SLIDERS)
		window.A_SLIDERS = [];
	this.n_id = window.A_SLIDERS.length;
	window.A_SLIDERS[this.n_id] = this;

	// save config parameters in the slider object
	var s_key;
	if (a_tpl)
		for (s_key in a_tpl)
			this[s_key] = a_tpl[s_key];
	for (s_key in a_init)
		this[s_key] = a_init[s_key];

	this.n_maxValue = parseInt(this.n_maxValue);
	this.n_minValue = parseInt(this.n_minValue);
	var divisor = (this.n_maxValue - this.n_minValue);
	this.n_pix2value = this.n_pathLength / (this.n_maxValue - this.n_minValue);
	if (this.n_value == null)
		this.n_value = this.n_minValue;

	// Absolute Werte fuer den Reset
	this.firstMaxValue = this.n_maxValue;
	this.firstMinValue = this.n_minValue;
	
	// generate the control's HTML
	document.write(
		'<div style="width:' + this.n_controlWidth + 
    'px;height:' + this.n_controlHeight + 'px;border:0; background-image:url(' + 
    this.s_imgControl + ')" id="sl' + this.n_id + 'base">' +
		
    '<img src="' + this.s_imgSlider + '" width="' + 
    this.n_sliderWidth + '" height="' + this.n_sliderHeight + 
    '" border="0" style="position:relative;left:' + 
    this.n_pathLeft + 'px;top:' + this.n_pathTop + 
    'px;z-index:' + this.n_zIndex + 
    ';cursor:hand;visibility:hidden;" name="sl' + 
    this.n_id + 'slider" id="sl' + this.n_id + 
    'slider" onmousedown="return f_sliderMouseDown(' + this.n_id + ')"/></div>'
	);
	this.e_base   = get_element('sl' + this.n_id + 'base');
	this.e_slider = get_element('sl' + this.n_id + 'slider');
	
	// safely hook document/window events
	if (document.onmousemove != f_sliderMouseMove) {
		window.f_savedMouseMove = document.onmousemove;
		document.onmousemove = f_sliderMouseMove;
		//alert("Slider onmousemove="+document.onmousemove);
	}
	if (document.onmouseup != f_sliderMouseUp) {
		window.f_savedMouseUp = document.onmouseup;
		document.onmouseup = f_sliderMouseUp;
	}
	// preset to the value in the input box if available
	var e_input = this.s_form == null
		? get_element(this.s_name)
		: document.forms[this.s_form]
			? document.forms[this.s_form].elements[this.s_name]
			: null;
	this.f_setValue(e_input && e_input.value != '' ? e_input.value : null, 1);
	this.e_slider.style.visibility = 'visible';
}

function f_sliderSetValue (n_value, b_noInputCheck) {
	if (n_value == null)
		n_value = this.n_value == null ? this.n_minValue : this.n_value;
	if (isNaN(n_value))
		return false;
	// round to closest multiple if step is specified
	if (this.n_step)
		n_value = Math.round((n_value - this.n_minValue) / this.n_step) * this.n_step + this.n_minValue;
	// smooth out the result
	if (n_value % 1)
		n_value = Math.round(n_value * 1e5) / 1e5;

	if (n_value < this.n_minValue)
		n_value = this.n_minValue;
	if (n_value > this.n_maxValue)
		n_value = this.n_maxValue;

	this.n_value = n_value;
	// move the slider
	if (this.b_vertical)
		this.e_slider.style.top  = (this.n_pathTop + this.n_pathLength - Math.round((n_value - this.n_minValue) * this.n_pix2value)) + 'px';
	else		
		this.e_slider.style.left = (this.n_pathLeft + Math.round((n_value - this.n_minValue) * this.n_pix2value)) + 'px';

	// save new value
	var e_input;
	if (this.s_form == null) {
		e_input = get_element(this.s_name);
		if (!e_input)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with ID='" + this.s_name + "'.");
	}
	else {
		var e_form = document.forms[this.s_form];
		if (!e_form)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the form with NAME='" + this.s_form + "'.");
		e_input = e_form.elements[this.s_name];
		if (!e_input)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with NAME='" + this.s_name + "'.");
	}
	
	this.oldValue = e_input.value;
	this.newValue = n_value;
	var theSliderEvent = new SliderEvent(this.oldValue, this.newValue, this);
	e_input.value = this.newValue;
}

function getInput()
{
  var e_input;
	if (this.s_form == null) {
		e_input = get_element(this.s_name);
		if (!e_input)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with ID='" + this.s_name + "'.");
	}
	else {
		var e_form = document.forms[this.s_form];
		if (!e_form)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the form with NAME='" + this.s_form + "'.");
		e_input = e_form.elements[this.s_name];
		if (!e_input)
			return b_noInputCheck ? null : f_sliderError(this.n_id, "Can not find the input with NAME='" + this.s_name + "'.");
	}
  return e_input;
}

function notifySliderListener(aSliderEvent)
{
  if(this.sliderListener != null)
  {
    this.sliderListener.sliderPosChanged(aSliderEvent);
  }
  else
  { 
    //alert("No SliderListener set. old:"+this.oldValue+" new:"+this.newValue);
    //theInput.value = this.newValue;
    //this.sliderListener.sliderPosChanged(aSliderEvent);
  }
}

// get absolute position of the element in the document
function f_sliderGetPos (b_vertical, b_base) {
	var n_pos = 0,
		s_coord = (b_vertical ? 'Top' : 'Left');
	var o_elem = o_elem2 = b_base ? this.e_base : this.e_slider;
	
	while (o_elem) {
		n_pos += o_elem["offset" + s_coord];
		o_elem = o_elem.offsetParent;
	}
	o_elem = o_elem2;

	var n_offset;
	while (o_elem.tagName != "BODY") {
		n_offset = o_elem["scroll" + s_coord];
		if (n_offset)
			n_pos -= o_elem["scroll" + s_coord];
		o_elem = o_elem.parentNode;
	}
	return n_pos;
}

function f_sliderMouseDown (n_id) {
	var o_slider = window.A_SLIDERS[n_id];
	window.n_activeSliderId = o_slider != null && o_slider.active == 'true' 
		? n_id : null;
	return false;
}

function f_sliderMouseUp (e_event, b_watching) {
  
	if (window.n_activeSliderId != null) {
		var o_slider = window.A_SLIDERS[window.n_activeSliderId];
		var theSliderEvent = null;
		if (o_slider.isSlider4Time) 
		{			
			o_slider.f_setValue(o_slider.n_minValue + (o_slider.b_vertical
				? (o_slider.n_pathLength - parseInt(o_slider.e_sliderStart.style.top) + o_slider.n_pathTop)
				: (parseInt(o_slider.e_sliderStart.style.left) - o_slider.n_pathLeft)) / o_slider.n_pix2value,
				(o_slider.b_vertical
				? (o_slider.n_pathLength - parseInt(o_slider.e_sliderEnd.style.top) + o_slider.n_pathTop)
				: (parseInt(o_slider.e_sliderEnd.style.left) - o_slider.n_pathLeft)) / o_slider.n_pix2value);
				
			theSliderEvent = new SliderEvent4Time(
									o_slider.oldStartValue, 
									o_slider.newStartValue, 
									o_slider.oldEndValue, 
									o_slider.newEndValue,										
									o_slider);								
		} else {		
			o_slider.f_setValue(o_slider.n_minValue + (o_slider.b_vertical
				? (o_slider.n_pathLength - parseInt(o_slider.e_slider.style.top) + o_slider.n_pathTop)
				: (parseInt(o_slider.e_slider.style.left) - o_slider.n_pathLeft)) / o_slider.n_pix2value);
		
    		theSliderEvent = new SliderEvent(o_slider.oldValue, o_slider.newValue, o_slider);
    	}
		
    	if(!e_event || e_event==null) 
		{
	      	if (window.ActiveXObject)
	      	{
	        	o_slider.notifySliderListener(theSliderEvent);
	      	} else
	        	alert("Mouse event registered: "+e_event);
	    } else if (e_event.type == 'mouseup') {
			o_slider.notifySliderListener(theSliderEvent);
		}
		
		if (b_watching)	return;
		window.n_activeSliderId = null;
	}
	if (window.f_savedMouseUp)
		return window.f_savedMouseUp(e_event);
}

function f_sliderMouseMove (e_event) {

	if (!e_event && window.event) e_event = window.event;

	// save mouse coordinates
	if (e_event) {
		window.n_mouseX = e_event.clientX + f_scrollLeft();
		window.n_mouseY = e_event.clientY + f_scrollTop();
	}

	// check if in drag mode
	if (window.n_activeSliderId != null) {
		var o_slider = window.A_SLIDERS[window.n_activeSliderId];	
		var n_pxOffset;	
		if (o_slider.isSlider4Time) 
		{
			if (o_slider.b_vertical) {
				// nicht implementiert
				alert("Not implemented");
			} else {
				var n_sliderLeft = window.n_mouseX - o_slider.n_sliderWidth / 2 - o_slider.f_getPos(0, 1);
				// limit the slider movement
				if (n_sliderLeft < o_slider.n_pathLeft)
					n_sliderLeft = o_slider.n_pathLeft;
				var n_pxMax = o_slider.n_pathLeft + o_slider.n_pathLength;
				if (n_sliderLeft > n_pxMax)
					n_sliderLeft = n_pxMax;
					
				var diff2Start = parseInt(o_slider.e_sliderStart.style.left) - n_sliderLeft;
				var diff2End = parseInt(o_slider.e_sliderEnd.style.left) - n_sliderLeft;
				diff2Start = Math.abs(diff2Start);
				diff2End = Math.abs(diff2End);
				if(diff2Start < diff2End)
				{
					var distanceOK = o_slider.checkDistance4Time(
									(parseInt(n_sliderLeft) - o_slider.n_pathLeft) / o_slider.n_pix2value,
									(parseInt(o_slider.e_sliderEnd.style.left) - o_slider.n_pathLeft) / o_slider.n_pix2value);
									
					if (distanceOK)				
						o_slider.e_sliderStart.style.left = n_sliderLeft + 'px';
						
				} else {
					var distanceOK = o_slider.checkDistance4Time(
									(parseInt(o_slider.e_sliderStart.style.left) - o_slider.n_pathLeft) / o_slider.n_pix2value,
									(parseInt(n_sliderLeft) - o_slider.n_pathLeft) / o_slider.n_pix2value);
									
					if (distanceOK)	
						o_slider.e_sliderEnd.style.left = n_sliderLeft + 'px';
				}
					
				n_pxOffset = n_sliderLeft - o_slider.n_pathLeft;
			}
		} else {
			if (o_slider.b_vertical) {
				var n_sliderTop = window.n_mouseY - o_slider.n_sliderHeight / 2 - o_slider.f_getPos(1, 1) - 3;
				// limit the slider movement
				if (n_sliderTop < o_slider.n_pathTop)
					n_sliderTop = o_slider.n_pathTop;
				var n_pxMax = o_slider.n_pathTop + o_slider.n_pathLength;
				if (n_sliderTop > n_pxMax)
					n_sliderTop = n_pxMax;
				o_slider.e_slider.style.top = n_sliderTop + 'px';
				n_pxOffset = o_slider.n_pathLength - n_sliderTop + o_slider.n_pathTop;
			} else {
				var n_sliderLeft = window.n_mouseX - o_slider.n_sliderWidth / 2 - o_slider.f_getPos(0, 1) - 3;
				// limit the slider movement
				if (n_sliderLeft < o_slider.n_pathLeft)
					n_sliderLeft = o_slider.n_pathLeft;
				var n_pxMax = o_slider.n_pathLeft + o_slider.n_pathLength;
				if (n_sliderLeft > n_pxMax)
					n_sliderLeft = n_pxMax;
				o_slider.e_slider.style.left = n_sliderLeft + 'px';
				n_pxOffset = n_sliderLeft - o_slider.n_pathLeft;
			}									
		}					
		if (o_slider.b_watch)
			 f_sliderMouseUp(e_event, 1);

		return false;
	}
	
	if (window.f_savedMouseMove)
		return window.f_savedMouseMove(e_event);
}

// get the scroller positions of the page
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function f_sliderError (n_id, s_message) {
	alert("Slider #" + n_id + " Error:\n" + s_message);
	window.n_activeSliderId = null;
}


function setSliderListener(aSliderListener)
{
  this.sliderListener = aSliderListener;
}

function SliderEvent (aOldValue, aNewValue, aSlider)
{
  this.oldValue= aSlider;
  this.newValue= aNewValue;
  this.slider = aSlider;
  this.getSlider = getSlider;
}
 
function getSlider()
{
  return this.slider;
}
/**
 * Setzt den Regler auf den inaktiven Zustand.
 * @author Markus Hanses
 */
function setSliderInactive()
{
		this.e_base.src = this.s_imgControl_inactive;
		this.e_slider.src = this.s_imgSlider_inactive;
		var inputElement = this.s_form == null
		? get_element(this.s_name)
		: document.forms[this.s_form]
			? document.forms[this.s_form].elements[this.s_name]
			: null;
		inputElement.style.color='#aaaaaa';
		this.active = 'false';		
}
/**
 * Setzt den Regler auf den aktiven Zustand.
 * @author Markus Hanses
 */
function setSliderActive()
{
		this.e_base.src = this.s_imgControl;
		this.e_slider.src = this.s_imgSlider;
		var inputElement = this.s_form == null
		? get_element(this.s_name)
		: document.forms[this.s_form]
			? document.forms[this.s_form].elements[this.s_name]
			: null;
		inputElement.style.color='#000000';
		this.active = 'true';
}
/**
 * Setzt die Werte auf die Uhrsprugswerte zurueck.
 * @author Markus Hanses
 */
function resetSlider()
{
		this.n_minValue = this.firstMinValue;	
		this.n_maxValue = this.firstMaxValue;
		this.n_pix2value = this.n_pathLength / (this.n_maxValue - this.n_minValue);
		this.f_setValue(this.firstMaxValue, 1);
}
/**
 * Setzt den Regler auf den Maximalwert.
 * @author Markus Hanses
 */
function unsetSlider()
{		
		this.f_setValue(this.n_maxValue, 1);
}

get_element = document.all ?
	function (s_id) { return document.all[s_id] } :
	function (s_id) { return document.getElementById(s_id) };

