function keywordSearch(layername, textfield, submitbutton) {
	this.textfield = textfield;
	this.layername = layername;
	this.submitbutton = submitbutton;
	this.visibleIsAllowed = true;
	
	this.keyword = '';
	this.kwData = new Array();
	this.kwDataFiltered = new Array();
	this.add = ksAdd;
	this.draw = ksDraw;
	
	this.search = ksSearch;
	this.searchOnClick = ksSearchOnClick;
	this.onPressButton = ksOnPressButton;
	this.hidePopup = ksHidePopup;
	
	this.setKeyword = ksSetKeyword;
	this.checkInput = ksCheckInput;
	
	if (_BROWSER == 'INTERNET_EXPLORER') {
		document.attachEvent("onkeydown", onPressButton);
	} else {
		document.onkeydown = this.onPressButton;
	}
}

function onKwSuccess(o) {
	keywordSearch.kwData = Array();
	var retVal = o.responseText.trim();
	var jsonData = Ext.util.JSON.decode(retVal);
	for (var i = 0; i < jsonData.length; i++) {
		keywordSearch.add(jsonData[i]);
	}
	keywordSearch.draw();
}

function ksCheckInput(word) {
	this.setKeyword(word);
	if (word.length >= ksMinWordLength) {
		ajaxRequest(onKwSuccess, null, 'POST', 'method=getKeywords&word=' + word);
	} else {
		this.hidePopup();
	}
}

function ksSetKeyword(word) {
	this.keyword = word;
}

function ksSearch(key) {
	tf = document.getElementById(this.textfield);
	tf.value = this.kwDataFiltered[key];
	tf.blur();
	this.draw(key);
}

function ksSearchOnClick(key) {
	this.search(key);
	this.onPressButton(13, true);
}

function ksAdd(word) {
	this.kwData[this.kwData.length] = word;
}

function ksDraw(act) {
	if (!act && (act != 0)) {
		act = -1;
	}
	ksActiv = act;
	var output = '';
	var temp = '';
	this.kwDataFiltered = Array();
	kwLength = this.keyword.length;
	
	for (var key = 0; key < this.kwData.length; key++) {
		var entry = this.kwData[key];
		temp = entry.substring(0, kwLength);
		if (temp.toLowerCase()==this.keyword.toLowerCase() && this.keyword) {
			this.kwDataFiltered[this.kwDataFiltered.length] = this.kwData[key];
		}
	}
	for (var key = 0; key < this.kwDataFiltered.length; key++) {
		if (key == act) {
			className = "kwsEntry_activ";
		} else {
			className = "kwsEntry";
		}
		output += "<a href=\"javascript:" + ksName + ".searchOnClick('" + key + "');\" class=\"" + className + "\">" + this.kwDataFiltered[key] + "</a>\n";
	}
	var layer = document.getElementById(this.layername);
	if ((this.kwDataFiltered.length) && (this.visibleIsAllowed)) {
		layer.style.visibility = "visible";
	} else {
		layer.style.visibility = "hidden";
	}
	layer.innerHTML = output;
	if (this.submitbutton) {
		submitbutton = document.getElementById(this.submitbutton);
		if ((this.keyword != "") && (this.kwDataFiltered.length)) {
			submitbutton.disabled = false;
		} else {
			submitbutton.disabled = true;		
		}
	}
}

function ksHidePopup() {
	var layer = document.getElementById(this.layername);
	layer.style.visibility = "hidden";
}

function ksOnPressButton(e, override) {
	var ksObj = null;
	var keycode;
	
	if (_BROWSER == 'INTERNET_EXPLORER') {
		ksObj = this;
		keycode = e;
	} else {
		eval('ksObj = ' + ksName + ';');
		keycode = e.keyCode;
	}
	if (override) {
		keycode = e;
	}
	
	// return
	if (ksActiv >= 0) {
		if (keycode == 13) {
			ksObj.visibleIsAllowed = false;
			ksObj.hidePopup();
			document.getElementById(ksObj.textfield).form.submit();
		} else {
			ksObj.visibleIsAllowed = true;
		}
	}
	
	// escape
	if (keycode == 27) {
		ksObj.hidePopup();
	} else
	// key up
	if (keycode == 38) {
		newact = parseInt(ksActiv)-parseInt(1);
		if (newact >= 0) {
			ksObj.search(newact);
		}
		return false;
	} else
	// key down
	if (keycode == 40) {
		newact = parseInt(ksActiv) + parseInt(1);
		if (newact < ksObj.kwDataFiltered.length) {
			ksObj.search(newact);
		}
		return false;
	}
}

function onPressButton() {
	keycode = window.event.keyCode;
	eval(ksName + ".onPressButton('" + keycode + "');");
}
