/*
	Written	by Eugene Ostroukhov
	Copyright, All right reserved, 2007
	version: 1.02
*/
ajax_request = function()
{
	this.init();
}

var aj_req = ajax_request.prototype;

aj_req.init = function() {

	this._postdata = null;
	this.headers = null;
	this.params = null;
	this.req = null;
}
aj_req.setRequestHeader	= function(field, header) {
	if(! this.headers) this.headers	= [];
	this.headers[field] = header;
};

aj_req.setRequestHeaders = function(headers) {
	if(! this.headers) this.headers	= []
	for(var	i=0; i<	headers.length;	i++) 
	{
		this.headers[i]	= headers[i];
	}
};

aj_req.setPostData = function(postdata)	{
	var post = '';
	if(postdata == null) return false;
	for(var	i in postdata) post += "&" + i + "=" + encodeURI(postdata[i]);
	post = post.substring(1, post.length);
	this._postdata = post;
};

aj_req.send = function (params)	{
	var req;

	if (window.XMLHttpRequest) req = new XMLHttpRequest();
	else if	(window.ActiveXObject) 
	{
		req = new ActiveXObject("Msxml2.XMLHTTP");
		if (! req) req = new ActiveXObject("Microsoft.XMLHTTP");
	}

	if(! req) {
	
/*	alert("ei ole reqqii");*/
	
		return false;
	}
	this.req = req;
	if(params.url == null) return false;
	if(params.method == null) params.method	= "GET";
	else params.method = params.method.toUpperCase();

	this.params = params;

	var _this = this;

	req.onreadystatechange = function() 
	{
		if(req.readyState == 4)
		{
			if(req.responseText == 'ERROR') {
				if(_this.params.onError	!= null) _this.params.onError();
			}
			else if(req.responseText == '') {
				if(_this.params.onEmpty	!= null) _this.params.onEmpty();
			}
			else {
				if(_this.params.onDataReady != null) 
				{
					if(_this.params.result == 'reqObject') _this.params.onDataReady(req);
					else if(_this.params.result == 'xmlObject') _this.params.onDataReady(req.responseXML);
					else _this.params.onDataReady(req.responseText);
				}

				if(_this.params.elements != null) for(var i=0; i< _this.params.elements.length;	i++) 
					aj_req._fillElement(_this.params.elements[i], req.responseText);

				if(_this.params.onComplete != null) _this.params.onComplete(req.responseText);
			}
			req = null;
		}
	}

	req.open(params.method,	params.url, true);

	if(params.method == "POST" && this._postdata != null && this._postdata.length) {

		req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    //		  req.setRequestHeader('Content-length', this._postdata.length);
		req.setRequestHeader('Connection', 'close');
	}
	if(this.headers) for(var i = 0;	i< this.headers.length;	i++)
		req.setRequestHeader(i,	this.headers[i]);
	req.send(this._postdata);
	return req;
};

aj_req._fillElement = function(params, responseText) {
	if(params.id ==	null) return false;
	var elem = document.getElementById(params.id);
	if(! elem) return false;
	switch(elem.tagName)
	{
		case 'BUTTON': case 'INPUT':
			elem.value = responseText; 
			break;

		case 'FORM': case 'DIV': case 'TR': case 'TD': case 'TABLE': case 'SPAN': case 'P': 
			elem.innerHTML = responseText; 
			break;

		case 'SELECT' :
			if(params.clear	== true) while(elem.options.length) elem.options[0] = null;
			eval("var arr = new Array("+responseText+");");
			for(var	i=0; i<	arr.length; i+=3)
				elem.options[elem.options.length] = new	Option(arr[i], arr[i+1], false,	parseInt(arr[i+2]));
			break;
	}
};

