var http_request = false;
var wait_time = false;
var wait_on = false;
var response;
var strict;
var func;

/*
	a bongeszot elfedo objektum
*/
function createRequestObject() {
	http_request = false;

	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if (!http_request) {
		return false;
	}
}


function escape(response)
{
	response = response.replace(/\\/g, '\\\\');
	response = response.replace(/"/g,  '\\"');
	response = response.replace(/\n/g, '\\n');
	response = response.replace(/\r/g, '\\r');
	response = response.replace(/\t/g, '\\t');
	return response
}

/**
 * AJAX lekerdezes inditasa
 * parameterek:
 * modul: melyik modulnak menjen a keres
 * func: melyik funkcionak menjen a keres
 * url: ha nincs megadva a modul es a func, akkor erre az url-re kuldi az adatokat (csak kulso url-nel ajanlott)
 *      (a modul es a func erosebb nala)
 * id_params: az atadando id-k /-rel elvalasztva
 * get_params: atadando get parameterek a szokasos formatumban
 * http_method: a http keres metodusa: get vagy post (default: get)
 * response_format: milyen formatumban kapjuk vissza a valaszt: XML objektum, HTML 
 *      vagy Text (escapelve vannak bizonyos dolgok) (default: Text)
 * callback: a valasszal, mint parameterrel meghivando JS fuggveny
 * target_id: annak a HTML elemnek az id-je, ahova a valasz kerul
 * target_overwrite: felulirja, vagy hozzafuzze a valaszt a target_id tartalmahoz (default: false)
 * no_header_check: ha ez nincs megadva, es nem egy ajax=1-es system*.ini-beli funkcio adta a valaszt, akkor reloadolja 
 *   az oldalt a fuggveny. pl ha lejart a session es ezert nem a megadott funkcio hajtodik vegre, akkor hasznos.
 *   ha meg van adva a parameter, akkor ez az ellenorzes ki van kapcsolva
 * debug_url: ha igaz, kiirja a meghivando url-t
 * debug_response: ha igaz, kiirja a valaszt
 * post_params: a postolando parameterek a get_params-nal hasznalt formatumaban
 * form_id: a postolando form. Ha nincs megadva a post_params, akkor innen veszi,
 *          ha nincs megadva a http_method, akkor innen veszi
 *
 * pl: getData({modul: 'fwtest', func: 'ajax_proc', target_id: 'response', get_params: 'debug_modul=0', response_format: 'Text'
 * });
 */
function getData(params) {
	if (params.modul || params.func)
	{
		params.url = get_url(params.modul, params.func)+(params.id_params ? params.id_params : '')+(params.get_params ? '?'+params.get_params : '');
	}
	if (params.debug_url)
	{
		e(params.url);
	}
	params.post_params = params.form_id && !params.post_params ? form2data(params.form_id) : params.post_params;
	params.http_method = params.form_id && !params.http_method ? document.getElementById(params.form_id).method : params.http_method;
	if (show_wait) 
	{
		show_wait();
	}
	if (createRequestObject()==false) 
	{
		return false;
	}
    if (!params.http_method) {
        params.http_method = 'GET';
    }

    http_request.onreadystatechange = function()
	{
		if (http_request.readyState == 4)
		{
			if (http_request.status == 200)
			{

				if (params.response_format == "XML")
				{
					response = http_request.responseXML;
				} else if (params.response_format == "HTML") 
				{
					response = http_request.responseText;
				}
				else {
                    response = escape(http_request.responseText);
				}
				if (params.debug_response || http_request.getResponseHeader("X-XMLHTTP-DEBUG")) {
                	alert(http_request.responseText);
				}
                   
				strict=false;
				try
				{
					strict = http_request.getResponseHeader("X-XMLHTTP-RESPONSE") || params.no_header_check ? true : false;
				} 
				catch (evt) {}
				if (hide_wait)
				{	
					hide_wait();
				}
				if (strict)
				{
					if (params.target_id)
					{
						document.getElementById(params.target_id).innerHTML = (params.target_overwrite ? '' : document.getElementById(params.target_id).innerHTML) + response;
					}
					if (params.callback)
					{
						eval(params.callback + '(response);');
					}
				}
				else 
				{
					document.location.reload();
					return;
				}
			} 
			else 
			{
				return false;
			}
		}
	};
	http_request.open(params.http_method, params.url, true);
	
    if (params.post_params) 
    {
        http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        http_request.send(params.post_params);
    } 
    else 
    {
        http_request.send(null);
    }

}

function getXML(func, url, no_header_check, httpmethod) {
	getData({callback: func, url: url, response_format: "XML", no_header_check: no_header_check});
}

function postXML(func, url, data, no_header_check) {
	getData({callback: func, url: url, response_format: "XML", no_header_check: no_header_check, http_method: "POST", post_params: data});	
}

function getText(func, url, no_header_check) {
	getData({callback: func, url: url, response_format: "Text", no_header_check: no_header_check});		
}

function getHTML(func, url, no_header_check) {
	getData({callback: func, url: url, response_format: "HTML", no_header_check: no_header_check});		
}

function postForm(func, url, form_id, no_header_check)
{
	getData({callback: func, url: url, response_format: "XML", no_header_check: no_header_check, form_id: form_id, http_method: "POST"});
}

function postFormHTML(func, url, form_id, no_header_check)
{
	getData({callback: func, url: url, response_format: "HTML", no_header_check: no_header_check, form_id: form_id, http_method: "POST"});
}

/**
 * adott id-ju form adatait kigyujti, es string alakban adja vissza
 */
function form2data(form_id)
{
	form = document.getElementById(form_id);
	ret = '';
	tagnames = new Array('input', 'select', 'textarea');
	for(j=0; j<tagnames.length; j++)
	{
		elems = form.getElementsByTagName(tagnames[j]);
		for(i=0; i<elems.length; i++)
		{
			elem = elems[i];
			ret+= elem.name+'='+elem.value+'&';
		}
	}
	return ret;
}

function show_wait() {
	wait = document.getElementById("ajax_waiting");
	if (wait) 
	{
		wait_time=true;
		wait_on=true;
		window.setTimeout("auto_hide_wait()",1000);
		wait.style.display="block";
	}
}

function hide_wait() {
	wait_on=false;
	wait=document.getElementById("ajax_waiting");
	if (wait && !wait_time) {
		wait.style.display="none";
	}
}

function auto_hide_wait() {
	wait_time=false;
	if (!wait_on) {
		hide_wait();
	}
}


