function create_xhr() {
  var xhr;
  try {
    xhr = new XMLHttpRequest();
  }
  catch(e) {
    var XmlHttpVersions = new Array(
		"MSXML2.XMLHTTP.6.0",
		"MSXML2.XMLHTTP.5.0",
		"MSXML2.XMLHTTP.4.0",
		"MSXML2.XMLHTTP.3.0",
		"MSXML2.XMLHTTP",
		"Microsoft.XMLHTTP"
	);
    for (var i=0; i<XmlHttpVersions.length && !xhr; i++) {
      try {
        xhr = new ActiveXObject(XmlHttpVersions[i]);
      }
      catch (e) {}
    }
  }
  if (xhr) return xhr;
  else return false;
}

function cb(func, params) {
	eval(func+'(params)');
}

var xhr_cache=Array();
var xhr=create_xhr();

function processCache() {
	try {
		if (xhr_cache.length > 0) {
			if ((xhr.readyState == 4 || xhr.readyState == 0) && xhr_cache.length > 0) {
				cache=xhr_cache.shift();
				split=cache.split('<||>');
				domelement=document.getElementById(split[0]);
				url=split[1];
				query=split[2];
				method=(split[3]==1?"POST":"GET");
				callback=split[4];
				if (method == "GET") url=url+'?'+query;
				xhr.open(method, url, true);
				if (method == "POST") xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				xhr.onreadystatechange =
					function() {
						if (xhr.readyState == 4) {
						    if (xhr.status == 200) {
							    if (callback.length > 0) {
									cb(callback, xhr.responseText);
								}
								else {
									try {
										domelement.innerHTML=xhr.responseText;
									}
									catch(e) {
										domelement.innerHTML="Błąd podczas odczytu odpowiedzi: " + e.toString();
									}
								}
							}
							else {
								domelement.innerHTML="Pojawił się problem w uzyskaniu danych:\n" + xhr.statusText;
							}
						}
					}
				xhr.send((method == "GET"?null:query));
			}
			else {
				xt=setTimeout("processCache()", 100);
			}
		}
	}
	catch (e) {
		domelement.innerHTML="Nie mogę połączyć się z serwerem:\n" + e.toString();
	}
}

function process(dom_id, url, query, method, callback) {
	if (xhr) {
		if (!method) method=0;
		if (!callback) callback='';
		xhr_cache.push(dom_id+'<||>'+url+'<||>'+query+'<||>'+method+'<||>'+callback);
		processCache();
	}
}
