
var isIE6 = navigator.userAgent.toLowerCase().indexOf('msie 6') != -1;

Element.Events.extend({
	'wheelup': {
		type: Element.Events.mousewheel.type,
		map: function(event){
			event = new Event(event);
			if (event.wheel >= 0) this.fireEvent('wheelup', event)
		}
	},
	
	'wheeldown': {
		type: Element.Events.mousewheel.type,
		map: function(event){
			event = new Event(event);
			if (event.wheel <= 0) this.fireEvent('wheeldown', event)
		}
	}
});

// Activate dropdowns and scroll areas on load
function vdInitDropdowns(objDropdown){
		var arrScrollPanels;
		var arrDropdownPanels;
		
		if(objDropdown) {
			
			objDropdown = $(objDropdown);
			if (objDropdown.hasClass('scrollPanel')) {
				vdInitScrollPanels(objDropdown);
			}
			else if (objDropdown.hasClass('dropdownPanel')) {
				vdInitDropdownPanels(objDropdown);
			}
		}
		else {
			arrScrollPanels = $$('table.scrollPanel');
			$each(arrScrollPanels, vdInitScrollPanels);
			
			arrDropdownPanels = $$('table.dropdownPanel');
			$each(arrDropdownPanels, vdInitDropdownPanels);
		}
	}


function vdInitScrollPanels (objPanel) {
	var intSteps;
	var intStepSize;
	var objButtonScrollDown;
	var objButtonScrollUp;
	var objDataArea;
	var objMaskArea;
	var objScrollbarArea;
	var objKnob;
	var objSlider;
	var objPeriodical;
	
	objScrollbarArea	= $(objPanel.getElement("div[class=scrollbar]"));
	objKnob				= $(objPanel.getElement("div[class=knob]"));
	objMaskArea			= $(objPanel.getElement("div[class=mask]"));
	objDataArea			= $(objPanel.getElement("div[class=data]"));
	objButtonScrollDown	= $(objPanel.getElement("div[class=scrollDown]"));
	objButtonScrollUp	= $(objPanel.getElement("div[class=scrollUp]"));
	
	if(!objScrollbarArea) {
		return;
	}
	
	objScrollbarArea.setStyle("height", objMaskArea.getCoordinates().height - objButtonScrollDown.getCoordinates().height - objButtonScrollUp.getCoordinates().height)
	
	objKnob.setStyle("height", objScrollbarArea.getCoordinates().height / (objDataArea.getCoordinates().height / objScrollbarArea.getCoordinates().height));
	if(objKnob.getCoordinates().height < 8) {
		objKnob.setStyle("height", 8);
	}
	
	if(objDataArea.getCoordinates().height <= objMaskArea.getCoordinates().height) {
		objKnob.addClass('disabled');
		objScrollbarArea.addClass('disabled');
		objButtonScrollDown.addClass('disabled');
		objButtonScrollUp.addClass('disabled');
		objMaskArea.setStyle("height", objDataArea.getCoordinates().height);
	}
	else {
		intStepSize = objMaskArea.getCoordinates().height / 2;
		
		intSteps = objDataArea.getCoordinates().height - objMaskArea.getCoordinates().height;
		objSlider = new Slider(objScrollbarArea, objKnob, {
			steps: intSteps,
			mode: 'vertical',
			onChange: function(intStep){
				objDataArea.style.top = "-" + intStep + "px"
			}
		}).set(0);
		
		objPanel.addEvents({
			'wheelup': function(objEvent) {
				objEvent = new Event(objEvent).stop();
				objSlider.set(objSlider.step - intStepSize);
			},
			'wheeldown': function(objEvent) {
				objEvent = new Event(objEvent).stop();
				objSlider.set(objSlider.step + intStepSize);
			}
		});
		
		objButtonScrollDown.addEvents({
			'mousedown': function() {
				objSlider.set(objSlider.step + intStepSize);
				objPeriodical = (function () {objSlider.set(objSlider.step + intStepSize);}).periodical(100);
			},
			
			'mouseup': function() {
				$clear(objPeriodical);
			},
			
			'mouseleave': function() {
				$clear(objPeriodical);
			}
		});
		
		objButtonScrollUp.addEvents({
			'mousedown': function() {
				objSlider.set(objSlider.step - intStepSize);
				objPeriodical = (function () {objSlider.set(objSlider.step - intStepSize);}).periodical(100);
			},
			
			'mouseup': function() {
				$clear(objPeriodical);
			},
			
			'mouseleave': function() {
				$clear(objPeriodical);
			}
		});
	}
}

