var gQexInit       = false;
var gQexForm       = null;
var gQexHttp       = null;
var gQexElem       = null;
var gQexQuery      = "freeez";
var gQexTmoFlag    = false;
var gQexList       = null;
var gQexListDone   = false;
var gQexDebug      = false;
var gQexSubmitFlag = false;
var gQexTextElem   = null;
var qSettings	   = new Array();

function QexAlert(aText, aInstance) {
	if (qSettings[aInstance]["gQexDebug"]) {
		alert(aText);
	}
}

function QexSetup(aParam) {
	var aInstance  = aParam.Instance;
	if (typeof(qSettings[aInstance]) == 'undefined') {
		qSettings[aInstance] = new Object();
	}
	
	if (qSettings[aInstance]["gQexInit"]) return true;

	var aAppId     = aParam.AppId;
	var aTextElem  = aParam.TextElem;
	var aQexElem   = aParam.QexElem;
	var aQexForm   = aParam.QexForm;
	var aDebug     = aParam.Debug;

	qSettings[aInstance]["gQexTmoInter"] = 250;
	qSettings[aInstance]["gQexListMax"] = 10;
	qSettings[aInstance]["gQexBaseURL"] = "";
	qSettings[aInstance]["gQexTmoId"] = 0;
	qSettings[aInstance]["gQexListCnt"] = 0;
	qSettings[aInstance]["gQexListIdx"] = 0;
	qSettings[aInstance]["gQexBusy"] = false;
	qSettings[aInstance]["gQexListNormal"] = "qex_list qex_list_normal";
	qSettings[aInstance]["gQexListFuzzy"] = "qex_list qex_list_fuzzy";
	qSettings[aInstance]["gQexListSelect"] = "qex_list qex_list_select";	

	if ((aDebug != null) && aDebug) {
		qSettings[aInstance]["gQexDebug"] = true;
	}
	if (aAppId == null) {
		QexAlert("Parameter element AppId is missing");
	}
	if (aTextElem == null) {
		QexAlert("Parameter element TextElem is missing");
	}
	if (aQexElem == null) {
		QexAlert("Parameter element QexElem is missing");
	}

	var gQexTextElem = document.getElementById(aTextElem);
	if (gQexTextElem == null) {
		QexAlert("Text element is missing");
		return false;
	}
	qSettings[aInstance]["gQexTextElem"] = gQexTextElem;

	var gQexElem = document.getElementById(aQexElem);
	if (gQexElem == null) {
		QexAlert("Qex element is missing");
		return false;
	}
	qSettings[aInstance]["gQexElem"] = gQexElem;

	var gQexForm = null;
	if (aQexForm != null) {
		gQexForm = document.getElementById(aQexForm);
		qSettings[aInstance]["gQexForm"] = gQexForm;
		if (gQexForm == null) {
			QexAlert("Qex form is undefined");
			return false;
		} else {
			var gQexSubmitFlag = true;
			qSettings[aInstance]["gQexSubmitFlag"] = gQexSubmitFlag;
		}
	}

	var gQexHttp = null;
	if (typeof XMLHttpRequest != 'undefined') {
		gQexHttp = new XMLHttpRequest();
	}

	if (gQexHttp == null) {
		try {
			gQexHttp  = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			gQexHttp  = null;
		}
	}

	if (gQexHttp == null) {
		try {
			gQexHttp  = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e) {
			gQexHttp  = null;
		}
	}

	if (gQexHttp == null) {
		QexAlert("XmlHttp is not available", aInstance);
		return false;
	}
	qSettings[aInstance]["gQexHttp"] = gQexHttp;
	qSettings[aInstance]["gQexBaseURL"] = "/qexit?APPID=" +  aAppId;
	qSettings[aInstance]["gQexInit"] = true;
	return true;
}

function QexLoadList(aInstance) {
	if (!qSettings[aInstance]["gQexInit"]) return false;

	QexCancelTimeout(aInstance);

	var Query = qSettings[aInstance]["gQexTextElem"].value;
	if (Query == null) {
		Query = "";
	}

	var gOrigQuery = Query;
	qSettings[aInstance]["gOrigQuery"] = Query;  

	var LoadFlag = false;
	if (!LoadFlag && (Query != qSettings[aInstance]["gQexQuery"])) LoadFlag = true;

	var gQexBusy = qSettings[aInstance]["gQexBusy"];
	if (!gQexBusy && LoadFlag) {
		gQexBusy  = true;
		qSettings[aInstance]["gQexQuery"] = Query;

		var URL = qSettings[aInstance]["gQexBaseURL"] + "&query=" + Query;
		qSettings[aInstance]["gQexHttp"].open('GET', URL, true);
		qSettings[aInstance]["gQexHttp"].onreadystatechange = function () {
			if (qSettings[aInstance]["gQexHttp"].readyState == 4) {
				gQexBusy = false;
				var responseText = qSettings[aInstance]["gQexHttp"].responseText;
				responseText = responseText.replace(/ÃŸ/g, "ß");
				responseText = responseText.replace(/Ã¤/g, "ä");
				responseText = responseText.replace(/Ã¼/g, "ü");
				responseText = responseText.replace(/Ã¶/g, "ö");
				QexSetList(responseText, aInstance);
			}
		}

		qSettings[aInstance]["gQexHttp"].send(null);
	}

	QexSetTimeout(aInstance);

	return true;

}

