	function initDropDown(el)
	{
		if (el == null)
		{
			alert('initDropDown: element does not exist');
			return;
		}
		el.addEventListener('keyup', keyUpHandler, true);
		el.addEventListener('keydown', keyDownHandler, true);
		el.addEventListener('blur', blurHandler, true);
		el.setAttribute('autocomplete', 'off');

		dd = document.getElementById('dropdown');
		if (dd == null)
		{
			dd = document.createElement('div');
			dd.setAttribute('id', 'dropdown');
		}

		dd.style.backgroundColor = '#ffffff';
		dd.style.width = "200px";
		dd.style.heigth = "198px";
		dd.style.overflow = "auto";
		dd.style.display = "none";
		dd.style.position = "absolute";
		dd.style.fontSize = "8pt";
		dd.style.fontFamily = "sans-serif";

		dd_list = document.getElementById('dropdown_list');
		if (dd_list == null)
		{
			dd_list = document.createElement('div');
			dd_list.setAttribute('id', 'dropdown_list');
			dd_list.style.float = "left";
			dd.appendChild(dd_list);
		}
	}

	function blurHandler(event)
	{
		closeDropDown();
	}

	function keyDownHandler(event)
	{
		if (event.keyCode == 40)
		{
			dd_box = document.getElementById('dropdown');
			if (dd_box.style.display == 'none')
				updateDropDown(event.target.id);
			else
				selectDropDownItem(getSelection() + 1);
		}
		else if (event.keyCode == 38)
		{
			dd_box = document.getElementById('dropdown');
			if (dd_box.style.display == 'none')
				updateDropDown(event.target.id);
			else
				selectDropDownItem(getSelection() - 1);
		}
		else if (event.keyCode == 33)
		{
			dd_box = document.getElementById('dropdown');
			if (dd_box.style.display == 'none')
				updateDropDown(event.target.id);
			else
			{
				index = getSelection();
				if (index == -1) index = -2;
				else if (index <= 10) index = 0;
				else index -= 10;
				selectDropDownItem(index);
			}
		}
		else if (event.keyCode == 34)
		{
			dd_box = document.getElementById('dropdown');
			if (dd_box.style.display == 'none')
				updateDropDown(event.target.id);
			else
			{
				index = getSelection();
				if (index == -1) index = 0;
				else index += 10;
				selectDropDownItem(index);
			}
		}
		else if (event.keyCode == 13)
		{
			inp = document.getElementById(event.target.id);
			selection_index = getSelection();
			dd_data = document.getElementById('dropdown_data');
			data = dd_data.innerHTML.split('\n');
			selected_data = html_entity_decode(data[selection_index]);
			inp.value = selected_data;
			closeDropDown();
			inp.select();

			id = event.target.id;
			/* begin of specific code */
			if (id.search(/artist/) != -1)
			{
				nat_id = id.replace(/artist/, "nationality");
				sel = document.getElementById(nat_id);
				if (sel == null) alert(nat_id + " is null");
				query = "?name='" + encodeURIComponent(inp.value) + "'";
				
				req = new XMLHttpRequest();
				req.onreadystatechange = function() {
					if (req.readyState == 4 && req.status == 200)
					{
						/* select new option */
						opt = sel.options.namedItem(req.responseText);
						sel.selectedIndex = opt.index;
						
						tit_id = id.replace(/artist/, "title");
						if (tit_id == null) alert("title input does not exist");	
						document.getElementById(tit_id).focus();
					}
				}
				req.open("GET", "tools/artists.php" + query, true);
				req.send();
			}
			else if (id.search(/title/) != -1)
			{
				id_prefix = id.replace(/(adm_pl_.*?)_.*/, "$1");
				id_index = id.replace(/adm_pl_.*?_.*?_/, "");
				checkAudio(id_prefix, id_index);
			}
			/* end of specific code */
		}
		else if (event.keyCode == 27)
		{
			closeDropDown();
		}
		else
		{
			//alert(event.keyCode);
		}
	}

	function keyUpHandler(event)
	{
		if ((event.keyCode > 40) || (event.keyCode == 32) || (event.keyCode == 8))
		{
			setSelection(-1);
			updateDropDown(event.target.id);
		}
	}

	function closeDropDown()
	{
		dd = document.getElementById('dropdown');
		dd.style.display = "none";
		setSelection(-1);
	}

	function setSelection(value)
	{
		selector = getDropDownSelector();
		selector.innerHTML = value;
	}

	function selectDropDownItem(n)
	{
		if (n == -1) return;
		new_item = document.getElementById('dropdown_item_' + n);
		if (new_item == null)
		{
			n = getDropDownItemCount() - 1;
			new_item = document.getElementById('dropdown_item_' + n);
		}
		current_index = getSelection();
		old_item = document.getElementById('dropdown_item_' + current_index);
		if (old_item != null)
		{
			old_item.style.color = '#000000';
			old_item.style.backgroundColor = '#ffffff';
		}
		new_item.style.color = '#000000';
		new_item.style.backgroundColor = '#A0D0FF';
		setSelection(n);

		dd = document.getElementById('dropdown');
		selTop = new_item.offsetTop;
		selBottom = selTop + new_item.offsetHeight;
		wndHeight = dd.offsetHeight - 2;
		if (selTop < dd.scrollTop)
			dd.scrollTop = selTop;
		else if (selBottom > wndHeight + dd.scrollTop)
			dd.scrollTop = selBottom - wndHeight;
	}

	function getDropDownSelector()
	{
		span_element = document.getElementById('dropdown_selector');
		if (span_element == null)
			span_element = createHiddenSpan('dropdown_selector', '-1');
		return span_element;
	}

	function getSelection()
	{
		selector = getDropDownSelector();
		return parseInt(selector.innerHTML);
	}

	function createHiddenSpan(id, value)
	{
		span_element = document.createElement('span');
		span_element.setAttribute('id', id);
		span_element.style.display = 'none';
		span_element.innerHTML = value;
		document.getElementById('dropdown').appendChild(span_element);
		return span_element;
	}

	function setDropDownItemCount(value)
	{
		span_element = document.getElementById('dropdown_item_count');
		if (span_element == null)
			span_element = createHiddenSpan('dropdown_item_count', value);
		else
			span_element.innerHTML = value;
	}

	function getDropDownItemCount()
	{
		span_element = document.getElementById('dropdown_item_count');
		if (span_element == null)
			span_element = createHiddenSpan('dropdown_item_count', 0);
		return parseInt(span_element.innerHTML);
	}

	function refreshDropDown(id)
	{
		dd_data = document.getElementById('dropdown_data');
		if ((dd_data == null) || (dd_data.innerHTML.length == 0)) return;
		
		input_element = document.getElementById(id);

		dc = document.getElementById('dropdown_list');

		data = dd_data.innerHTML.split('\n');
		count = data.length;
		setDropDownItemCount(count);

		dd.style.display = "block";
		dd.scrollTop = 0;
		dc.innerHTML = "";
		re = (input_element.value == '') ? null : new RegExp('(' + input_element.value + ')', 'ig');
		for (i = 0; i < count; i++)
		{
			div = document.createElement('div');
			div.setAttribute('id', 'dropdown_item_' + i);
			div.style.display = "block";
			div.style.paddingLeft = "3px";
			div.style.paddingTop = "2px";
			div.style.paddingRight = "3px";
			div.style.paddingBottom = "2px";
			
			div.style.backgroundColor = "#FFFFFF";
			div.style.color = "#000000";
			dc.appendChild(div);
			div.innerHTML = (re == null) ? data[i] : data[i].replace(re, '<span style="font-weight: bold; color:red">$1</span>');
	//		if (div.offsetWidth > max_width) max_width = div.offsetWidth;
		}
		lastBottom = div.offsetTop + div.offsetHeight;
		dd.style.height = ((lastBottom < 198) ? lastBottom : 198) + "px";

		setSelection(-1);
	}

	function updateDropDown(id)
	{
		dd = document.getElementById('dropdown');
		el = document.getElementById(id);
		dd.style.display = "none";
		
		dd_data = document.getElementById('dropdown_data');
		if (dd_data == null) {
			dd_data = document.createElement('div');
			dd_data.style.display = "none";
			dd_data.setAttribute('id', 'dropdown_data');
			dd_data.innerHTML = "";
			dd.appendChild(dd_data);
		}

		dd.style.left = el.offsetLeft + "px";
		dd.style.top = (el.offsetTop + el.offsetHeight) + "px";
		dd.style.border = "thin solid black";
		req = new XMLHttpRequest();
		req.onreadystatechange = function() {
			if (req.readyState == 4 && req.status == 200) {
				dd_data.innerHTML = html_entity_decode(req.responseText);
				refreshDropDown(id);
			}
		}

		/* begin of specific code */
		if (id.search(/artist/) != -1)
		{
			url = "tools/artists.php?search='" + el.value + "'";
		}
		else if (id.search(/title/) != -1)
		{
			artist_input = document.getElementById(id.replace(/title/, "artist"));
			query = "?artist=" + encodeURIComponent(artist_input.value) + "&search='" + el.value + "'";
			url = "tools/titles.php" + query;
		}
		/* end of specific code */

		req.open("GET", url, true);
		req.send();
	}