function AutoComplete(params)
{
	this.id	= "autoCompletePopupDiv";
	var _acpopup = document.createElement("DIV");
	_acpopup.className = "ACPopup";
	_acpopup.innerHTML = "";
	_acpopup.id = this.id;
	_acpopup.style.zIndex =	'1000';
	_acpopup.style.position	= "absolute";
	_acpopup.style.display = "none";
	document.body.appendChild(_acpopup);

	document.body.autoCompletePopupId = this.id;

	this.popup = _acpopup;

	this.active = this.prevActive =	-1;

	var acObject = this;
	this.params = params;

	if (window.addEventListener) window.addEventListener("click", hideAutoComplete, false)
	else if	(document.body.attachEvent) document.body.attachEvent("onclick", hideAutoComplete)
	else document.body.onclick = hideAutoComplete;
	
	_acpopup.onclick = function(ev)
	{

		var	ev = window.event || ev;
		var	target=window.event? window.event.srcElement: ev.target;

		if(! target.className) 
			target = target.parentNode;
		if(target.className == 'active' || target.className == 'normal')
		{
			document.getElementById(this.textFieldId).value	= target.hiddenText;
		}
		_acpopup.style.display = 'none';

	}

	// init	text input elements

	for(var	i in params) {
		var el;


		el = document.getElementById(params[i].id);

		if(el.tagName != "INPUT") continue;

		el.onkeydown = function(ev) 
		{
			var	ev = window.event || ev;
			var	target=window.event? window.event.srcElement: ev.target;


			if(ev.keyCode != 38 && ev.keyCode != 40) return;

			var list = acObject.popup.childNodes;
			var na,	pa = acObject.active; // na = new active

			if(list.length == 0) return;
			if(list.length == 1) {
				na = pa	= 0;
			}
			else
			switch(ev.keyCode) 
			{
				case 38:
					na = pa	- 1;
					if(na <	0) na =	list.length - 1;
					break;

				case 40:
					na = pa	+ 1;
					if(pa >= list.length - 1) na = 0;
					break;
			}
			if(pa != -1) list[pa].className	= 'normal';
			if(na != -1) list[na].className	= 'active';

			acObject.prevActive = acObject.active;
			acObject.active	= na;
			return true;
		}
		el.onkeyup = function(ev) 
		{
			var	ev = window.event || ev;
			var	target=window.event? window.event.srcElement: ev.target;

			if(ev.type == 'keyup')
			{
				var c =	ev.keyCode;

				if( c == 108 ||	c == 189 || c == 38 || c == 40 ) return;
				if( (c > 47 && c < 91 )	|| c ==	8 || c == 46 ||	(c > 187 && c <	193 ) || c == 27 || c == 13 || c == 111	|| (c >	95 && c	< 111) || c == 191 || c	== 109 || c == 188 || c	== 32 || c == 220);
				else return;

				switch(ev.keyCode) 
				{
					case 13:
						if(acObject.active == -1) return;
						this.value = acObject.popup.childNodes[acObject.active].hiddenText;
						acObject.popup.style.display = 'none';
						return;
					case 27:
						acObject.popup.style.display = 'none';
						return;
					case 9:	
						acObject.popup.style.display = 'none';
						return;
					default: 
						acObject.popup.style.display = 'none';
				}
			}

			var index = acObject.findElementIndex(this.id);
			if(! params[index].minchars || (params[index].minchars && this.value.length >= params[index].minchars))
			{

				var ap = { url:	params[index].url, method: "post",
					onDataReady: function(text) 
					{
						if(text	== '') return;

						acObject.active	= acObject.prevActive =	-1;
						_acpopup.innerHTML = '';
						eval("var list = [" + text + "]");

						for(var	k=0; k < list.length; k	+= 2) 
						{
							var listItem = document.createElement("DIV");
							listItem.innerHTML = list[k];
							listItem.className = 'normal';
							listItem.hiddenText = list[k + 1];

							listItem.onmouseover = function() {
								if(this.className == 'normal') this.className = 'active';
							}

							listItem.onmouseout = function() {
								this.className = 'normal';
							}

							_acpopup.appendChild(listItem);
						}


						_acpopup.textFieldId = params[index].id;

						var obj	= document.getElementById(params[index].id);
						var w =	obj.offsetWidth;
						var h =	obj.offsetHeight;
						var x =	y = 0;
						while(obj) {
							x += obj.offsetLeft;
							y += obj.offsetTop;
							obj = obj.offsetParent;
						}
						if(params[index].align)	{
							if(params[index].align.match("right")) x += w;
							if(params[index].align.match("bottom")) y += h;
						}
						_acpopup.style.left = x;
						_acpopup.style.top = y;
						_acpopup.style.display = 'block';
					}
				}

				var ajax = new ajax_request();

				var p =	{};
				p.text = this.value;
				if(p.postdata && p.postdata.length) for(var j in postdata) {
					eval("p." + j + "=" + postdata[j]);
				}
				p.text = this.value;

				ajax.setPostData(p);
				if(! ajax.send(ap)) return false;
			}

		}
	}

	this.searchActiveItem =	function()
	{
		for(var	i in this.popup.childNodes)
			if(this.popup.childNodes[i] && this.popup.childNodes[i].className == 'active') return i;
		return -1;
	}

	this.findElementIndex =	function(id) {
		for(var	i in this.params) 
			if(this.params[i].id ==	id) 
				return i;
		return -1;
	}
}

hideAutoComplete = function(ev)	{

	var	ev = window.event || ev;
	var	target=window.event? window.event.srcElement: ev.target;
	if(target.className != 'normal' && target.className != 'active' && target.className != 'ACPopup')
		document.getElementById(document.body.autoCompletePopupId).style.display = 'none';
}


