/**
* @package GS_Ajax
* @copyright GuidoSoft 2006
* @author Kovacs Guido
* @internal AJAX-os kommunkaciot megvalosito Javascript osztaly.
*
* @internal TODO	- submit gomb erteket is el tudja kuldeni, de csak amelyikre kattintottak
*					- image gomb erteket is el tudja kuldeni, de csak amelyikre kattintottak
*/

function GS_Ajax() {
	this.req				= null;
	this.url				= null;
	this.method				= 'GET';			// 'GET' vagy 'POST'
	this.async				= true;				// Asyncron modban tortenjen-e a kommunikacio
	this.status				= null;
	this.statusText			= '';
	this.postData			= null;
	this.readyState			= null;
	this.responseText		= null;
	this.responseXML		= null;
	this.responseFormat		= 'text';			// 'text', 'xml', vagy 'object'
	this.responseContainer	= '';
	this.handleResp			= null;
	this.handleErr			= null;
	this.mimeType			= null;
	this.charset			= 'iso-8859-2';		// Kommunikacio altal hasznalt karakterkeszlet
	this.callbackSuccess	= function(){};		// Sikeres kommunikacio eseten meghivodo fuggveny
	this.callbackFailed		= function(){};		// Sikertelen kommunikacio eseten meghivodo fuggveny



	/**
	* XMLHttpRequest objektum peldanyositasa.
	*
	* @return object
	*/
	this.init = function() {
		if (!this.req) {
			try {
				// Objektum peldanyositasa a kovetkezo bongeszok szamara: Firefox, Safari, IE7 [30], stb.
				this.req = new XMLHttpRequest();
			}
			catch (e) {
				try {
					// Objektum peldanyositasa a kovetkezo bongeszok szamara: IE ujabb verziok.
					this.req = new ActiveXObject('MSXML2.XMLHTTP');
				}
				catch (e) {
					try {
						// Objektum peldanyositasa a kovetkezo bongeszok szamara: IE korabbi verziok.
						this.req = new ActiveXObject('Microsoft.XMLHTTP');
					}
					catch (e) {
						// Nem lehet peldanyositani az objektumot.
						return false;
					}
				}
			}
		}
		return this.req;
	};



	/**
	* Egy HTTP keres elkuldese.
	*
	* @return void
	*/
	this._doRequest = function() {
		// IE Cache work around
		var d = new Date();
		var time = d.getTime();

		if (!this.init()) { 
			alert('Nem lehet peldanyositani az XMLHttpRequest objektumot.'); 
			return; 
		}
		if (this.url.indexOf('?') >= 0) {
			this.req.open(this.method, this.url+'&'+time+'='+time, this.async);
		}
		else {
			this.req.open(this.method, this.url+'?'+time+'='+time, this.async);
		}

		if (this.mimeType) { 
			try { 
				req.overrideMimeType(this.mimeType); 
			} 
			catch (e) { 
				// Nem tudja felulirni a MIME tipust - IE6 vagy Opera? 
			} 
		} 


		// A 'loss-of-scope' jelenseg kivedesere szolgalo bugfix.
		//
		// A jelenseg leirasa: asszinkron javascript kommunikacio eseten egy keres befejezesehez rendelt esemenykezelo az
		// oldalban esetlegesen mashol vegrehajtodo setTimeout es/vagy setInterval utasitasok hatasara 'elvesziti' a sajat
		// hatokoret (scope-jat)
		var self = this;


		/*
		* Egy keres vegrehajtasa alatt torteno allapotvaltozas eseten lefuto fuggveny.
		*
		* @return void
		*/
		this.req.onreadystatechange = function() {
			var resp = null;
			if (self.req.readyState == 4) {
				switch (self.responseFormat) {
					case 'text':
						resp = self.req.responseText;
						break;
					case 'xml':
						resp = self.req.responseXML;
						break;
					case 'object':
						resp = req;
						break;
				}
				if (self.req.status >= 200 && self.req.status <= 299) {
					self.handleResp(resp);
					self.callbackSuccess();
				}
				else {
					self.handleErr(resp);
					self.callbackFailed();
				}
			}
		};

		if (this.postData != null) {
			this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=' + this.charset);
		}
		this.req.send(this.postData);
	};



	/**
	* GET tipusu keres kuldese.
	*
	* @param url	string				A keres URL-je
	* @param hand	function_reference	A kapott valaszt lekezelo esemenykezelo fuggveny
	* @param format	string				A vart valasz tipusa
	* @return void
	*/
	this._doGet = function(url, hand, format) {
		this.url = url;
		this.method = 'GET';
		this.postData = null;
		this.handleResp = hand;
		this.responseFormat = format || 'text';
		this._doRequest();
	};



	/**
	* POST tipusu keres kuldese.
	*
	* @param url	string				A keres URL-je
	* @param hand	function_reference	A kapott valaszt lekezelo esemenykezelo fuggveny
	* @param format	string				A vart valasz tipusa
	* @param data	string				A tovabbitando adat (sorositva!)
	* @return void
	*/
	this._doPost = function(url, hand, format, data) {
		this.url = url;
		this.method = 'POST';
		this.postData = data;
		this.handleResp = hand;
		this.responseFormat = format || 'text';
		this._doRequest();
	}



	/**
	* Egy form adatainak tovabbitasa POST metodussal (a fajlfeltoltest es az 'image' tipusu gombot nem tamogatja!).
	*
	* @param formid	string				A tovabbitando form ID-je (id parameter erteke)
	* @param hand	function_reference	A kapott valaszt lekezelo esemenykezelo fuggveny
	* @param format	string				A vart valasz tipusa
	* @return void
	*/
	this.submitForm = function(formid, hand, format) {
		var form	= document.getElementById(formid);
		var data	= this.serializeForm(formid);
		this.method	= form.method.toUpperCase();

		if (this.method == 'GET') {
			var glue = (form.action.indexOf('?') >= 0) ? '&' : '?';
			this._doGet(form.action + glue + data, hand, format);
		}
		else if (this.method == 'POST') {
			this._doPost(form.action, hand, format, data);			
		}
		else {return false;}
	}



	/**
	* Tetszoleges keres tovabbitasa egy cimre, majd a visszaadott ertek megjelenitese egy HTML elemben.
	* Ehhez fontos, hogy a visszaadott ertek vagy formazott HTML, esetleg sima szoveg legyen.
	*
	* @param method		string	A keres metodusa (GET v. POST)
	* @param url		string	A keres celjanak cime
	* @param data		string	A tovabbitando adatok
	* @param container	string	A HTML elem azonositoja, amibe a valasz megjelenjen
	*/
	this.showAjaxRequestResponse = function(method, url, data, container) {
		if (method.toLowerCase() == 'get') {
			var glue = (url.indexOf('?') >= 0) ? '&' : '?';
			this.responseContainer = container;
			this._doGet(url + glue + data, this._doResponsePutElement);
		}
		else if (method.toLowerCase() == 'post') {
			this.responseContainer = container;
			this._doPost (url, this._doResponsePutElement, 'text', data);
		}
		else {return false;}
	}



	/**
	* Egy HTTP keres altal visszaadott valaszt (HTML vagy TEXT tipusu) egy megadott elembe helyez.
	*
	* @param response_text	string	A keres altal visszaadott valasz
	* @return bool
	*/
	this._doResponsePutElement = function(response_text)
	{
		if (response_text != '') {
			document.getElementById(this.responseContainer).innerHTML = response_text;
			return true;
		}
		else {return false;}
	}



	/**
	* Egy form tartalmanak sorositasa a form adatainak elkuldesehez.
	*
	* @param formid		string	A sorositando form ID-je
	* @return formdata	string	A form sorositott tartalma
	*/
	this.serializeForm = function(formid) {
		var formobj		= document.getElementById(formid);
		var formdata	= '';
		var element		= null;

		for (var i=0; i<formobj.elements.length; i++) {
			element = formobj.elements[i];
			if (element && element.type) {
				switch (element.type.toLowerCase()) {
					case 'hidden':
					case 'password':
					case 'text':
					case 'textarea':
						formdata += this._addQueryStringText(element);
						break;
					case 'checkbox':
					case 'radio':
						formdata += this._addQueryStringChecker(element);
						break;
					case 'select-one':
						formdata += this._addQueryStringSelectOne(element);
						break;
					case 'select-multiple':
						formdata += this._addQueryStringSelectMultiple(element);
						break;
					case 'button':
					case 'submit':
					case 'image':
					default:
						continue;
				}
			}
		}
		return formdata.substr(1, (formdata.length-1));
	}



	/**
	* Szoveg tartalmu mezo ertekenek hozzafuzese a querystring-hez (text, textarea, password, hidden).
	*
	* @param element	objectum_reference	Az elem neve, aminek az erteket hozzafuzzuk a query_string-hez
	* @return string
	*/
	this._addQueryStringText = function(element) {
		return '&' + element.name + '=' + encodeURIComponent(element.value);
	}



	/**
	* Jelolo mezo ertekenek hozzafuzese a querystring-hez (checkbox, radio).
	*
	* @param element	objectum_reference	Az elem neve, aminek az erteket hozzafuzzuk a query_string-hez
	* @return string
	*/
	this._addQueryStringChecker = function(element) {
		return (element.checked) ? '&' + element.name + '=' + encodeURIComponent(element.value) : '';
	}



	/**
	* Legordulo mezo ertekenek hozzafuzese a querystring-hez (csak egy eretek valaszthato).
	*
	* @param element	objectum_reference	Az elem neve, aminek az erteket hozzafuzzuk a query_string-hez
	* @return string
	*/
	this._addQueryStringSelectOne = function(element) {
		var value = '', opt, index = element.selectedIndex;
		if (index >= 0) {
			opt = element.options[index];
			value = opt.value;
			if (!value && !('value' in opt)) {value = opt.text;}
		}
		return '&' + element.name + '=' + encodeURIComponent(value);
	}



	/**
	* Legordulo mezo ertekenek hozzafuzese a querystring-hez (tobb eretek valaszthato).
	*
	* @param element	objectum_reference	Az elem neve, aminek az erteke(i)t hozzafuzzuk a query_string-hez
	* @return string
	*/
	this._addQueryStringSelectMultiple = function(element) {
		var value = new Array();
		var subelement = (element.name.substr((element.name.length-2), 2) == '[]') ? element.name.substr(0, (element.name.length-2)) : element.name;
		for (var j=0; j<element.length; j++) {
			var opt = element.options[j];
			if (opt.selected) {
				var optValue = opt.value;
				if (!optValue && !('value' in opt)) {optValue = opt.text;}
				value.push(encodeURIComponent(optValue));
			}
		}
		return '&' + subelement + '=' + value;
	}



	/**
	* Valasz mime-tipusanak beallitasa.
	*
	* @param mimeType	string	Valasz mime-tipusa
	* @return void
	*/
	this.setMimeType = function(mimeType) { 
		this.mimeType = mimeType; 
	};



	/**
	* Hiba kezelo fuggveny.
	* A HTTP keresek lefutatasa soran felmerulo
	*
	* @return void
	*/
	this.handleErr = function() {
		alert('An error occurred, but the error message cannot be '
		+ 'displayed. This is probably because of your browser\'s '
		+ 'pop-up blocker.\n'
		+ 'Please allow pop-ups from this web site if you want to '
		+ 'see the full error messages.\n'
		+ '\n'
		+ 'Status Code: ' + this.req.status + '\n'
		+ 'Status Description: ' + this.req.statusText);
	};



	/**
	* Hiba lekezelesere szolgalo fuggveny beallitasa.
	*
	* @param funcRef	function_reference	Az uj hibakezelo fuggvenyre mutato referencia
	* @return void
	*/
	this.setHandlerErr = function(funcRef) {
		this.handleErr = funcRef;
	};



	/**
	* Hiba- es a valasz egyuttes lekezelesere szolgalo fuggveny beallitasa.
	*
	* @param funcRef	function_reference	Az uj kezelo fuggvenyre mutato referencia
	* @return void
	*/
	this.setHandlerBoth = function(funcRef) {
		this.handleResp = funcRef;
		this.handleErr = funcRef;
	};



	/**
	* A folyamatban levo HTTP keres(ek) leallitasara szolgal.
	*
	* Ha egy weboldalon egy AJAX-ot hasznalo kod tul sokaig fut, akkor az 'abort' metodus segitsegevel
	* amennyiben a felhasznalo a 'Stop' gombra kattint, akkor ezzel leall a folyamatban levo AJAX keres
	* is ('abort' metodus nelkul nem allna le).
	*
	* @return void
	*/
	this.abort = function() {
		if (this.req) {
			this.req.onreadystatechange = function() { };
			this.req.abort();
			this.req = null;
		}
	};


// GS_Ajax osztaly vege
};