/*<input type='text' id='users' name='users' />
<hr/>
<input type='text' id='moder' name='moder' />
<script>
	autocomplite(getElem('users'), "/admin/ajax_functions.php", {'function' : "getAutocompliteUsers"});
	autocomplite(getElem('moder'), "/admin/ajax_functions.php", {'function' : "getAutocompliteUsers"});
</script>*/

var isIE = checkBrowser();
var scrollWidth = 15;
var loadingImg = "/images/loading.gif";


function autocomplite(elem, value, url, URLparams, acParams)
{
	var maxHeight = 100;
	value = (value) ? value : '';
	var errMsg = (acParams && acParams.errMsg) ? acParams.errMsg : "Некорректные данные";
	var onsuccessEvent = (acParams && acParams.succEvent) ? acParams.succEvent : "";
	scrollWidth = getScrollBarWidth();
	var elemAutocomplite = createElement('input', 'autocompliteInput_' + elem.name, 'autocompliteInput_' + elem.name);
	elemAutocomplite.className = elem.className;
	elemAutocomplite.type = elem.type;
	elemAutocomplite.value = value;
	elemAutocomplite.rel = value;
	elemAutocomplite.autocomplete = elem.autocomplete = "off";
	elemAutocomplite = insertAfter(elemAutocomplite, elem);
	elem.style.display = "none";
	Event.add(elemAutocomplite, "keyup", 
		function(e) 
		{ 
			this.value = this.value.replace(/^\s/, '');
			clearIncorrectDataMsg(elemAutocomplite);
			var container = getElem('autocompliteContainer_' + this.name);
			if (container)
			{
				if (e.keyCode == 16) //shift
				{
					if (container)
						container.parentNode.removeChild(container);
				}
				if (e.keyCode == 40) // down
				{
					var list = container.children;
					if (list.length > 0)
					{
						var prvSelected = -1;
						var heightToSelected = 0;
						for (var i = 0; i < list.length; i++)
						{
							heightToSelected += list[i].offsetHeight;
							if(list[i].className == "autocompliteItemSelected")
							{
								if (i != list.length - 1)
									list[i].className = "autocompliteItem";
								prvSelected = i;
								break;
							}
						}
						heightToSelected = (prvSelected == -1) ? 0 : heightToSelected;
						if (prvSelected < list.length - 1)
						{
							var selectedItem = prvSelected + 1;
							list[selectedItem].className = "autocompliteItemSelected";
							elemAutocomplite.value = list[selectedItem].innerHTML;
							elem.value = list[selectedItem].rel;
							if (container.style.overflow == "auto")
							{
								if (heightToSelected > 0)
								{
									heightToSelected = heightToSelected - container.scrollTop;
									if (heightToSelected > container.offsetHeight/2)
										container.scrollTop += list[selectedItem - 1].offsetHeight;
								}
							}
						}
					}
					return;
				}
				else if(e.keyCode == 38) //up
				{
					var list = container.children;
					if (list.length > 0)
					{
						var prvSelected = -1;
						var heightToSelected = 0;
						for (var i = 1; i < list.length; i++)
						{
							if(list[i].className == "autocompliteItemSelected")
							{
								if (i > 0)
									list[i].className = "autocompliteItem";
								prvSelected = i;
								heightToSelected += list[i].offsetHeight;
								break;
							}
							heightToSelected += list[i].offsetHeight;
						}
						if (prvSelected > 0)
						{
							var selectedItem = prvSelected - 1;
							list[selectedItem].className = "autocompliteItemSelected";
							elemAutocomplite.value = list[selectedItem].innerHTML;
							elem.value = list[selectedItem].rel;
							if (container.style.overflow == "auto")
							{
								heightToSelected = heightToSelected - container.scrollTop;
								if (heightToSelected < container.offsetHeight/2)
									container.scrollTop = Math.max(0, container.scrollTop - list[selectedItem - 1].offsetHeight);
							}
						}
					}
					return;				
				}
			}
			//**********************
			if(e.keyCode == 13) //enter
			{
				if (container)
					container.parentNode.removeChild(container);
				if (elemAutocomplite.value && !elem.value)
					addIncorrectDataMsg(elemAutocomplite, errMsg);
				else
					eval(onsuccessEvent);
				return;
			}
			//**********************
			if (this.value.length < 2)
			{
				if (container)
					container.parentNode.removeChild(container);
				elem.value = "";
				return;
			}
			
			var container;
			if ( !(container = getElem('autocompliteContainer_' + elemAutocomplite.name)) )
				container = createElement('div', 'autocompliteContainer_' + elemAutocomplite.name);
			container.innerHTML = (loadingImg) ? "<img src='" + loadingImg + "' align='left' />" : "";
			var parentPos = getElementPos(elemAutocomplite);
			container.className = 'autocompliteContainer';
			container.style.overflow = "visible";
			container.style.height = "auto";
			container.style.width = "auto";
			container.style.left = parentPos.left + 'px';
			container.style.top = parentPos.top + parentPos.height + 1 + 'px';		
			elemAutocomplite.parentNode.appendChild(container);				
			//**********************
			URLparams['namePart'] = this.value;
			JsHttpRequest.query(url, URLparams,
				function(result, answer)
				{
					if (result['success'])
					{
						var datas = result['data'];
						container.innerHTML = "";
						
						elem.value = "";
						if (datas.length > 0)
						{
							for (cnt in datas)
							{
								var item = createElement('div');
								item.appendChild(document.createTextNode(datas[cnt][1]));
								item.rel = datas[cnt][0];
								item.className = 'autocompliteItem';
								if (datas[cnt][1].toLowerCase() == elemAutocomplite.value.toLowerCase())
								{
									item.className += 'Selected';
									elem.value = datas[cnt][0];
								}
								Event.add(item, "mouseover", 
									function(e) 
									{ 
										this.className = "autocompliteItemSelected";
									});
								Event.add(item, "mouseout", 
									function(e) 
									{ 
										this.className = "autocompliteItem";
									});
								Event.add(item, "click", 
									function(e) 
									{ 
										elemAutocomplite.value = this.innerHTML;
										elemAutocomplite.rel = this.innerHTML;
										elem.value = this.rel;
										this.parentNode.parentNode.removeChild(this.parentNode);
										eval(onsuccessEvent);
									});
								container.appendChild(item);
							}
							if (container.offsetWidth + scrollWidth < parentPos.width)
								container.style.width = parentPos.width - 2 + 'px';
							else
								container.style.width = container.offsetWidth + scrollWidth + 2 + 'px';
								
							var needScroll = (container.offsetHeight > maxHeight);
							if (needScroll)
							{
								container.style.height = maxHeight; 
								container.style.overflow = "auto";
							}
							
							Event.add(container, "blur", 
								function(e) 
								{ 
									if (!elem.value)
										addIncorrectDataMsg(elemAutocomplite, errMsg);
									this.parentNode.removeChild(this);
								});
						}
						else
						{
							container.style.width = parentPos.width - 2 + 'px';
							container.innerHTML = "нет совпадений";
						}
					}
					else
						alert(result['error']);
				}, true);
		});
	Event.add(elemAutocomplite, "blur", 
		function(e) 
		{ 
			var container;
			if (container = getElem('autocompliteContainer_' + this.name))
			{
				if (!isMouseOver(container))
				{
					container.parentNode.removeChild(container);
					if (!elem.value)
						addIncorrectDataMsg(elemAutocomplite, errMsg);
					else
						eval(onsuccessEvent);
				}
			}
			else
			{
				if (this.value == "")
				{
					this.value = this.rel = "";
					elem.value = "";
				}
				else 
				{
					if(!elem.value)
						addIncorrectDataMsg(elemAutocomplite, errMsg);
					else
						eval(onsuccessEvent);
				}
			}
		});
	return elemAutocomplite;
}

