var LIST = "tblCompleteList";

var ARROW_UP = 38;
var ARROW_DOWN = 40;

var highlight = -1;
var total = 0;

function AutoComplete(url, objTextField, objIndicator, minChar)
{
	if (objTextField)
	{
		objTextField.onkeydown = function (event) {
			var temp = objTextField.value;
			var evt = event ? event : (window.event) ? window.event : null;
			if (evt.keyCode == 13 && highlight > -1 && isTableVisible()) // Enter key
			{
				select(objTextField.id, document.getElementById(LIST).rows[highlight].cells[0].innerHTML);
				return false;
			}
			else if (evt.keyCode == 27) // Escape key
			{
				select(objTextField.id, temp);
				return false;
			}
		};

		objTextField.onkeyup = function (event) {
			if (objTextField.value.length < minChar)
				return;

			var evt = event ? event : (window.event) ? window.event : null;
			var cont = true;
			if (evt)
			{
				if (evt.keyCode >= 65 && evt.keyCode <= 90) // A - Z (case insensitive)
					cont = true;
				else if (evt.keyCode >= 48 && evt.keyCode <= 57) // 0 - 9
					cont = true;
				else if (evt.keyCode >= 96 && evt.keyCode <= 105) // numpad 0 - 9
					cont = true;
				else if (evt.keyCode == 8 || evt.keyCode == 46) // 8 for Backspace, 46 for Delete
					cont = true;
				else if (evt.keyCode == ARROW_DOWN && !isTableVisible())
					cont = true;
				else
					cont = false;

				if (evt.keyCode == ARROW_UP)
					setHighlight(--highlight);
				else if (evt.keyCode == ARROW_DOWN)
					setHighlight(++highlight);
			}

			if (!cont)
				return;

			var xmlhttp = createXMLHttp();
			if (xmlhttp)
			{
				xmlhttp.open("GET", url + "?p=" + urlEncode(objTextField.value), true);
				xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				xmlhttp.onreadystatechange = function () {
					if (xmlhttp.readyState == 4)
					{
						try
						{
							var xmlDoc = xmlhttp.responseXML.documentElement;
							var suggestions = xmlDoc.getElementsByTagName("suggestion");
							var list = new Array();

							for (var i = 0; i < suggestions.length; i++)
								list[i] = suggestions[i].firstChild.nodeValue;

							highlight = -1;
							total = list.length;
							var table = createTable(getAbsoluteLeft(objTextField),
													getAbsoluteTop(objTextField) + objTextField.offsetHeight,
													objTextField.offsetParent.offsetWidth);
							for (var i = 0 ; i < list.length; i++)
							{
								var row = table.insertRow(0);
								var cell = row.insertCell(0);
								cell.innerHTML = list[i];

								cell.onmousemove = function (event) {
									var evt = (event) ? event : (window.event) ? window.event : null;
									if (evt)
									{
										var target = getTargetFromEvent(evt);
										if (target)
											setHighlight(target.parentNode.rowIndex);
									}
								};

								cell.onmouseout = function (event) {
									setHighlight(-1);
								};

								cell.onclick = function () {
									select(objTextField.id, document.getElementById(LIST).rows[highlight].cells[0].innerHTML);
								};
							}

							objTextField.offsetParent.appendChild(table);
						}
						catch (err)
						{
							//alert(err);
						}
						finally
						{
							objIndicator.style.display = "none";
						}
					}
					else
					{
						objIndicator.style.display = "";
					}
				};
				xmlhttp.send(null);
			}
		};
	}
}

function createTable(x, y, width)
{
	var table;

	if (document.getElementById(LIST))
	{
		table = document.getElementById(LIST);
		table.style.display = "";
		while (table.rows.length  > 0)
			table.deleteRow(0);
	}
	else
	{
		table = document.createElement("table");
		table.border = 0;
		table.cellPadding = 0;
		table.cellSpacing = 0;
		table.id = LIST;

		table.style.left = x;
		table.style.top = y;
		table.style.width = width;
	}

	addEvent(document, "mousedown", captureDoc);

	return table;
}

function isTableVisible()
{
	var table = document.getElementById(LIST);
	return (table) && table.style.display == "";
}

function hideTable()
{
	var table = document.getElementById(LIST);
	if (table)
	{
		highlight = -1;
		table.style.display = "none";
	}
	removeEvent(document, "mousedown", captureDoc);
}

function select(txtfldId, value)
{
	var objTextField = document.getElementById(txtfldId);
	objTextField.value = value;
	hideTable();
}

function setHighlight(index)
{
	if (index < -1)
	{
		highlight = -1;
		return;
	}

	if (index >= total)
	{
		highlight = total - 1;
		return;
	}

	var table = document.getElementById(LIST);
	for (var i = 0; i < table.rows.length; i++)
		table.rows[i].cells[0].className = "normal";

	if (index >= 0)
		table.rows[index].cells[0].className = "highlight";

	highlight = index;
}

function captureDoc(event)
{
	var evt = event ? event : (window.event) ? window.event : null;
	if (evt)
	{
		var src = (evt.srcElement) ? evt.srcElement : (evt.target) ? evt.target : null;
		var flag = false;
		while (src != null)
		{
			if (document.getElementById(LIST) == src)
			{
				flag = true;
				break;
			}
			src = src.offsetParent;
		}
		if (flag)
			return;
	}
	hideTable();
}