var rracarray, rrac_lastpart;
var rr_autocomplete = function(e, rracself, rraclimit, ajax_script_name, ajax_param_name){
 
	var isArray = function(obj){return(typeof(obj.length)=="undefined")?false:true;}

	var alertClient = function(http_request) {
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				var tmp = new Array();
				
				var myre=/(.*?)\r?\n/gi;
				while ((zzz = myre.exec(http_request.responseText)) != null) 				
				tmp.push(zzz[1]);
				
				//var tmp = eval(http_request.responseText);
				if(isArray(tmp))rracarray=tmp;
				action();
			}
		}
	}

	var makeRequest = function(url) {
		var http_request = false;

		if (window.XMLHttpRequest) {
			http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType) {
				http_request.overrideMimeType('text/xml');
			}
		}else
			if(window.ActiveXObject) { // IE
				try{
					http_request = new ActiveXObject("Msxml2.XMLHTTP");
				}catch(e){
					try {
						http_request = new ActiveXObject("Microsoft.XMLHTTP");
					}
					catch(e){ }
				}
			}
		http_request.onreadystatechange = function() {
			alertClient(http_request);
		};
		http_request.open('GET', url, true);
		http_request.send(null);
	}

	var escapewin1251=function(str) {
	              var str=decodeURIComponent(str);
	              var trans = [];for (var i = 0x410; i <= 0x44F; i++)trans[i] = i - 0x350;trans[0x401] = 0xA8;trans[0x451] = 0xB8;
	              var encval=''; for (var i = 0; i < str.length; i++){var n = str.charCodeAt(i);if (typeof trans[n] != 'undefined')n = trans[n];if (n <= 0xFF)encval+=String.fromCharCode(n);} 
	              return escape(encval);    
	}


	var refresh_acarray = function(){
		if(ajax_script_name){  
			if(!/\?/.test(ajax_script_name)){ajax_script_name+='?';}
			ajax_script_name += escapewin1251(rracself.value);

			makeRequest(ajax_script_name);
			rrac_lastpart=rracself.value;
		}
	}

	var getBounds = function(p) {
		var rect = p.getBoundingClientRect();
		return {
			top: rect.top,
			right: rect.right,
			bottom: rect.bottom,
			left: rect.left,
			width: p.offsetWidth,
			height: p.offsetHeight};
	}

	var getKeynum = function(){
		if(window.event)return window.event.keyCode;
		else if(ev.keyCode)return ev.keyCode;
		else if(ev.which)return ev.which;
	}

	var keyController = function(keynum){
		if(keynum == 13){
			rracself.value=tt_select.value;
			tt_div.style.display = 'none';
			return false;
		}
		if(keynum == 27){
			tt_div.style.display = 'none';
			if(window.event){window.event.cancelBubble = true;}
			else if(e.which){e.stopPropagation()}
			return false;
		}
		if(keynum == 38){
			if(tt_select.length == 0) return false;
			if(tt_select.selectedIndex<=0)
				tt_select.selectedIndex=tt_select.length-1;
			else
				--tt_select.selectedIndex;
			return false;
		}
		if(keynum == 40){
			if(tt_select.length == 0) return false;
			if(tt_select.selectedIndex>=tt_select.length-1)
				tt_select.selectedIndex=0;
			else
				++tt_select.selectedIndex;
			return false;
		}
		if((keynum >= 65 && keynum <= 90) || keynum == 8 || keynum == 32 || keynum == 46 || keynum == 109)return true;
		else return false;
	}

	var getTooltip=function(){
		if(!document.getElementById('rractt')){
			var select=document.createElement('select');
			select.style.height = '100px';
			select.style.width = '160px';
			select.id = 'rracselect';
			select.setAttribute('multiple', 'true');

			var div=document.createElement('div');
			div.style.display = 'none';
			div.style.position = 'absolute';
			div.style.zIndex = '10';
			div.id='rractt';
			div.appendChild(select);
			document.body.appendChild(div);
			return div;
		}else
			return document.getElementById('rractt');
	}

	var showDropDown = function(p){
		tt_div.style.display = 'block';
		var mc = getBounds(p);
		tt_div.style.top = document.documentElement.scrollTop+mc.bottom+'px';
		tt_div.style.left = mc.left+'px';

		tt_select.onclick = function(){
			var me=this;
			setTimeout(function(){p.value=me.value},300);
			return false;
		}

		if(typeof(document.addEventListener)=='undefined')
			document.attachEvent('onclick', function(){tt_div.style.display = 'none'});
		else
			document.addEventListener('click', function(){tt_div.style.display = 'none'}, true);
	}

	var tt_div, tt_select, 
		ev = e,
		keynum = getKeynum();

	var action = function(){
		tt_div=getTooltip();
		tt_select=document.getElementById('rracselect');

		//keynum = getKeynum();

		//if(!keyController(keynum))return false;

		var r=RegExp('^'+rracself.value.toLowerCase()),
			cnt=0,
			compl=new Array(),
			i;

		for(i=0;i<rracarray.length;++i){
			if(1 || r.test(rracarray[i].toLowerCase())){
				++cnt;
				compl[compl.length]=rracarray[i];
			}
			if(cnt>rraclimit-1)
				break;
		}

		if(cnt==0){tt_div.style.display = 'none';return false;}

		tt_select.length=0;
		for(i=0;i<compl.length;++i){
			tt_select.options[tt_select.length]=new Option(compl[i], compl[i], false, null);
		}
		showDropDown(rracself);
	}

	if(rracself.value.length >= 3 && rrac_lastpart != rracself.value){
		refresh_acarray();
		//setTimeout(action, 600);
	}else action();

}

function rr_autocomplete_init(ajax_script_name, dropdown_limit, ac_array,  ajax_param_name){
	var inputs=document.getElementsByTagName('input');
	var rraclimit;
	if(ac_array)rracarray = ac_array;else rracarray=[];
	if(dropdown_limit)rraclimit = dropdown_limit;else rraclimit=10;
	for(var i=0;i<inputs.length;++i){
		if(inputs[i].className=='rracinput'){
			inputs[i].onkeyup = function(e){var self=this;rr_autocomplete(e, self, rraclimit, (ajax_script_name?ajax_script_name:null), (ajax_param_name?ajax_param_name:null));};
			inputs[i].setAttribute('autocomplete', 'off');
		}
	}
}

