/**********************************************
			AJAXOBJECT 
				v1.0

		XmlHttp kezelő komponens
	
	Copyright (C) 2006 - 2007, Dávid Milán
***********************************************/

/**
 * Objektum definiálása
 */
AjaxObject = function () {
	/*	Publikus propertyk	*/
	this.xmlHttp = null;			/* xmlHttp objektum a kapcsolathoz */
	this.responseType = "TEXT";		/* Lehetséges értékek: TEXT, XML */
	this.asyncMode = true;			/* Aszinkron mód (alapértelmezett: true)*/
	this.postDatas = new Array();	/* Post-olandó adatok tömbje Pl: postDatas = Array(["label1", "value1"], ["label2", "value2"]) */
	this.extraHeaders = null;		/* Extra fejlécadatok a kérés küldéséhez Pl: extraHeaders = Array(["label1", "value1"], ["label2", "value2"]) */
	this.readyState = 0;			/* Aktuális állapot */
	this.charset = "UTF-8";			/* Karakterkódolás az adatvitelhez (alapértelmezett: UTF-8)*/
	this.timeOut = 20000;			/* Timeout-ra futás ideje (alapértelmezett: 20 mp)*/

	/*	Felülbírálható egyedi fgv-ek	*/
	this.onStateChange = function (readyState) {	/* Állapotváltozás esetén hívódik meg */
		/*
			READYSTATE értékek:
				0 = uninitialized
				1 = loading
				2 = loaded
				3 = interactive
				4 = complete
		*/
		return false;
	}
	this.onError = function (errorCode, errorText) { return false; };	/* Hiba esetén hívódik meg */

	/* Üzenetküldő layer */
	this.msgWindow = document.createElement("div");
	with (this.msgWindow.style) {
		display = "inline";
		border = "1px solid #C5C5C5";
		background = "#FFFFFF";
		font = "11px Arial";
		padding = "10px";
		position = "absolute";
	}
};

/**
 * Privát propertyk
 */
AjaxObject.isIE = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);	/* Internet Explorer típusú-e a böngésző */
AjaxObject.visible = false;
AjaxObject.timer = null;
AjaxObject.req = null;
AjaxObject.errorMessage = {	/* Hibaüzenetek */
	100: "Browser does not support HTTP Request",
	101: "Server not responding",
	404: "File not found"
};

/**
 * XmlHttp objektum létrehozása a kapcsolat kezeléséhez
 *
 * @return XMLHttpRequest
 */
AjaxObject.getXmlHttpObject = function () { 
	var objXMLHttp = null;
	if (window.XMLHttpRequest)	/* Firefox, Safari, ... */
		objXMLHttp = new XMLHttpRequest();
	else
		if (window.ActiveXObject) {	/* Internet Explorer */
			var types = Array(
				'MSXML2.XMLHTTP.5.0',
				'MSXML2.XMLHTTP.4.0',
				'MSXML2.XMLHTTP.3.0',
				'MSXML2.XMLHTTP',
				'Microsoft.XMLHTTP'
			   );

			for (var i = 0; i < types.length; i++)
				try {
					objXMLHttp = new ActiveXObject(types[i]);
					break;
				} catch (e) {
					objXMLHttp = null;
				}
		}

	return objXMLHttp;
};

/**
 * Kérés küldése a szervernek
 * Sikeres küldés után meghívja az responseCallBack(response) függvényt a visszakapott tartalommal
 *
 * @param requestType String Kérés típusa (POST, GET, ...)
 * @param url String Cél url
 * @param responseCallBack function Válaszfeldolgozó callback fgv.
 */
