function AutoCompleteDB()
{
	// set the initial values.
	this.bEnd = false;
	this.nCount = 0;
	this.aStr = new Object;
}

AutoCompleteDB.prototype.add = function(str)
{
	// increment the count value.
	this.nCount++;

	// if at the end of the string, flag this node as an end point.
	if ( str == "" )
		this.bEnd = true;
	else
	{
		// otherwise, pull the first letter off the string
		var letter = str.substring(0,1);
		var rest = str.substring(1,str.length);
		
		// and either create a child node for it or reuse an old one.
		if ( !this.aStr[letter] ) this.aStr[letter] = new AutoCompleteDB();
		this.aStr[letter].add(rest);
	}
}

AutoCompleteDB.prototype.getCount = function(str, bExact)
{
	// if end of search string, return number
	if ( str == "" )
		if ( this.bEnd && bExact && (this.nCount == 1) ) return 0;
		else return this.nCount;
	
	// otherwise, pull the first letter off the string
	var letter = str.substring(0,1);
	var rest = str.substring(1,str.length);
	
	// and look for case-insensitive matches
	var nCount = 0;
	var lLetter = letter.toLowerCase();
	if ( this.aStr[lLetter] )
		nCount += this.aStr[lLetter].getCount(rest, bExact && (letter == lLetter));
	
	var uLetter = letter.toUpperCase();
	if ( this.aStr[uLetter] )
		nCount += this.aStr[uLetter].getCount(rest, bExact && (letter == uLetter));
	
	return nCount;	
}

AutoCompleteDB.prototype.getStrings = function(str1, str2, outStr)
{
	if ( str1 == "" )
	{
		// add matching strings to the array
		if ( this.bEnd ) 
			outStr.push(str2);

		// get strings for each child node
		for ( var i in this.aStr )
			this.aStr[i].getStrings(str1, str2 + i, outStr);
	}
	else
	{
		// pull the first letter off the string
		var letter = str1.substring(0,1);
		var rest = str1.substring(1,str1.length);
		
		// and get the case-insensitive matches.
		var lLetter = letter.toLowerCase();
		if ( this.aStr[lLetter] )
			this.aStr[lLetter].getStrings(rest, str2 + lLetter, outStr);

		var uLetter = letter.toUpperCase();
		if ( this.aStr[uLetter] )
			this.aStr[uLetter].getStrings(rest, str2 + uLetter, outStr);
	}
}


function AutoComplete(aStr, oText, oDiv, nMaxSize)
{
	// initialize member variables
	this.oText = oText;
	this.oDiv = oDiv;
	this.nMaxSize = nMaxSize;
	
	// preprocess the texts for fast access
	this.db = new AutoCompleteDB();
	var i, n = aStr.length;
	for ( i = 0; i < n; i++ )
	{
		this.db.add(aStr[i]);
	}
			
	// attach handlers to the text-box
	oText.AutoComplete = this;
	oText.onkeyup = AutoComplete.prototype.onTextChange;
	oText.onblur = AutoComplete.prototype.onTextBlur;
}

AutoComplete.prototype.onTextBlur = function()
{
	this.AutoComplete.onblur();
}

AutoComplete.prototype.onblur = function()
{
	this.oDiv.style.visibility = "hidden";
}

AutoComplete.prototype.onTextChange = function()
{
	this.AutoComplete.onchange();
}

AutoComplete.prototype.onDivMouseDown = function()
{
	this.AutoComplete.oText.value = this.innerHTML;
}

AutoComplete.prototype.onDivMouseOver = function()
{
	this.className = "AutoCompleteHighlight";
}

AutoComplete.prototype.onDivMouseOut = function()
{
	this.className = "AutoCompleteBackground";
}

