function SliderManager() { }

SliderManager.Sliders = new Array ();

SliderManager.AddSlider = function($slider) {
	SliderManager.Sliders.push($slider);
}

SliderManager.InitSliders = function() {
	var $init_string = new Array ();
	var $slider_controls = SliderManager.raiseEvent('RegisterSlider');

	var $i = 0;
	while ($i < $slider_controls.length) {
		var $j = 0;
		while ($j < $slider_controls[$i].length) {
			$init_string.push($slider_controls[$i][$j]);
			$j++;
		}
		$i++;
	}

	eval('SET_DHTML("' + $init_string.join('", "') + '");');
	SliderManager.raiseEvent('InitSlider');
}


SliderManager.raiseEvent = function($event_name, $slider_id) {
	var $result = new Array ();

	for (var $i = 0; $i < SliderManager.Sliders.length; $i++) {

		if (isset($slider_id) && SliderManager.Sliders[$i].Field != $slider_id) {
			continue;
		}

		$result.push( SliderManager.Sliders[$i].processEvent($event_name, false) );
	}

	return $result;
}

function Slider($field, $type, $formatting_callback, $change_callback, $type_params, $range_classes) {
	this.Field = $field;
	this.Type = $type;
	this.FormattingCallback = $formatting_callback;
	this.ChangeCallback = $change_callback;

	// related to range slider
	switch (this.Type) {
		case 'range':
			var $display_range = $type_params.split('-');
			this.DisplayMinRange = parseFloat($display_range[0]);
			this.DisplayMaxRange = parseFloat($display_range[1]);
			this.ControlRangeLength = 0;
			break;

		case 'magnetic':
			this.MagneticRange = $type_params;
			$range_classes = $range_classes.split(':');
			this.InsideRangeClass = $range_classes[0];
			this.OutsideRangeClass = $range_classes[1];
			break;
	}

}

Slider.prototype.Init = function() {
//	SET_DHTML(this.Field+'_min' + MAXOFFLEFT+0+HORIZONTAL, this.Field+'_max' + MAXOFFRIGHT+0+HORIZONTAL, this.Field+'_range'+NO_DRAG, this.Field+NO_DRAG);

	dd.elements[this.Field+'_min'].hide(true);
	dd.elements[this.Field+'_max'].hide(true);

	var $min_pos = dd.elements[this.Field].x;
	var $max_pos = dd.elements[this.Field].x + dd.elements[this.Field].w - dd.elements[this.Field+'_max'].w;

	dd.elements[this.Field+'_min'].moveTo($min_pos, dd.elements[this.Field].y - 1); // -1 (slider has larger height, then scroller)
	dd.elements[this.Field+'_max'].moveTo($max_pos, dd.elements[this.Field].y - 1); // -1 (slider has larger height, then scroller)

	dd.elements[this.Field+'_range'].resizeTo(dd.elements[this.Field].w - 10, dd.elements[this.Field].h); // 10 = 5*2 (diff from each slider)
	dd.elements[this.Field+'_range'].moveTo(dd.elements[this.Field].x + 5, dd.elements[this.Field].y);

	this.processEvent('my_DropFunc', true);

	dd.elements[this.Field].addChild(this.Field + '_min');
	dd.elements[this.Field].addChild(this.Field + '_max');

	dd.elements[this.Field+'_min'].show();
	dd.elements[this.Field+'_max'].show();

	this.InitType();
}

Slider.prototype.InitType = function() {
	if (this.Type == 'range') {
		this.ControlRangeLength = dd.elements[this.Field].w;
	}

	this.displayRange(true);
}

Slider.prototype.Round = function($number, $round) {
	if (!isset($round)) {
		$round = 2;
	}

	return $round > 0 ? Math.round($number * Math.pow(10, $round)) / Math.pow(10, $round) : Math.round($number);
}

Slider.prototype.ConvertToRange = function($number, $range_type) {
	var $k = this.ControlRangeLength / (this.DisplayMaxRange - this.DisplayMinRange);
	var $diff = this.DisplayMinRange;

	return this.FormattingCallback(this, ($number / $k) + $diff);
}

Slider.prototype.getRange = function($convert_range) {
	var $range = {
		'min': dd.elements[this.Field+'_min'].x - dd.elements[this.Field].x,
		'max': dd.elements[this.Field+'_max'].x - dd.elements[this.Field].x + dd.elements[this.Field+'_max'].w
	}


	if (!isset($convert_range) || $convert_range == true) {
		$range.min = this.ConvertToRange($range.min, 'min');
		$range.max = this.ConvertToRange($range.max, 'max');
	}
	
	return $range;
}