AjaxObject.prototype.sendRequest = function (requestType, url, responseCallBack) {
	var req = this;

	stateChanged = function () {
		req.readyState = req.xmlHttp.readyState;
		req.onStateChange(req.readyState);	/* Egyedi állapotváltozás figyelő fgv. meghívása */
		if (req.xmlHttp.readyState == 4 || req.xmlHttp.readyState == "complete") {	/* Kérés küldése befejezve */
			if (req.xmlHttp.status == 200 || req.xmlHttp.status == 0) {	/* Sikeres adatlekérés esetén eredmény visszaadás TEXT vagy XML formában */
				if (responseCallBack != null)	/* Ha van válaszfeldolgozó fgv. akkor meghívjuk */
					if (req.responseType.toUpperCase() == "TEXT")
						responseCallBack(req.trim(req.xmlHttp.responseText));
					else
						if (req.responseType.toUpperCase() == "MULTIPART")
							responseCallBack(req.xmlHttp.responseText);
					else
						if (req.responseType.toUpperCase() == "XML")
							responseCallBack(req.xmlHttp.responseXML);
			}
			else
				req.onError(404, AjaxObject.errorMessage[404]);	/* Hiba esetén hibajelző fgv. meghívása */
			
			AjaxObject.stopTimer();
		}
	}

	req.xmlHttp = AjaxObject.getXmlHttpObject();	/* xmlHttp objektum példányosítása */
	if (req.xmlHttp == null) {	/* Nem AJAX kompatibilis a böngésző */
		req.onError(100, AjaxObject.errorMessage[100]);
		return false;
	}

	req.xmlHttp.onreadystatechange = stateChanged;	/* Állapotváltozás figyelő fgv. beállítása */

	try {
		url += (url.indexOf("?") > -1?"&":"?") + "rand=" + new Date().getTime();	/* URL hack a cache-elés elkerüléséhez */

		if (requestType.toUpperCase() == "GET")
			url += "&" + AjaxObject.createQuery(req.postDatas);

		req.xmlHttp.open(requestType, url, req.asyncMode);	/* Kapcsolat nyitása a szerverrel */

		if (req.xmlHttp.overrideMimeType)	/* Visszakapott eredmény típusának beállítása */
			if (req.responseType.toUpperCase() == "XML")
				req.xmlHttp.overrideMimeType("text/xml");
			else
				req.xmlHttp.overrideMimeType("text/html");

		/* Fejléc beállítása */
		req.xmlHttp.setRequestHeader("Connection", "close");
		if (requestType.toUpperCase() == "POST")	/* Ha POST a kéréstípus, akkor beállítjuk a header-t hozzá */
			req.xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + this.charset);
		if (req.extraHeaders != null)	/* Extra fejlécek hozzáadása a kéréshez */
			for (var i = 0; i < req.extraHeaders.length; i++)
				req.xmlHttp.setRequestHeader(req.extraHeaders[i][0], req.extraHeaders[i][1]);

		req.xmlHttp.send(AjaxObject.createQuery(req.postDatas));	/* Kérés küldése */
		req.readyState = 0;

		/* Timeout indítása */
		AjaxObject.req = req.xmlHttp;
		AjaxObject.stopTimer();
		AjaxObject.startTimer(req);
	} catch (e) {
		if (!AjaxObject.isIE)
			this.onError(e.number, e.name);	/* Hibajelző fgv. meghívása */
	} finally {
		this.postDatas = new Array();	/* Post-olandó adatok ürítése a kérés végeztével */
		this.extraHeaders = null;	/* Extra fejlécadatok ürítése */
	}
};

/**
 * Timeout fgv. az időntúli kérés megszakításához
 */
AjaxObject.timedOut = function () {
	if (AjaxObject.req != null) {
		AjaxObject.req.xmlHttp.abort();
		AjaxObject.stopTimer();
		AjaxObject.req.onError(101, AjaxObject.errorMessage[101]);
	}
};

/**
 * Timeout időzítő indítása
 *
 * @param req AjaxObject Objektum amihez csatoljuk
 */
AjaxObject.startTimer = function (req) {
	AjaxObject.req = req;
	AjaxObject.timer = setTimeout(AjaxObject.timedOut, req.timeOut);
};

/**
 * Timeout időzítő leállítása
 */
AjaxObject.stopTimer = function () {
	if (AjaxObject.timer != null)
		clearTimeout(AjaxObject.timer);
};

/**
 * Speciális karakterek átkódolása
 *
 * @param uri String Átkódolandó szöveg
 * @return String
 */

AjaxObject.encode = function (uri) {
	if (encodeURIComponent)
		return encodeURIComponent(uri);

	if (escape)
		return escape(uri);

	return uri;
}

/**
 * Query adatok összeállítása
 *
 * @param postDatas Array Összefűzendő adatok
 * @return String
 */
AjaxObject.createQuery = function (postDatas) {
	var queryData = new Array();
	if (postDatas != null)
		for (var i = 0; i < postDatas.length; i++)
			queryData.push(AjaxObject.encode(postDatas[i][0]) + "=" + AjaxObject.encode(postDatas[i][1]));

	return (queryData.length > 0?queryData.join("&"):"");
};

/**
 * Szöveg előtti és utáni fehérkarakter eltávolító
 *
 * @param text String Tisztítandó szöveg
 * @return String
 */
AjaxObject.prototype.trim = function (text) {
	return text.replace(/^\s+|\s+$/, '');
};

/**
 * Üzenetablak újrapozícionálása
 */
AjaxObject.prototype.repositionMsgWindow = function () {
	this.msgWindow.style.left = (document.body.scrollLeft + (document.body.clientWidth / 2 - this.msgWindow.offsetWidth / 2)) + "px";
	this.msgWindow.style.top = (document.body.scrollTop + (document.body.clientHeight / 2 - this.msgWindow.offsetHeight / 2)) + "px";
};

/**
 * Üzenetablak megjelenítése
 *
 * @param msg String Megjelenítendő üzenet
 */
AjaxObject.prototype.displayMessage = function (msg) {
	this.msgWindow.innerHTML = "<table style=\"font: " + this.msgWindow.style.font + ";\" cellpadding=\"0\" cellspacing=\"0\"><tr><td><img src=\"images/ajaxupdating.gif\" style=\"margin-right: 10px;\"></td><td>" + msg + "</td></tr></table>";
	if (!AjaxObject.visible)
		document.body.appendChild(this.msgWindow);
	AjaxObject.visible = true;
	this.repositionMsgWindow();
};

/**
 * Üzenetablak elrejtése
 */
AjaxObject.prototype.hideMsgWindow = function () {
	if (AjaxObject.visible)
		document.body.removeChild(this.msgWindow);
	AjaxObject.visible = false;
}