function vdInitDropdownPanels (objPanel) {
	var arrOptions;
	var intStepSize;
	var intSteps;
	var intShadowWidth;
	var objButtonScrollDown;
	var objButtonScrollUp;
	var objDataArea;
	var objDataColumn;
	var objInput;
	var objKnob;
	var objMaskArea;
	var objPeriodical;
	var objScrollbarArea;
	var objScrollbarColumn;
	var objSelectedOption;
	var objSlider;
	
	
	objPanel.setStyle("display", "");
	
	// Initialize selected objects
	objDataArea			= $(objPanel.getElement("div[class=data]"));
	intOptionsCount		= objDataArea.getElements("li").length;
	
	if(!intOptionsCount) {
		objPanel.setStyle("display", "none");
		return;
	}
	
	objInput = $(objPanel.getPrevious());
	
	// set up selected value
	vdSmartCut(objInput.getFirst(), objInput.getFirst().innerHTML, objInput.getCoordinates().width - Number.toInt(objInput.getStyle("padding-right")) - Number.toInt(objInput.getStyle("padding-left")));
	
	objPanel.setStyle("top", objInput.getCoordinates().bottom);
	
	if(objPanel.initialized) {
		objPanel.setStyle("display", "none");
		return;
	}
	objPanel.initialized = true;
	
	objScrollbarArea	= $(objPanel.getElement("div[class=scrollbar]"));
	objKnob				= $(objPanel.getElement("div[class=knob]"));
	objMaskArea			= $(objPanel.getElement("div[class=mask]"));
	objButtonScrollDown	= $(objPanel.getElement("div[class=scrollDown]"));
	objButtonScrollUp	= $(objPanel.getElement("div[class=scrollUp]"));
	intStepSize			= $(objDataArea.getElement("li")).getCoordinates().height;
	objScrollbarColumn	= $(objScrollbarArea.getParent());
	objDataColumn		= $(objDataArea.getParent());
	intShadowWidth		= objPanel.getCoordinates().width - objScrollbarColumn.getCoordinates().width - objDataColumn.getCoordinates().width;
	
	//set up dropdown height and top
	objDataArea.setStyle("height", intOptionsCount * intStepSize);
	objMaskArea.setStyle("height", intStepSize * 10);
	objDataColumn.setStyle("height", intStepSize * 10);
	
	// set up dropdown width and left
	if(objDataColumn.getCoordinates().width + objScrollbarColumn.getCoordinates().width < objInput.getCoordinates().width) {
		objDataColumn.setStyle("width", objInput.getCoordinates().width - objScrollbarColumn.getCoordinates().width);
	}
	else if(objPanel.getCoordinates().right > window.getWidth() || (objInput.getCoordinates().width < objPanel.getCoordinates().width && objInput.hasClass("flopLeft"))) {
		objInput.addClass("flopLeft");
		objPanel.setStyle("left", objPanel.getCoordinates().left - (objPanel.getCoordinates().right - objInput.getCoordinates().right) + intShadowWidth);
	}
	
	//set up scroll area and the knob
	objScrollbarArea.setStyle("height", objMaskArea.getCoordinates().height - objButtonScrollDown.getCoordinates().height - objButtonScrollUp.getCoordinates().height)
	objKnob.setStyle("height", objScrollbarArea.getCoordinates().height / (objDataArea.getCoordinates().height / objScrollbarArea.getCoordinates().height));
	if(objKnob.getCoordinates().height < 8) {
		objKnob.setStyle("height", 8);
	}
	
	if(objDataArea.getCoordinates().height <= objMaskArea.getCoordinates().height) {
		objScrollbarColumn.innerHTML = "";
		objScrollbarColumn.setStyle("width", "0");
		objDataColumn.setStyle("width", objDataColumn.getCoordinates().width + objScrollbarColumn.getCoordinates().width);
		if (isIE6 && objInput.getFirst().getParent().id == 'infscnr_input')
		{
			objMaskArea.setStyle("height", objDataArea.getCoordinates().height-3);
		}
		else
		{
			objMaskArea.setStyle("height", objDataArea.getCoordinates().height);
		}
	}
	else {
		intSteps = objDataArea.getCoordinates().height - objMaskArea.getCoordinates().height;
		objSlider = new Slider(objScrollbarArea, objKnob, {
			steps: intSteps,
			mode: 'vertical',
			onChange: function(intStep){
				objDataArea.style.top = "-" + Number.toInt(intStep / intStepSize) * intStepSize + "px"
			}
		}).set(0);
		
		objPanel.addEvents({
			'wheelup': function(objEvent) {
				objEvent = new Event(objEvent).stop();
				objSlider.set(objSlider.step - intStepSize);
			},
			'wheeldown': function(objEvent) {
				objEvent = new Event(objEvent).stop();
				objSlider.set(objSlider.step + intStepSize);
			}
		});
		
		objButtonScrollDown.addEvents({
			'mousedown': function() {
				objSlider.set(objSlider.step + intStepSize);
				objPeriodical = (function () {objSlider.set(objSlider.step + intStepSize);}).periodical(100);
			},
			
			'mouseup': function() {
				$clear(objPeriodical);
			},
			
			'mouseleave': function() {
				$clear(objPeriodical);
			}
		});
		
		objButtonScrollUp.addEvents({
			'mousedown': function() {
				objSlider.set(objSlider.step - intStepSize);
				objPeriodical = (function () {objSlider.set(objSlider.step - intStepSize);}).periodical(100);
			},
			
			'mouseup': function() {
				$clear(objPeriodical);
			},
			
			'mouseleave': function() {
				$clear(objPeriodical);
			}
		});
	}
	
	arrOptions = objDataArea.getElements("li");
	$each(
		arrOptions
		, function (objOption) {
			objOption = $(objOption);
			
			objOption.addEvents({
				  'click': function(objEvent) {
					var intPaddingLeft;
					var intPaddingRight;
					var objOptionSpan;
					var objInputSpan;
					
					intPaddingRight	= Number.toInt(objInput.getStyle("padding-right"));
					intPaddingLeft	= Number.toInt(objInput.getStyle("padding-left"));
					
					objOptionSpan = $(objOption.getFirst());
					objInputSpan = $(objInput.getFirst());
					
					vdSmartCut(objInputSpan, objOptionSpan.innerHTML, objInput.getCoordinates().width - intPaddingRight - intPaddingLeft);
					
					objSelectedOption = objDataArea.getElement("li[class^=selected]");
					
					if (objOption == objSelectedOption) {
						objPanel.setStyle("display", "none");
						$(document).removeEvents('mousedown');
						return;
					}
					
					if(objSelectedOption) {
						objSelectedOption.removeClass("selected");
					}
					
					objOption.addClass("selected");
					objPanel.setStyle("display", "none");
					$(document).removeEvents('mousedown');
					
					if (objInput.getAttribute("vdOnChange")) {
						if (objOption.getAttribute("strValue") != null && objOption.getAttribute("strValue") != "") {
							eval(objInput.getAttribute("vdOnChange") + "('" + objInput.getAttribute("strName") + "','" + (objOption.getAttribute("strValue") ? objOption.getAttribute("strValue") : '') + "')");
						} else {
							eval(objInput.getAttribute("vdOnChange") + "('" + objInput.getAttribute("strName") + "','" + (objOptionSpan.getAttribute("href") ? objOptionSpan.getAttribute("href") : '') + "')");
						}
					}
				}
				, 'mouseenter': function(objEvent) {
					objOption.addClass("highlighted");
				}
				, 'mouseleave' : function(objEvent) {
					objOption.removeClass("highlighted");
				}
			});
		}
	);
	
	objInput.addEvents({
		'click': function(objEvent) {
			var intLeft;
			
			objEvent = new Event(objEvent);
			if(objPanel.getStyle('display') == 'none') {
				objPanel.setStyle("display", "");
				window.setTimeout('', 100);
				
				if (strGetPanelAlignment(objInput, objPanel) == 'right') {
					objPanel.setStyle("left", objInput.getCoordinates().left);
				}
				else {
					intLeft = objPanel.getCoordinates().left - (objPanel.getCoordinates().right - objInput.getCoordinates().right) + intShadowWidth;
					if (objPanel.getCoordinates().left != intLeft) {
						objPanel.setStyle("left", intLeft);
					}
				}
				
				$(document).addEvents({
					'mousedown': function(objEvent) {
						
						var objEvent = new Event(objEvent);
						if(!blnIsInside(objEvent.target, objInput) && !blnIsInside(objEvent.target, objPanel)) {
							objPanel.setStyle("display", "none");
							$(document).removeEvents('mousedown');
							
						}
					}
				})
				$(window).addEvents({
					'resize': function(objEvent) {
						objPanel.setStyle("display", "none");
						$(document).removeEvents('resize');
					}
				});
			}
			else {
				if(blnIsInside(objEvent.target, objInput)) {
					objPanel.setStyle("display", "none");
					$(document).removeEvents('mousedown');
				}
			}
		}
	});
	
	objPanel.setStyle("display", "none");
}

