/******************************************************************************
 *	Author:  Petr Suchy (xsuchy09) <suchy@wamos.cz>
 *	Copyright: (c) Petr Suchy (xsuchy09) <suchy@wamos.cz> <http://www.wamos.cz>
 ******************************************************************************/


/**
 * Objekt pro odesilani a zpracovani XMLHTTP požadavků.
 * @author Petr Suchy (xsuchy09) <suchy@wamos.cz>
 * @copyright (c) 2009 Petr Suchy (xsuchy09) <suchy@wamos.cz> <http://www.wamos.cz>
 */
var ajax = {
	xmlhttp : null, 
	buffer : new Array(), 
	active_request : '', 
	container : null, 
	
	addRequest : function(url, method, content, headers, userFunction, userFunctionArgument) {
		ajax_state = ajax.getReadyState();
		if (ajax_state == false || ajax_state == 'COMPLETE') {
			ajax.send(url, method, content, headers, userFunction, userFunctionArgument);
		} else {
			ajax.buffer.unshift(new Array(url, method, content, headers, userFunction, userFunctionArgument));
		}
	}, 
	
	trySendRequest : function(ajax_state) {
		if (ajax_state != null && ajax_state == 'COMPLETE') {
			request = ajax.buffer.pop();
			if (request != null && request.length > 0) {
				ajax.send(request[0], request[1], request[2], request[3], request[4], request[5]);
			}
		}
	}, 
	
	send : function(url, method, content, headers, userFunction, userFunctionArgument) {
		try {
			// vytvor xmlhttp request
			this.xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e) {
			// nepodarilo se vytvorit xmlhttp request
			alert('Chyba v soubor ajax.js - Nepodarilo se vytvorit objekt xmlhttp request!');
			return false;
		}
		
		// otevri xmlhttp request, asynchronni
		this.xmlhttp.open(method, url, true);
		
		// pokud je uzivatelska funkce pro zpracovani requestu, zavolame ji
		this.xmlhttp.onreadystatechange = function() {
			if (userFunction != null) {
				if (userFunctionArgument != null) {
					userFunction(ajax.getReadyState(), userFunctionArgument);
				} else {
					userFunction(ajax.getReadyState());
				}
			}
			ajax.trySendRequest(ajax.getReadyState());
		};
		
		// pokud jsou stanovene hlavicky, odesleme je
		if (headers != null) {
			// headers je "asociativni pole", projedeme ho a pridame k xmlhttp requestu
			for (var key in headers) {
				this.xmlhttp.setRequestHeader(key, headers[key]);
			}
		} else {
			this.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
			if (content != null) {
				this.xmlhttp.setRequestHeader('Content-Length', content.length);
			}
			this.xmlhttp.setRequestHeader('Connection', 'close');
		}
		
		// oznacime si jaky pozadavek prave zpracovavame
		this.active_request = url;
		
		// odesleme pozadavek s predanym obsahem
		this.xmlhttp.send(content);
		
		return true;
	},
	
	getReadyState : function() {
		// musi byt aktivni xmlhttp spojeni
		if (ajax.xmlhttp == null) {
			return false;
		}
		
		// vraci stav ajax requestu (lepsi nez default ciselne vyjadreni)
		switch (ajax.xmlhttp.readyState) {
			case 0:
				return 'NOT_INITIALIZED';
			case 1:
				return 'INITIALIZED';
			case 2:
				return 'SENT';
			case 3:
				return 'IN_PROCESS';
			case 4:
				return 'COMPLETE';
			default:
				return 'UNDEFINED';
		}
	}, 
	
	getStatusCode : function() {
		if (ajax.xmlhttp == null) {
			return false;
		}
		
		return ajax.xmlhttp.status;
	}, 
	
	getStatusText : function() {
		if (ajax.xmlhttp == null) {
			return false;
		}
		
		return ajax.xmlhttp.statusText;
	}, 
	
	getResponse : function(type) {
		if (this.xmlhttp == null) {
			return false;
		}
		// zda chceme odezvu v XML, nebo v textu
		if (type == 'xml') {
			return this.xmlhttp.responseXML;
		} else {
			// default text
			return this.xmlhttp.responseText;
		}
	}
}
