function AJAX_Option_List() {
	AJAX_Option_List.prototype.setEvent(AJAX_Option_List.prototype.init, "load", window);
}
AJAX_Option_List.prototype.init = function() {
	if(typeof(AjaxResParam) == 'undefined') {
		alert("AJAX functions not loaded");
		return;
	}
	if (ajaxList.listObjRef) return;
	ajaxList.listIsActive = false;
	var newDiv = document.createElement("div");
	newDiv.className = "AJAXOptions";
	document.body.appendChild(newDiv);
	AJAX_Option_List.listObjRef = newDiv;
	AJAX_Option_List.listObjRef.style.display = "none";
	AJAX_Option_List.prototype.removeEvent(AJAX_Option_List.prototype.init, "load", window);
}
AJAX_Option_List.prototype.applyOption = function(thisId) {
	var thisMatch = ajaxList.fieldResObj.getElementsByTagName("matchItem").item(thisId);
	AJAX_Option_List.prototype.hideOptions(true);
	ajaxList.selectedOption = -1;
	ajaxList.listIsActive = false;
	ajaxList.returnAction(thisMatch, ajaxList.fieldObjRef);
	return false;
}
AJAX_Option_List.prototype.getOptions = function(evt, returnAction, ajaxScript, ajaxAction, ajaxParam) {
	evt = evt ? evt : window.event;
	var tObj = (evt.target || evt.srcElement);
	var codeVal = evt.charCode || evt.keyCode;
	if (codeVal == 27) {
		ajaxList.hideOptions(evt);
		ajaxList.cancelParentEvents(evt);
		return;
	}
	if (codeVal == 38) {
		ajaxList.selectedOption = (ajaxList.selectedOption > -1 ? ajaxList.selectedOption-1 : -1);
		ajaxList._setActive(ajaxList.selectedOption);
		ajaxList.cancelParentEvents(evt);
		return;
	}
	if (codeVal == 40) {
		ajaxList.selectedOption = (ajaxList.selectedOption < (ajaxList.numOptions-1) ? ajaxList.selectedOption+1 : ajaxList.selectedOption);
		ajaxList._setActive(ajaxList.selectedOption);
		ajaxList.cancelParentEvents(evt);
		return;
	}
	if (ajaxList.showListTimeout)
		clearTimeout(ajaxList.showListTimeout);
	ajaxList.fieldObjRef = tObj;
	ajaxList.returnAction = returnAction;
	ajaxList.selectedOption = -1;
	ajaxList.numOptions = 0;
	AJAX_Option_List.listObjRef.style.left = AJAX_Option_List.prototype.getXPos(tObj)+"px";
	AJAX_Option_List.listObjRef.style.top = (AJAX_Option_List.prototype.getYPos(tObj)+tObj.offsetHeight)+"px";
	ajaxList.setEvent(AJAX_Option_List.prototype.hideOptions, "mousedown", document);
	if (tObj.value.length > 2)
		ajaxList.showListTimeout = setTimeout('AJAX_Option_List.prototype.fetchOptionList("'+ajaxScript+'", "'+ajaxAction+'", "'+ajaxParam+'", "'+escape(tObj.value)+'")',500);
}