function QexOnKeyDown(aEvt, aInstance) {
	if (!qSettings[aInstance]["gQexInit"]) return false;

	qSettings[aInstance]["gQexListDone"] = false;
	QexCancelTimeout(aInstance);

	var k = 0;

	if (window.event != null) {
		k = window.event.keyCode;
	}
	else {
		if (aEvt != null) {
			k = aEvt.which;
		}
	}

	switch(k) {
		case 38:
			QexScrollList(-1, aInstance);
			break;

		case 40:
			QexScrollList(+1, aInstance);
			break;

		case 13:
			QexSelectList(qSettings[aInstance]["gQexListIdx"], aInstance);
			gQexListDone = true;
			break;

		case 27:
			QexClose(aInstance);
			break;

		default:
			QexSetTimeout(aInstance);
			break;
	}
}

function QexClose(aInstance) {
	if (!qSettings[aInstance]["gQexInit"]) return false;
	qSettings[aInstance]["gQexTextElem"] = qSettings[aInstance]["gOrigQuery"];
	QexSetList("", aInstance);
}

function QexCancelTimeout(aInstance) {
	if (qSettings[aInstance]["gQexTmoFlag"]) {
		window.clearTimeout(qSettings[aInstance]["gQexTmoId"]);
		qSettings[aInstance]["gQexTmoFlag"] = false;
	}
}

function QexSetTimeout(aInstance) {
    qSettings[aInstance]["gQexTmoId"] = window.setTimeout('QexLoadList(' + aInstance + ')', qSettings[aInstance]["gQexTmoInter"]);
	//qSettings[aInstance]["gQexTmoId"] = window.setTimeout('QexLoadList(1)', 250);
    qSettings[aInstance]["gQexTmoFlag"] = true;

}

function QexSetList(aResult, aInstance) {
	if (!qSettings[aInstance]["gQexInit"]) return false;
	qSettings[aInstance]["gQexListIdx"] = -1;
	qSettings[aInstance]["gQexListCnt"] = 0;
	var Text = "";

	if ((aResult != "") && !qSettings[aInstance]["gQexListDone"]) {
		try {
            qSettings[aInstance]["gQexList"] = eval(aResult);
            qSettings[aInstance]["gQexListCnt"] = qSettings[aInstance]["gQexList"].length;
		}
		catch (e) {
			qSettings[aInstance]["gQexListCnt"] = 0;
		}

		if (qSettings[aInstance]["gQexListCnt"] > qSettings[aInstance]["gQexListMax"]) {
			qSettings[aInstance]["gQexListCnt"] = qSettings[aInstance]["gQexListMax"];
		}

		for (var i = 0; i < qSettings[aInstance]["gQexListCnt"]; i++) {
			var c = qSettings[aInstance]["gQexListNormal"];
			if (qSettings[aInstance]["gQexList"][i].mFuzzyCnt != 0) c = qSettings[aInstance]["gQexListFuzzy"];

			Text = Text + '<div id="qex__' + i + '" class="' + c + '" onkeydown="OnListMove();" onclick="QexSelectList(' + i + ',' + aInstance + ');">';
			Text = Text + qSettings[aInstance]["gQexList"][i].mPhrase;
			Text = Text + '</div>';
		}
	}

	if (Text == "") {
		qSettings[aInstance]["gQexElem"].style.display = "none";
	}
	else {
		qSettings[aInstance]["gQexElem"].style.display = "";
		Text = Text + '<div class="qex_close" onclick="QexClose(' + aInstance + ');">Schlie&szlig;en</div>';
	}

	qSettings[aInstance]["gQexElem"].innerHTML = Text;

}

function QexScrollList(aOff, aInstance) {

	if (!qSettings[aInstance]["gQexInit"]) return false;

	if (qSettings[aInstance]["gQexListCnt"] < 1) return;

	qSettings[aInstance]["gQexListIdx"] = qSettings[aInstance]["gQexListIdx"] + aOff;

	var gQexListIdx = qSettings[aInstance]["gQexListIdx"];
	var gQexListCnt = qSettings[aInstance]["gQexListCnt"];
	if (gQexListIdx >= gQexListCnt) gQexListIdx = 0;
	if (gQexListIdx < 0) gQexListIdx = gQexListCnt - 1;

	for (var i = 0; i < gQexListCnt; i++) {
		var e = document.getElementById("qex__" + i);
		if (e != null) {
			var cn = qSettings[aInstance]["gQexListNormal"];
			if (i == gQexListIdx) {
				cn = qSettings[aInstance]["gQexListSelect"];
				qSettings[aInstance]["gQexTextElem"].value = qSettings[aInstance]["gQexList"][i].mPhrase;
			}
			else {
				if (qSettings[aInstance]["gQexList"][i].mFuzzyCnt != 0) {
					cn = qSettings[aInstance]["gQexListFuzzy"];
				}
			}
			e.className = cn;
		}
	}
}

function QexSelectList(aIdx, aInstance) {
	if (!qSettings[aInstance]["gQexInit"]) return false;

	if (qSettings[aInstance]["gQexListCnt"] < 1) return;

	var e = document.getElementById("qex__" + aIdx);
	if (e != null) {
		qSettings[aInstance]["gQexTextElem"].value = qSettings[aInstance]["gQexList"][aIdx].mPhrase;

		QexSetList("", aInstance);
		qSettings[aInstance]["gQexListDone"] = true;

		if (qSettings[aInstance]["gQexSubmitFlag"]) {
			qSettings[aInstance]["gQexForm"].submit();
		}
		else {
			qSettings[aInstance]["gQexTextElem"].focus();
		}
	}

}
