function getDivId(id)
{
	return id + "___div___auto";
}

function getValueId(id)
{
	return id + "___value___auto";
}

function getTdId(id, i)
{
	return id + "___td___auto_" + i;
}

function showAutocomplete(id)
{
	document.getElementById(id).focus();
	document.getElementById(id).select();
	autocompletef(null, id);
	
}

function autocompletef(event, id, dat)
{
	if (consumed(event, id))
		return;
	
	var textfield = document.getElementById(id);
	if (textfield == null)
		return;
	
	if (dat == null)
		dat = textfield.auto_data;
	
	if (dat == null)
		return;

	var div = document.getElementById(getDivId(id));
	var hidden = document.getElementById(getValueId(id));;
	
	if (div == null)
	{
		div = createDiv(getDivId(id), textfield);
		
	}
	if (hidden == null)
	{
		hidden = createInputHidden(textfield, getValueId(id), textfield.id);
	}
	assignPosition(div, textfield);
	
	var value = textfield.value;
		
	var matches = findMatches(value, dat);
	if (matches.length == 0)
	{
		div.style.visibility = "hidden";
		return;
	}

	hidden.matches = matches;
	hidden.selectedIndex = -1;
	
	addMatches(id, div, matches);
	div.style.visibility = "visible";

}

function getAbsolutePosition(oElement)
{
	var x = 0;
	var y = 0;
	var h = oElement.offsetHeight;


	while( oElement != null ) 
	{
		x += 1*oElement.offsetLeft;
		y += 1*oElement.offsetTop;

		oElement = oElement.offsetParent;
	}
	
	
	var result = new Array();
	result[0] = x;
	result[1] = 1*y + 1*h;
	return result;

}

function createDiv(id, textfield)
{
	var newdiv = document.createElement('div');
	newdiv.setAttribute('id', id);
	newdiv.style.background = "#00C";
   	newdiv.style.border = "1px solid #000";
   	newdiv.style.position = "absolute";
   	newdiv.style.cursor = "pointer";
   	newdiv.className = "autocombodiv";
   	newdiv.onfocus="new function{alert('focus')}";
   	

   	
   	newdiv.style.visibility = "hidden";
   	document.body.appendChild(newdiv);
   	
   	   	
   	return newdiv;
	
}

function assignPosition(div, textfield)
{
   	var position = getAbsolutePosition(textfield);
   	div.style.left = position[0];
   	div.style.top = position[1];
}

function createInputHidden(textfield, id, name)
{
	var form = textfield.form;
	if (form == null)
		return;
	
   	var inputElement = document.createElement("input")
   	inputElement.setAttribute("type", "hidden");   	
   	inputElement.setAttribute("id", id);
   	if (name != null)
   		inputElement.setAttribute("name", name);
   	
   	form.appendChild(inputElement)
   	
   	return inputElement;
   	

	
}

function prepareString(value)
{
	value = value.toLowerCase();
	value = value.replace('á', 'a');
	value = value.replace('é', 'e');
	value = value.replace('í', 'i');
	value = value.replace('ó', 'o');
	value = value.replace('ú', 'u');
	value = value.replace('ü', 'u');
	
	return value;
}

function findMatches(value, dat)
{
	var result = new Array();
	value = prepareString(value);
	
	for (i = 0; i < dat.length; i++)
	{
		var data = dat[i];
		var strResult = data[0];
		
		var strResult1 = "";
		var strResult2 = "";
		var strData = "";
		var strData2 = "";
		
		var bAdded = false;
		for (j = 1; j < data.length; j++)
		{
			strData += data[j];
			
			if (j < data.length - 1)
			{
				strData += " / ";
			}
		}

		strData2 = prepareString(strData);
		var index = strData2.indexOf(value);
		
		
		if (index != -1)
		{
			strResult1 += strData.substring(0, index);
			strResult1 += "<b>";
			strResult1 += strData.substring(index, index + value.length);
			strResult1 += "</b>";
			strResult1 += strData.substring(index + value.length); 
			bAdded = true;
		}
		else
		{
			strResult1 += strData;
		}
		strResult2 += strData;
			
		
			
		
		

		if (bAdded)	
		{
			result[result.length] = new Array(strResult, strResult1, strResult2);
		}
	}
	
	return result;
}

function addMatches(id, div, matches)
{
	var strHtml = "";
	
	strHtml = "<table border=0 cellpadding=0 cellspacing=0>";
	
	for (i = 0; i < matches.length; i++)
	{
		var data = matches[i];

		strHtml += "<tr><td class='autocombotd' id='" + getTdId(id, i) + "' onmouseover='selectComboValue(\"" + id + "\"," + i +")' onmouseout='unselectComboValue(\"" + id +"\"," + i +")' onmousedown='doautocomplete(\"" + id + "\"," + i + ")'>" + data[1] + "</td></tr>";
	}
	
	strHtml += "</table>";
	div.innerHTML = strHtml;
}

function doautocomplete(id, i)
{
	var hidden = document.getElementById(getValueId(id));
	hidden.value = id;
	var result = hidden.matches[i];
	var textfield = document.getElementById(id);
	textfield.value = result[2];
	hideautocomplete(id);
	
	
}

function selectComboValue(id, index)
{
	var td = document.getElementById(getTdId(id, index));
	td.className="autocombotdsel";
	var hidden = document.getElementById(getValueId(id));
	hidden.selectedIndex = index;
}

function unselectComboValue(id, index)
{
	var td = document.getElementById(getTdId(id, index));
	td.className="autocombotd";
	var hidden = document.getElementById(getValueId(id));
	hidden.selectedIndex = -1;
}

function consumed(event, id)
{
	if (event == null)
		return false;
		
	var div = document.getElementById(getDivId(id));
		
	var hidden = document.getElementById(getValueId(id));
	if (event.keyCode == 13) // return
	{
		
		if (div != null && div.style.visibility != "hidden")
			doautocomplete(id, hidden.selectedIndex);
			
		return true;
	}
	
	if (event.keyCode == 38) // up
	{
		if (div != null && div.style.visibility != "hidden")
		{
			var index = hidden.selectedIndex;
			if (index <= 0)
				return true;
			
			unselectComboValue(id, index);
			selectComboValue(id, index - 1);
			
			return true;
		}
		

	}
	
	if (event.keyCode == 40) // down
	{
		if (div != null && div.style.visibility != "hidden")
		{
			var index = hidden.selectedIndex;
			if (index >= hidden.matches.length - 1)
				return true;
			
			if (index > -1)
				unselectComboValue(id, index);
			selectComboValue(id, index + 1);
			
			return true;
		}
		

	}

	
	return false;
}

function findValue(matches, value)
{
	for (i = 0; i < matches.length; i++)
	{
		var data = matches[i];
		if (data[2] == value)
			return data[0];
	}
	
	return -1;
}

function hideautocomplete(id)
{
	var hidden = document.getElementById(getValueId(id));
	var matches = hidden.matches;
	
	var textfield = document.getElementById(id);
	var value = textfield.value;
	
	var index = findValue(matches, value);
	hidden.value = index;
	if (index == -1)
		textfield.value = "";
	
	textfield.title = textfield.value;
	textfield.alt = textfield.value;
	
	var div = document.getElementById(getDivId(id));
	if (div != null)
		setTimeout('document.getElementById("' + getDivId(id) + '").style.visibility = "hidden"', 100);
}

function disableEnterKey(e)
{
     var key;

     if(window.event)
          key = window.event.keyCode;     //IE
     else
          key = e.which;     //firefox

     if(key == 13)
          return false;
     else
          return true;
}