function addIncorrectDataMsg(field, msg)
{
	if (!field)
		return;
	field.parentNode.previousSibling.style.color = "#f00";
	/*var errSpan;
	if (!(errSpan = getElem('autocompliteError_' + field.name)))
	{
		errSpan = createElement('span', 'autocompliteError_' + field.name);
		errSpan.className = "autocompliteError";
		insertAfter(errSpan, field);
	}
	errSpan.innerHTML = msg;*/
}

function clearIncorrectDataMsg(field)
{
	if (!field)
		return;
	field.parentNode.previousSibling.style.color = "#000";
	/*if (errSpan = getElem('autocompliteError_' + field.name))
		errSpan.parentNode.removeChild(errSpan);*/
}


function getElem(id)
{
	return document.getElementById(id);
}

function isMouseOver(elem)
{
	if (!elem)
		return false;
	var elemPosParams = getElementPos(elem, true);
	return	(mousex > elemPosParams.left) && (mousex < elemPosParams.left + elemPosParams.width ) &&
			(mousey > elemPosParams.top) && (mousey < elemPosParams.top + elemPosParams.height );
}

//********************************
function insertAfter(newElement, targetElement) 
{
	var parent = targetElement.parentNode;
 
	//if the parents lastchild is the targetElement...
	if(parent.lastchild == targetElement) 
		return parent.appendChild(newElement);
	else
		return parent.insertBefore(newElement, targetElement.nextSibling);
}