AutoComplete.prototype.onchange = function()
{
	var txt = this.oText.value;
	
	// count the number of strings that match the text-box value
	var nCount = this.db.getCount(txt, true);
	
	// if a suitable number then show the popup-div
	if ( (this.nMaxSize == -1 ) || ((nCount < this.nMaxSize) && (nCount > 0)) )
	{
		// clear the popup-div.
		while ( this.oDiv.hasChildNodes() )
			this.oDiv.removeChild(this.oDiv.firstChild);
			
		// get all the matching strings from the AutoCompleteDB
		var aStr = new Array();
		this.db.getStrings(txt, "", aStr);
		
		// add each string to the popup-div
		var i, n = aStr.length;
		for ( i = 0; i < n; i++ )
		{
			var oDiv = document.createElement('div');
			this.oDiv.appendChild(oDiv);
			oDiv.innerHTML = aStr[i];
			oDiv.onmousedown = AutoComplete.prototype.onDivMouseDown;
			oDiv.onmouseover = AutoComplete.prototype.onDivMouseOver;
			oDiv.onmouseout = AutoComplete.prototype.onDivMouseOut;
			oDiv.AutoComplete = this;			
		}
		this.oDiv.style.visibility = "visible";
	}
	else // hide the popup-div
	{
		this.oDiv.innerHTML = "";
		this.oDiv.style.visibility = "hidden";
	}
}