Slider.prototype.displayRange = function ($range_init) {
	if (!isset($range_init)) {
		$range_init = false;
	}

	var $range = this.getRange(false);

	switch (this.Type) {
		case 'range':
			var $display_range = this.getRange();
			var display_range1 = this.getRange();
			this.getControl('range_value').innerHTML = $display_range.min + ' - ' + $display_range.max;
	var q=$display_range.min;
		var r=$display_range.max;	
			if ($range.max - $range.min > this.getControl('range_value').offsetWidth) {
				dd.elements[this.Field+'_range_info'].resizeTo($range.max - $range.min, dd.elements[this.Field+'_range_info'].h);
				dd.elements[this.Field+'_range_info'].moveTo(dd.elements[this.Field+'_min'].x, dd.elements[this.Field].y + dd.elements[this.Field].h + 5);
			}
			var v=this.Field;
			
			searchs(v,q,r);

			break;




		case 'magnetic':
			if ($range_init) {
				dd.elements[this.Field+'_range_info'].resizeTo($range.max - $range.min, dd.elements[this.Field+'_range_info'].h);
				dd.elements[this.Field+'_range_info'].moveTo(dd.elements[this.Field+'_min'].x, dd.elements[this.Field].y + dd.elements[this.Field].h + 5);
			}
	var q=$range.min;
		var r=$range.max;
		
			for (var $i = 0; $i < this.MagneticRange.length; $i++) {
				var $magnet = this.getControl('magnet_' + this.MagneticRange[$i]);
				if (this.MagneticRange[$i] >= $range.min && this.MagneticRange[$i] <= $range.max) {
					$magnet.className = this.InsideRangeClass;
				}
				else {
					$magnet.className = this.OutsideRangeClass;
				}
			}
			var v=this.Field;
searchs(v,q,r);
			break;
	}
}

Slider.prototype.getControl = function($name) {
	return document.getElementById(this.Field + '_' + $name);
}

Slider.prototype.getCloserMagnet = function($slider_pos, $left_magnet, $right_magnet) {
	var $middle_magnet = $left_magnet + ($right_magnet - $left_magnet) / 2;
	if ($slider_pos >= $left_magnet && $slider_pos < $middle_magnet) {
		return $left_magnet;
					

	}
	else if ($slider_pos >= $middle_magnet && $slider_pos < $right_magnet) {
		return $right_magnet;
	}

	return false;
}

Slider.prototype.processEvent = function($event_name, $init) {
	switch ($event_name) {
		case 'my_DropFunc':
			this.ChangeCallback();
			// set new range
			if (this.Type == 'magnetic' && !$init) {
				// jump to neareset slider
				var $range = this.getRange(false);

				for (var $i = 0; $i < this.MagneticRange.length - 1; $i++) {
					var $left_magnet = this.MagneticRange[$i];
					var $right_magnet = this.MagneticRange[$i + 1];

					switch (dd.obj.name) {
						case this.Field+'_min':
							var $closer_magnet = this.getCloserMagnet($range.min, $left_magnet, $right_magnet);
							if ($closer_magnet !== false) {
								if ($closer_magnet == $range.max) {
									// if user tries to move both sliders at same magnet
									$closer_magnet = $left_magnet;
								}
								dd.obj.moveTo(dd.elements[this.Field].x + $closer_magnet, dd.obj.y);

//								dd.elements[this.Field+'_max'].maxoffl -= (this.MagneticRange[$i + 2] - $right_magnet) - dd.elements[this.Field+'_max'].w;
							}
							break;

						case this.Field+'_max':
							var $closer_magnet = this.getCloserMagnet($range.max, $left_magnet, $right_magnet);
							if ($closer_magnet !== false) {
								if ($closer_magnet == $range.min) {
									// if user tries to move both sliders at same magnet
									$closer_magnet = $right_magnet;
								}
								dd.obj.moveTo(dd.elements[this.Field].x + $closer_magnet - dd.obj.w, dd.obj.y);

//								dd.elements[this.Field+'_min'].maxoffr -= (this.MagneticRange[$i + 1] - $left_magnet);
							}
							break;
					}
				}

				this.processEvent('my_DragFunc', false);
			}

			dd.elements[this.Field+'_min'].maxoffr = dd.elements[this.Field+'_max'].x - dd.elements[this.Field].x - dd.elements[this.Field+'_max'].w;
			dd.elements[this.Field+'_max'].maxoffl = dd.elements[this.Field].w - (dd.elements[this.Field+'_min'].x - dd.elements[this.Field].x) - dd.elements[this.Field+'_min'].w - dd.elements[this.Field+'_max'].w;
			break;

		case 'my_DragFunc':
			// highlight range
			dd.elements[this.Field+'_range'].resizeTo(dd.elements[this.Field+'_max'].x - dd.elements[this.Field+'_min'].x + dd.elements[this.Field+'_max'].w - 10, dd.elements[this.Field+'_range'].h);
			dd.elements[this.Field+'_range'].moveTo(dd.elements[this.Field+'_min'].x + 5, dd.elements[this.Field+'_range'].y);

			this.displayRange();
			break;

		case 'RegisterSlider':
			var $controls = new Array (
				this.Field+'_min' + MAXOFFLEFT+0+HORIZONTAL,
				this.Field+'_max' + MAXOFFRIGHT+0+HORIZONTAL,
				this.Field+'_range'+NO_DRAG,
				this.Field+'_range_info'+NO_DRAG,
				this.Field+NO_DRAG
			);

			return $controls;
			break;

		case 'InitSlider':
			this.Init();
			break;
	}

	return '';
}

function my_DropFunc() {
	SliderManager.raiseEvent('my_DropFunc', dd.obj.parent.name);
}

function my_DragFunc() {
	SliderManager.raiseEvent('my_DragFunc', dd.obj.parent.name);
}