
function Scrollbar($textfield,$scrollfield) {
	// Private-Variablen
	var textField, scrollField, scrollFrame;

	var scrollBoxHeight = 0;
	var scrollStartPos  = 0;
	var scrollBoxJump   = 0;
	var scrollMaxPos    = 0;
	var scrollOffset    = 0;
	var scrollBoxTop    = 0;
	var scrollByPx      = 0;
	var scrollTop       = 0;
	var mousePos        = 0;

	var arrowScrollHeight  = 4;
	var minScrollBoxHeight = 32;

	var enableScrollJump = true;

	var scrollUpArrow   = null;
	var scrollDownArrow = null;
	var scrollFrame     = null;
	var scrollField     = null;
	var scrollBox       = null;
	var scrollBar       = null;
	var textField       = null;
	var dragObject      = null;
	var arrowTimer      = null;
	var arrowClicked    = null;
	var jumpEvent       = null;


	// Erstellung des Scrollbar-Objektes
	if(typeof($textfield) == 'object') {
		textField = $textfield;
	}
	else if(typeof($textfield) == 'string') {
		textField = document.getElementById($textfield);
	}

	if(typeof($scrollfield) == 'object') {
		scrollField = $scrollfield;
	}
	else if(typeof($scrollfield) == 'string') {
		scrollField = document.getElementById($scrollfield);
	}


	// Start Drag & Drop (Private-Funktionen)
	function makeNoSelection() {
		document.body.onselectstart = function () { return false; };
		document.body.ondrag        = function () { return false; };
		document.onmousedown        = function () { return false; };
	}
	
	function resetNoSelection() {
		document.body.onselectstart = function () { return true; };
		document.body.ondrag        = function () { return true; };
		document.onmousedown        = function () { return true; };
	}

	function doScroll() {
		if(scrollTop < 1) {
			scrollTop = 0;
		}
		if(scrollTop > scrollMaxPos) {
			scrollTop = scrollMaxPos;
		}

		scrollBox.style.top = scrollTop + 'px';
		textField.style.top = scrollTop * -scrollByPx + 'px';
	}

	function scrollWheel(wheelEvent) {
		if(!wheelEvent) {
			wheelEvent = window.event;
		}

		if (wheelEvent.wheelDelta) {
			delta = wheelEvent.wheelDelta / 100;

			if(window.opera && parseFloat(navigator.appVersion) < 9) {
				delta = -delta;
			}
		}
		else if (wheelEvent.detail) {
			delta = -wheelEvent.detail;
		}

		if(scrollTop >= 0 && scrollTop <= scrollMaxPos) {
			scrollTop -= delta * Math.floor(scrollBoxJump / 10);

			if (wheelEvent.preventDefault) {
				wheelEvent.preventDefault();
			}
			wheelEvent.returnValue = false;
		}

		doScroll();
	}

	function scrollJump(clickEvent) {
		if(enableScrollJump) {
			scrollInterval = 50;
			if(typeof(arrowClicked) != 'object' || arrowClicked == null) {
				if(!clickEvent) {
					clickEvent = window.event;
				}

				mousePos = clickEvent.clientY;
				scrollInterval = 500;

				arrowClicked = this;
				arrowClicked.className += '_click';
			}

			curtop = 0;
			topObj = scrollBar;

			do {
				curtop += topObj.offsetTop;
			}
			while (topObj = topObj.offsetParent);

			if(scrollTop < mousePos - curtop) {
				scrollTop += scrollBoxJump;
			}
			else {
				scrollTop -= scrollBoxJump;
			}

			doScroll();

			if(scrollTop + scrollBoxHeight < mousePos - curtop || scrollTop > mousePos - curtop) {
				arrowTimer = setTimeout(function() { scrollJump(clickEvent); },scrollInterval);
			}
			else {
				stopDrag();
			}
		}
	}

	function scrollArrow($timeout) {
		scrollInterval = 50;

		if(typeof($timeout) != 'undefined') {
			scrollInterval = $timeout;
		}

		makeNoSelection();

		scrollTop = scrollTop + (Math.floor(scrollBoxJump / 10) * arrowClicked.scrollByPx);
		doScroll();

		arrowTimer = setTimeout(function() { scrollArrow(); },scrollInterval);
	}

	function scrollArrowClick() {
		arrowClicked = this;
		arrowClicked.className += '_click';

		scrollArrow(500)
	}

	function startDrag(clickEvent) {
		if(!clickEvent) {
			clickEvent = window.event;
		}
		dragObject = this;

		enableScrollJump = false;

		curtop = 0;
		topObj = dragObject.offsetParent;
		scrollBoxTop = dragObject.offsetTop;

		do {
			curtop += topObj.offsetTop;
		}
		while (topObj = topObj.offsetParent);

		scrollStartPos = curtop;
		scrollOffset   = clickEvent.clientY + document.body.scrollTop - curtop;

		makeNoSelection();
	}

	function stopDrag() {
		if(typeof(dragObject) == 'object' && dragObject != null) {
			dragObject = null;
		}

		if(arrowClicked != null) {
			arrowClicked.className = arrowClicked.className.replace('_click','');
			arrowClicked = null;
		}

		if(arrowTimer != null) {
			clearTimeout(arrowTimer);
		}

		resetNoSelection();

		enableScrollJump = true;
	}

	function moveDrag(mouseEvent) {
		if(typeof(dragObject) == 'object' && dragObject != null) {
			if(!mouseEvent) {
				mouseEvent = window.event;
			}

			scrollTop = mouseEvent.clientY + document.body.scrollTop + scrollBoxTop - scrollOffset - scrollStartPos;

			doScroll();
		}
	}
	// End Drag & Drop


	// Private-Funktionen
	function createScrollBar() {
		scrollFrame = document.createElement('div');
		scrollField.appendChild(scrollFrame);

		scrollFrame.className    = 'scrollframe';
		scrollFrame.style.height = scrollField.offsetHeight + 'px';

		scrollArrowTop = document.createElement('div');
		scrollFrame.appendChild(scrollArrowTop);

		scrollArrowTop.className  = 'scrolluparrow';
		scrollArrowTop.scrollByPx = -1;

		scrollBar = document.createElement('div');
		scrollFrame.appendChild(scrollBar);

		scrollBar.className    = 'scrollbar';
		scrollBar.style.height = (scrollField.offsetHeight - 32) + 'px';

		scrollArrowBottom = document.createElement('div');
		scrollFrame.appendChild(scrollArrowBottom);

		scrollArrowBottom.className = 'scrolldownarrow';
		scrollArrowBottom.scrollByPx = 1;

		scrollBox = document.createElement('div');
		scrollBar.appendChild(scrollBox);

		scrollBox.className = 'scrollbox';
		scrollBox.style.height = scrollBoxHeight + 'px';

		addHeight = 0;

		innerField = new Array();
		$count = 0;
		for($i = 0; $i < textField.childNodes.length; ++$i) {
			if(textField.childNodes[$i].nodeName.toLowerCase() == 'div') {
				innerField[$count] = textField.childNodes[$i];
				++$count;
			}
		}

		if(innerField.length == 1) {
			innerField = innerField[0];
		}
		else {
			innerField = null;
		}

		if(scrollField.currentStyle) {
			scrollStyle = scrollField.currentStyle;
			textStyle   = textField.currentStyle;
			if(innerField != null) {
				innerStyle  = innerField.currentStyle;
			}
		}
		else if(document.defaultView) {
			scrollStyle = document.defaultView.getComputedStyle(scrollField,"");
			textStyle   = document.defaultView.getComputedStyle(textField,"");
			if(innerField != null) {
				innerStyle  = document.defaultView.getComputedStyle(innerField,"");
			}
		}

		addHeight += parseInt(scrollStyle.paddingBottom);
		addHeight += parseInt(scrollStyle.paddingTop);

		addHeight += parseInt(textStyle.marginBottom);
		addHeight += parseInt(textStyle.marginTop);

		if(innerField != null) {
			addHeight += parseInt(innerStyle.marginBottom);
			addHeight += parseInt(innerStyle.marginTop);
		}

		scrollMaxPos = scrollField.offsetHeight - scrollBoxHeight - 32;
		scrollByPx   = (textField.offsetHeight - scrollField.offsetHeight) / scrollMaxPos;
	}

	function enableScrollBar($enable) {
		if($enable) {
			scrollField.style.overflow = 'hidden';

			if(typeof(scrollFrame) == 'object' && scrollFrame != null) {
				scrollFrame.style.visibility = 'hidden';
			}
			else {
				createScrollBar();

				scrollBox.onmousedown = startDrag;
				scrollBar.onmousedown = scrollJump;
				scrollArrowTop.onmousedown = scrollArrowClick;
				scrollArrowBottom.onmousedown = scrollArrowClick;

				if (window.addEventListener) {
					scrollField.addEventListener('DOMMouseScroll', scrollWheel, false);
				}
				else if(window.attachEvent) {
					scrollField.attachEvent('mousewheel',scrollWheel);
				}
				scrollField.onmousewheel = scrollWheel;

				document.onmouseup    = stopDrag;
				document.onmousemove  = moveDrag;
			}
		}
		else {
			scrollField.style.overflow = 'auto';

			if(typeof(scrollFrame) == 'object' && scrollFrame != null) {
				scrollFrame.style.visibility = 'hidden';
			}
		}
	}

	function setScrollBoxHeight() {
		if(typeof(textField) == 'object' && textField != null && typeof(scrollField) == 'object' && scrollField != null) {
			scrollBoxHeight = Math.floor((scrollField.offsetHeight / textField.offsetHeight * 10) * 26);

			scrollBoxJump = scrollBoxHeight;

			if(scrollBoxHeight < minScrollBoxHeight) {
				scrollBoxHeight = minScrollBoxHeight;
			}
			enableScrollBar(true);
		}
		else {
			enableScrollBar(false);
		}
	}

	// Public-Funktionen
	this.setTextField = function($textfield) {
		if(typeof($textfield) == 'object') {
			textField = $textfield;
		}
		else if(typeof($textfield) == 'string') {
			textField = document.getElementById($textfield);
		}
		else {
			return false;
		}

		if(scrollField.offsetHeight < textField.offsetHeight) {
			setScrollBoxHeight();
		}

		return true;
	}

	this.setScrollField = function($scrollfield) {
		if(typeof($scrollfield) == 'object') {
			scrollField = $scrollfield;
		}
		else if(typeof($scrollfield) == 'string') {
			scrollField = document.getElementById($scrollfield);
		}
		else {
			return false;
		}

		if(scrollField.offsetHeight < textField.offsetHeight) {
			setScrollBoxHeight();
		}

		return true;
	}

	this.setArrowScrollHeight = function($scrollHeight) {
		if($scrollHeight > 0) {
			arrowScrollHeight = $scrollHeight;
		}
	}

	if(typeof(scrollField) == 'object' && scrollField != null && typeof(textField) == 'object' && textField != null) {
		if(scrollField.offsetHeight < textField.offsetHeight) {
			setScrollBoxHeight();
		}
		else {
			scrollField.style.overflow = 'hidden';
		}
	}
}

