var $ = function (id)
{
	return document.getElementById(id);
}

var mouse = { button:false, x:0, y:0 };

function initModix()
{
	// Node-Objekt-Erweiterung um die Funktion contains()
	// Ist für IsMouseEnter/IsMouseLeave notwendig
	if (window.Node && Node.prototype && !Node.prototype.contains)
	{
		Node.prototype.contains = function (arg)
		{
			return !!(this.compareDocumentPosition(arg) & 16);
		}
	}

	addEvent(document, "mousedown", function(e)
	{
		mouse.button = true;
		if (e.stopPropagation) e.stopPropagation();
		return true;
	});

	addEvent(document, "mouseup",  function(e)
	{
		mouse.button = false;
		if (e.stopPropagation) e.stopPropagation();
		return true;
	});

	addEvent(document, "mousemove", function(e)
	{
		if (window.event)
		{
			mouse.x = window.event.clientX;
			mouse.y = window.event.clientY;
		}
		else
		{
			mouse.x = e.pageX;
			mouse.y = e.pageY;
		}
		if (e.stopPropagation) e.stopPropagation();
		if (e.preventDefault) e.preventDefault();
		return true;
	});
}

addEvent(window, "DOMContentLoaded", function () { removeEvent(window, "load", initModix); initModix(); });
addEvent(window, "load", initModix);

function getAbsPos(elem)
{
	var x = 0, y = 0;
	while (elem != null)
	{
		x += elem.offsetLeft;
		y += elem.offsetTop;
		elem = elem.offsetParent;
	}

	return { "x":x, "y":y };
}

function setOpacity(elem, opacity)
{
	elem.style.opacity = opacity || '1.0';
	elem.style.MozOpacity = opacity || '1.0';
	elem.style.KhtmlOpacity = opacity || '1.0';
	elem.style.filter = (opacity === undefined ? 'none': 'Alpha(style=0, opacity=' + Math.round(opacity * 100) + ')');
}

function setUnselectable(elem)
{
	if (elem == undefined) { return; }
	addEvent(elem, "selectstart", function () { return false; });
	elem.style.MozUserSelect = "none";
	elem.style.KhtmlUserSelect = "none";
	elem.unselectable = "on";
}

function IsMouseEnter(elem, e)
{
	e = e || window.event;
	var target = e.target || e.srcElement;
	var fromElement = e.relatedTarget || e.fromElement || false;

	if (fromElement == false) { return true; }
	if (elem.contains(fromElement) || fromElement == elem)
	{
		return false;
	}
	else
	{
		return true;
	}
}

function IsMouseLeave(elem, e)
{
	e = e || window.event;
	var target = e.target || e.srcElement;
	var toElement = e.relatedTarget || e.toElement || false;

	if (toElement == false) { return true; }
	if (elem.contains(toElement) || toElement == elem)
	{
		return false;
	}
	else
	{
		return true;
	}
}

// John Resigs "Flexible Javascript Events"
// http://ejohn.org/projects/flexible-javascript-events/
function addEvent(obj, type, fn)
{
	if (obj.attachEvent)
	{
		obj['e' + type + fn] = fn;
		obj[type + fn] = function() { obj['e' + type + fn](window.event); }
		obj.attachEvent('on' + type, obj[type + fn]);
	}
	else
	{
		obj.addEventListener(type, fn, false);
	}
}

function removeEvent(obj, type, fn)
{
	if (obj.detachEvent)
	{
		obj.detachEvent('on' + type, obj[type + fn]);
		obj[type + fn] = null;
	}
	else
	{
		obj.removeEventListener(type, fn, false);
	}
}

function getScrollLeft() { return window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft || 0; }
function getScrollTop() { return window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop || 0; }
function getViewportWidth() { return window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth || 0; }
function getViewportHeight() { return window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight || 0; }

function trim(text)
{
	return text.replace(/^(\s|\&nbsp\;)+/, '').replace (/(\s|\&nbsp\;)+$/, '');
}

function setBgXOffset(elem, xOffset)
{
	elem.style.backgroundPosition =  xOffset + 'px ' + /.+\s([-0-9a-zA-Z]+)/.exec(elem.style.backgroundPosition)[1]
}

function setBgYOffset(elem, yOffset)
{
	elem.style.backgroundPosition = /([-0-9a-zA-Z]+)\s.+/.exec(elem.style.backgroundPosition)[1] + ' ' + yOffset + 'px'
}

