	
	//Global variables
	var g_nSelMenuItem = 0;
	var g_sTextBoxID;
	var g_bCancelSubmit;
	var g_sOldTextBoxValue="";


	function asbGetXmlHttp()
	{
		var oXmlHttp=false;
	
		// -----> This method was provided from Jim Ley's website 
		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
		// JScript gives us Conditional compilation, we can cope with old IE versions.
		// and security blocked creation of the objects.
		try {
			oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
		try {
			oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			oXmlHttp = false;
		}
		}
		/*@end @*/
	

		if (!oXmlHttp && typeof XMLHttpRequest!='undefined') 
		{
			oXmlHttp = new XMLHttpRequest();
		}
		
		return oXmlHttp;	  
	}	
	

  	// Over here we make a call back to our server side page and return the results from our query 
	// to a DIV tag sitting under the text box
	function asbGetDataFromServer(sValue, sDivID, sDataType, sAdditionalParam)
	{
		var oXmlHttp;
		oXmlHttp=asbGetXmlHttp();
		
		var sUrl;
		sUrl=ASB_GET_DATA_URL + "?TextBoxID=" + g_sTextBoxID + "&DivID=" + sDivID + "&DataType=" + sDataType + "&Keyword=" + sValue + "&AdditionalParam=" + sAdditionalParam; 
		
		oXmlHttp.open("GET", sUrl, true);
		
		oXmlHttp.onreadystatechange=function() 
		{
			if (oXmlHttp.readyState==4) 
			{
				loading_img("idle");
				if (oXmlHttp.responseText!="")
				{
					asbShowDiv(sDivID, oXmlHttp.responseText);
				}				
				else
				{	
					asbClearDiv(sDivID);
					asbHideDiv(sDivID);
				}
			}
		}
		loading_img("busy");
		oXmlHttp.send(null)
		
	}


	function asbSetSelectedValue(sValue)
	{
		asbTRACE("asbSetSelectedValue: " + sValue);
	
		var hdnSelectedValue=document.getElementById(g_sTextBoxID + "_SelectedValue");
		if(hdnSelectedValue)
			hdnSelectedValue.value=sValue;
	}
	
	function asbGetSelectedValue()
	{
		var hdnSelectedValue=document.getElementById(g_sTextBoxID + "_SelectedValue");
		return hdnSelectedValue.value;
	}

	function asbSetTextBoxValue()
	{
		var divMenuItem;
		var txtCtrl;
		txtCtrl=document.getElementById(g_sTextBoxID);
		divMenuItem=asbGetSelMenuItemDiv();
	
		asbTRACE("divMenuItem " + divMenuItem);
	
		if(divMenuItem)
		{
			var sMenuItemValueID;
			sMenuItemValueID=GetDivMenuItemID(g_nSelMenuItem) + "_value";
			var hdnMenuItemValue=document.getElementById(sMenuItemValueID);
			
			asbTRACE("Set selected item to " + hdnMenuItemValue.value);
			if (hdnMenuItemValue)
			{
				//Set selected value of control to the value of selected menu item
				asbSetSelectedValue(hdnMenuItemValue.value);
			}
			else
			{
				asbSetSelectedValue('');
			}
						
			txtCtrl.value = divMenuItem.innerHTML;
		}
		else
		{
			asbSetSelectedValue('');
		}
		
	}

	function asbGetTextBoxValue()
	{
		var txtCtrl;
		txtCtrl=document.getElementById(g_sTextBoxID);
		return(txtCtrl.value);
	}
		
	function asbOnMouseClick(nMenuIndex, sTextBoxID, sDivID)
	{
		g_nSelMenuItem=nMenuIndex;
		g_sTextBoxID=sTextBoxID;
					
		asbSetTextBoxValue();
		asbHideDiv(sDivID);
	}
	
	function asbOnMouseOver(nMenuIndex, sTextBoxID)
	{
		//g_sTextBoxID=sTextBoxID;
				
		//asbSelectMenuItem(nMenuIndex);
	}
			
	function asbOnKeyPress(evt)
	{
		asbTRACE("asbOnKeyPress : " + asbGetKey(evt));
		if ((asbGetKey(evt)==13) && (g_bCancelSubmit)) 
			return false;
		
		return true;
	}
	
	function asbOnKeyUp(sTextBoxID, sDiv, sDataType, sAdditionalParam, evt)
	{
		g_sTextBoxID=sTextBoxID;
		
		var nKey;
		nKey=asbGetKey(evt);
		
		asbTRACE("asbOnKeyUp : " + nKey);
		
		
		//Skip up/down/enter
		if ((nKey!=38) && (nKey!=40) && (nKey!=13))
		{
			var sNewValue;
			sNewValue=asbGetTextBoxValue();
			asbTRACE("asbOnKeyUp : New text box value '" + sNewValue + "'");
				
			if ((sNewValue.length <= 50) && (sNewValue.length > 0))
			{
				asbTRACE("asbOnKeyUp : Getting data for '" + sNewValue + "'");
				asbGetDataFromServer(sNewValue, sDiv, sDataType, sAdditionalParam);
			}
		
			if (g_sOldTextBoxValue!=sNewValue)
			{
				asbSetSelectedValue("");
			}
		}
	}
	
	function asbOnKeyDown(sTextBoxID, sDiv, evt)
	{
		asbTRACE("asbOnKeyDown : " + asbGetKey(evt));
		
		g_sTextBoxID=sTextBoxID;
		
		//Save current text box value before key press takes affect
		g_sOldTextBoxValue=asbGetTextBoxValue();
		asbTRACE("asbOnKeyDown : old text box value='" + g_sOldTextBoxValue + "'");
		
		var nKey;
		nKey=asbGetKey(evt);
						
		//Detect if the user is using the down button
		if(nKey==38) //Up arrow
		{
			asbMoveDown()
		}
		else if(nKey==40) //Down arrow
		{
			asbMoveUp()
		}
		else if(nKey==13) //Enter
		{
			asbTRACE("asbOnKeyDown : asbIsVisibleDiv - " + asbIsVisibleDiv(sDiv));
			if (asbIsVisibleDiv(sDiv))
			{
				asbHideDiv(sDiv);
				asbTRACE("asbOnKeyDown : asbHideDiv");
				
				//Only works in IE
				evt.cancelBubble = true;
				
				if (evt.returnValue) evt.returnValue = false;
				if (evt.stopPropagation) evt.stopPropagation();
				
				g_bCancelSubmit=true;
     		}
     		else
     		{
     			g_bCancelSubmit=false;
     		}
		}
		else
		{
			asbHideDiv(sDiv);
		}
				
		return true;
	}
	
	function asbGetSelMenuItemDiv()
	{
		return asbGetMenuItemDiv(g_nSelMenuItem);
	}		
			
	function GetDivMenuItemID(nMenuItem)
	{
		return (g_sTextBoxID + "_mi_" + nMenuItem);
	}
	
	function asbGetMenuItemDiv(nMenuItem)
	{
		var sDivMenuItemID;
		sDivMenuItemID=GetDivMenuItemID(nMenuItem);
		
		return document.getElementById(sDivMenuItemID)
	}	

	function asbMoveUp()
	{
		var nMenuItem;
		nMenuItem=g_nSelMenuItem+1;
		
		//Check if menu item exists
		if(asbGetMenuItemDiv(nMenuItem))
		{
			asbSelectMenuItem(nMenuItem)
		}
	}


	function asbMoveDown()
	{
		var nMenuItem;
		nMenuItem=g_nSelMenuItem -1;
		
		if(nMenuItem!=0)
		{
			asbSelectMenuItem(nMenuItem)
		}
	}


	//Highlights a div
	function asbSelectMenuItem(nMenuItem)
	{
		var divMenuItem;
		divMenuItem=asbGetMenuItemDiv(nMenuItem)
					
		if(divMenuItem)
		{
			if (nMenuItem!=g_nSelMenuItem)
			{
				asbUnhighlightSelMenuItem();
				
				g_nSelMenuItem=nMenuItem;
				asbSetTextBoxValue();
						
				divMenuItem.className="asbSelMenuItem"
			}
		}
	}


	//unhighlights a div
	function asbUnhighlightSelMenuItem()
	{
		var divMenuItem;
		divMenuItem=asbGetSelMenuItemDiv()
	
		if(divMenuItem)
		{
			divMenuItem.className="asbMenuItem"
		}
	}


	//Detects what key was pressed
	function asbGetKey(evt)
	{
		evt = (evt) ? evt : (window.event) ? event : null;
		if (evt)
		{
			var cCode = (evt.charCode) ? evt.charCode :
					((evt.keyCode) ? evt.keyCode :
					((evt.which) ? evt.which : 0));
			return cCode; 
		}
	}
	
	function asbSetValueOnLostFocus(sDivID)
	{
		if(asbMenuItemCount()>0 && g_nSelMenuItem == 0)
		{
			if(asbGetSelectedValue() == '')
			{
				g_nSelMenuItem = 1;
				asbSetTextBoxValue();
				//txtCtrl.focus();
			}
		}
		else
		{
			g_nSelMenuItem = 0;
			asbSetSelectedValue('');
		}
	}
	
	function asbMenuItemCount()
	{
		var i = 1;
		while(asbGetMenuItemDiv(i))
		{
			i = i + 1;
		}
		return i-1;
	}
	
	function asbHideDiv(sDivID)
	{
		asbShowObjects();
		document.getElementById(sDivID).style.visibility = 'hidden';
		g_nSelMenuItem=0;
	}
	
	function asbHideObjects()	{
		selects = document.getElementsByTagName("select");
		for (i = 0; i != selects.length; i++) {
			selects[i].style.visibility = "hidden";
		}
	}

	function asbShowObjects() {
		selects = document.getElementsByTagName("select");
		for (i = 0; i != selects.length; i++) {
			selects[i].style.visibility = "visible";
		}
	}
	
	function asbIsVisibleDiv(sDivID)
	{
		if (document.getElementById(sDivID).style.visibility == 'hidden')
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	
	function asbClearDiv(sDivID)
	{
		var divMenu;
		divMenu=document.getElementById(sDivID);
		divMenu.innerHTML = '';
	}
	
	function asbShowDiv(sDivID, sDivContent)
	{
		asbHideObjects();
		var divMenu;
		divMenu=document.getElementById(sDivID);
		
		var sInnerHtml;
		sInnerHtml=sDivContent;	
		divMenu.innerHTML = sInnerHtml;
		
		var txtCtrl;
		txtCtrl=document.getElementById(g_sTextBoxID);
		divMenu.style.left = calculateOffsetLeft(txtCtrl) + 2 + "px";
		if (navigator.appName.toUpperCase().match(/MICROSOFT INTERNET EXPLORER/) != null)
			divMenu.style.top  = calculateOffsetTop(txtCtrl) + 30 + "px";
		else
			divMenu.style.top  = calculateOffsetTop(txtCtrl) + 16 + "px";
		divMenu.style.visibility = 'visible';
	}

	// Called as:
	// calculateOffsetLeft(_inputField)
	// was ob
	function calculateOffsetLeft(r){
		return Ya(r,"offsetLeft")
	}

	// Called as:
	// calculateOffsetTop(_inputField)
	// Was Qb...
	function calculateOffsetTop(r){
		return Ya(r,"offsetTop")
	}

	function Ya(r,attr){
		var kb=0;
		while(r){
			kb+=r[attr]; 
			r=r.offsetParent
		}
		return kb
	}
	
	function asbIsIE()
	{
		return ( navigator.appName=="Microsoft Internet Explorer" ); 
	}
	

	function asbIsNav()
	{
		return ( navigator.appName=="Netscape" );
	}
	
	
	function asbTRACE(sText)
	{
		//var sMessage = window.document.forms[0].txtTRACE.value;
		//sMessage = sMessage + sText + "\n";;
		//window.document.forms[0].txtTRACE.value = sMessage;
	}
	
	//****************************
	// Function which handles the
	// AJAX busy/idle animation
	//****************************
	function loading_img(disp) {
		if(DOMGetElement("AJAX_Status") != null){
			if(disp == "busy")
				var src = "/AJAX/loading.gif";
			else if(disp == "idle")
				var src = "/AJAX/loader.gif"; 
				
			imageHolder = DOMGetElement("AJAX_Status");
			imageHolder.src = src;
		}
	}	

	//****************************
	// helper method that retrieves  
	// a specified object
	//****************************
	function DOMGetElement(o)
	{
		if (document.getElementById)
			return document.getElementById(o);
		else if (document.all)
			return document.all[o];
		else if (document.layers)
			return document.layers[o];
			
		return null;
	}