	var autoCompleteCount = 0;
	var autoCompleteSelectedIndex = -1;
	var autoCompleteWidth = 300;
	var autoCompleteVisible = false;
	var ffSocket; 
	var cityList;
	
//	var cityNameService = "http://www.blogabond.com/WebServices/CityNameService.aspx?cityName=<CITYNAME/>";
//	var cityNameService = "http://blogabond.dev/WebServices/CityNameService.aspx?cityName=<CITYNAME/>";
	var cityNameService = "/WebServices/CityNameService.aspx?cityName=<CITYNAME/>";
	
	function StopEvent(evt)
	{
		evt.returnValue = false;
		if(evt.preventDefault)
		{
			evt.preventDefault();
			evt.stopPropagation();
		}

		return false;
	}

	function cityName_keypress(target, evt)
	{
		evt = evt ? evt : event;
		

		// detect up/down arrows.  handle & bail if necessary.		
		if (evt.keyCode == 13)
		{
			return StopEvent(evt);
		}
	}
		
	function cityName_keydown(target, evt)
	{
		evt = evt ? evt : event;
		

		// detect up/down arrows.  handle & bail if necessary.		
		if (autoCompleteVisible)
		{
			switch (evt.keyCode)
			{
				case 40:	// Down Arrow
					if (autoCompleteSelectedIndex < autoCompleteCount - 1)
					{
						SetAutoCompleteIndex(autoCompleteSelectedIndex + 1);
					}
					else
					{
						SetAutoCompleteIndex(0);
					}
					return StopEvent(evt);
					break;
					
				case 38:	// Up Arrow
					if (autoCompleteSelectedIndex > 0)
					{
						SetAutoCompleteIndex(autoCompleteSelectedIndex - 1);
					}
					else
					{
						SetAutoCompleteIndex(autoCompleteCount-1);
					}
					return StopEvent(evt);
					break;
					
				case 13:	// Enter
					if (autoCompleteSelectedIndex > -1)
					{
						FillCityName(autoCompleteSelectedIndex);
					}
					else
					{
						//HideAutoComplete();
					}
					return StopEvent(evt);
					break;
					
				case 9:		// Tab
					if (autoCompleteSelectedIndex > -1)
					{
						FillCityName(autoCompleteSelectedIndex);
					}
					else
					{
						SetAutoCompleteIndex(0);
						StopEvent(evt);
					}
					break;
					
				case 27:	// ESC
					HideAutoComplete();
					return StopEvent(evt);
					break;
			}
		
		}
	}
		
	function cityName_keyup(target, evt)
	{
		evt = evt ? evt : event;

		StopEvent(evt);

		// don't process up/down arrows or the enter or tab keys.
		if (evt.keyCode == 38 || evt.keyCode == 40 || evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 27)
		{
			return false;
		}
		
		//var box = document.getElementById("txtCityName");
		var box = target;
		
		if (box.value.length > 2)
		{
			var request = cityNameService.replace("<CITYNAME/>", box.value);
			RequestScript(request);

			window.status = "Searching for City: " + box.value + "...";
		}
		else
		{
			HideAutoComplete();
		}
	}
	
	function cityName_blur(e)
	{
		setTimeout('HideAutoComplete()', 100);
	}
	
	function AutoComplete_callback(values)
	{
		window.status = "";
	
		PopulateAutoComplete(values);
		ShowAutoComplete();
	}
	
	function HideAutoComplete()
	{
		var divAutoCompleteList = document.getElementById("divAutoCompleteList");
		var divAutoCompleteMap = document.getElementById("divAutoCompleteMap");
		divAutoCompleteList.style.visibility = "hidden";
		if (divAutoCompleteMap)
		{
			divAutoCompleteMap.style.visibility = "hidden";
		}
		autoCompleteVisible = false;
	}
	
	function ShowAutoComplete()
	{
		var divAutoCompleteList = document.getElementById("divAutoCompleteList");
		var divAutoCompleteMap = document.getElementById("divAutoCompleteMap");
		divAutoCompleteList.style.visibility = "visible";
		divAutoCompleteList.style.display = "inline";
		if (divAutoCompleteMap)
		{
			//divAutoCompleteMap.style.visibility = "visible";
		}
		autoCompleteVisible = true;
		
		//alert(divAutoCompleteList.style.display);
	}
	
	function ShowAutoCompleteMap(cityID, displayName, lon, lat)
	{
		var divAutoCompleteMap = document.getElementById("divAutoCompleteMap");
		if (divAutoCompleteMap)
		{
			divAutoCompleteMap.style.visibility = "visible";
		}
	}
	
	function FillCityName(index)
	{
		if (cityList.length >= index)
		{
			var cityID = cityList[index][0];
			var cityName = cityList[index][1];
			var stateCode = cityList[index][2];
			var countryName = cityList[index][3];
			var locationName = cityList[index][4];
			var lon = cityList[index][5];
			var lat = cityList[index][6];
			
			// note the order of lat/lon here...
			selectUnknownLocation(cityID, cityName, stateCode, countryName, locationName, lat, lon);
		}

		HideAutoComplete();
	}
	
	function SetAutoCompleteIndex(index)
	{
		PaintAutoCompleteCell(autoCompleteSelectedIndex, "");
		PaintAutoCompleteCell(index, "#ffdd33");
		
		autoCompleteSelectedIndex = index;
		
		if (window.SelectedFeature_onchange)
		{
			var cityID = cityList[index][0];
			var displayName = cityList[index][4];
			var lon = cityList[index][5];
			var lat = cityList[index][6];
			
			window.SelectedFeature_onchange(cityID, displayName, lon, lat);
		}
		
		ShowAutoCompleteMap(cityID, displayName, lon, lat);
		
	}
	
	function PaintAutoCompleteCell(index, color)
	{
		var obj = document.getElementById("autoLink_" + index);
		if (obj)
		{
			obj.style.backgroundColor = color;
		}
	}
	
	
	function PopulateAutoComplete(values)
	{
		autoCompleteCount = values.length;
		autoCompleteSelectedIndex = -1;
		
		cityList = values;

		var divAutoCompleteList = document.getElementById("divAutoCompleteList");
//		var linkPattern = "<a href=\"javascript:void(null)\" class='navlink' onmousedown=\"FillCityName(INDEX)\" onmouseover=\"SetAutoCompleteIndex(INDEX)\" ><div id='autoLink_INDEX' style='width:298px;'>VALUE</div></a>";
		var linkPattern = "<a href=\"javascript:void(null)\" class='navlink' onmousedown=\"FillCityName(INDEX)\" onmouseover=\"SetAutoCompleteIndex(INDEX)\" ><div id='autoLink_INDEX' style='width:AUTOCOMPLETEWIDTHpx;'>FULLNAME</div></a>";
		var text = "";
		for (var a=0; a < values.length; a++)
		{
			var linkText = linkPattern.replace(/INDEX/g, a);
			var linkText = linkText.replace(/FULLNAME/g, values[a][4]);
			var linkText = linkText.replace(/AUTOCOMPLETEWIDTH/g, autoCompleteWidth);
			
			text += linkText;
		}
		
		divAutoCompleteList.innerHTML = text;
		
		if (autoCompleteCount == 0)
		{
			setTimeout('HideAutoComplete()', 100);
			return;
		}

	}

	function RequestScript(request)
	{
		if (document.all)
		{
			// IE, Opera
			var socket = document.getElementById("scriptSocket");
			socket.src = request;
		}
		else
		{
			// FireFox Workaround: FireFox does not allow script source swapping.
			// We'll have to use a hidden frame.
			if (ffSocket == null)
			{
				ffSocket = document.createElement("IFRAME");
				ffSocket.style.visibility = "hidden";
				document.body.appendChild(ffSocket);
			}

			request = request + "&scriptWrap=1";
			ffSocket.src = request;
			
			//window.open(ffSocket.src, 'testWindow');
		}
	}

	
	function InitCityName()
	{
	}
