function TypeAhead(control, serviceUrl, styleUrl, queryParam){
	if(!TypeAhead.prototype.initialized){
		var t = this;
		var p = TypeAhead.prototype;
		p.domUtil = new DomUtil();
		p.downKey = 40;
		p.upKey = 38;
		p.enterKey = 13;
		p.tabKey = 8;
		p.showResults = function(){
			this.results.style.display = '';
		}
		p.hideResults = function(){
			this.results.style.display = 'none';
		}
		p.setResults = function(content){
			var t = this;
			t.results.innerHTML = '';
			//t.hideResults();
			if(isArray(content)&&content.length>0){
				var select = document.createElement('select');
				select.size = content.length;
				if(select.size>10){
					select.size = 10;
				}
				for(var i=0;i<content.length && i<10;i++){
					var option = document.createElement('option');
					option.innerHTML = content[i];
					option.value = content[i];
					select.appendChild(option);
					select.size = select.size + 1;
					select.selectedIndex = -1;
				}
				t.results.appendChild(select);
				t.showResults();
			}
			else if(content!=''){
				t.results.innerHTML = content;
				t.showResults();
			}
		}
		p.search = function(k){
			var t = this;
			var e = document.getElementById('debug');
			var r = this.results;
			var key = (window.event? window.event.keyCode :k.which);
			//e.innerHTML = e.innerHTML + '; &nbsp; '+ key;
			switch(key){
				case this.downKey:
					var select = t.results.getElementsByTagName('select');
					if(select && select[0]){
						select = select[0];
						if(select.selectedIndex < select.options.length - 1){
							select.selectedIndex = select.selectedIndex + 1;
							t.control.value = select.options[select.selectedIndex].innerHTML;
						}
					}
					return false;
					break;
				case this.upKey:
					var select = t.results.getElementsByTagName('select');
					if(select && select[0]){
						select = select[0];
						if(select.selectedIndex > 0){
							select.selectedIndex = select.selectedIndex - 1;
							t.control.value = select.options[select.selectedIndex].innerHTML;
						}
					}
					return false;
					break;
				default:
					//if(key >
					var c = this.control;
					var v = c.value;
					if(v.length>0){
						new HttpRequest(t.serviceUrl + '?'+t.queryParam+'=' + v, t.results, t.styleUrl, true).submit();					
						var select = r.getElementsByTagName('select');
						if(select && select[0]){
							select = select[0];
							select.input = c;
							select.onchange = function(){
								this.input.value = this.options[this.selectedIndex].innerHTML;
								this.input.focus();
							}
						}
					}
					else{
						r.innerHTML = '';
					}
					break;
			}
			t.control.focus();
		}
			
			
		p.initialized = true;
	}
	var t = this;
	t.serviceUrl = serviceUrl;
	t.styleUrl = styleUrl;
	t.control = this.domUtil.getElement(control);
	t.results = document.createElement('div');
	t.queryParam = queryParam;
	var s = t.results.style;
	s.left = t.control.style.left;
	s.top = t.control.style.top;
	//s.height = '50';
	//s.width = '100';
	s.border = 'none';
	s.borderColor = 'red';
	t.control.parentNode.appendChild(t.results);
	t.control.typeAhead = this;
	t.control.onkeyup = function(k){
		this.typeAhead.search(k);
	}
	t.setResults('');
}

function isArray(object){
	if (object.constructor.toString().indexOf("Array") == -1){
		return false;
	}
	else{
		return true;
	}
}
		