/*!
 * AJAX Search Functions
 */

var http_request = false;
var keys_array = new Array();

function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}

addLoadEvent(function() {
	makeRequest('/static/app/search/xml/keys.xml');
});

function makeRequest(url) {
	http_request = false;
	// Mozilla, Safari, ...
	if (window.XMLHttpRequest) {
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
			// zu dieser Zeile siehe weiter unten
		}
	}
	// IE
	else if (window.ActiveXObject) {
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) {}
		}
	}
	if (!http_request) {
		//alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
		return false;
	}
	http_request.onreadystatechange = generateKeylist;
	http_request.open('GET', url, true);
	http_request.send(null);
}

function generateKeylist() {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			var xmldoc = http_request.responseXML;
			for(var i=0; i<xmldoc.getElementsByTagName('key').length; i++) {
				var ausgabe = xmldoc.getElementsByTagName('key')[i].firstChild.nodeValue;
				if (ausgabe != '') {
					keys_array[i] = ausgabe;
				}
			}      
		}
		else {
			//alert('Bei dem Request ist ein Problem aufgetreten.');
		}
	}
}

var press_count = 0;
var element_count = 0;

if (document.captureEvents) {
	document.captureEvents(Event.KEYDOWN);
}
document.onkeydown = listDown;
document.onkeyup = listUp;
document.onclick = closeList;

function closeList(evt) {
	try {
		if (!evt) evt = window.event; // for IE
		if (evt.button == 0) document.getElementById('searchSuggestBox').style.visibility = 'hidden';
		press_count = 0;
	}
	catch (exception) {}
}

function listDown(evt) {
	try {
		if (!evt) evt = window.event; // for IE
		var search_div = document.getElementById('searchSuggestBox');
		var search_input = document.getElementById('searchTextField');
		// down arrow
		if (evt.keyCode == 40 && search_div.style.visibility == 'visible') {
			if (press_count != 0) var search_div_key_old = document.getElementById('key_' + press_count);
			if (press_count == element_count-1) { press_count = 1; } else { press_count++; }
			var search_div_key = document.getElementById('key_' + press_count);
			if (press_count != 1) { search_div_key_old.className = 'searchSuggestLink'; } else { document.getElementById('key_' + (element_count-1)).className = 'searchSuggestLink';	}
			search_div_key.className = 'searchSuggestLinkOver';
		}
		// up arrow
		else if (evt.keyCode == 38 && search_div.style.visibility == 'visible') {
			if (press_count != 0) var search_div_key_old = document.getElementById('key_' + press_count);
			if (press_count == element_count) { press_count = 1; }
			var search_div_key = document.getElementById('key_' + press_count);
			if (press_count != 0 && press_count > 0) search_div_key_old.className = 'searchSuggestLink';
			if (press_count > 0) search_div_key.className = 'searchSuggestLinkOver';
			search_input.selectionStart = search_input.value.length;
		}
		// enter
		else if (evt.keyCode == 13 && search_div.style.visibility == 'visible') {
			document.getElementById('searchTextField').value = document.getElementById('key_' + press_count).innerHTML;
			document.getElementById('searchSuggestBox').innerHTML = '';
			document.getElementById('searchSuggestBox').style.visibility = 'hidden';
			document.getElementById('search').submit();
		}
	}
	catch (exception) {}
}

function listUp(evt) {
	try {
		if (!evt) evt = window.event; // for IE
		var search_div = document.getElementById('searchSuggestBox');
		var search_input = document.getElementById('searchTextField');
		if (press_count != 0) var search_div_key_old = document.getElementById('key_' + press_count);
		// down arrow
		if (evt.keyCode == 40 && search_div.style.visibility == 'visible') {
			var search_div_key = document.getElementById('key_' + press_count);
			if (press_count != 1) search_div_key_old.className = 'searchSuggestLink';
			search_div_key.className = 'searchSuggestLinkOver';
		}
		// up arrow
		else if (evt.keyCode == 38 && search_div.style.visibility == 'visible') {
			if (press_count == element_count) { press_count = 1; } else if (press_count == 0) {} else { press_count--; }
			if (press_count != 0 && press_count > 0) var search_div_key = document.getElementById('key_' + press_count);
			if (press_count > 0) search_div_key_old.className = 'searchSuggestLink';
			if (press_count != 0 && press_count > 0) search_div_key.className = 'searchSuggestLinkOver';
			search_input.selectionStart = search_input.value.length;
		}
	}
	catch (exception) {}
}