function setCheckbox(which, inputId)
{
	switch (/.+\s([-0-9a-zA-Z]+)/.exec(which.style.backgroundPosition)[1])
	{
		case '0px':
			$(inputId).value = '1';
			setBgYOffset(which, '-13');
			reloadSearchForm();
			break;
		case '-13px':
			$(inputId).value = '';
			setBgYOffset(which, '0');
			reloadSearchForm();
			break;
	}
}

function setListCheckbox(which)
{
	switch (/.+\s([-0-9a-zA-Z]+)/.exec(which.style.backgroundPosition)[1])
	{
		case '0px':
			setBgYOffset(which, '-13');
			break;
		case '-13px':
			setBgYOffset(which, '0');
			break;
	}
}

function setRadiobox(which, inputName, inputValue, reload)
{
	if (/.+\s([-0-9a-zA-Z]+)/.exec(which.style.backgroundPosition)[1] == '0px')
	{
		$(inputName).value = inputValue;

		divs = document.getElementsByTagName("div");
		for (var i = 0; i < divs.length; i++)
		{
			if (divs[i].className == 'elemRadioBox' && /([-0-9a-zA-Z]+)_.+/.exec(divs[i].id)[1] == inputName)
			{
				if (/.+\s([-0-9a-zA-Z]+)/.exec(divs[i].style.backgroundPosition)[1] == '-13px')
				{
					setBgYOffset(divs[i], '0');
				}
			}
		}

		if (inputName == 'gas')
		{
			if (inputValue == '9')
			{
				var modelName;
				if (document.getElementById('modelSelectText').innerHTML.substr(document.getElementById('modelSelectText').innerHTML.length - 1) == 'h')
				{
					modelName = document.getElementById('modelSelectText').innerHTML.substr(0, document.getElementById('modelSelectText').innerHTML.length - 1);
				}
				else
				{
					modelName = document.getElementById('modelSelectText').innerHTML;
				}

				if (mdxLexusHybridModels[document.getElementById('model').value])
				{
					document.getElementById('modelSelectText').innerHTML = modelName + 'h';
				}
				else
				{
					document.getElementById('modelSelectText').innerHTML = modelName;
				}
			}
			else
			{
				if (document.getElementById('modelSelectText').innerHTML.substr(document.getElementById('modelSelectText').innerHTML.length - 1) == 'h')
				{
					document.getElementById('modelSelectText').innerHTML = document.getElementById('modelSelectText').innerHTML.substr(0, document.getElementById('modelSelectText').innerHTML.length - 1);
				}
				else
				{
					document.getElementById('modelSelectText').innerHTML = document.getElementById('modelSelectText').innerHTML;
				}
			}
		}

		setBgYOffset(which, '-13');
		if (reload == undefined || reload == true) { reloadSearchForm(); }
	}
}

