/*
	@target_id 	ID of the DOM element to add autocomplete too
	@ui			Unique string addressing autocomplete
	@name		The name of the hidden field that passes the value (string)
	@lang_id	The db id for the language (int)
	@init_val 	Default value for autocomplete (string)
*/
function get_autocomplete(_targetID,_uid,_name,_value,_langID,_initStrVal,_formName,_dbFunc,_useHiddenField)
{
	if(_initStrVal==undefined) _initStrVal = "";
	if(_useHiddenField==undefined) _useHiddenField = true;
	
	this.ac_name = _name;
	this.ac_dbFunc = _dbFunc;
	this.ac_useHiddenField = _useHiddenField;
	
	var input = document.createElement("input");
	input.id = _useHiddenField ? _uid + "_input" : _name;
	input.name = !_useHiddenField ? _name : null;
	input.type = "text";
	input.value = _initStrVal;
	input.setAttribute("autocomplete","off");
	input.onkeypress = function(event){ if(event.keyCode==9){select_autocomplete(event,_uid,_name,_formName); return false;} };
	input.onkeyup = function(event){ autocomplete_keyup(event,_uid,_langID) };
	input.onfocus = function(event){ show_autocomplete(event,_uid) };	
	
	var select = document.createElement("select");
	select.id = _uid + "_select";
	select.style.position = "absolute";
	select.style.display = "none";
	select.onchange = function(event){select_autocomplete(event,_uid,_name,_formName)};
	
	var target = document.getElementById(_targetID);
	target.appendChild(input);
	target.appendChild(select);
	
	select.style.marginTop = "1px";
	select.style.marginLeft = "30px";
	select.style.zIndex = "9999";
	
	//alert(input.offsetLeft);
	
	if(_useHiddenField)
	{
		var hidden = document.createElement("input");
		hidden.type="hidden";
		hidden.id = _name;
		hidden.name = _name;
		hidden.value = _value;
		target.appendChild(hidden);
	}
	
	return input;
}

//	selects an autocomplete option by setting the hidden field containing corresponding value
function select_autocomplete (e,id,field_name,form_name)
{
	//	autocomplete reference
	var el  = document.getElementById(id + '_select');
	var el2 = document.getElementById(ac_useHiddenField?id+'_input':ac_name);
	
	//	select first item if that's all there is
	if(el.options.length==1) el.options[0].selected=true;
	
	var i = el.selectedIndex;
	
	if(	el.options.length && 
		el.options[i]!=undefined)
	{
		if(ac_useHiddenField)
		{
			//	update hidden field w/ selected data...support arrays
			if(field_name.substr(field_name.length-2,field_name.length)=="[]" &&
				document.getElementById(field_name) != undefined)
			{
				var tid = id.split("_")[1];
				document.forms[form_name][field_name][tid].value = el.options[i].value;
			}
			else if(document.getElementById(field_name) != undefined)
			{
				document.getElementById(field_name).value = el.options[i].value;
			}
		}
		
		var keycode = this.get_keycode(e);
		if(e==null || keycode != 8)
		{
			//	sync input text w/ selected value text
			el2.value = el.options[i].text;
			//	clear values
			el.options.length = 0;
			hide_autocomplete(id);
		}
	}
	//	sync input text w/ selected value text
	//if(el2!=undefined) el2.value = el.options[el.selectedIndex].text;
}


function show_autocomplete (e,id)
{
	if(this.cur_id!=null)
		document.getElementById(this.cur_id+'_select').style.display="none";
		
	this.cur_id = id;
	
	if(document.getElementById(this.cur_id + '_select').options.length)
		document.getElementById(this.cur_id + '_select').style.display = "block";
}

function hide_autocomplete(id)
{
	document.getElementById(id + '_select').style.display="none";
}

function autocomplete_keyup (e,id,lang_id)
{
	var el = document.getElementById(ac_useHiddenField?id+'_input':ac_name);
	var str = el.value;
	
	var keychar = this.get_keychar(e);
	var keycode = this.get_keycode(e);
	
	if(this.is_letternumber(keychar) || keycode==8)
	{
		do_autocomplete(e,id,lang_id);
	}
	//	down arrow
	else if(keycode == 40 || keycode == 38)
	{
		var s = document.getElementById(id + '_select');
		if(keycode==40)
		{	if(s.selectedIndex+1<s.options.length)
				s.selectedIndex += 1;
			else
				s.selectedIndex = 0;
		}
		else
		{
			if(s.selectedIndex-1>=0)
				s.selectedIndex -= 1;
			else
				s.selectedIndex = s.options.length-1;
		}
		show_autocomplete(e,id);
	}
	
	return true;
}

function do_autocomplete (e,id,lang_id)
{
	document.getElementById(id + "_select").style.display = "none";
	document.getElementById(id + "_select").options.length = 0;
	
	var str = document.getElementById(ac_useHiddenField?id+'_input':ac_name).value;
	this.ac_dbFunc(e,id,str,lang_id);
}

function filter_words(words,e,id)
{
	var el = document.getElementById(id + "_select");
	var str = document.getElementById(ac_useHiddenField?id+'_input':ac_name).value;
	//	clear
	el.options.length = 0;
	el.selectedIndex = -1;
	//	filter
	if(str.length && words!=undefined)
	{
		for(var i=0,j=0;i<words.length;i++)
		{
			if(words[i].text.substr(0,str.length)==str){
				el.options[j] = words[i];
				j++;
			}
		}
	}
	//	size autocomplete
	el.size = Math.min(j,5);
	//	if only one item select it
	if(j==1)
		select_autocomplete(e,id,ac_name);
	else
		show_autocomplete(e,id);
}

//	utils
function get_keychar(e)
{
	var keychar;
	
	if (window.event)
	   key = window.event.keyCode;
	else if (e)
	   key = e.which;
	else
	   return true;
	
	keychar = String.fromCharCode(key);
	return keychar.toLowerCase();
}

function get_keycode (e)
{
	var evt = (e)?e:(window.event)?window.event:null; 
	if(evt) var key=(evt.charCode)?evt.charCode: ((evt.keyCode)?evt.keyCode:((evt.which)?evt.which:0)); 
	return key;
}

function is_letternumber (keychar)
{
	return (("abcdefghijklmnopqrstuvwxyz0123456789").indexOf(keychar) > -1);
}
//var search;
var ac_name;
var ac_dbFunc;
var ac_useHiddenField;