function getElementPos(elem, fromScreenZero)   
{   
	if (!elem)
		return false;   
	   
	var w = elem.offsetWidth;   
	var h = elem.offsetHeight;   
	   
	var l = 0;   
	var t = 0;   
	var positionStyle = "";
	
	while (elem)   
	{   
		l += elem.offsetLeft;   
		t += elem.offsetTop;   
		elem = elem.offsetParent;
		if (!elem)
			break;
		positionStyle = (isIE) ? elem.currentStyle['position'] : getComputedStyle(elem, null).position;
		if ( ( (positionStyle == "relative") || (positionStyle == "absolute") ) && !fromScreenZero )
			break;
	} 
	return {"left":l, "top":t, "width": w, "height":h};   
}

//*************************************
function getElementComputedStyle(elem, prop)
{
	if (typeof elem != "object") 
		elem = document.getElementById(elem);
  
	// external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
	if (document.defaultView && document.defaultView.getComputedStyle)
	{
		if (prop.match(/[A-Z]/)) 
			prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
		return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
	}	  
	// external stylesheet for Explorer and Opera 9
	if (elem.currentStyle)
	{
		var i;
		while ((i=prop.indexOf("-"))!=-1) 
			prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
		return elem.currentStyle[prop];
	}	  
	return "";
}
//*****************************************
function createElement(type, id, name)
{
	var element;
	if (isIE)
		element = document.createElement("<" + type + ( (id) ? " id='" + id + "'" : "") + ( (name) ? " name='" + name + "'" : "") + ">");
	else
	{
		element = document.createElement(type);
		if (id)
			element.id = id;
		if (name)
			element.name = name;
	}
	return element;
}


var prvmousex = mousex = prvmousey = mousey = 0;
if (isIE) //ie
{
	document.onmousemove = function()
	{    
		prvmousex = mousex;
		prvmousey = mousey;
		mousex = event.clientX + document.body.scrollLeft;
		mousey = event.clientY + document.body.scrollTop;
		return true
	}
}
else // !ie
{
	document.onmousemove = function(e) 
	{
		prvmousex = mousex;
		prvmousey = mousey;
		mousex = e.pageX;
		mousey = e.pageY;
		return true
	}  
}

function checkBrowser() 
{
	if (navigator.appName.indexOf ("Microsoft") !=-1) 
	{
		return true //IE
	}	
	return false;
}

function getScrollBarWidth() 
{
    var inner = createElement('p');
    inner.style.width = '100%';
    inner.style.height = '200px';

    var outer = createElement('div');
    outer.style.position = 'absolute';
    outer.style.top = '0px';
    outer.style.left = '0px';
    outer.style.visibility = 'hidden';
    outer.style.width = '200px';
    outer.style.height = '150px';
    outer.style.overflow = 'hidden';
    outer.appendChild(inner);

    document.body.appendChild(outer);
    var w1 = inner.offsetWidth;
    outer.style.overflow = 'scroll';
    var w2 = inner.offsetWidth;
    if (w1 == w2)
        w2 = outer.clientWidth;
    document.body.removeChild(outer);

    return (w1 - w2);
};
