setTimeout(function(){
	var keyCode;
	var el = document.getElementById("searchText");
	var proposalDropdown = null;
	var xhrActive = false;
	// proposal-Zustände:
	// * verborgen: proposalDropdown == null
	// * aktiv: proposalDropdown != null, proposalValueBase != null
	// * inaktiv (input-Wert passt nicht zum Dropdownmenü): proposalDropdown != null, proposalValueBase == null
	var proposalValue = "";
	var proposalValueBase = "";
	var proposalIndex = null;
	el.setAttribute("autocomplete", "off");
	
	var setVisibility = function(state) {
		if (state) {
			if (proposalDropdown == null) {
				var rect = el.getBoundingClientRect();
				proposalDropdown = document.createElement("div");
				proposalDropdown.className = "searchProposals";
				proposalDropdown.style.cssText = "position:absolute;left:" + rect.left + "px;top:" + rect.bottom + "px;min-width:" + (rect.right-rect.left-2) + "px;z-index:10000;white-space:nowrap;";
				document.body.appendChild(proposalDropdown);
				var rect2 = proposalDropdown.getBoundingClientRect();
				proposalDropdown.style.left = rect.left*2-rect2.left+"px";
				proposalDropdown.style.top = rect.bottom*2-rect2.top+"px";
			}
		} else {
			if (proposalDropdown != null) {
				proposalDropdown.parentNode.removeChild(proposalDropdown);
				proposalDropdown = null;
				proposalIndex = null;
			}
		}
	};
	
	var populateList = function(text, value) {
		if (!text) return setVisibility(false);
		setVisibility(true);
		proposalDropdown.innerHTML = "";
		text = text.split(/\n/);
		proposalIndex = null;
		for (var i = 0; i < text.length; i++) {
			var li = document.createElement("div");
			li.appendChild(document.createTextNode(value));
			var b = document.createElement("b");
			b.appendChild(document.createTextNode(text[i]));
			li.appendChild(b);
			proposalDropdown.appendChild(li);
			li.style.cursor = "pointer";
			li.onmousedown = function(){
				el.value=this.firstChild.nodeValue+this.lastChild.firstChild.nodeValue;
				doSearch($('searchForm').elements.searchText.value);
			};
		}
		proposalValueBase = value;
	};
	
	var cache = {};
	
	getProposals = function() {
		if ((keyCode == 38 || keyCode == 40) && proposalDropdown && proposalValueBase != null && proposalValue == el.value) {
			if (proposalIndex) proposalIndex.className = "";
			proposalIndex = keyCode == 38
				? (proposalIndex ? proposalIndex.previousSibling : proposalDropdown.lastChild)
				: (proposalIndex ? proposalIndex.nextSibling : proposalDropdown.firstChild);
			if (proposalIndex) proposalIndex.className = "highlight";
			el.value = proposalValue = proposalValueBase + (proposalIndex ? proposalIndex.lastChild.firstChild.nodeValue : "");
		} else if (keyCode == 13) {
			setVisibility(false);
		} else {
			var value = el.value;
			if (value == proposalValue) return;
			if (!value.match(/[\w\xC4\xD6\xDC\xDF\xE4\xF6\xFC]/)) { proposalValue = value; return setVisibility(false); }
			if (xhrActive) return;
			if (cache[value] != null) {
				proposalValue = value;
				proposalValueBase = null;
				populateList(cache[value], value);
			} else {
				var xhr = new XMLHttpRequest();
				xhr.open("GET", searchProposalsScript + encodeURIComponent(value), true);
				xhr.onreadystatechange = function() {
					if (xhr.readyState != 4) return;
					xhrActive = false;
					proposalValue = value;
					proposalValueBase = null;
					if (xhr.status != 200) return setVisibility(false);
					cache[value] = xhr.responseText;
					populateList(xhr.responseText, value);
					// Erneuter Aufruf, falls Wert mittlerweile nochmals geändert wurde
					if (value != el.value) {
						getProposals();
					}
				}
				xhr.send(null);
				xhrActive = true;
			}
		}
	};
	if (el.addEventListener) {
		el.addEventListener("keydown", function(event) { keyCode = event.keyCode; setTimeout(getProposals, 0);}, false);
		el.addEventListener("blur", function(event) { setVisibility(false); }, false);
	} else {
		el.attachEvent("onkeydown", function() { keyCode = window.event.keyCode; setTimeout(getProposals, 0);});
		el.attachEvent("onblur", function() { setVisibility(false); });
	}
}, 0);
