function HttpClient() { }
HttpClient.prototype = {
	// Typ GET lub POST przekazywany do funkcji open
	requestType:'GET',
	// Ustawienie na true powoduje zgłaszanie wywołań asynchronicznych
	isAsync:false,

	// Zmienna na egzemplarz obiektu XMLHttpRequest
	xmlhttp:false,

	// Jaki typ danych ma byc pobrany XML czy TEXT
	responseType:'text',	
	
	// Kod wywoływany po wywołaniu asynchronicznym zakończonym
	// powodzeniem
	callback:false,

	// Kod wywoływany po wywołaniu send na obiekcie XMLHttpRequest.
	// Aby zastosować niestandardowy efekt wczytywania, należy ustawić
	// własną funkcją dla zdarzenia onSend
	onSend:function() {	
		document.getElementById('load').style.display = 'none';
	},

	// Kod wywoływany, kiedy readyState przyjmie wartość 4. Ten kod jest wywoływany
	// przed wywołaniem zwrotnym
	onLoad:function() {
		document.getElementById('load').style.display= 'block';
	},

	// Kod wywoływany w wyniku wystąpienia błędu http
	onError:function(error) {
		alert(error.message);
	},
	
	// Metoda inicjująca obiekt XMLHttpRequest
	init:function() {
		try {
		    // Mozilla / Safari
		    this.xmlhttp = new XMLHttpRequest();
		} catch (e) {
			// IE
			var XMLHTTP_IDS = new Array(
			'MSXML2.XMLHTTP.5.0',
			'MSXML2.XMLHTTP.4.0',
			'MSXML2.XMLHTTP.3.0',
			'MSXML2.XMLHTTP',
			'Microsoft.XMLHTTP' );
			var success = false;
			for (var i=0;i < XMLHTTP_IDS.length && !success; i++) {
				try {
					this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
					success = true;
				} catch (e) {}
			}
			if (!success) {
				throw new Error('Nie można utworzyć obiektu XMLHttpRequest.');
			}
		}
	},

	// Metoda zgłaszająca żądanie strony	
	// @param string url - Strona, do której kierowane jest żądanie
	// @param string payload - Wysyłane dane, jeśli jest to żądanie typu POST
	makeRequest: function(url,payload) {
		if (!this.xmlhttp) {
			this.init();
		}
		this.xmlhttp.open(this.requestType,url,this.isAsync);

		// Tu należy ustawić onreadystatechange, ponieważ w Mozilli stan zostanie wyzerowany
		// po zakończeniu wywołania
		var self = this;
		this.xmlhttp.onreadystatechange = function() { self._readyStateChangeCallback(); }

		this.xmlhttp.send(payload);

		if (!this.isAsync) {
			if (this.responseType == 'xml')
				return this.xmlhttp.responseXML;
			else
				return this.xmlhttp.responseText;
		}
	},
	

	// Wewnętrzna metoda służąca do obsługi zmian stanu
	_readyStateChangeCallback:function() {
		if (this.xmlhttp.readyState == 2 || this.xmlhttp.readyState == 3)
			this.onLoad();
		else if (this.xmlhttp.readyState == 4) {
			this.onSend();
			if (this.xmlhttp.status == 200) {
				if (this.responseType == 'xml')
					this.callback(this.xmlhttp.responseXML);
				else
					this.callback(this.xmlhttp.responseText);
			}
			else {
				this.onError(new Error('Błąd HTTP w czasie zgłaszania żądania: ['+this.xmlhttp.status+'] '+this.xmlhttp.statusText));
			}
		}
	}
}