function Slider(_id, _min, _max, _value, _unit, _displayFactor)
{
	if (_value != -1 && _value < _min)
	{
		_value = _min;
	}
	else if (_value > _max)
	{
		_value = _max;
	}

	if (_value == -1)
	{
		var _posX = 213;
		setSliderPos(_posX);
		updateText();
		$(_id).value = '';
	}
	else
	{
		var _posX = 33 + (Math.round(((_value - _min) / (_max - _min)) * 9) * 18);
		setSliderPos(_posX);
		updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 9)) + _min));
		$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 9)) + _min) / _displayFactor);
	}

	addEvent($('slider_' + _id), "mousedown", initDrag);
	addEvent($('slider_' + _id), "mouseup", $('slider_' + _id + '_ctrl').focus);

	setUnselectable($('slider_' + _id));
	setUnselectable($('slider_' + _id + '_ctrl'));

	var dragStart = 0;
	var dragCurrent = 0;

	this.reset = function ()
	{
		_posX = 213;
		setSliderPos(_posX);
		updateText();
		$(_id).value = '';
	}

	function initDrag(e)
	{
		if (window.event)
		{
			var mouseX = window.event.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft) - getAbsPos($('slider_' + _id)).x;
			var mouseY = window.event.clientY + (document.body.scrollTop || document.documentElement.scrollTop) - getAbsPos($('slider_' + _id)).y;
		}
		else
		{
			var mouseX = e.pageX - getAbsPos($('slider_' + _id)).x;
			var mouseY = e.pageY - getAbsPos($('slider_' + _id)).y;
		}

		if (mouseX > _posX && mouseX < _posX + 13 && mouseY > 2 && mouseY < 24)
		{
			dragStart = mouse.x;
			dragCurrent = mouse.x;

			addEvent(document, "mousemove", doDrag);
			return false;
		}
		else if (mouseX < _posX && mouseX >= 33 && _posX > 33)
		{
			_posX = setSliderPos(_posX - 18);
		}
		else if (mouseX > _posX && mouseX <= 220 && _posX < 213)
		{
			_posX = setSliderPos(_posX + 18);
		}

		if (_posX == 213)
		{
			updateText();
			$(_id).value = '';
		}
		else
		{
			updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 9)) + _min));
			$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 9)) + _min) / _displayFactor);
		}

		$('slider_' + _id + '_ctrl').focus();

		reloadSearchForm();

		return false;
	}

	function doDrag(e)
	{
		if (mouse.button == false)
		{
			removeEvent(document, "mousemove", doDrag);
			_posX += dragCurrent - dragStart;

			_posX = setSliderPos(_posX);

			if (_posX == 213)
			{
				updateText();
				$(_id).value = '';
			}
			else
			{
				updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 9)) + _min));
				$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 9)) + _min) / _displayFactor);
			}

			// Hier muss ein Dummy-Element den Fokus erhalten, damit mein nächsten Klick ein Drag/Drop-Event ausgelöst wird.
			$('slider_' + _id + '_ctrl').focus();

			reloadSearchForm();
		}
		else
		{
			dragCurrent = mouse.x;

			var posX2 = setSliderPos(_posX + (dragCurrent - dragStart));

			if (posX2 == 213)
			{
				updateText();
			}
			else
			{
				updateText(Math.round(((posX2 - 33) / 18 * ((_max - _min) / 9)) + _min));
			}
		}
		return false;
	}

	function updateText(value)
	{
		if (value == undefined)
		{
			$(_id + '_current_value_container').style.display = 'none';
			$(_id + '_all_container').style.display = 'block';
		}
		else
		{
			$(_id + '_all_container').style.display = 'none';
			$(_id + '_current_value_container').style.display = 'block';
			$(_id + '_current_value').innerHTML = value;

//			showLargePic($(_id + '_current_value'), '<div style="margin:8px 0 0 4px; padding:0px 6px; background:#383838; color:#4597bc;">' + value + '</div>');
		}
	}

	function setSliderPos(posX)
	{
		if (posX < 42)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "33px -25px";
			return 33;
		}
		else if (posX < 60)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "51px 0px";
			return 51;
		}
		else if (posX < 78)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "69px 0px";
			return 69;
		}
		else if (posX < 96)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "87px 0px";
			return 87;
		}
		else if (posX < 114)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "105px 0px";
			return 105;
		}
		else if (posX < 132)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "123px 0px";
			return 123;
		}
		else if (posX < 150)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "141px 0px";
			return 141;
		}
		else if (posX < 168)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "159px 0px";
			return 159;
		}
		else if (posX < 186)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "177px 0px";
			return 177;
		}
		else if (posX < 204)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "195px 0px";
			return 195;
		}
		else
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "213px -50px";
			return 213;
		}
	}
}


