
function autoComplete(obj){
	this.timeOut = -1;
	this.showWords = -1;
	this.firstText = false;
	this.mouseSupport = true;
	this.delimiter = new Array();
	this.startCheck = 2;

	this.borderColor = '#999';
	this.bgColor = '#fff';
	this.textColor = '#333';
	this.hiliteColor = '#ccf';
	this.fontFamily = 'Verdana';
	this.fontSize = '11px';
	this.hStyle = 'text-decoration:underline; font-weight:bold;';
	this.width = '196px';

	var delimwords = new Array();
	var cdelimword = 0;
	var delimchar = new Array();
	var display = false;
	var pos = 0;
	var total = 0;
	var curr = null;
	var rangeu = 0;
	var ranged = 0;
	var bool = new Array();
	var pre = 0;
	var toid;
	var tomake = false;
	var getpre = "";
	var mouseSupport_on_list = 1;
	var kwcount = 0;
	var caretmove = false;
	this.keywords = new Array('Conrad Adam',
'Charlotte  Adler',
'Saika Alam',
'Lindsey Alexander',
'David Allison',
'Rebecca Amboaje',
'Tom Amlot',
'Louise Barretto',
'Kim Beatson',
'Jo Beecham',
'Marilyn Bell',
'Gillian Bishop',
'Sue Bland',
'Duncan Brooks',
'Ruth Bross',
'Laura Brown',
'Alison  Bull',
'Harriet Burge',
'John Burrell',
'jane butler',
'James Carroll',
'James Carroll',
'Aisling Collins',
'Pamela Collis',
'Daniel Coombes',
'Jane  Craig',
'Ursula Danagher',
'Philippa Dolan',
'Michael  Drake',
'Rachel Duke',
'Melanie Dunton',
'Elizabeth Edwards',
'Joanne Edwards',
'Carol Ellinas',
'Carol Ellinas',
'David Emmerson',
'Caroline Falkus',
'Tom Farrell',
'Sarah Fleminger',
'Jeremy Ford',
'Fiona Forsyth',
'Elizabeth Francis',
'Rebekah Gershuny',
'Amandeep Gill',
'Judith Goodman',
'Eileen  Graham ',
'Rosamund Gregory',
'John Grogan',
'John Grogan',
'Nicola Gunn',
'Nicole Hackett',
'Dennis Hall',
'John Halley',
'Kate Hamilton',
'Emma Hatley',
'William Hogg',
'Belinda Hornsby-Cox',
'Grant Howell',
'Bernadette  Hoy',
'Eva Huckle',
'Andrew Johnston',
'Lisa Jones',
'Alan Kaufman',
'Anne Kay',
'Joanna Kay',
'Margaret Kelly',
'Margaret Kelly',
'Suzanne  Kingston ',
'Mark Kosmin-Barr',
'Lois Langton',
'KARINA LEAPMAN',
'Jacky Lewis',
'Patricia MacAvock',
'Gail Marchant-Daisley',
'Peter Martin',
'William Massey',
'Simon McKirgan',
'Magnus Mill',
'Elizabeth Muirhead',
'Rebecca  Newitt',
'Paul Newton',
'Claire Nickolds',
'Ann Northover',
'Maeve O\'Higgins',
'Eileen Meredith Pembridge',
'Lisa Pepper',
'Helen Pidgeon',
'Helen Pidgeon',
'Kathy Pinney',
'James Pirrie',
'Duane Plant',
'Philip Pollecoff',
'John Porteous',
'Suzy Power',
'Susan Pyle',
'Dominic Raeside',
'Robert Reid',
'Emma Ries',
'Karen Ritchie',
'Helen Robbins',
'Michael  Rowlands',
'Liz Saunders',
'Nigel Shepherd',
'Frances Sieber',
'Jane Simpson',
'Ruth Smallacombe',
'Alan Smith',
'Colin Smith',
'James Stewart',
'Elizabeth Sulkin',
'Haema Sundram',
'Florence Terry',
'test test',
'Camilla Thornton',
'Andrew Todd',
'Janet  Tresman',
'Michael Tulloch',
'Fiona Turner',
'Michelle Uppal',
'Sue  Varty',
'Panay Vassiliou',
'Karin Walker',
'Karen Wallace',
'Bradley Williams',
'Rachel  Woodd',
'Anna  Worwood',
'Hazel Wright',
'Jane Wright',
'Helen Young');
	var self = this;

	curr = obj;
	
	addEvent(curr,"focus",setup);
	function setup(){
		addEvent(document,"keydown",checkkey);
		addEvent(curr,"blur",clear);
		addEvent(document,"keypress",keypress);
	}

	function clear(evt){
		if (!evt) evt = event;
		removeEvent(document,"keydown",checkkey);
		removeEvent(curr,"blur",clear);
		removeEvent(document,"keypress",keypress);
		removedisp();
	}
	function parse(n){
		if (self.delimiter.length > 0){
			var t = delimwords[cdelimword].trim().addslashes();
			var plen = delimwords[cdelimword].trim().length;
		}else{
			var t = curr.value.addslashes();
			var plen = curr.value.length;
		}
		var tobuild = '';
		var i;

		if (self.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='"+(self.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 generate(){
		if (document.getElementById('tat_table')){ display = false;document.body.removeChild(document.getElementById('tat_table')); } 
		if (kwcount == 0){
			display = false;
			return;
		}
		a = document.createElement('table');
		a.cellSpacing = '0px';
		a.cellPadding = '2px';
		a.width = self.width;
		a.style.position='absolute';
		a.style.top = eval(curTop(curr) + curr.offsetHeight) + "px";
		a.style.left = eval(curLeft(curr) + 1) + "px";
		a.style.backgroundColor=self.bgColor;
		a.style.border = '1px solid '+self.borderColor
		a.id = 'tat_table';
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (self.mouseSupport){
			a.onmouseout = table_unfocus;
			a.onmouseover = table_focus;
		}
		var counter = 0;
		for (i=0;i<self.keywords.length;i++){
			if (bool[i]){
				counter++;
				r = a.insertRow(-1);
				if (first && !tomake){
					r.style.backgroundColor = self.hiliteColor;
					first = false;
					pos = counter;
				}else if(pre == i){
					r.style.backgroundColor = self.hiliteColor;
					first = false;
					pos = counter;
				}else{
					r.style.backgroundColor = self.bgColor;
				}
				r.id = 'tat_tr'+(j);
				c = r.insertCell(-1);
				c.style.color = self.textColor;
				c.style.fontFamily = self.fontFamily;
				c.style.fontSize = self.fontSize;
				c.innerHTML = parse(self.keywords[i]);
				c.id = 'tat_td'+(j);
				c.setAttribute('pos',j);
				if (self.mouseSupport){
					c.style.cursor = 'pointer';
					c.onclick=mouseSupportclick;
					c.onmouseover = table_highlight;
				}
				j++;
			}
			if (j - 1 == self.showWords && j < total){
				r = a.insertRow(-1);
				r.style.backgroundColor = self.bgColor;
				c = r.insertCell(-1);
				c.style.color = self.textColor;
				c.style.fontFamily = 'arial narrow';
				c.style.fontSize = self.fontSize;
				c.align='center';
				replaceHTML(c,'\\/');
				if (self.mouseSupport){
					c.style.cursor = 'pointer';
					c.onclick = mouseSupport_down;
				}
				break;
			}
		}
		rangeu = 1;
		ranged = j-1;
		display = true;
		if (pos <= 0) pos = 1;
	}
	function 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(curr) + curr.offsetHeight) + "px";
		a.style.left = curLeft(curr) + "px";
		a.style.backgroundColor=self.bgColor;
		a.id = 'tat_table';
		if (self.mouseSupport){
			a.onmouseout= table_unfocus;
			a.onmouseover=table_focus;
		}
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (rangeu > 1){
			r = a.insertRow(-1);
			r.style.backgroundColor = self.bgColor;
			c = r.insertCell(-1);
			c.style.color = self.textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = self.fontSize;
			c.align='center';
			replaceHTML(c,'/\\');
			if (self.mouseSupport){
				c.style.cursor = 'pointer';
				c.onclick = mouseSupport_up;
			}
		}
		for (i=0;i<self.keywords.length;i++){
			if (bool[i]){
				if (j >= rangeu && j <= ranged){
					r = a.insertRow(-1);
					r.style.backgroundColor = self.bgColor;
					r.id = 'tat_tr'+(j);
					c = r.insertCell(-1);
					c.style.color = self.textColor;
					c.style.fontFamily = self.fontFamily;
					c.style.fontSize = self.fontSize;
					c.innerHTML = parse(self.keywords[i]);
					c.id = 'tat_td'+(j);
					c.setAttribute('pos',j);
					if (self.mouseSupport){
						c.style.cursor = 'pointer';
						c.onclick=mouseSupportclick;
						c.onmouseover = table_highlight;
					}
					j++;
				}else{
					j++;
				}
			}
			if (j > ranged) break;
		}
		if (j-1 < total){
			r = a.insertRow(-1);
			r.style.backgroundColor = self.bgColor;
			c = r.insertCell(-1);
			c.style.color = self.textColor;
			c.style.fontFamily = 'arial narrow';
			c.style.fontSize = self.fontSize;
			c.align='center';
			replaceHTML(c,'\\/');
			if (self.mouseSupport){
				c.style.cursor = 'pointer';
				c.onclick = mouseSupport_down;
			}
		}
	}
	function goup(){
		if (!display) return;
		if (pos == 1) return;
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.bgColor;
		pos--;
		if (pos < rangeu) moveup();
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.hiliteColor;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list=0;removedisp();},self.timeOut);
	}
	function godown(){
		if (!display) return;
		if (pos == total) return;
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.bgColor;
		pos++;
		if (pos > ranged) movedown();
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.hiliteColor;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list=0;removedisp();},self.timeOut);
	}
	function movedown(){
		rangeu++;
		ranged++;
		remake();
	}
	function moveup(){
		rangeu--;
		ranged--;
		remake();
	}

	/* Mouse */
	function mouseSupport_down(){
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.bgColor;
		pos++;
		movedown();
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.hiliteColor;
		curr.focus();
		mouseSupport_on_list = 0;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list=0;removedisp();},self.timeOut);
	}
	function mouseSupport_up(evt){
		if (!evt) evt = event;
		if (evt.stopPropagation){
			evt.stopPropagation();
		}else{
			evt.cancelBubble = true;
		}
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.bgColor;
		pos--;
		moveup();
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.hiliteColor;
		curr.focus();
		mouseSupport_on_list = 0;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list=0;removedisp();},self.timeOut);
	}
	function mouseSupportclick(evt){
		if (!evt) evt = event;
		if (!display) return;
		mouseSupport_on_list = 0;
		pos = this.getAttribute('pos');
		penter();
	}
	function table_focus(){
		mouseSupport_on_list = 1;
	}
	function table_unfocus(){
		mouseSupport_on_list = 0;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list = 0;removedisp();},self.timeOut);
	}
	function table_highlight(){
		mouseSupport_on_list = 1;
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.bgColor;
		pos = this.getAttribute('pos');
		while (pos < rangeu) moveup();
		while (pos > ranged) movedown();
		document.getElementById('tat_tr'+pos).style.backgroundColor = self.hiliteColor;
		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list = 0;removedisp();},self.timeOut);
	}
	/* ---- */

	function insertword(a){
		if (self.delimiter.length > 0){
			str = '';
			l=0;
			for (i=0;i<delimwords.length;i++){
				if (cdelimword == i){
					prespace = postspace = '';
					gotbreak = false;
					for (j=0;j<delimwords[i].length;++j){
						if (delimwords[i].charAt(j) != ' '){
							gotbreak = true;
							break;
						}
						prespace += ' ';
					}
					for (j=delimwords[i].length-1;j>=0;--j){
						if (delimwords[i].charAt(j) != ' ') break;
						postspace += ' ';
					}
					str += prespace;
					str += a;
					l = str.length;
					if (gotbreak) str += postspace;
				}else{
					str += delimwords[i];
				}
				if (i != delimwords.length - 1){
					str += delimchar[i];
				}
			}
			curr.value = str;
			setCaret(curr,l);
		}else{
			curr.value = a;
		}
		mouseSupport_on_list = 0;
		removedisp();
	}
	function penter(){
		if (!display) return;
		display = false;
		var word = '';
		var c = 0;
		for (var i=0;i<=self.keywords.length;i++){
			if (bool[i]) c++;
			if (c == pos){
				word = self.keywords[i];
				break;
			}
		}
		insertword(word);
		l = getCaretStart(curr);
	}
	function removedisp(){
		if (mouseSupport_on_list==0){
			display = 0;
			if (document.getElementById('tat_table')){ document.body.removeChild(document.getElementById('tat_table')); }
			if (toid) clearTimeout(toid);
		}
	}
	function keypress(e){
		if (caretmove) stopEvent(e);
		return !caretmove;
	}
	function checkkey(evt){
		if (!evt) evt = event;
		a = evt.keyCode;
		caret_pos_start = getCaretStart(curr);
		caretmove = 0;
		switch (a){
			case 38:
				goup();
				caretmove = 1;
				return false;
				break;
			case 40:
				godown();
				caretmove = 1;
				return false;
				break;
			case 13: case 9:
				if (display){
					caretmove = 1;
					penter();
					return false;
				}else{
					return true;
				}
				break;
			default:
				setTimeout(function(){tocomplete(a)},50);
				break;
		}
	}

	function tocomplete(kc){
		if (kc == 38 || kc == 40 || kc == 13) return;
		var i;
		if (display){ 
			var word = 0;
			var c = 0;
			for (var i=0;i<=self.keywords.length;i++){
				if (bool[i]) c++;
				if (c == pos){
					word = i;
					break;
				}
			}
			pre = word;
		}else{ pre = -1};
		
		if (curr.value == ''){
			mouseSupport_on_list = 0;
			removedisp();
			return;
		}
		if (self.delimiter.length > 0){
			caret_pos_start = getCaretStart(curr);
			caret_pos_end = getCaretEnd(curr);
			
			delim_split = '';
			for (i=0;i<self.delimiter.length;i++){
				delim_split += self.delimiter[i];
			}
			delim_split = delim_split.addslashes();
			delim_split_rx = new RegExp("(["+delim_split+"])");
			c = 0;
			delimwords = new Array();
			delimwords[0] = '';
			for (i=0,j=curr.value.length;i<curr.value.length;i++,j--){
				if (curr.value.substr(i,j).search(delim_split_rx) == 0){
					ma = curr.value.substr(i,j).match(delim_split_rx);
					delimchar[c] = ma[1];
					c++;
					delimwords[c] = '';
				}else{
					delimwords[c] += curr.value.charAt(i);
				}
			}

			var l = 0;
			cdelimword = -1;
			for (i=0;i<delimwords.length;i++){
				if (caret_pos_end >= l && caret_pos_end <= l + delimwords[i].length){
					cdelimword = i;
				}
				l+=delimwords[i].length + 1;
			}
			var ot = delimwords[cdelimword].trim(); 
			var t = delimwords[cdelimword].addslashes().trim();
		}else{
			var ot = curr.value;
			var t = curr.value.addslashes();
		}
		if (ot.length == 0){
			mouseSupport_on_list = 0;
			removedisp();
		}
		if (ot.length < self.startCheck) return this;
		if (self.firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}

		total = 0;
		tomake = false;
		kwcount = 0;
		for (i=0;i<self.keywords.length;i++){
			bool[i] = false;
			if (re.test(self.keywords[i])){
				total++;
				bool[i] = true;
				kwcount++;
				if (pre == i) tomake = true;
			}
		}

		if (toid) clearTimeout(toid);
		if (self.timeOut > 0) toid = setTimeout(function(){mouseSupport_on_list = 0;removedisp();},self.timeOut);
		generate();
	}

	function addEvent(obj,event_name,func_name){
		if (obj.attachEvent){
			obj.attachEvent("on"+event_name, func_name);
		}else if(obj.addEventListener){
			obj.addEventListener(event_name,func_name,true);
		}else{
			obj["on"+event_name] = func_name;
		}
	}
	
	function removeEvent(obj,event_name,func_name){
		if (obj.detachEvent){
			obj.detachEvent("on"+event_name,func_name);
		}else if(obj.removeEventListener){
			obj.removeEventListener(event_name,func_name,true);
		}else{
			obj["on"+event_name] = null;
		}
	}
	
	function stopEvent(evt){
		evt || window.event;
		if (evt.stopPropagation){
			evt.stopPropagation();
			evt.preventDefault();
		}else if(typeof evt.cancelBubble != "undefined"){
			evt.cancelBubble = true;
			evt.returnValue = false;
		}
		return false;
	}
	
	function getElement(evt){
		if (window.event){
			return window.event.srcElement;
		}else{
			return evt.currentTarget;
		}
	}
	
	function getCaretEnd(obj){
		if(typeof obj.selectionEnd != "undefined"){
			return obj.selectionEnd;
		}else if(document.selection&&document.selection.createRange){
			var M=document.selection.createRange();
			try{
				var Lp = M.duplicate();
				Lp.moveToElementText(obj);
			}catch(e){
				var Lp=obj.createTextRange();
			}
			Lp.setEndPoint("EndToEnd",M);
			var rb=Lp.text.length;
			if(rb>obj.value.length){
				return -1;
			}
			return rb;
		}
	}
	
	function getCaretStart(obj){
		if(typeof obj.selectionStart != "undefined"){
			return obj.selectionStart;
		}else if(document.selection&&document.selection.createRange){
			var M=document.selection.createRange();
			try{
				var Lp = M.duplicate();
				Lp.moveToElementText(obj);
			}catch(e){
				var Lp=obj.createTextRange();
			}
			Lp.setEndPoint("EndToStart",M);
			var rb=Lp.text.length;
			if(rb>obj.value.length){
				return -1;
			}
			return rb;
		}
	}
	
	function setCaret(obj,l){
		obj.focus();
		if (obj.setSelectionRange){
			obj.setSelectionRange(l,l);
		}else if(obj.createTextRange){
			m = obj.createTextRange();		
			m.moveStart('character',l);
			m.collapse();
			m.select();
		}
	}
	
	function setSelection(obj,s,e){
		obj.focus();
		if (obj.setSelectionRange){
			obj.setSelectionRange(s,e);
		}else if(obj.createTextRange){
			m = obj.createTextRange();		
			m.moveStart('character',s);
			m.moveEnd('character',e);
			m.select();
		}
	}
	
	String.prototype.addslashes = function(){
		return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
	}
	String.prototype.trim = function() {
	    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
	};
	
	function curLeft(obj){
		toreturn = 0;
		while(obj){
			toreturn += obj.offsetLeft;
			obj = obj.offsetParent;
		}
		return toreturn;
	}
	function curTop(obj){
		toreturn = 0;
		while(obj){
			toreturn += obj.offsetTop;
			obj = obj.offsetParent;
		}
		return toreturn;
	}
	
	function replaceHTML(obj,text){
		while(el = obj.childNodes[0]){
			obj.removeChild(el);
		};
		obj.appendChild(document.createTextNode(text));
	}

	return this;
}


