var Caps = window.Caps || {};

Caps.Widgets= {
	rangeSliders: function(options) {
		var minHandle = $(options.minHandle) || $('minHandle');
		var maxHandle = $(options.maxHandle) || $('maxHandle');
		var minMeter = $(options.minMeter) || $('minMeter');
		var maxMeter = $(options.maxMeter) || $('maxMeter');
		var minPostback = $(options.minPostback) || $('minPostback');
		var maxPostback = $(options.maxPostback) || $('maxPostback');
		var track = $(options.track) || $('track');
		var minValue = options.minValue || 0;
		var maxValue = options.maxValue || 100;
		var defaultMinValue = options.defaultMinValue || minValue.toFixed(0);
		var defaultMaxValue = options.defaultMaxValue || maxValue.toFixed(0);
		var offset = options.offset || 0;
		var callback = options.callback || function() { return }
		var indicateMinOutlier = options.indicateMinOutlier || false;
		var indicateMaxOutlier = options.indicateMaxOutlier || false;
		var indicateMB = options.indicateMB || false;
		var indicateLowToHigh = options.indicateLowToHigh || false;

		var minHandle1 = new Control.Slider(minHandle, track, {
			range: $R(minValue, maxValue),
			onSlide: function(e) {
				if (minHandle.style.left.slice(0, -2) < maxHandle.style.left.slice(0, -2) - offset)
				{
					//If we are displaying Millions and Billions 
					if (indicateMB)
					{
							IndicateMB(e.toFixed(0),minMeter);
					}
					else if (indicateLowToHigh)
					{
							IndicateLowToHigh(e,minMeter);
					}
					else
					{
							minMeter.innerHTML = e.toFixed(0);
					}
					
					minPostback.value = e.toFixed(0);
					
					//If we are indicating outlying min values
					if ((indicateMinOutlier) && (minValue == e.toFixed(0)))
							IndicateMinOutlier(minMeter);
				}
				else {
					minHandle.style.left = maxHandle.style.left.slice(0, -2) - offset + 'px';
					}
				},
			onChange: callback
			});
		var maxHandle1 = new Control.Slider(maxHandle, track, {
			range: $R(minValue, maxValue),
			sliderValue: maxValue,
			onSlide: function(e) {
				if (minHandle.style.left.slice(0, -2) < maxHandle.style.left.slice(0, -2) - offset) {
					
					//If we are displaying Millions and Billions 
					if (indicateMB)
					{
							IndicateMB(e.toFixed(0),maxMeter);
					}
					else if(indicateLowToHigh)
					{
							IndicateLowToHigh(e,maxMeter);
					}
					else
					{
							maxMeter.innerHTML = e.toFixed(0);
					}
					
					maxPostback.value = e.toFixed(0);
					
					//If we are indicating outlying min values
					if ((indicateMaxOutlier) && (maxValue == e.toFixed(0)))
							IndicateMaxOutlier(maxMeter);
				}
				else {
					maxHandle.style.left = minHandle.style.left.slice(0, -2) - 0 + offset + 'px';
					}
				},
			onChange: callback
			});
			
		//indicate 'M' and 'B' in the display values
		if (indicateMB)
		{
			IndicateMB(defaultMinValue,minMeter);
			IndicateMB(defaultMaxValue,maxMeter);
		}
		//If we are doing a low to high scale
		else if (indicateLowToHigh)
		{
			IndicateLowToHigh(defaultMinValue,minMeter);
			IndicateLowToHigh(defaultMaxValue,maxMeter);
		}	
		else
		{
			minMeter.innerHTML = defaultMinValue;
			maxMeter.innerHTML = defaultMaxValue;
		}
		
		//If we are indicating outlying min values
		if ((indicateMinOutlier) && (minValue == defaultMinValue))
		{
			IndicateMinOutlier(minMeter);
		}
			
		//If we are indicating outlying min values
		if ((indicateMaxOutlier) && (maxValue == defaultMaxValue))
		{
			IndicateMaxOutlier(maxMeter);
		}
			
							
		minPostback.value = defaultMinValue;
		maxPostback.value = defaultMaxValue;
		minHandle1.setValue(defaultMinValue);
		maxHandle1.setValue(defaultMaxValue);	
		
		Event.stopObserving(minHandle1.track, "mousedown", minHandle1.eventMouseDown);
		Event.stopObserving(maxHandle1.track, "mousedown", maxHandle1.eventMouseDown);
		}
};

function IndicateMinOutlier(control)
{
	control.innerHTML = '< ' + control.innerHTML;
	return;
}
function IndicateMaxOutlier(control)
{
	control.innerHTML +=' >';
	return;
}
function IndicateMB(value,control)
{
	var integer = value;
	if (value >= 1000)
	{
		integer /= 1000;
		control.innerHTML = integer.toFixed(1) + ' B';
	}	
	else
	{
		control.innerHTML = integer + ' M';
	}
	return;
}
function IndicateLowToHigh(value,control)
{
	switch (value.toFixed(0))
	{
		case '1':
				control.innerHTML = 'Low';
				break;
		case '2': 
				control.innerHTML = 'Medium Low';
				break;
		case '3':
				control.innerHTML = 'Medium';
				break;
		case '4':
				control.innerHTML = 'Medium High';
				break;
		case '5':
				control.innerHTML = 'High';
				break;
	}
	return;
}