function actb(obj,ca){


	/* ---- Public Variables ---- */


	this.actb_timeOut = -1; // Autocomplete Timeout in ms (-1: autocomplete never time out)


	this.actb_lim = 4;    // Number of elements autocomplete can show (-1: no limit)


	this.actb_firstText = true; // 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 = 1; // Show widget only after this number of characters is typed in.


	/* ---- Public Variables ---- */





	/* --- Styles --- */


	this.actb_bgColor = '#FFFFFF';


	this.actb_textColor = '#213760';


	this.actb_hColor = '#FFB949';


	this.actb_fFamily = 'Arial';


	this.actb_fSize = '8pt';


	this.actb_hStyle = 'color:#888888; text-decoration:none; 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 = 1;


	var actb_kwcount = 0;


	var actb_caretmove = false;


	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(document,"keydown",actb_checkkey);


		addEvent(actb_curr,"blur",actb_clear);


		addEvent(document,"keypress",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;


		}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.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.align = 'left';


					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.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_mouse_up;


			}


		}


		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.align = 'left';


						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;


}
