function actb(obj, ca) {
	/* ---- Public Variables ---- */
	this.actb_timeOut = 10000; // Autocomplete Timeout in ms (-1: autocomplete never time out)
	this.actb_lim = 5;    // Number of elements autocomplete can show (-1: no limit)
	this.actb_firstText = false; // should the auto complete be limited to the beginning of keyword?
	this.actb_mouse = true; // Enable Mouse Support
	this.actb_delimiter = new Array(";", "%", "*");  // Delimiter for multiple autocomplete. Set it to empty array for single autocomplete
	this.actb_startcheck = 0; // Show widget only after this number of characters is typed in.
	/* ---- Public Variables ---- */
	/* --- Styles --- */
	this.actb_bgColor = "#254117";
	this.actb_textColor = "#FFFFFF";
	this.actb_hColor = "#000000";
	this.actb_fFamily = "Verdana";
	this.actb_fSize = "14px";
	this.actb_hStyle = "text-decoration:underline;font-weight=\"bold\"";
	/* --- Styles --- */
	/* ---- Private Variables ---- */
	var actb_delimwords = new Array();
	var actb_cdelimword = 0;
	var actb_delimchar = new Array();
	var actb_display = false;
	var actb_pos = 0;
	var actb_total = 0;
	var actb_curr = null;
	var actb_rangeu = 0;
	var actb_ranged = 0;
	var actb_bool = new Array();
	var actb_pre = 0;
	var actb_toid;
	var actb_tomake = false;
	var actb_getpre = "";
	var actb_mouse_on_list = 10;
	var actb_kwcount = 0;
	var actb_caretmove = true;
	this.actb_keywords = new Array();
	/* ---- Private Variables---- */
	this.actb_keywords = ca;
	var actb_self = this;
	actb_curr = obj;
	addEvent(actb_curr, "focus", actb_setup);
	function actb_setup() {
		addEvent(actb_curr, "keydown", actb_checkkey);
		addEvent(actb_curr, "blur", actb_clear);
		addEvent(actb_curr, "keypress", actb_keypress);
		addEvent(actb_curr, "focus", actb_keypress);
	}
	function actb_clear(evt) {
		if (!evt) {
			evt = event;
		}
		
	//	removeEvent(document,"keydown",actb_checkkey);
	//	removeEvent(actb_curr,"blur",actb_clear);
	//	removeEvent(document,"keypress",actb_keypress);
	//	actb_removedisp();
	}
	function actb_parse(n) {
		if (actb_self.actb_delimiter.length > 0) {
			var t = actb_delimwords[actb_cdelimword].trim().addslashes();
			var plen = actb_delimwords[actb_cdelimword].trim().length;
		// alert(actb_self.actb_delimiter);
		//if (actb_self.actb_delimiter.value == "%") {
		//alert();
		//  dwr.util.setValue("actb_delimiwords","");
		//  var t = actb_delimwords[actb_cdelimword].trim().addslashes();
		//  var plen = actb_delimwords[actb_cdelimword].trim().length;
		//}	
		} else {
			var t = actb_curr.value.addslashes();
			var plen = actb_curr.value.length;
		}
		var tobuild = "";
		var i;
		if (actb_self.actb_firstText) {
			var re = new RegExp("^" + t, "i");
		} else {
			var re = new RegExp(t, "i");
		}
		var p = n.search(re);
		for (i = 0; i < p; i++) {
			tobuild += n.substr(i, 1);
		}
		tobuild += "<font style='" + (actb_self.actb_hStyle) + "'>";
		for (i = p; i < plen + p; i++) {
			tobuild += n.substr(i, 1);
		}
		tobuild += "</font>";
		for (i = plen + p; i < n.length; i++) {
			tobuild += n.substr(i, 1);
		}
		return tobuild;
	}
	function actb_generate() {
		if (document.getElementById("tat_table")) {
			actb_display = false;
			document.body.removeChild(document.getElementById("tat_table"));
		}
		if (actb_kwcount == 0) {
			actb_display = false;
			return;
		}
		a = document.createElement("table");
		a.cellSpacing = "1px";
		a.cellPadding = "2px";
		a.width = "357px";
		a.style.position = "absolute";
		a.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft(actb_curr) + "px";
		a.style.backgroundColor = actb_self.actb_bgColor;
		a.id = "tat_table";
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_self.actb_mouse) {
			a.onmouseout = actb_table_unfocus;
			a.onmouseover = actb_table_focus;
		}
		var counter = 0;
		for (i = 0; i < actb_self.actb_keywords.length; i++) {
			if (actb_bool[i]) {
				counter++;
				r = a.insertRow(-1);
				if (first && !actb_tomake) {
					r.style.backgroundColor = actb_self.actb_hColor;
					first = false;
					actb_pos = counter;
				} else {
					if (actb_pre == i) {
						r.style.backgroundColor = actb_self.actb_hColor;
						first = false;
						actb_pos = counter;
					} else {
						r.style.backgroundColor = actb_self.actb_bgColor;
					}
				}
				r.id = "tat_tr" + (j);
				c = r.insertCell(-1);
				c.style.color = actb_self.actb_textColor;
				c.style.fontFamily = actb_self.actb_fFamily;
				c.style.fontSize = actb_self.actb_fSize;
				c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
				c.id = "tat_td" + (j);
				c.setAttribute("pos", j);
				if (actb_self.actb_mouse) {
					c.style.cursor = "pointer";
					c.onclick = actb_mouseclick;
					c.onmouseover = actb_table_highlight;
				}
				j++;
			}
			if (j - 1 == actb_self.actb_lim && j < actb_total) {
				r = a.insertRow(-1);
				r.style.backgroundColor = actb_self.actb_bgColor;
				c = r.insertCell(-1);
				c.style.color = actb_self.actb_textColor;
				c.style.fontFamily = "arial narrow";
				c.style.fontSize = actb_self.actb_fSize;
				c.align = "center";
				replaceHTML(c, "\\/");
				if (actb_self.actb_mouse) {
					c.style.cursor = "pointer";
					c.onclick = actb_mouse_down;
				}
				break;
			}
		}
		actb_rangeu = 1;
		actb_ranged = j - 1;
		actb_display = true;
		if (actb_pos <= 0) {
			actb_pos = 1;
		}
	}
	function actb_remake() {
		document.body.removeChild(document.getElementById("tat_table"));
		a = document.createElement("table");
		a.cellSpacing = "1px";
		a.cellPadding = "2px";
		a.width = "357px";
		a.style.position = "absolute";
		a.style.top = eval(curTop(actb_curr) + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft(actb_curr) + "px";
		a.style.backgroundColor = actb_self.actb_bgColor;
		a.id = "tat_table";
		if (actb_self.actb_mouse) {
			a.onmouseout = actb_table_unfocus;
			a.onmouseover = actb_table_focus;
		}
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_rangeu > 1) {
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_self.actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_self.actb_textColor;
			c.style.fontFamily = "arial narrow";
			c.style.fontSize = actb_self.actb_fSize;
			c.align = "center";
			replaceHTML(c, "/\\");
			if (actb_self.actb_mouse) {
				c.style.cursor = "pointer";
				c.onclick = actb_mouseclick;
			}
		}
		for (i = 0; i < actb_self.actb_keywords.length; i++) {
			if (actb_bool[i]) {
				if (j >= actb_rangeu && j <= actb_ranged) {
					r = a.insertRow(-1);
					r.style.backgroundColor = actb_self.actb_bgColor;
					r.id = "tat_tr" + (j);
					c = r.insertCell(-1);
					c.style.color = actb_self.actb_textColor;
					c.style.fontFamily = actb_self.actb_fFamily;
					c.style.fontSize = actb_self.actb_fSize;
					c.innerHTML = actb_parse(actb_self.actb_keywords[i]);
					c.id = "tat_td" + (j);
					c.setAttribute("pos", j);
					if (actb_self.actb_mouse) {
						c.style.cursor = "pointer";
						c.onclick = actb_mouseclick;
						c.onmouseover = actb_table_highlight;
					}
					j++;
				} else {
					j++;
				}
			}
			if (j > actb_ranged) {
				break;
			}
		}
		if (j - 1 < actb_total) {
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_self.actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_self.actb_textColor;
			c.style.fontFamily = "arial narrow";
			c.style.fontSize = actb_self.actb_fSize;
			c.align = "center";
			replaceHTML(c, "\\/");
			if (actb_self.actb_mouse) {
				c.style.cursor = "pointer";
				c.onclick = actb_mouse_down;
			}
		}
	}
	function actb_goup() {
		if (!actb_display) {
			return;
		}
		if (actb_pos == 1) {
			return;
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos--;
		if (actb_pos < actb_rangeu) {
			actb_moveup();
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	function actb_godown() {
		if (!actb_display) {
			return;
		}
		if (actb_pos == actb_total) {
			return;
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos++;
		if (actb_pos > actb_ranged) {
			actb_movedown();
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	function actb_movedown() {
		actb_rangeu++;
		actb_ranged++;
		actb_remake();
	}
	function actb_moveup() {
		actb_rangeu--;
		actb_ranged--;
		actb_remake();
	}
	/* Mouse */
	function actb_mouse_down() {
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos++;
		actb_movedown();
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_hColor;
		actb_curr.focus();
		actb_mouse_on_list = 0;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	function actb_mouse_up(evt) {
		if (!evt) {
			evt = event;
		}
		if (evt.stopPropagation) {
			evt.stopPropagation();
		} else {
			evt.cancelBubble = true;
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos--;
		actb_moveup();
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_hColor;
		actb_curr.focus();
		actb_mouse_on_list = 0;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	function actb_mouseclick(evt) {
		if (!evt) {
			evt = event;
		}
		if (!actb_display) {
			return;
		}
		actb_mouse_on_list = 0;
		actb_pos = this.getAttribute("pos");
		actb_penter();
	}
	function actb_table_focus() {
		actb_mouse_on_list = 1;
	}
	function actb_table_unfocus() {
		actb_mouse_on_list = 0;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	function actb_table_highlight() {
		actb_mouse_on_list = 1;
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_bgColor;
		actb_pos = this.getAttribute("pos");
		while (actb_pos < actb_rangeu) {
			actb_moveup();
		}
		while (actb_pos > actb_ranged) {
			actb_movedown();
		}
		document.getElementById("tat_tr" + actb_pos).style.backgroundColor = actb_self.actb_hColor;
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
	}
	/* ---- */
	function actb_insertword(a) {
		if (actb_self.actb_delimiter.length > 0) {
			str = "";
			l = 0;
			for (i = 0; i < actb_delimwords.length; i++) {
				if (actb_cdelimword == i) {
					prespace = postspace = "";
					gotbreak = false;
					for (j = 0; j < actb_delimwords[i].length; ++j) {
						if (actb_delimwords[i].charAt(j) != " ") {
							gotbreak = true;
							break;
						}
						prespace += " ";
					}
					for (j = actb_delimwords[i].length - 1; j >= 0; --j) {
						if (actb_delimwords[i].charAt(j) != " ") {
							break;
						}
						postspace += " ";
					}
					str += prespace;
					str += a;
					l = str.length;
					if (gotbreak) {
						str += postspace;
					}
				} else {
					str += actb_delimwords[i];
				}
				if (i != actb_delimwords.length - 1) {
					str += actb_delimchar[i];
				}
			}
			actb_curr.value = str;
			setCaret(actb_curr, l);
		} else {
			actb_curr.value = a;
		}
		actb_mouse_on_list = 0;
		actb_removedisp();
	}
	function actb_penter() {
		if (!actb_display) {
			return;
		}
		actb_display = false;
		var word = "";
		var c = 0;
		for (var i = 0; i <= actb_self.actb_keywords.length; i++) {
			if (actb_bool[i]) {
				c++;
			}
			if (c == actb_pos) {
				word = actb_self.actb_keywords[i];
				break;
			}
		}
		actb_insertword(word);
		l = getCaretStart(actb_curr);
	}
	function actb_removedisp() {
		if (actb_mouse_on_list == 0) {
			actb_display = 0;
			if (document.getElementById("tat_table")) {
				document.body.removeChild(document.getElementById("tat_table"));
			}
			if (actb_toid) {
				clearTimeout(actb_toid);
			}
		}
	}
	function actb_keypress(e) {
		if (actb_caretmove) {
			stopEvent(e);
		}
		return !actb_caretmove;
	}
	function actb_checkkey(evt) {
		if (!evt) {
			evt = event;
		}
		a = evt.keyCode;
		caret_pos_start = getCaretStart(actb_curr);
		actb_caretmove = 0;
		switch (a) {
		  case 38:
			actb_goup();
			actb_caretmove = 1;
			return false;
			break;
		  case 40:
			actb_godown();
			actb_caretmove = 1;
			return false;
			break;
		  case 13:
		  case 9:
			if (actb_display) {
				actb_caretmove = 1;
				actb_penter();
				return false;
			} else {
				return true;
			}
			break;
		  default:
			setTimeout(function () {
				actb_tocomplete(a);
			}, 50);
			break;
		}
	}
	function actb_tocomplete(kc) {
		if (kc == 38 || kc == 40 || kc == 13) {
			return;
		}
		var i;
		if (actb_display) {
			var word = 0;
			var c = 0;
			for (var i = 0; i <= actb_self.actb_keywords.length; i++) {
				if (actb_bool[i]) {
					c++;
				}
				if (c == actb_pos) {
					word = i;
					break;
				}
			}
			actb_pre = word;
		} else {
			actb_pre = -1;
		}
		if (actb_curr.value == "") {
			actb_mouse_on_list = 0;
			actb_removedisp();
			return;
		}
		if (actb_self.actb_delimiter.length > 0) {
			caret_pos_start = getCaretStart(actb_curr);
			caret_pos_end = getCaretEnd(actb_curr);
			delim_split = "";
			for (i = 0; i < actb_self.actb_delimiter.length; i++) {
				delim_split += actb_self.actb_delimiter[i];
			}
			delim_split = delim_split.addslashes();
			delim_split_rx = new RegExp("([" + delim_split + "])");
			c = 0;
			actb_delimwords = new Array();
			actb_delimwords[0] = "";
			for (i = 0, j = actb_curr.value.length; i < actb_curr.value.length; i++, j--) {
				if (actb_curr.value.substr(i, j).search(delim_split_rx) == 0) {
					ma = actb_curr.value.substr(i, j).match(delim_split_rx);
					actb_delimchar[c] = ma[1];
					c++;
					actb_delimwords[c] = "";
				} else {
					actb_delimwords[c] += actb_curr.value.charAt(i);
				}
			}
			var l = 0;
			actb_cdelimword = -1;
			for (i = 0; i < actb_delimwords.length; i++) {
				if (caret_pos_end >= l && caret_pos_end <= l + actb_delimwords[i].length) {
					actb_cdelimword = i;
				}
				l += actb_delimwords[i].length + 1;
			}
			var ot = actb_delimwords[actb_cdelimword].trim();
			var t = actb_delimwords[actb_cdelimword].addslashes().trim();
		} else {
			var ot = actb_curr.value;
			var t = actb_curr.value.addslashes();
		}
		if (ot.length == 0) {
			actb_mouse_on_list = 0;
			actb_removedisp();
		}
		if (ot.length < actb_self.actb_startcheck) {
			return this;
		}
		if (actb_self.actb_firstText) {
			var re = new RegExp("^" + t, "i");
		} else {
			var re = new RegExp(t, "i");
		}
		actb_total = 0;
		actb_tomake = false;
		actb_kwcount = 0;
		for (i = 0; i < actb_self.actb_keywords.length; i++) {
			actb_bool[i] = false;
			if (re.test(actb_self.actb_keywords[i])) {
				actb_total++;
				actb_bool[i] = true;
				actb_kwcount++;
				if (actb_pre == i) {
					actb_tomake = true;
				}
			}
		}
		if (actb_toid) {
			clearTimeout(actb_toid);
		}
		if (actb_self.actb_timeOut > 0) {
			actb_toid = setTimeout(function () {
				actb_mouse_on_list = 0;
				actb_removedisp();
			}, actb_self.actb_timeOut);
		}
		actb_generate();
	}
	return this;
}