AJAX_Option_List.prototype.fetchOptionList = function(ajaxScript, ajaxAction, ajaxParam, ajaxValue) {
	AjaxRequest(ajaxScript, ajaxList.showOptions, ajaxAction, ajaxParam, unescape(ajaxValue));
}
AJAX_Option_List.prototype._setActive = function(idxNum) {
	var aTags = AJAX_Option_List.listObjRef.getElementsByTagName("A");
	for (var i=0; aTags[i]; i++) {
		if (i == idxNum) 
			aTags[i].className = "selectedOption";
		else
			aTags[i].className = "";
	}
}
AJAX_Option_List.prototype.showOptions = function(resObj) {
	AJAX_Option_List.listObjRef.innerHTML = '';
	if (resObj.getElementsByTagName("matchItem") && resObj.getElementsByTagName("matchItem").length) {
		ajaxList.listIsActive = true;
		if (!ajaxList.selectedOption)
			ajaxList.selectedOption = -1;
		ajaxList.numOptions = resObj.getElementsByTagName("matchItem").length;
		ajaxList.fieldResObj = resObj;
		for (var i=0; i<resObj.getElementsByTagName("matchItem").length; i++) {
			var thisMatch = resObj.getElementsByTagName("matchItem").item(i);
			var incClass = "";
			if (i == ajaxList.selectedOption)
				var incClass = " class=\"selectedOption\"";
			AJAX_Option_List.listObjRef.innerHTML += '<a href="#"'+incClass+' onclick="return ajaxList.applyOption('+i+')">'+
				AjaxResParam(thisMatch, "text")+'</a>';
			if (AjaxResParam(thisMatch, "description"))
				AJAX_Option_List.listObjRef.innerHTML += '<div>'+AjaxResParam(thisMatch, "description")+'</div>';
		}
		AJAX_Option_List.listObjRef.style.display = "";
		ajaxList.removeEvent(AJAX_Option_List.prototype.hideOptions, "mousedown", document);
		ajaxList.setEvent(AJAX_Option_List.prototype.hideOptions, "mousedown", document);
	} else {
		ajaxList.listIsActive = false;
		AJAX_Option_List.listObjRef.style.display = "none";
		ajaxList.removeEvent(AJAX_Option_List.prototype.hideOptions, "mousedown", document);
	}
}

AJAX_Option_List.prototype.hideOptions = function(evt) {
	evt = evt ? evt : window.event;
	var tObj = (evt.target || evt.srcElement);
	ajaxList.listIsActive = false;
	if (ajaxList.fieldObjRef != tObj) {
		if ((window.event && evt == true) || !tObj || !tObj.parentNode || (AJAX_Option_List.listObjRef != tObj.parentNode && AJAX_Option_List.listObjRef != tObj)) {
			AJAX_Option_List.listObjRef.style.display = "none";
			ajaxList.removeEvent(AJAX_Option_List.prototype.hideOptions, "mousedown", document);
			if (!evt == true)
				ajaxList.returnAction(null, ajaxList.fieldObjRef);
		}
	}
}

/* get the left pixel position for a given element */
AJAX_Option_List.prototype.getXPos = function(thisObj) {
	var x=0;
	do {
		x += thisObj.offsetLeft;
		thisObj = thisObj.offsetParent;
	} while (thisObj != null)
	return x;
}

/* get the top pixel position for a given element */
AJAX_Option_List.prototype.getYPos = function (thisObj) {
	var y=0;
	do {
		y += thisObj.offsetTop;
		thisObj = thisObj.offsetParent;
	} while (thisObj != null)
	return y;
}

AJAX_Option_List.prototype.setEvent = function() {
	var functionCall = AJAX_Option_List.prototype.setEvent.arguments[0];
	var eventRoot = AJAX_Option_List.prototype.setEvent.arguments[1] ? AJAX_Option_List.prototype.setEvent.arguments[1] : "load";
	var eventScope = AJAX_Option_List.prototype.setEvent.arguments[2] ? AJAX_Option_List.prototype.setEvent.arguments[2] : window;
	if (window.attachEvent)
		eventScope.attachEvent("on"+eventRoot, functionCall);
	else if (window.addEventListener)
		eventScope.addEventListener(eventRoot, functionCall, false);
}
AJAX_Option_List.prototype.removeEvent = function() {
	var functionCall = AJAX_Option_List.prototype.removeEvent.arguments[0];
	var eventRoot = AJAX_Option_List.prototype.removeEvent.arguments[1] ? AJAX_Option_List.prototype.removeEvent.arguments[1] : "load";
	var eventScope = AJAX_Option_List.prototype.removeEvent.arguments[2] ? AJAX_Option_List.prototype.removeEvent.arguments[2] : window;
	if (window.detachEvent)
		eventScope.detachEvent("on"+eventRoot, functionCall);
	else if (window.removeEventListener)
		eventScope.removeEventListener(eventRoot, functionCall, false);
}
AJAX_Option_List.prototype.cancelParentEvents = function(evt) {
	evt = (evt ? evt : window.event);
	if (window.event)
		window.event.cancelBubble = true;
	else
		evt.stopPropagation();
}
var ajaxList = new AJAX_Option_List();

