
function getXmlHttpRequestObject() {

	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	}

}
	
var searchReq = getXmlHttpRequestObject();

	
function SearchSuggest(elem,type,sUrlRoot)
{


	var me = this;

	var suggs = new Array();

	this.elem = elem;

	this.eligible = new Array();


	this.inputText = null;

	this.highlighted = -1;


	this.div = document.getElementById("SearchSuggest");



	var TAB = 9;
	var ESC = 27;
	var KEYUP = 38;
	var KEYDN = 40;
	var ENTER = 13;	


	elem.setAttribute("autocomplete","off");


	if(!elem.id)
	{
		var id = "SearchSuggest" + idCounter;
		idCounter++;

		elem.id = id;
	}

	elem.onblur = function(){me.useSuggestion() || me.hideDiv()};
	

	elem.onkeydown = function(ev)
	{
		var key = me.getKeyCode(ev);

		switch(key)
		{
			case TAB:
			me.useSuggestion();
			me.hideDiv();
			break;

			case ENTER:
			me.useSuggestion();
			me.hideDiv();
			return true;
			break;

			case ESC:
			me.hideDiv();
			break;

			case KEYUP:
			if (me.highlighted > 0)
			{
				me.highlighted--;
			}
			me.changeHighlight(key);
			//me.useSuggestion();
			break;

			case KEYDN:

			if (me.highlighted < (suggs.length - 1))
			{
				me.highlighted++;
			}
			me.changeHighlight(key);
			//me.useSuggestion();
			break;
		}
	};

	elem.onkeyup = function(ev) 
	{
		var key = me.getKeyCode(ev);
		switch(key)
		{
		case ENTER:
		me.useSuggestion();
		return false;
		break;
		
		case TAB:
		case ESC:
		case KEYUP:
		case KEYDN:
			return;
		default:

			if (this.value.length > 2)
			{
				me.inputText = this.value;
				me.getEligible();
			}
			else
			{
				me.hideDiv();
			}
		}
	};



	this.useSuggestion = function()
	{

		if (this.highlighted > -1)
		{
			this.elem.value = suggs[this.highlighted].substring(2);
			setTimeout("document.getElementById('" + this.elem.id + "').focus()",0);
		}
	};



	this.hideDiv = function()
	{
		this.div.style.display = 'none';
		this.highlighted = -1;
	};


	this.changeHighlight = function()
	{
		var lis = this.div.getElementsByTagName('LI');
		for (i in lis)
		{
			var li = lis[i];

			if (this.highlighted == i)
			{
				li.className = "selected";
			}
			else
			{
				li.className = "";
			}
		}
	};


	this.positionDiv = function()
	{
		var el = this.elem;
		var x = 0;
		var y = el.offsetHeight;
	

		while (el.offsetParent && el.tagName.toUpperCase() != 'BODY')
		{
			x += el.offsetLeft;
			y += el.offsetTop;
			el = el.offsetParent;
		}

		x += el.offsetLeft;
		y += el.offsetTop;

		this.div.style.left = x + 'px';
		this.div.style.top = y + 'px';
		this.div.style.width='255px';
	};


	this.createDiv = function(s)
	{
		var ul = document.createElement('ul');

		for (i in s)
		{
			
			var word = s[i];

			var li = document.createElement('li');
			var a = document.createElement('a');
			a.href="javascript:false";
			a.innerHTML = word;
			li.appendChild(a);
			if (me.highlighted == i)
			{
				li.className = "selected";
			}
	
			ul.appendChild(li);
		}
	
		this.div.replaceChild(ul,this.div.childNodes[0]);
	

		ul.onmouseover = function(ev)
		{
			var target = me.getEventSource(ev);
			while (target.parentNode && target.tagName.toUpperCase() != 'LI')
			{
				target = target.parentNode;
			}
		
			var lis = me.div.getElementsByTagName('LI');
			
	
			for (i in lis)
			{
				var li = lis[i];
				if(li == target)
				{
					me.highlighted = i;
					break;
				}
			}
			me.changeHighlight();
		};


		ul.onclick = function(ev)
		{
			me.useSuggestion();
			me.hideDiv();
			me.cancelEvent(ev);
			return false;
		};

		this.div.className="suggestion_list";
		this.div.style.position = 'absolute';

		me.positionDiv();
		
   		if(s[0].length >= 1)
		{ 
			this.div.style.display = 'block'; 
		} else 
		{ 
			this.div.style.display = 'none'; 
			this.highlighted = -1; 
		} 		

	};



	this.getKeyCode = function(ev)
	{
		if(ev)
		{
			return ev.keyCode;
		}
		if(window.event)
		{
			return window.event.keyCode;
		}
	};


	this.getEventSource = function(ev)
	{
		if(ev)
		{
			return ev.target;
		}
	
		if(window.event)
		{
			return window.event.srcElement;
		}
	};


	this.cancelEvent = function(ev)
	{
		if(ev)
		{
			ev.preventDefault();
			ev.stopPropagation();
		}
		
		if(window.event)
		{
			window.event.returnValue = false;
		}
	}
	
   this.showDiv = function() 
   { 
   		if(this.eligible.length > 0)
		{ 
			this.div.style.display = 'block'; 
		} else 
		{ 
			this.div.style.display = 'none'; 
			this.highlighted = -1; 
		} 
   };

	function handleSearchSuggest() {
	
		if (searchReq.readyState == 4) {
			
			suggs=new Array();
			suggs = searchReq.responseText.split("|");
			
			this.eligible=suggs;

			me.createDiv(suggs);

		}
	}

	
	this.getEligible = function()
	{		
		if (searchReq.readyState == 4 || searchReq.readyState == 0) {

			var str = escape(elem.value);
			searchReq.open("GET",sUrlRoot + 'suggest.asp?type=' + type + '&search=' + str, true);
			this.eligible = new Array();
			searchReq.onreadystatechange = handleSearchSuggest;
			searchReq.send(null);
		}
		
	};
}

var idCounter = 0;