function HttpClient() {}
HttpClient.prototype = {
	// typ get lub posr przekazany do metody open
	requestType:'POST',
	// jeśli ta zmienna ma wartość true wykonywane są wywołania asynchroniczne
	isAsync:false,
	
	// gdzie przechowywany jest egzemplarz obiektu XMLHttpRequest?
	xmlhttp:false,
	
	// jaka funkcja jest wywoływana po zakończonym powodzeniem wywołaniu asynchronicznym?
	callback:false,
	
	// jaka funkcja jest wywoływana po wykonaniu metody send obiektu XMLHttpRequest?
	// Użyj własnej funkcji dla zdarzenia onSend, aby zastosować niestandardowy efekt wczytania.
	onSend:function() {
		document.getElementById('HttpClientStatus').style.display = 'block';
	},
	
	// Funkcja wywołana, kiedy readyState ma wartość 4; jest ona
	// uruchamiana przed wywołaniem zwrotnym (callback).
	onLoad:function() {
		document.getElementById('HttpClientStatus').style.display = 'none';
	},
	
	// funkcja wywołana po wystąbłędu http.
	onError:function(error) {
		alert(error);
	},
	
	// metoda inicjiującobiekt XMLHttpRequest
	init:function() {
		try {
			// Mozilla, Safari
			this.xmlhttp = new XMLHttpRequest();
		} catch (e) {
			// Internet Explorer
			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 ActiveObject(XMLHTTP_IDS[i]);
					success = true;
				} catch (e) {}
			}
			if(!success) {
				this.onError('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, jęsli jest to żądanie typu POST
	// @divId - identyfikator bloku, który ma zostać zmieniony (w którym mają pobrane dane)
	makeRequest:function(url, payload, divId) {
		if(!this.xmlhttp) {
			this.init();
		}
		this.xmlhttp.open(this.requestType, url, this.isAsync);
		this.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		// 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(divId); }
		
		this.xmlhttp.send(payload);
		
		if(!this.isAsync) {
			return this.xmlhttp.responseText;
		}
	},
	
	// wewnętrzna metoda służąca do obsługi zmian stanu.
	_readyStateChangeCallback:function(divId) {
		switch(this.xmlhttp.readyState) {
			case 2 :
				this.onSend();
				break;
			case 4 :
				this.onLoad();
				if(this.xmlhttp.status == 200) {
					this.callback(this.xmlhttp.responseText, divId);
				} else {
					this.onError('Błąd HTTP w czasie zgłaszania żądania: '+
						'['+this.xmlhttp.status+']'+
						''+this.xmlhttp.statusText);
				}
				break;
		}
	}
}