// called from keyup on the search textbox
function searchSuggest(evt) {
    var value = keys_array;
	if (!evt) evt = window.event; // for IE
	element_count = 1;
	var suggest = '';
	var tmp_suggest = '';
	var search_input = document.getElementById('searchTextField').value;
	var search_div = document.getElementById('searchSuggestBox');
	search_div.innerHTML = '';
	var search_pattern = eval('/^' + document.getElementById('searchTextField').value + '(.*)/i');	
	for(var i=0; i < value.length; i++) {
		var wort = value[i];
		var search_result = wort.match(search_pattern);
		if (search_result) {
			if (search_input != '' && element_count <= 10) {
				suggest = wort;
				var option = document.createElement("div");
				option_txt = document.createTextNode(wort.replace(/^(.*)&amp;(.*)$/,'&'));
				//if (i == 59) alert(option_txt.innerHTML);
				option.appendChild(option_txt);
				if (document.all) {
					option.className   = 'searchSuggestLink';
					option.onmouseout  = suggestOutIE;
					option.onmouseover = suggestOverIE;
					option.onclick     = setSearchIE;
				}
				else {
					option.setAttribute("class", "searchSuggestLink");
					option.setAttribute("onMouseOut", 'suggestOut(this);');
					option.setAttribute("onMouseOver", 'suggestOver(this);');
					option.setAttribute("onClick", 'setSearch(this.innerHTML);');
				}
				option.setAttribute("id", "key_" + element_count);
				search_div.appendChild(option);
				element_count++;
			}
		}
	}
	if (search_input == '' || suggest == '') {
		search_div.style.visibility = 'hidden';
		element_count = 0;
	}
	else {
		search_div.size = element_count;
		if (evt.keyCode != 13) search_div.style.visibility = 'visible';
		if (evt.keyCode != 13 && evt.keyCode != 40 && evt.keyCode != 38) press_count = 0;
	}		
}

// mouseover function
function suggestOver(div_value) {
	div_value.className = 'searchSuggestLinkOver';
}

// mouseout function
function suggestOut(div_value) {
	div_value.className = 'searchSuggestLink';
}

// onclick function
function setSearch(strValue) {
	document.getElementById('searchTextField').value = strValue.replace(/&amp;/g,'&');
	document.getElementById('searchSuggestBox').innerHTML = '';
	document.getElementById('searchSuggestBox').style.visibility = 'hidden';
	element_count = 0;
	document.getElementById('search').submit();	
}

// for IE
function suggestOverIE() {
	this.className = 'searchSuggestLinkOver';
}

function suggestOutIE() {
	this.className = 'searchSuggestLink';
}

function setSearchIE() {
	document.getElementById('searchTextField').value = this.innerHTML.replace(/&amp;/g,'&');
	document.getElementById('searchSuggestBox').innerHTML = '';
	document.getElementById('searchSuggestBox').style.visibility = 'hidden';
	element_count = 0;
	document.getElementById('search').submit();	
}

function changeNumber() {
	document.getElementById('search').submit();
}

function clearSearchField(inputField) {
	if (document.getElementById(inputField).value == 'Suchbegriff') {
		document.getElementById(inputField).value = '';
		document.getElementById(inputField).style.color = '#000';
	}
	else if (document.getElementById(inputField).value == '') {
		document.getElementById(inputField).value = 'Suchbegriff';
		document.getElementById(inputField).style.color = '#999';
	}
}
