
function suggestInit(){
	self.lang = "cs"; // TODO: recognize language!
	var skin = "default";

	var findTextBox = document.getElementById("find");
	if (!findTextBox) return;

	var ul = document.createElement("UL");
	ul.id = "suggest";
	document.getElementsByTagName("BODY")[0].appendChild(ul);
	ul.style.left = getLeft(findTextBox) + "px";
	ul.style.top = (getTop(findTextBox) + findTextBox.offsetHeight + 2) + "px";
	findTextBox.onkeypress = sugPress;
	findTextBox.onkeydown = sugDown;
	findTextBox.onkeyup = sugUp;
	findTextBox.onblur = sugLazyHide;
	findTextBox.setAttribute('autocomplete','off');
	self.findTextBox = findTextBox;
	
	self.skinRoot = "skins/" + skin;
	var tables = document.getElementsByTagName("TABLE");
	for (i=0; i<tables.length; i++){
		if (tables[i].className == 'sortable'){
			new SortableTable(tables[i]);
		}
	}

	window.t = 0;
	window.sugAct = 0;
	window.sugOpen = 0;
	window.xml = getObj("Msxml2.XMLHTTP");
	if (!xml) xml = getObj("Microsoft.XMLHTTP");
	if (!xml)
	{
		if (typeof XMLHttpRequest!="undefined")
			xml = new XMLHttpRequest();
	};
	if (!xml) {
		//alert("Sugestivní návrhy nefungují na vašem prohlížeči.");
	}
	window.last = '';
	window.sugBox = document.getElementById("suggest");
	if (self.showOnLoad) {
		sugDisp (1);
	}
	self.encFunc = encodeURIComponent ? encodeURIComponent : escape;
}

addOnloadEvent (suggestInit);

function getLeft(el){
	return el ? el.offsetLeft + getLeft(el.offsetParent) : 0;
}

function getTop(el){
	return el ? el.offsetTop + getTop(el.offsetParent) : 0;
}


function sugOver (el) {
	if (window.sugAct != el) {
		if (window.sugAct) {
			window.sugAct.className = "";
		}
		window.sugAct = el;
		el.className = "Hover";
	}
}

function sugPress (ev) {
	var q = self.findTextBox;
	ev = window.event ? window.event : ev;
	switch(ev.keyCode) {
		case 27:
			sugLazyHide();
			break;
		case 13:
			// enter
			var act = window.sugAct;
			if (act) {
				q.value = act.innerText ? act.innerText : act.textContent;
				location.href = window.sugAct.getElementsByTagName('A')[0].href;
				ev.cancelBubble = true;
				return false;
			}
			break;
		case 38:
		case 40:
			if (window.sugOpen) {
				return false;
			}
			break;
	}
	return true;
}

function sugDown (ev) {
	var q = self.findTextBox;
	ev = window.event ? window.event : ev;
	switch(ev.keyCode) {
		case 38:
		case 40:
			// up or down arrow
			if (window.sugOpen) {
				var n = 0;
				if (ev.keyCode == 38) {	// up
					n = (window.sugAct) ? window.sugAct.previousSibling : 0;
					if (!n) n = window.sugBox.lastChild;
					while (n.tagName != "LI") { n=n.previousSibling; }
				} else {	// down
					n = (window.sugAct) ? window.sugAct.nextSibling : 0;
					if (!n) n = window.sugBox.firstChild;
					while (n.tagName != "LI") { n=n.nextSibling; }
				}
				sugOver(n);
			}
			break;
	}
}

function sugUp (ev) {
	var q = self.findTextBox;
	ev = window.event ? window.event : ev;
	switch(ev.keyCode) {
		case 13:
			break;
		default:
			// something writen?
			if (q.value.length < 3) {
				window.last = q.value;
				sugDisp(0);
				break;
			}
			if (q.value != window.last){
				window.last = q.value;
				if (xml) {
					var loader = function() {
						if (xml.readyState != 0) xml.abort();
						xml.open ("GET", self.lang + "/suggest?q=" + self.encFunc(q.value), true);
						xml.onreadystatechange = function(){
							if (xml.readyState == 4){ // && xml.responseText
								var result = xml.responseText;
								if (result.length > 0) {
									sugDisp(1);
									document.getElementById("suggest").innerHTML = result;
								} else { sugDisp(0); }
							}
						}
						xml.send(null);
					}
					clearTimeout (self.loaderTimer);
					self.loaderTimer = setTimeout(loader, 800);
				}
		}
	}
}

function sugLazyHide () {
	var f = function () { sugDisp(0); }
	self.t = setTimeout(f, 500);
	self.showOnLoad = 0;
}

function sugDisp (st) {
	var ul = window.sugBox;
	if (!ul) {
		self.showOnLoad = 1;
		return;
	}
	if (st) {
		window.sugOpen = 1;
		clearTimeout(self.t);
		ul.style.display = "block";
	} else {
		window.sugOpen = 0;
		ul.style.display = "none";
		window.sugAct = 0;
	}
}

function getObj (obj) {
	try { return new ActiveXObject(obj); }
	catch (e) { return null; }
}

