var XMLHTTP = null;
var XMLHTTP_PLZ = null;

var geosearch = Object;
var plzsearch = Object;

if (window.XMLHttpRequest) {
	XMLHTTP = new XMLHttpRequest();
	XMLHTTP_PLZ = new XMLHttpRequest();
} else if (window.ActiveXObject) {
	try {
		XMLHTTP = new ActiveXObject("Msxml2.XMLHTTP");
		XMLHTTP_PLZ = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (ex) {
		try {
			XMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
			XMLHTTP_PLZ = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (ex) {
		}
	}
}

function geladen() {
	if (XMLHTTP.readyState == 4) {
		geosearch = eval("(" + XMLHTTP.responseText + ")");
		window.clearTimeout(id_a);
	}
	if (XMLHTTP_PLZ.readyState == 4) {
		plzsearch = eval("(" + XMLHTTP_PLZ.responseText + ")");
		window.clearTimeout(id_b);
	}
}

function abbruch() {
	XMLHTTP.abort();
	XMLHTTP_PLZ.abort();
}

function load_JSON() {
	XMLHTTP.open("GET", "/meteo_cron/geosearch.json", true);
	XMLHTTP.onreadystatechange = geladen;
	XMLHTTP.send(null);

	id_a = window.setTimeout("abbruch();", 5000);

	XMLHTTP_PLZ.open("GET", "/meteo_cron/plzsearch.json", true);
	XMLHTTP_PLZ.onreadystatechange = geladen;
	XMLHTTP_PLZ.send(null);

	id_b = window.setTimeout("abbruch();", 5000);
}

function init() {
	load_JSON();
	var input_field = document.getElementById("eingabefeld");
	var search_list = document.getElementById("auswahlliste");
	var submit_btn = document.getElementById("go");
	input_field.blur();
	if (input_field.addEventListener) {
		// Mozilla
		input_field.addEventListener("focus", focusEingabefeld, false);
		input_field.addEventListener("blur", blurEingabefeld, false);
		input_field.addEventListener("keydown", keydownEingabefeld, false);
		input_field.addEventListener("keyup", keyupEingabefeld, false);

		search_list.addEventListener("mouseup", clickSuchfeld, false);
		search_list.addEventListener("keydown", keydownSuchfeld, false);
		search_list.addEventListener("keyup", keyupSuchfeld, false);
		
		document.addEventListener("keydown", keydownDocument, false);
		
		submit_btn.addEventListener("mouseup", clickSubmit, false);
		submit_btn.addEventListener("mouseover", mouseoverSubmit, false);
		submit_btn.addEventListener("mouseout", mouseoutSubmit, false);
	} else if (input_field.attachEvent) {
		// Internet Explorer
		input_field.attachEvent('onfocus', focusEingabefeld);
		input_field.attachEvent('onblur', blurEingabefeld);
		input_field.attachEvent('onkeydown', keydownEingabefeld);
		input_field.attachEvent('onkeyup', keyupEingabefeld);

		search_list.attachEvent("onmouseup", clickSuchfeld);
		search_list.attachEvent("onkeydown", keydownSuchfeld);
		search_list.attachEvent("onkeyup", keyupSuchfeld);
		
		document.attachEvent("onkeydown", keydownDocument);

		submit_btn.attachEvent("onmouseup", clickSubmit);
		submit_btn.attachEvent("onmouseover", mouseoverSubmit);
		submit_btn.attachEvent("onmouseout", mouseoutSubmit);
	}
}


function jump (id,lang){
	document.cookie = "weather2011_front=" + id+";expires=Sun, 1 Dec 2030 10:00:00 GMT;path=/";
	if (lang == "de") {
		window.parent.document.location = "/wetter/ortswetter.tmpl?geo="
			+ id;
	} else if (lang = "fr") {
		window.parent.document.location = "/ro/meteo/ortswetter.tmpl?geo="
			+ id;
	} else {
		window.parent.document.location = "/wetter/ortswetter.tmpl?geo="
			+ id;
	}
}

function mouseoverSubmit(e){
	document.body.style.cursor = "pointer";
}

function mouseoutSubmit(e){
	document.body.style.cursor = "default";
}

function clickSubmit(e){
	getDetailseite(document.getElementById("auswahlliste"));
}

function keydownDocument(e){
	if (e.keyCode) {
		// Mozilla Browser
		code = e.keyCode;
	} else if (e.which) {
		// Internet Explorer
		code = e.which;
	}
	if (code == 27) {
		var i = document.getElementById("eingabefeld");
		var gt = document.getElementById("grayText");
		var selbox = document.getElementById("auswahlliste");
		i.focus();
		i.value = '';
		gt.value = '';
		selbox.style.visibility = 'hidden';
		i.blur();
	}
}

function focusEingabefeld(e) {
	input_el = document.getElementById("eingabefeld");
	var lang = document.getElementById("lang");
	lang = lang.value;
	if (lang == "de") {
		if (input_el.value == 'Ort oder PLZ eingeben') {
			input_el.value = '';
			gt = document.getElementById("grayText");
			gt.value = '';
		}
	} else if (lang == "fr") {
		if (input_el.value == 'Entrez une localité ou CP') {
			input_el.value = '';
			gt = document.getElementById("grayText");
			gt.value = '';
		}
	} else {
		if (input_el.value == 'Ort oder PLZ eingeben') {
			input_el.value = '';
			gt = document.getElementById("grayText");
			gt.value = '';
		}
	}
}

function blurEingabefeld(e) {
	input_el = document.getElementById("eingabefeld");
	var lang = document.getElementById("lang");
	lang = lang.value;
	if (lang == "de") {
		if (input_el.value == '') {
			input_el.value = 'Ort oder PLZ eingeben';
			gt = document.getElementById("grayText");
			gt.value = 'Ort oder PLZ eingeben';
		}
	} else if (lang == "fr") {
		if (input_el.value == '') {
			input_el.value = 'Entrez une localité ou CP';
			gt = document.getElementById("grayText");
			gt.value = 'Entrez une localité ou CP';
		}
	} else {
		if (input_el.value == '') {
			input_el.value = 'Ort oder PLZ eingeben';
			gt = document.getElementById("grayText");
			gt.value = 'Ort oder PLZ eingeben';
		}
	}
}

function clickSuchfeld(e) {
	var go = false;
	if (!e) {
		// Internet Explorer
		var e = window.event;
	}
	if (e.target) {
		// Mozilla Browser
		targ = e.target;
		if (targ.tagName == "OPTION") {
			go = true;
		}
	} else if (e.srcElement) {
		// Internet Explorer
		targ = e.srcElement;
		if (targ.tagName == "SELECT") {
			go = true;
		}
	}
	if (targ.nodeType == 3) {
		// Safari
		targ = targ.parentNode;
		go = true;
	}
	if (go){
		getDetailseite(document.getElementById("auswahlliste"));
	}
}

// Jump to selected URL
function getDetailseite(selbox) {
	var lang = document.getElementById("lang");
	lang = lang.value;	
	if (selbox.selectedIndex != -1) {
		document.cookie = "weather2011_front=" + selbox[selbox.selectedIndex].value+";expires=Sun, 1 Dec 2030 10:00:00 GMT;path=/";
		if (lang == "de") {
			window.parent.document.location = "/wetter/ortswetter.tmpl?geo="
					+ selbox[selbox.selectedIndex].value;
		} else if (lang == "fr") {
			window.parent.document.location = "/ro/meteo/ortswetter.tmpl?geo="
				+ selbox[selbox.selectedIndex].value;
		} else {
			window.parent.document.location = "/wetter/ortswetter.tmpl?geo="
				+ selbox[selbox.selectedIndex].value;
		}
	} else {
		if (lang == "de") {
			if (document.getElementById("eingabefeld").value == 'Ort oder PLZ eingeben') {
				window.parent.document.location = "/wetter/search.tmpl?search_string=";
			} else {
				window.parent.document.location = "/wetter/search.tmpl?search_string="+document.getElementById("eingabefeld").value;
			}
		} else if (lang == "fr") {
			if (document.getElementById("eingabefeld").value == 'Entrez une localité ou CP') {
				window.parent.document.location = "/ro/meteo/search.tmpl?search_string=";
			} else {
				window.parent.document.location = "/ro/meteo/search.tmpl?search_string="+document.getElementById("eingabefeld").value;
			}
		} else {
			if (document.getElementById("eingabefeld").value == 'Ort oder PLZ eingeben') {
				window.parent.document.location = "/wetter/search.tmpl?search_string=";
			} else {
				window.parent.document.location = "/wetter/search.tmpl?search_string="+document.getElementById("eingabefeld").value;
			}
		}
	}
}

function getCursorPosition(node) {
	var cursorPos = 0;
	if (document.selection) {
		// Internet Explorer
		node.focus();
		var oSel = document.selection.createRange();
		oSel.moveStart('character', -node.value.length);
		cursorPos = oSel.text.length;
	} else if (node.selectionStart || node.selectionStart == '0') {
		// Firefox
		cursorPos = node.selectionStart;
	}
	return (cursorPos);
}
	


function keyupEingabefeld(e) {
	if (e.keyCode) {
		// Mozilla Browser
		code = e.keyCode;
	} else if (e.which) {
		// Internet Explorer
		code = e.which;
	}
	if (code == 40) {
		// Down Arrow
		var s = document.getElementById("auswahlliste");
		var i = document.getElementById("eingabefeld");
		var gt = document.getElementById("grayText");
		if (s.selectedIndex + 1 < s.options.length) {
			s.selectedIndex = s.selectedIndex + 1;
			i.value = s[s.selectedIndex].text;
			gt.value = s[s.selectedIndex].text;
		}

	}
	if (code == 38) {
		// Up Arrow
		var s = document.getElementById("auswahlliste");
		var i = document.getElementById("eingabefeld");
		var gt = document.getElementById("grayText");
		if (s.selectedIndex > 0) {
			s.selectedIndex = s.selectedIndex - 1;
			i.value = s[s.selectedIndex].text;
			gt.value = s[s.selectedIndex].text;
		}

	}

	if (code != 40 && code != 38) {
		gt = document.getElementById("grayText");
		in_el = document.getElementById("eingabefeld");
		var auswahl = document.getElementById("auswahlliste");
		visibleToggle("auswahlliste");
		geoFlushWeather("auswahlliste");
		gt.value = '';
		start = getCursorPosition(in_el);
		grayTxt = in_el.value.substring(0, start);
		if (in_el.value.length >= 1) {
			var isnum = /^[0-9]/i.exec(in_el.value);
			if (isnum) {
				var db = plzsearch;
			} else {
				var db = geosearch;
			}

			var regexp = (isnum ? new RegExp("^" + in_el.value, "i")
					: new RegExp("^" + in_el.value, "i"));
			for ( var key in db) {
				if (regexp.test(key)) {
					var nx = document.createElement("option");
					nx.setAttribute("value", db[key]);
					nx.setAttribute("onmouseover",
							"this.selected='true'");
					nx.text = key;
					auswahl[auswahl.length] = nx;
					auswahl[0].selected = "true";
				}
			}
			if (auswahl[0]) {
				grayTxt += auswahl[0].text.substring(start,
						auswahl[0].text.length);
				gt.value = grayTxt;
			}
		}
		visibleToggle("auswahlliste");
	}
}

function keydownEingabefeld(e) {
	if (e.keyCode) {
		// Mozilla Browser
		code = e.keyCode;
	} else if (e.which) {
		// Internet Explorer
		code = e.which;
	}
	if (code == 13) {
		getDetailseite(document.getElementById("auswahlliste"));
	}
}

function keyupSuchfeld(e) {
	if (e.keyCode) {
		// Mozilla Browser
		code = e.keyCode;
	} else if (e.which) {
		// Internet Explorer
		code = e.which;
	}
	if (code == 40) {
		// Down Arrow
		var s = document.getElementById("auswahlliste");
		var i = document.getElementById("eingabefeld");
		var gt = document.getElementById("grayText");
		if (s.selectedIndex + 1 < s.options.length) {
			i.value = s[s.selectedIndex].text;
			gt.value = s[s.selectedIndex].text;
		}
	}
	if (code == 38) {
		// Up Arrow
		var s = document.getElementById("auswahlliste");
		var i = document.getElementById("eingabefeld");
		var gt = document.getElementById("grayText");
		if (s.selectedIndex >= 0) {
			i.value = s[s.selectedIndex].text;
			gt.value = s[s.selectedIndex].text;
		}
	}
}

function keydownSuchfeld(e) {
	if (e.keyCode) {
		// Mozilla Browser
		code = e.keyCode;
	} else if (e.which) {
		// Internet Explorer
		code = e.which;
	}
	if (code == 13) {
		// Eingabetaste
		getDetailseite(document.getElementById("auswahlliste"));
	}
}


function visibleToggle(suchliste) {
	var selbox = document.getElementById(suchliste);
	var nentry = selbox.length;
	if (nentry == 0) {
		selbox.style.visibility = 'hidden';
	} else {
		selbox.size = (nentry >= 30 ? 15 : (nentry >= 10 ? 8 : 5));
		selbox.style.visibility = '';
	}
}

function geoFlushWeather(selectbox) {
	var selbox = document.getElementById(selectbox);
	for ( var i = selbox.length - 1; i >= 0; i--) {
		selbox[i] = null;
	}
}

window.onload = init;

