/**
* Funkce pro praci s XMLHttpRequest.
*
* @date 2007-06-05
* @version 1.2
* @author Petr Tomek <petr.tomek@centrum.cz>
*/

var reqBuff = new Array(); // buffer requestu
var httpGetXML = getHTTPObject(); // inicializace

/**
* Inicializace XMLHttpRequest objektu.
* @return object objekt XMLHttpRequest nebo false
*/
function getHTTPObject() {
	var xmlhttp;
	/*@cc_on
	@if (@_jscript_version >= 5)
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = false;
		}
	}
	return xmlhttp;
}

/**
* Zaradi request pozadavek do fronty nebo prvni vysle
* Funkce vraci false pokud je inicializovany request,
* jinak vrati true pro pripadne vyuziti href v tagu <a>
* nebo odeslani formu napr search.
*
* @param string url kompletni url adresa (napr 'getdata.php?id=5')
* @param string targer id komponentu ve strukture DOM
* @param string typ	'null'/'content' - vlozi vysledek do obsahu elementu
*					'class' - vlozi vysledek jako nazev tridy
*					'function' - zavola funkci s parametrem obsahujicim vysledek
*					'class-content' - ocekava na zacatku vysledku
*						<!--clas_name--> jako nazev css tridy a nasledne obsah
* @return bolean false-request proveden, true-request neproveden
* @todo pokud vysledek vrati 'reload', provede se reaload strany
* @tutorial getRequest('getdata.php?id=5', 'id_content')
*/
function getRequest() {
	if(httpGetXML!==false && arguments.length>1) {
		// uschovej pozadavek
		reqBuff.push(arguments);
		if(reqBuff.length==1) {
			// vysli pozadavek
			sendRequest(arguments[0]);
		}
		return false;
	}
	return true;
}

/**
* Vysle pozadavek request.
* @param string url kompletni url adresa (napr 'getdata.php?id=5')
*/
function sendRequest( url ) {
	if (httpGetXML.readyState == 4 || httpGetXML.readyState == 0) {
		httpGetXML = getHTTPObject(); // kvuli mozille, jine to nepotrebuji
		httpGetXML.open('GET',
			url + (url.lastIndexOf('?')>=0 ? '&' : '?')
			+ 'rand=' + Math.floor(Math.random() * 1000000), true);
		httpGetXML.onreadystatechange = resultRequest;
		httpGetXML.send(null);
	}
}

/**
* Zpracuj vysledek a pokud je tak vysle dalsi pozadavek.
* @return bolean false-request proveden, true-request neproveden
*/
function resultRequest() {
	if (httpGetXML.readyState == 4) {
		// request hotov
		results = httpGetXML.responseText;
		if (results=='reload') {
			return document.location.reload();
		}
		// zpracovani vysledku
		req = reqBuff.shift();
		target = document.getElementById(req[1]);
		if(target) {
			switch(req[2]) {
				case 'function':
					try{eval(req[1]+'(httpGetXML.responseText);');}catch(e){};
					break;
				case 'class':
					target.className = results;
					break;
				case 'class-content':
					css = results.match(/^<!--([^ ]+)-->/);
					if(css) target.className = css[1];
				case 'content':
				default:
					target.innerHTML = results;
			}
		}
		// je-li v bufferu pozadavek, vysli jej
		if(isRequest()) {
			sendRequest(reqBuff[0][0]);
		}
	}
}

/**
* Test na ukonceni fronty requestu.
* @return boolean true-probiha zpracovani
*/
function isRequest() {
	return reqBuff.length!=0;
}

