LookupBox = function(id, url)
{
	this.input = document.getElementById(id);
	this.selector = this.input.offsetParent.appendChild(document.createElement("SELECT"));
	this.url = url;
	this.init();
}

LookupBox.prototype.clear = function()
{
	this.selector.innerHTML = "";
}

LookupBox.prototype.hide = function(timeout)
{
	if (timeout && timeout > 0)
	{
		var instance = this;
	
		window.setTimeout(function(){instance.hide()}, timeout);
	}
	else
	{
		this.selector.style.visibility = "hidden";
	}
}

LookupBox.prototype.init = function()
{
	var input = this.input;
	var instance = this;
	var selector = this.selector;

	input.style.position = "relative";
	input.setAttribute("autoComplete", "off");
	input.onblur = function(){instance.hide(100)};
	input.onkeydown = function(e){if(e==null)e=window.event;if(e.keyCode==13)return false;};
	input.onkeyup = function(e)
	{
		if (e == null)
		{
			e = window.event;
			e.preventDefault = function(){e.returnValue=false;};
			e.stopPropagation = function(){e.cancelBubble=true;};
		}
		
		switch (e.keyCode)
		{
			case 9:		break;
			case 13:	instance.selectItem(); return false;
			case 38:	selector.selectedIndex = Math.max(selector.selectedIndex - 1, -1); break;
			case 40:	selector.selectedIndex = Math.min(selector.selectedIndex + 1, selector.options.length - 1); break;
			default:	instance.lookup(); break;
		}
		
		return true;
	}

	var x = this.input.offsetLeft;
	var y = this.input.offsetTop + this.input.offsetHeight;
	
	selector.onchange = function(){instance.selectItem()};
	selector.size = 10;
	selector.style.left = x + "px";
	selector.style.position = "absolute";
	selector.style.top = y + "px";
	selector.style.visibility = "hidden";
	selector.style.width = this.input.offsetWidth + "px";
	selector.style.zIndex = 10;
}

LookupBox.prototype.lookup = function()
{
	var instance = this;
	
	if (instance.request && instance.request.abort)
	{
		instance.request.abort();
		instance.request = null;
	}
	
	if (window.XMLHttpRequest)
	{
    	try
		{
			instance.request = new XMLHttpRequest();
        }
		catch(e)
		{
			instance.request = null;
        }
    }
	else if (window.ActiveXObject)
	{
		try
		{
			instance.request = new ActiveXObject("Msxml2.XMLHTTP");
      	}
		catch(e)
		{
			try
			{
				instance.request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e)
			{
				instance.request = null;
			}
		}
    }
	
	if (instance.request)
	{
		var url = instance.url + "?value=" + escape(instance.input.value);
		
		instance.request.onreadystatechange = function(){instance.lookupProcess()};
		instance.request.open("GET", url, true);
		instance.request.send("");
	}
}

LookupBox.prototype.lookupProcess = function()
{
	var instance = this;
	
	if (instance.request != null && instance.request.readyState == 4 && instance.request.status == 200)
	{
		var airports = eval("(" + instance.request.responseText + ")");
		
		instance.clear();
		
		if (airports && airports.options)
		{
			for (var i = 0; i < airports.options.length; i++)
			{
				var option = new Option();
				
				option.text = airports.options[i].text;
				option.value = airports.options[i].value;
				
				instance.selector.options[instance.selector.options.length] = option;
			}
		}

		instance.show();
		instance.request = null;
	}
}

LookupBox.prototype.selectItem = function()
{
	if (this.selector.selectedIndex >= 0 && this.selector.selectedIndex < this.selector.options.length)
	{
		this.input.value = this.selector.options[this.selector.selectedIndex].value;
	}
	
	this.hide();
}

LookupBox.prototype.show = function()
{
	this.selector.size = Math.min(this.selector.options.length, 10);
	this.selector.style.visibility = "visible";
}