function blnIsInside(objElement, objWrapper) {
	var objElement;
	var objWrapper;
	
	objElement = $(objElement);
	objWrapper = $(objWrapper);
	
	if(objElement == objWrapper) {
		return true;
	}
	
	while(objElement) {
		if(objWrapper == objElement.parentNode) {
			return true;
		}
		objElement = objElement.parentNode;
	}
	return false
}

function vdSmartCut(objContainer, strText, intWidth){
	var strText = strText.clean();
	if (isIE6 && objContainer.getParent().id == 'infscnr_input')
	{
		intWidth = 211;
	}
	
	objContainer = $(objContainer);
	objContainer.setStyle("visibility", "hidden");
	objContainer.innerHTML = strText;
	
	if(objContainer.getCoordinates().width <= intWidth) {
		objContainer.setStyle("visibility", "visible");
		return;
	}
	while(objContainer.getCoordinates().width > intWidth) {
		strText = strText.substr(0, strText.length - 1);
		objContainer.innerHTML = strText + "&hellip;";
	}
	objContainer.setStyle("visibility", "visible");
	return;
}

function strGetPanelAlignment(objInput, objPanel) {
	//Standardausrichtung
	var strAlignment = 'right'
	
	//Sichbarer Bereich
	var objViewport = new Viewport();
	objViewport.left = window.getScroll().x;
	objViewport.width = window.getSize().x;
	objViewport.right = (objViewport.left + objViewport.width)
	
	//DropDownBox
	var objDropDownBox = new DropDownBox();
	objDropDownBox.left = objInput.getCoordinates().left;
	objDropDownBox.right = objInput.getCoordinates().right;
	objDropDownBox.width = objInput.getCoordinates().width;
	
	//DropDownPanel
	var objDropDownPanel = new DropDownPanel();
	objDropDownPanel.left = objPanel.getCoordinates().left;
	objDropDownPanel.right = objPanel.getCoordinates().right;
	objDropDownPanel.width = objPanel.getCoordinates().width;
	
	//Überprüfung, welche Ausrichtung das Panel bekommen soll
	//Box innerhalb Viewport.
	if ((objDropDownBox.left > objViewport.left) && (objDropDownBox.right < objViewport.right)) {
		//Panel mit rechter Ausrichtung innerhalb des Viewports.
		if (((objDropDownBox.left + objDropDownPanel.width) < objViewport.right)) {
			strAlignment = 'right';
		}
		//Panel mit linker Ausrichtung innerhalb des Viewports.
		else if (((objDropDownBox.right - objDropDownPanel.width) > objViewport.left))
		{
			strAlignment = 'left';
		}
		//Panel kann mit keine Ausrichtung innerhalb des Viewports angezeigt werden
		//daher wird die Standardausrichtung verwendet.
		else
		{
			strAlignment = 'right';
		}
	}
	else {
		//Linke Seite der Box nicht mehr innerhalb des Viewports.
		if (objDropDownBox.left <= objViewport.left) {
			strAlignment = 'right';
		}
		//Rechte Seite der Box nicht mehr innerhalb des Viewports.
		else {
			strAlignment = 'left';
		}
	}
	
	return strAlignment;
}

function Viewport() {
	this.left;
	this.right;
	this.top;
	this.bottom;
	this.width;
	this.height;
}

function DropDownBox() {
	this.left;
	this.right;
	this.top;
	this.bottom;
	this.width;
	this.height;
}

function DropDownPanel() {
	this.left;
	this.right;
	this.top;
	this.bottom;
	this.width;
	this.height;
}