function SliderSmall(_id, _min, _max, _value, _unit, _displayFactor)
{
	if (_value != -1 && _value < _min)
	{
		_value = _min;
	}
	else if (_value > _max)
	{
		_value = _max;
	}

	if (_value == -1)
	{
		var _posX = 159;
		setSliderPos(_posX);
		updateText();
		$(_id).value = '';
	}
	else
	{
		var _posX = 33 + (Math.round(((_value - _min) / (_max - _min)) * 6) * 18);
		setSliderPos(_posX);
		updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 6)) + _min));
		$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 6)) + _min) / _displayFactor);
	}

	addEvent($('slider_' + _id), "mousedown", initDrag);
	addEvent($('slider_' + _id), "mouseup", $('slider_' + _id + '_ctrl').focus);

	setUnselectable($('slider_' + _id));
	setUnselectable($('slider_' + _id + '_ctrl'));

	var dragStart = 0;
	var dragCurrent = 0;


	this.reset = function ()
	{
		_posX = 159;
		setSliderPos(_posX);
		updateText();
		$(_id).value = '';
	}

	function initDrag(e)
	{
		if (window.event)
		{
			var mouseX = window.event.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft) - getAbsPos($('slider_' + _id)).x;
			var mouseY = window.event.clientY + (document.body.scrollTop || document.documentElement.scrollTop) - getAbsPos($('slider_' + _id)).y;
		}
		else
		{
			var mouseX = e.pageX - getAbsPos($('slider_' + _id)).x;
			var mouseY = e.pageY - getAbsPos($('slider_' + _id)).y;
		}

		if (mouseX > _posX && mouseX < _posX + 13 && mouseY > 2 && mouseY < 24)
		{
			dragStart = mouse.x;
			dragCurrent = mouse.x;

			addEvent(document, "mousemove", doDrag);
			return false;
		}
		else if (mouseX < _posX && mouseX >= 33 && _posX > 33)
		{
			_posX = setSliderPos(_posX - 18);
		}
		else if (mouseX > _posX && mouseX <= 166 && _posX < 159)
		{
			_posX = setSliderPos(_posX + 18);
		}

		if (_posX == 159)
		{
			updateText();
			$(_id).value = '';
		}
		else
		{
			updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 6)) + _min));
			$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 6)) + _min) / _displayFactor);
		}

		$('slider_' + _id + '_ctrl').focus();

		reloadSearchForm();

		return false;
	}

	function doDrag(e)
	{
		if (mouse.button == false)
		{
			removeEvent(document, "mousemove", doDrag);
			_posX += dragCurrent - dragStart;

			_posX = setSliderPos(_posX);

			if (_posX == 159)
			{
				updateText();
				$(_id).value = '';
			}
			else
			{
				updateText(Math.round(((_posX - 33) / 18 * ((_max - _min) / 6)) + _min));
				$(_id).value = Math.round((((_posX - 33) / 18 * ((_max - _min) / 6)) + _min) / _displayFactor);
			}

			// Hier muss ein Dummy-Element den Fokus erhalten, damit mein nächsten Klick ein Drag/Drop-Event ausgelöst wird.
			$('slider_' + _id + '_ctrl').focus();

			reloadSearchForm();
		}
		else
		{
			dragCurrent = mouse.x;

			var posX2 = setSliderPos(_posX + (dragCurrent - dragStart));

			if (posX2 == 159)
			{
				updateText();
			}
			else
			{
				updateText(Math.round(((posX2 - 33) / 18 * ((_max - _min) / 6)) + _min));
			}
		}
		return false;
	}

	function updateText(value)
	{
		if (value == undefined)
		{
			$(_id + '_current_value_container').style.display = 'none';
			$(_id + '_all_container').style.display = 'block';
		}
		else
		{
			$(_id + '_all_container').style.display = 'none';
			$(_id + '_current_value_container').style.display = 'block';
			$(_id + '_current_value').innerHTML = value;
		}
	}

	function setSliderPos(posX)
	{
		if (posX < 42)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "33px -25px";
			return 33;
		}
		else if (posX < 60)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "51px 0px";
			return 51;
		}
		else if (posX < 78)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "69px 0px";
			return 69;
		}
		else if (posX < 96)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "87px 0px";
			return 87;
		}
		else if (posX < 114)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "105px 0px";
			return 105;
		}
		else if (posX < 132)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "123px 0px";
			return 123;
		}
		else if (posX < 150)
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "141px 0px";
			return 141;
		}
		else
		{
			$('slider_' + _id + '_ctrl').style.backgroundPosition = "159px -50px";
			return 159;
		}
	}
}

function formatNumber(num)
{
	if (typeof num == 'string')
	{
		num = parseFloat(num);
	}
	
	if (num < 0)
	{
		var sign = '-';
		num = -num;
	}
	else
	{
		var sign = '';
	}

	num = num.toString();

	var decPoint = num.indexOf('.');
	if (decPoint != -1)
	{
		var intPlaces = num.substr(0, decPoint);
		var decPlaces = num.substr(decPoint + 1);
	}
	else
	{
		var intPlaces = num;
		var decPlaces = '';
	}

	if (intPlaces.length > 3)
	{		
		var intPlacesOut = intPlaces.substr(intPlaces.length - 3);
	}
	else
	{
		var intPlacesOut = intPlaces;
	}
	for (var i = intPlaces.length - 6; i >= -2; i -= 3)
	{
		if (i >= 0)
		{
			intPlacesOut = intPlaces.substr(i, 3) + '.' + intPlacesOut;
		}
		else
		{
			intPlacesOut = intPlaces.substr(0, 3 + i) + '.' + intPlacesOut;
			break;
		}
	}
	return sign + intPlacesOut + (decPoint != -1 ? ',' + decPlaces : '');
}