function createAutoComplete()
{
	var aNames =
	[
				"Mind",
				"Abafája",
				"Abásfalva",
				"Abosfalva",
				"Ábránfalva",
				"Abrudbánya",
				"Aga",
				"Ágostonfalva",
				"Agyagfalva",
				"Ákosfalva",
				"Aldoboly",
				"Algyógy",
				"Alkenyér",
				"Almamező",
				"Almásegres",
				"Almásmező",
				"Alsóboldogfalva",
				"Alsógáld",
				"Alsókomána",
				"Alsómoécs",
				"Alsórákos",
				"Alsósófalva",
				"Alsószombatfalva",
				"Alsóvalkó",
				"Alvinc",
				"Angyalkút",
				"Angyalos",
				"Apáca",
				"Apatelek",
				"Apáti",
				"Apold",
				"Arad",
				"Aranyosbánya",
				"Aranyosgerend",
				"Aranyosgyéres",
				"Árapatak",
				"Árkos",
				"Árokalja",
				"Árvátfalva",
				"Atyha",
				"Backamadaras",
				"Balánbánya",
				"Balavásár",
				"Balázsfalva",
				"Bálinc",
				"Bálványosfürdő",
				"Bályok",
				"Bánffyhunyad",
				"Baráthely",
				"Barátos",
				"Barcánfalva",
				"Barcarozsnyó",
				"Barcaszentpéter",
				"Bardóc",
				"Barót",
				"Bazéd",
				"Bede",
				"Bégamonostor",
				"Bélbor",
				"Belényes",
				"Bélfenyér",
				"Bencéd",
				"Bencenc",
				"Bereck",
				"Berekeresztúr",
				"Beszterce",
				"Betfalva",
				"Bethlen",
				"Bethlenszentmiklós",
				"Bibarcfalva",
				"Bihar",
				"Bihardiószeg",
				"Bikafalva",
				"Bikfalva",
				"Bodola",
				"Bodzaforduló",
				"Bodzavám",
				"Bogárfalva",
				"Boksánbánya",
				"Bolgárcserged",
				"Bonchida",
				"Bonyha",
				"Bordos",
				"Borosjenő",
				"Boroskrakkó",
				"Borossebes",
				"Borsa",
				"Borszék",
				"Botfalu",
				"Bozovics",
				"Bögöz",
				"Bölön",
				"Bözöd",
				"Brád",
				"Brassó",
				"Budfalva",
				"Búzaháza",
				"Buziásfürdő",
				"Cikmántor",
				"Cófalva",
				"Csák",
				"Csákigorbó",
				"Csatószeg",
				"Cséffa",
				"Csekefalva",
				"Csernakeresztúr",
				"Csernáton",
				"Csicsógyörgyfalva",
				"Csíkbánkfalva",
				"Csíkborzsova",
				"Csíkcsekefalva",
				"Csíkcsicsó",
				"Csíkcsomortán",
				"Csíkdánfalva",
				"Csíkfalva",
				"Csíkkozmás",
				"Csiklovabánya",
				"Csíkmadaras",
				"Csíkménaság",
				"Csíkmindszent",
				"Csíkpálfalva",
				"Csíkrákos",
				"Csíksomlyó",
				"Csíkszentdomokos",
				"Csíkszentgyörgy",
				"Csíkszentimre",
				"Csíkszentkirály",
				"Csíkszentlélek",
				"Csíkszentmárton",
				"Csíkszentmihály",
				"Csíkszentmiklós",
				"Csíkszentsimon",
				"Csíkszenttamás",
				"Csíkszereda",
				"Csíkverebes",
				"Csittszentiván",
				"Csomortán",
"Csucsa",
				"Csukás",
				"Dálnok",
				"Dános",
				"Deményháza",
				"Dés",
				"Detta",
				"Déva",
				"Dézna",
				"Dicsőszentmárton",
				"Diód",
				"Diófás",
				"Dióshalom",
				"Ditró",
				"Dombos",
				"Dragus",
				"Egeres",
				"Egrestő",
				"Élesd",
				"Előpatak",
				"Énlaka",
				"Erdőd",
				"Erdőfüle",
				"Erdőszentgyörgy",
				"Érmihályfalva",
				"Érsemjén",
				"Erzsébetváros",
				"Esztelnek",
				"Etéd",
				"Facsád",
				"Farcád",
				"Farkaslaka",
				"Fehéregyháza",
				"Feketebátor",
				"Feketehalom",
				"Feldoboly",
				"Felek",
				"Félixfürdő",
				"Felőr",
				"Felsőbánya",
				"Felsőgirda",
				"Felsőilosva",
				"Felsőrákos",
				"Felsősófalva",
"Felsőszombatfalva",
				"Felvinc",
"Fenyéd",
				"Fiatfalva",
				"Fintaháza",
				"Firtosmartonos",
				"Firtosváralja",
				"Fogaras",
				"Földvár",
				"Futásfalva",
				"Gagy",
				"Geges",
				"Gelence",
				"Gernyeszeg",
				"Gidófalva",
				"Glogovác",
				"Gógán",
				"Görgényszentimre",
				"Görgényüvegcsűr",
				"Guraró",
				"Gyalu",
				"Gyergyóalfalu",
				"Gyergyócsomafalva",
				"Gyergyóremete",
				"Gyergyószárhegy",
				"Gyergyószentmiklós",
				"Gyergyóújfalu",
				"Gyilkos",
				"Gyimesfelsőlok",
				"Gyimesközéplok",
				"Györgyfalva",
				"Gyulafehérvár",
				"Gyulakuta",
				"Gyulavarsánd",
				"Halmágy",
				"Harasztkerék",
				"Harcó",
				"Hargitafürdő",
				"Harina",
				"Hatolyka",
				"Hátszeg",
"Havasnagyfalu",
				"Héjjasfalva",
				"Herkulesfürdő",
				"Hétúr",
				"Hídvég",
				"Homoród",
				"Homoródalmás",
				"Homoróddaróc",
				"Homoródfürdő",
				"Homoródjánosfalva",
				"Hosszúmező",
				"Höltövény",
				"Ic Ponor",
				"Ikafalva",
				"Ikland",
				"Illyéd",
				"Illyefalva",
				"Ipp",
				"Jád",
				"Jedd",
				"Jobbágyfalva",
				"Jobbágytelke",
				"Jód",
				"Kaca",
				"Kálnok",
				"Kalodva",
				"Kalotaszentkirály",
				"Kányád",
				"Kapnikbánya",
				"Karánsebes",
				"Karcfalva",
				"Kebele",
				"Kelementelke",
				"Kelnek",
				"Kerc",
				"Kerelőszentpál",
				"Keresd",
"Kereszténysziget",
				"Keresztvár",
				"Kerlés",
				"Kézdikővár",
				"Kézdimartonfalva",
				"Kézdiszentkereszt",
				"Kézdiszentlélek",
				"Kézdivásárhely",
				"Kilyén",
				"Királykegye",
				"Királypataka",
				"Kisbacon",
				"Kisiratos",
				"Kiskapus",
				"Kiskászon",
				"Kiskoh",
				"Kismihád",
				"Kladova",
				"Kolozsvár",
				"Koltó",
				"Kóródszentmárton",
				"Korond",
				"Kovászi",
				"Kovászna",
				"Kozmatelke",
				"Köd",
				"Kőhalom",
				"Kökös",
				"Köpec",
				"Körösfő",
				"Középajta",
				"Krassóvár",
				"Kraszna",
				"Krizba",
				"Kucsuláta",
				"Kudzsir",
				"Kund",
				"Kusaly",
				"Kutyfalva",
				"Küküllővár",
				"Kürtös",
				"Lászlóvára",
				"Lázárfalva",
				"Lécfalva",
				"Lemhény",
				"Liebling",
				"Lippa",
				"Lisznyó",
				"Lőrincfalva",
				"Lugos",
				"Lukafalva",
				"Mácsa",
				"Magyarád",
				"Magyarberkes",
				"Magyargoroszló",
				"Magyargyerőmonostor",
				"Magyarhermány",
				"Magyarigen",
				"Magyarkiskapus",
				"Magyarlápos",
				"Magyarléta",
				"Magyarlóna",
				"Magyarókereke",
				"Magyarremete",
				"Magyarvalkó",
				"Magyarzsákod",
				"Mája",
				"Majláthfalva",
				"Malomfalva",
				"Malomvíz",
				"Máramarossziget",
				"Máréfalva",
				"Margitta",
				"Marosfő",
				"Maroshévíz",
				"Marosillye",
				"Maroskeresztúr",
				"Marosludas",
				"Marosnémeti",
				"Marossárpatak",
				"Marosszentanna",
				"Marosszentgyörgy",
				"Marosszentkirály",
				"Marosújvár",
				"Marosvásárhely",
				"Marosvécs",
				"Medgyes",
				"Menyháza",
				"Menyő",
				"Mezőbánd",
				"Mezőcsávás",
				"Mezőerked",
				"Mezőfele",
				"Mezőkölpény",
				"Mezőmadaras",
				"Mezőméhes",
				"Mezőménes",
				"Mezőörményes",
				"Mezőpagocsa",
				"Mezőpanit",
				"Mezősámsond",
				"Mezőszabad",
				"Mezőtelegd",
				"Mezőzáh",
				"Miklósvár",
				"Mikóújfalu",
				"Milvány",
				"Mirkvásár",
				"Monyó",
				"Móricföld",
				"Muszka",
				"Nadab",
				"Nagyajta",
				"Nagybacon",
				"Nagybánya",
				"Nagybocskó",
				"Nagybodófalva",
				"Nagyborosnyó",
				"Nagycsanád",
				"Nagydisznód",
				"Nagyenyed",
				"Nagyernye",
				"Nagygoroszló",
				"Nagyilonda",
				"Nagykároly",
				"Nagylak",
				"Nagymoha",
				"Nagypél",
				"Nagysármás",
				"Nagysink",
				"Nagysomkút",
				"Nagyszalonta",
				"Nagyszeben",
				"Nagyszentmiklós",
				"Nagytalmács",
				"Nagyteremi",
				"Nagyvárad",
				"Nándorhegy",
				"Naszód",
				"Náznánfalva",
				"Németszentmihály",
				"Nyárádgálfalva",
				"Nyárádkarácsony",
				"Nyárádköszvényes",
				"Nyárádmagyarós",
				"Nyárádremete",
				"Nyárádselye",
				"Nyárádszentbenedek",
				"Nyárádszentimre",
				"Nyárádszentmárton",
				"Nyárádszereda",
				"Nyárádtő",
				"Nyomát",
				"Nyújtód",
				"Obád",
				"Ógerlistye",
				"Olthévíz",
				"Oltszem",
				"Ópálos",
				"Óradna",
				"Oravicabánya",
				"Orczyfalva",
				"Ósopot",
				"Ottlaka",
				"Ozsdola",
				"Őraljaboldogfalva",
				"Örményes",
				"Őscsanád",
"Paltinis",
				"Pankota",
				"Parajd",
				"Pécska",
				"Perjámos",
				"Péterfalva",
				"Petrozsény",
				"Pinták",
				"Piski",
				"Prázsmár",
				"Predeal",
				"Radnót",
				"Rava",
				"Resicabánya",
"Reketó",
				"Retteg",
				"Retyezát",
				"Rév",
				"Rézbánya",
				"Rigósfürdő",
				"Rohi",
				"Ruszkabánya",
				"Sajómagyarós",
				"Sajóudvarhely",
				"Sajtény",
				"Sándorháza",
				"Sáromberke",
				"Sebesrom",
				"Sebesvár",
				"Segesd",
				"Segesvár",
				"Sepsibükszád",
				"Sepsiszentgyörgy",
				"Sepsiszentkirály",
				"Sikló",
				"Simánd",
				"Soborsin",
				"Sofronya",
				"Solymosvár",
				"Sólyomkőpestes",
				"Somkerék",
				"Somosd",
				"Stájerlakanina",
				"Sülelmed",
				"Szabadhely",
				"Szalárd",
				"Szamosújvár",
				"Szaplonca",
				"Szászbuda",
				"Szászfenes",
				"Szászhermány",
				"Szászkeresztúr",
				"Szászkézd",
				"Szászludvég",
				"Szászorbó",
				"Szászrégen",
				"Szászsebes",
				"Szászváros",
				"Szászveresmart",
				"Szászvolkány",
				"Szatmárnémeti",
				"Szecseleváros",
				"Székelyhíd",
				"Székelykeresztúr",
				"Székelykocsárd",
				"Székelylengyelfalva",
				"Székelyudvarhely",
				"Székelyzsombor",
				"Székudvar",
				"Szelistye",
				"Szemlak",
				"Szent Anna",
				"Szentábrahám",
				"Szentágota",
				"Szentbenedek",
				"Szentivánlaborfalva",
				"Szentjobb",
				"Szentlélek",
				"Szentmárton",
				"Szentpál",
				"Széphely",
				"Szépvíz",
				"Szerdahely",
				"Szeretfalva",
				"Szikesfalu",
				"Szilágycseh",
				"Szilágysomlyó",
				"Szineke",
				"Szinérváralja",
				"Szováta",
				"Tasnád",
				"Teke",
				"Tekerőpatak",
				"Temesság",
				"Temesvár",
				"Tenke",
				"Topánfalva",
				"Torda",
				"Tordaszentlászló",
				"Torja",
				"Tornya",
				"Torockó",
				"Torockószentgyörgy",
				"Torontálkeresztes",
				"Tótvárad",
				"Törcsvár",
				"Törökszákos",
				"Tövis",
				"Tusnád",
				"Tusnádfürdő",
				"Ugra",
				"Újmoldova",
				"Újpanád",
				"Újszékely",
				"Újszentanna",
				"Újszentes",
				"Uzon",
				"Uzonkafürdő",
				"Vajdahunyad",
				"Vajdaszentivány",
				"Válaszút",
				"Váralmás",
				"Várasfenes",
				"Várfalva",
				"Vargyas",
				"Várhely",
				"Várkudu",
				"Vármező",
				"Vársonkolyos",
				"Verespatak",
				"Vidombák",
				"Viktóriaváros",
				"Világos",
				"Vinga",
				"Vízakna",
				"Vledény",
				"Zabola",
				"Zágon",
				"Zalatna",
				"Zaránd",
				"Zernyest",
				"Zetelaka",
				"Zilah",
				"Zsibó",
				"Zsidóvár"	];
	new AutoComplete(
		aNames, 
		document.getElementById('theText'), 
		document.getElementById('theDiv'), 
		50
	);
}
