/*
	AJAX Library
	v 1.0.0
*/

var ajaxReq, callThisFunc;
var funcDone = false;
var channelFree = true;

function ajax(url, callFunc, post) {
	if (!channelFree) {
		if (callFunc.indexOf('"') !==  -1) {
			alert('Error. Function call must not contain ". Only \'.');
			return;
		}
		setTimeout('ajax("'+ url +'", "'+ callFunc +'", "'+ post +'")', 250);
		return;
	}
	channelFree = false;
	funcDone = false;
	if (! isset(callFunc)) var callFunc = '';
	callThisFunc = callFunc;
	if (url.indexOf('?') == -1) url += '?'; else url += '&';
	url += IDgen();
	if (window.XMLHttpRequest) {
		ajaxReq = new XMLHttpRequest();
		ajaxReq.onreadystatechange = processReqChange;
		if (! isset(post)) {
			ajaxReq.open("GET", url, true);
			ajaxReq.send(null);
		} else {
			ajaxReq.open("POST", url, true);
			ajaxReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded, charset=utf-8');
			ajaxReq.send(post);
		}
	} else if (window.ActiveXObject) {
		ajaxReq = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxReq) {
			ajaxReq.onreadystatechange = processReqChange;
			if (! isset(post)) {
				ajaxReq.open("GET", url, true);
				ajaxReq.send();
			} else {
				ajaxReq.open("POST", url, true);
				ajaxReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded, charset=utf-8');
				ajaxReq.send(post);
			}
		}
	}
}

function processReqChange() {
	if (ajaxReq.readyState == 4) {
		if (ajaxReq.status == 200) {
			if (! funcDone) {
				funcDone = true;
				eval(callThisFunc);
			}
		} else if (ajaxReq.status > 0) alert('Server returned error code '+ ajaxReq.status +'\n'+ ajaxReq.responseText);
		channelFree = true;
	}
}

function xml2array(xml) {
	var nv, el, SO, i, cn = xml.childNodes, res = {};

	if (xml.attributes) {
		SO = xml.attributes.length;
		for (i = 0; i < SO; i++) res[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
	}
	SO = cn.length;
	for (i = 0; i < SO; i++) {
		nv = cn[i].nodeValue;
		if (nv != null) {
			res['txt'] = nv;
			return res;
		} else {
			if (typeof(res[cn[i].nodeName]) == 'undefined') res[cn[i].nodeName] = [];
			res[cn[i].nodeName].push(xml2array(cn[i]));
		}
	}

	return res;
}
