// ../script/ajax.js -> kinyomva	
// ../script/dialogManager.js -> kinyomva	
// ../script/scripthu.js -> kinyomva	
var ajaxcomm = 0;
var ajaxArray = new Array();
var cSearch = "";

function  fAddForum(){
	var strnick = new String(fGetObject("snick").value);
	var strpass = new String(fGetObject("spass").value);
	var stremail = new String(fGetObject("semail").value);
	
	if(strnick == "nick"){
		dialogManager.add(new Dialog('A nick név megadása kötelező!', 'alert'));	
		return false;
	}
	
	if(strpass == "jelszó"){
		dialogManager.add(new Dialog('A jelszó megadása kötelező!', 'alert'));			
		return false;
	}
	
	if(stremail == "e-mail"){
		dialogManager.add(new Dialog('Az e-mail cím megadása kötelező!', 'alert'));			
		return false;
	}
		
	
	if(stremail.indexOf("@") == -1 || stremail.indexOf(".") == -1){
		fGetObject("semail").value = "E-mail cím";
		dialogManager.add(new Dialog('Az e-mail cím formátuma nem megfelelő', 'alert'));			
	}else{
		fGetObject("div_hirlevel").innerHTML = "feldolgozás...";
			
		ajaxArray.push(Array("../doajax.php?type=addforum","&pnick="+strnick+"&ppass="+strpass+"&pemail="+stremail,"commGateAddForum"));
		fCallxmlhttpPost();	
	}
	
	return false;
}

function commGateAddForum(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	if(aTmp[0] != -1)
		eval(aTmp[1]);
		
	fGetObject("div_hirlevel").innerHTML = '<table border="0" cellspacing="0" cellpadding="0"><tr><td class="form_cim" style="padding-bottom:10px;">Szükséges adatok</td></tr><tr><td style="padding-bottom:8px;"><input type="text" id="snick" name="snick" class="form_item3" value="nick" style="width:400px;" onfocus="if(this.value==\'nick\') this.value=\'\'" onblur="if(this.value==\'\') this.value=\'nick\'" /></td></tr><tr><td style="padding-bottom:8px;"><input type="text" id="spass" name="spass" class="form_item3" value="jelszó" style="width:400px;" onfocus="if(this.value==\'jelszó\') this.value=\'\'" onblur="if(this.value==\'\') this.value=\'jelszó\'" /></td></tr><tr><td style="padding-bottom:8px;"><input type="text" id="semail" name="semail" class="form_item3" value="e-mail" style="width:400px;" onfocus="if(this.value==\'e-mail\') this.value=\'\'" onblur="if(this.value==\'\') this.value=\'e-mail\'" /></td></tr><tr><td align="left"><div><input type="image" src="../img/hr_belep.jpg"></div></td></tr></table>';
}

function fAddHirlevel(pLang){
	var stremail = new String(fGetObject("semail").value);
	var strnev = new String(fGetObject("sfnev").value);
	
	if(strnev == "Teljes név"){
		dialogManager.add(new Dialog('A név megadása kötelező!', 'alert'));	
		return false;
	}
	
	if(stremail == "E-mail cím"){
		dialogManager.add(new Dialog('Az e-mail cím megadása kötelező!', 'alert'));			
		return false;
	}
		
	
	if(stremail.indexOf("@") == -1 || stremail.indexOf(".") == -1){
		fGetObject("semail").value = "E-mail cím";
		dialogManager.add(new Dialog('Az e-mail cím formátuma nem megfelelő', 'alert'));			
	}else{
		fGetObject("div_hirlevel").innerHTML = "feldolgozás...";
		
		ajaxArray.push(Array("../doajax.php?type=addhirlevel","&pemail="+stremail+"&plang=hu&pname="+strnev,"commGateAddHirlevel"));
		fCallxmlhttpPost();	
	}
	
	return false;
}

function commGateAddHirlevel(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	if(aTmp[0] != -1)
		eval(aTmp[1]);
		
	fGetObject("div_hirlevel").innerHTML = '<table border="0" cellspacing="0" cellpadding="0"><tr><td class="form_cim" style="padding-bottom:10px;">Szükséges adatok</td></tr><tr><td style="padding-bottom:8px;"><input type="text" id="sfnev" name="sfnev" class="form_item3" value="Teljes név" style="width:400px;" onfocus="if(this.value==\'Teljes név\') this.value=\'\'" onblur="if(this.value==\'\') this.value=\'Teljes név\'" /></td></tr><tr><td style="padding-bottom:8px;"><input type="text" id="semail" name="semail" class="form_item3" value="E-mail cím" style="width:400px;" onfocus="if(this.value==\'E-mail cím\') this.value=\'\'" onblur="if(this.value==\'\') this.value=\'E-mail cím\'" /></td></tr><tr><td align="left"><div><input type="image" src="../img/hr_belep.jpg"></div></td></tr></table>';
}

function fSelectEvent(eid, strtype, datum){
	fGetObject("event_1").innerHTML = "frissítés...";
	
	ajaxArray.push(Array("../doajax.php?type=event_select","&eid="+String(eid)+"&etype="+String(strtype)+"&datum="+String(datum),"commGateSelectEvent"));
	fCallxmlhttpPost();	
}

function commGateSelectEvent(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	
	if(aTmp[0] == 1){
		obj = fGetObject("event_1");
		if(obj)
			obj.innerHTML = aTmp[1];
	}else
		fGetObject("event_1").innerHTML = "<b>Probléma a feldolgozás során!<br>Kérjük próbálja meg újból.</b>";
		
	try{
		myLightbox.updateImageList();
	}catch(err){
	}
}

function fShowHrSearch(){
	fGetObject("hrsearch_detail").style.display = "none";
	fGetObject("hrsearch_detail").innerHTML = "";
	fGetObject("hrsearch").style.display = "block";
}

function fShowHrDetail(pId){
	ajaxArray.push(Array("../doajax.php?type=loadcw","pid="+String(pId),"commGateLoadCw"));
	fCallxmlhttpPost();
}

function commGateLoadCw(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	
	tmp = '';
	if(aTmp[0] == -1){
		tmp = '<div style="padding-top:10px; padding-bottom:10px; border-bottom:1px solid #e7e7e7;">'+aTmp[1]+'</div>';
	}else{
		q = 1;
		tmp += '<div style="padding-top:10px; padding-bottom:10px; border-bottom:1px solid #e7e7e7;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td rowspan="2" align="left" valign="top" width="165"><img src="../file_cw/'+aTmp[q]+'" width="150" /></td><td style="padding-bottom:10px;" valign="bottom" height="1">'+aTmp[q+1]+' | <font color="#450934" style="font-weight:bold;">'+aTmp[q+2]+'</font><div style="padding-top:10px;">E-mail: <a href="mailto:'+aTmp[q+6]+'" class="link_hr1">'+aTmp[q+6]+'</a></div><div style="padding-top:3px;">Telefon: '+aTmp[q+7]+'</div></td></tr>	<tr><td valign="top" style="text-align:justify;">'+aTmp[q+3]+'<div style="padding-top:10px;"><a href="../file_cw/'+aTmp[q+5]+'" target="_blank" class="link_hr1">cw letöltése >></a></div></td></tr></table></div><div style="padding-top:10px;"><a href="javascript:fShowHrSearch()" class="link_hr1"><<&nbsp;vissza a találatokhoz</a></div>';
	}
	
	fGetObject("hrsearch").style.display = "none";
	fGetObject("hrsearch_detail").style.display = "block";
	fGetObject("hrsearch_detail").innerHTML = tmp;	
}

function fSearch(obj){
	if(obj.value != cSearch){	
		obj2 = fGetObject("content");
		if(obj2)
			obj2.style.display = "none";
			
		obj2 = fGetObject("searchresult");
		if(obj2)
			obj2.style.display = "block";
			
		cSearch = obj.value;
		if(obj.value.length > 2){
			fGetObject("searchresult").innerHTML = '<table width="480" border="0" cellspacing="0" cellpadding="0"><tr><td width="22" align="left" valign="top">&nbsp;</td><td width="458" align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top">&nbsp;</td><td align="left" valign="top" class="news5">Találatok</td></tr><tr><td align="left" valign="top">&nbsp;</td><td align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top">&nbsp;</td><td align="left" valign="top">frissítés...</td></tr></table>';
			xmlhttpPostSearch("../doajax.php?type=search", "str_search="+String(obj.value), "commGateSearch");
		}else if(obj.value.length > 0){
			tmp = '<table width="480" border="0" cellspacing="0" cellpadding="0"><tr><td width="22" rowspan="4" align="left" valign="top">&nbsp;</td><td align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top" class="news5">Találatok</td></tr><tr><td align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top">a keresés a harmadik leütött karaktertol indul</td></tr></table>';
			obj2 = fGetObject("searchresult");
			if(obj)
				obj2.innerHTML = tmp;
		}else{
			obj2 = fGetObject("searchresult");
			if(obj2)
				obj2.style.display = "none";
				
			obj2 = fGetObject("content");
			if(obj2)
				obj2.style.display = "block";
		}
	}
}

function commGateSearch(str){
	var aTmp = fGetToken(str, "<maksz>");
	var aSearch = new Array;
	var vszam = new Number(0);
	
	tmp = '<table width="480" border="0" cellspacing="0" cellpadding="0"><tr><td width="22" rowspan="4" align="left" valign="top">&nbsp;</td><td align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top" class="news5">Találatok</td></tr><tr><td align="left" valign="top">&nbsp;</td></tr><tr><td align="left" valign="top">';
	
	if(aTmp[0] == -1)
		tmp += 'nincs a keresési feltételnek megfelelő tétel';
	else{
		for(q=1; q<aTmp.length; q++){
			tmp += '<div style="border-top:1.5px dotted #53533C; padding-bottom:10px; padding-top:5px; width:450px"><table width="450" border="0" cellspacing="0" cellpadding="0"><tr><td align="left" valign="middle">'+aTmp[q]+'<div style="padding-top:5px;" align="right"><a class="link_news1" href="'+aTmp[++q]+'">tovább ></a></div></td></tr></table></div>';
		}
		
		tmp += '<div style="border-top:1.5px dotted #53533C; padding-bottom:10px; padding-top:5px;">&nbsp;</div>';
	}
	
	tmp += '</td></tr></table>';
	
	obj2 = fGetObject("searchresult");
	if(obj2)
		obj2.innerHTML = tmp;
}

function fSearchHr(){
	q = -1;
	strid = new String("");
	obj = fGetObject("hr_checkid_"+String(++q));
	while(obj){
		if(fGetObject("hr_check_"+String(obj.value)+"_v").value == 1)
			strid += String(obj.value)+",";
			
		obj = fGetObject("hr_checkid_"+String(++q));
	}
	
	strid = strid.substr(0, strid.length-1);
	
	strsearch = new String(fGetObject("input_hrserach").value);
	
	if(strsearch == "Kulcsszó")
		strsearch = "";
		
	fGetObject("hrsearch_detail").style.display = "none";
	fGetObject("hrsearch_detail").innerHTML = "";
	fGetObject("hrsearch").style.display = "block";
	
	if(strid == "" && strsearch.trim() == "")
		fGetObject("hrsearch").innerHTML = '<div style="padding-top:10px; padding-bottom:10px; border-bottom:1px solid #e7e7e7;">a keresés munkakör és / vagy kulcsszó megadását követően automatikusan elindul...</div>';
	else
		xmlhttpPostSearch("../doajax.php?type=searchhr", "str_search="+strsearch+"&pid="+strid, "commGateSearchHr");
}

function commGateSearchHr(str){
	var aTmp = fGetToken(str, "<maksz>");
	
	tmp = '';
	
	if(aTmp[0] == -1){
		tmp = '<div style="padding-top:10px; padding-bottom:10px; border-bottom:1px solid #e7e7e7;">'+aTmp[1]+'</div>';
	}else{
		for(q=1; q<aTmp.length; q++){
			tmp += '<div style="padding-top:10px; padding-bottom:10px; border-bottom:1px solid #e7e7e7;"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td rowspan="2" align="left" width="65" valign="top"><img src="../file_cw/'+aTmp[q]+'" width="55" /></td><td style="padding-bottom:10px;" valign="bottom" height="1">'+aTmp[q+1]+' | <font color="#450934" style="font-weight:bold;">'+aTmp[q+2]+'</font></td></tr>	<tr><td valign="top" style="text-align:justify;">'+aTmp[q+3]+'<a style="padding-left:15px;" class="class="link_news1"" href="javascript:fShowHrDetail('+aTmp[q+4]+');">tovább&nbsp;>></a></td></tr></table></div>';
		
			q += 4;
		}	
	}	
	
	fGetObject("hrsearch").innerHTML = tmp;
}


function fLoadNews(pDir, pId, pId2){
	ajaxArray.push(Array("../doajax.php?type=loadnews","pdir="+String(pDir)+"&pid="+String(pId)+"&pid2="+String(pId2),"commGateLoadNews"));
	fCallxmlhttpPost();
}

function commGateLoadNews(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	
	fGetObject("news_left_arrow").innerHTML = aTmp[0];
	fGetObject("news_left").innerHTML = aTmp[1];
	fGetObject("news_left_detail").innerHTML = aTmp[2];
	
	fGetObject("news_right_arrow").innerHTML = aTmp[3];
	fGetObject("news_right").innerHTML = aTmp[4];
	fGetObject("news_right_detail").innerHTML = aTmp[5];
}

function commGateGeneral(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	if(aTmp[0] != -1)
		eval(aTmp[1]);
}

function fCallxmlhttpPost(){
	if(ajaxcomm == 0 && ajaxArray.length>0){
		ajaxcomm = 1;
		param = ajaxArray.shift()
		xmlhttpPost(param[0], param[1], param[2]);
	}else if(ajaxcomm == 1 && ajaxArray.length>0){
		setTimeout("fCallxmlhttpPost()", 500);
	}	
}

function fGetToken(str, token){
	var aReturn = new Array();
	var str = new String(str);
	var token = new String(token);
	pos = str.indexOf(token);
	while(pos != -1){
		aReturn.push(str.substring(0,pos));
		str = str.substring(pos + token.length)
		pos = str.indexOf(token);
	}
	aReturn.push(str);
	return aReturn;
}

function xmlhttpPost(strUrl, strQuery, strCallBack) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strUrl, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4){
			eval(strCallBack + "(self.xmlHttpReq.responseText)");
        }
    }
    self.xmlHttpReq.send(strQuery);
}

function xmlhttpPostSearch(strUrl, strQuery, strCallBack) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strUrl, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4){
			eval(strCallBack + "(self.xmlHttpReq.responseText)");
        }
    }
    self.xmlHttpReq.send(strQuery);
}

function commGateChangeDropDown(str){
	ajaxcomm = 0;
	var aTmp = fGetToken(str, "<maksz>");
	
	tmp = "<select id='"+ aTmp[0] +"' name='"+ aTmp[0] +"' class='input' onchange='" + aTmp[1] + "'>";		
	
	for(q=2; q<aTmp.length; q++)
		tmp += "<option value='"+aTmp[q]+"' id='"+aTmp[++q]+"'>"+aTmp[q]+"</option>";
		
	tmp += "</select>";
	
	obj = fGetObject("div_" + aTmp[0]);
	if(obj)
		obj.innerHTML = tmp;
}

function commGateChangeDropDownSearch(str){
	var aTmp = fGetToken(str, "<maksz>");
	
	tmp = "<select id='"+ aTmp[0] +"' name='"+ aTmp[0] +"' class='input' onchange='" + aTmp[1] + "'>";		
	
	for(q=2; q<aTmp.length; q++)
		tmp += "<option value='"+aTmp[q]+"' id='"+aTmp[++q]+"'>"+aTmp[q]+"</option>";
		
	tmp += "</select>";
	
	obj = fGetObject("div_" + aTmp[0]);
	if(obj)
		obj.innerHTML = tmp;
}	
	
/*a html oldalba a </body> elé kell betenni

<div id="DialogBox" style="display: none;">
	<div class="dialogBoxBorder">
		<div id="dialogContent" class="dialogBoxContent"> </div>
	</div>
</div>
<div id="DialogPreLoading" style="display: none;">
	<center>
		<img class="preSpin" alt="loading" src="../img/preSpin.gif"/>
	</center>
</div>
<div id="DialogBackground" style="display: none;"> </div>
*/

/*a html oldalba be kell linkelni a dialogbox.css-t

<link href="path/dialogbox.css" rel="stylesheet" type="text/css" />

*/

/*template fileokat (kiterjesztésük .tmpl) valahavoa felmásolni és az elérését beállítani

TemplateManager.URL = "../dialogtemplate/";

*/

/*Példák a hazsnálathoz:

dialogManager.add(new Dialog('Üzenet ami megjelenik!', 'alert'));

dialogManager.add(new Dialog(
				"Biztosan törölni akarod?",
				"confirm",
				[ null, function () { self.removeMessage(messageId, folder, true); }, null ],
				[ "", "Igen", "Nem" ])
				);
*/



/**
 * Converts object's properties to Map, except functions
 * @return Converted object
 * @type Map
 * @author Cser Dániel
 */
Object.prototype.toMap = function() {
	var map = new Map();
	
	for (var key in this) {
		if (typeof(this[key]) != "function") {
			map.put(key, this[key]);
		}
	}
	
	return map;
}

/** 
 * Collection used to store data by key-value pairs.
 * @constructor
 * @author Cser Dániel
 */
function Map() {
	
	/**
	 * Data holding maps elements
	 * @type Array
	 */
	var data;
	
	/**
	 * Pointer to this
	 * @type Map
	 */
	var self = this;
	
	/**
	 * Put a value by a given key. If the key already exists, it will be overridden.
	 * @param String Key of data
	 * @param mixed Value of data
	 */
	this.put = function(elementKey, elementValue) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() == elementKey) {
				data[i].setValue(elementValue);
				return;
			}
		}
		
		data.push(new MapElement(elementKey, elementValue));
	}
	
	/**
	 * Returns value by a given key.
	 * @param String Key of value
	 * @return Found value
	 * @type mixed
	 */
	this.get = function(elementKey) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() == elementKey) {
				return data[i].getValue();
			}
		}
		
		return null;
	}
	
	/**
	 * Returns true when key is exists in the map
	 * @param String Key of value
	 * @return True when key exists
	 * @type boolean
	 */
	this.containsKey = function(elementKey) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() == elementKey) {
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * Returns true when value is exists in the map
	 * @param mixed Value
	 * @return True when value exists
	 * @type boolean
	 */
	this.containsValue = function(elementValue) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getValue() == elementValue) {
				return true;
			}
		}
		
		return false;
	}
	
	/**
	 * Returns the keyset of thew map
	 * @return Keyset of the map
	 * @type Set
	 */
	this.keys = function() {
		var set = new Set();
		
		for (var i = 0; i < data.length; i++) {
			set.add(data[i].getKey());
		}
		
		return set;
	}
	
	/**
	 * Returns the keyset of thew map
	 * @return Keyset of the map
	 * @type Array
	 */
	this.keysArray = function() {
		var array = new Array();
		
		for (var i = 0; i < data.length; i++) {
			array.push(data[i].getKey());
		}
		
		return array;
	}
	
	/**
	 * Returns the valueset of the map
	 * @return Valueset of the map
	 * @type Set
	 */
	this.values = function() {
		var set = new Set();
		
		for (var i = 0; i < data.length; i++) {
			set.add(data[i].getValue());
		}
		
		return set;
	}
	
	/**
	 * Returns the valueset of the map
	 * @return Valueset of the map
	 * @type Array
	 */
	this.valuesArray = function() {
		var array = new Array();
		
		for (var i = 0; i < data.length; i++) {
			array.push(data[i].getValue());
		}
		
		return array;
	}
	
	/**
	 * Removes an element by the given key
	 * @param String key
	 */
	this.remove = function(elementKey) {
		var newData = new Array();
		
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() != elementKey) {
				newData.push(data[i]);
			}
		}
		
		data = newData;
	}
	
	/**
	 * Empties the map
	 */
	this.clear = function() {
		data = new Array();
	}
	
	/**
	 * Returns true when map is empty
	 * @return True when map is empty
	 * @type boolean
	 */
	this.isEmpty = function() {
		return data.length == 0;
	}
	
	/**
	 * Returns the size of the map
	 * @return Size of the map
	 * @type Number
	 */
	this.size = function() {
		return data.length;
	}
	
	/**
	 * Converts map to object
	 * @return Converted map
	 * @type Object
	 */
	this.toObject = function() {
		var obj = new Object();
		
		for (var i = 0; i < data.length; i++) {
			obj[data[i].getKey()] = data[i].getValue();
		}
		
		return obj;
	}
	
	/**
	 * Sorts contained elements by the given function
	 * @param Function Function used to sort
	 */
	this.sort = function(sortBy) {
		data = data.sort(sortBy);
	}
	
	/**
	 * Calls callback on every element of the map
	 * @param Function Callback function
	 */
	this.map = function(callback) {
		for (var i = 0; i < data.length; i++) {
			callback(data[i].getValue());
		}
	}
	
	/**
	 * Returns true if keys and values of maps are equal
	 * @return True if keys and values of maps are equal
	 * @type Boolean
	 */
	this.equalsTo = function(otherMap) {
		if (! checkType(otherMap, Map)) {
			return false;
		}
		
		if (! self.keys().equalsTo(otherMap.keys()) || ! self.values().equalsTo(otherMap.values())) {
			return false;
		}
		
		return true;
	}
	
	/**
	 * Returns the next element relative to the given
	 * @param mixed Key of element
	 * @return The next element relative to the given
	 * @type mixed
	 */
	this.nextElement = function(elementKey) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() == elementKey) {
				return (data[i + 1] != undefined ? data[i + 1].getValue() : null);
			}
		}
		
		return null;
	}
	
	/**
	 * Returns the previous element relative to the given
	 * @param mixed Key of element
	 * @return The previous element relative to the given
	 * @type mixed
	 */
	this.prevElement = function(elementKey) {
		for (var i = 0; i < data.length; i++) {
			if (data[i].getKey() == elementKey) {
				return (data[i - 1] != undefined ? data[i - 1].getValue() : null);
			}
		}
		
		return null;
	}
	
	//Initialize
	data = new Array();
	
	/**
	 * Internal class for holding a key-value pair
	 * @param String Key of element
	 * @param mixed Value of element
	 */
	function MapElement(elementKey, elementValue) {
		
		/**
		 * Key of element
		 * @type String
		 */
		var key = elementKey;
		
		/**
		 * Value of element
		 * @type mixed
		 */
		var value = elementValue;
		
		/**
		 * Return the key of element
		 * @return Key of element
		 * @type String
		 */
		this.getKey = function() {
			return key;
		}
		
		/**
		 * Returns the value of element
		 * @return Value of element
		 * @type mixed
		 */
		this.getValue = function() {
			return value;
		}
		
		/**
		 * Set the new value of element
		 * @param mixed New value
		 */
		this.setValue = function(elementValue) {
			value = elementValue;
		}
		
	}
	
}

/**
 * Prototype.js style getElementById
 * @param String Id of DOM object
 * @return Found DOM object
 * @type Object
 */
function $(id) {
	return document.getElementById(id);
}

/**
 * Check if the variable is not null and is defined
 * @param mixed Variable to check
 * @return True if it's OK
 * @type Boolean
 */
function check(variable) {
	return (variable != null && variable != undefined);
}

/**
 * Check if the variable is not null and is defined and is instanceof type
 * @param mixed Variable to check
 * @return True if it's OK
 * @type Boolean
 */
function checkType(variable, type) {
	return (variable != null && variable != undefined && variable instanceof type);
}


/**
 * Returns a file content by a given URL
 * @param String URL of file
 * @throws When URL is null
 * @throws When XMLHttpRequest object cannot be created.
 * @return File content
 * @type String
 */
function getStringByUrl(url){
	if (! check(url) || url.length == 0)
		alert("getStringByUrl(): Invalid parameters.");
		
	var randomSeed = Math.floor(Math.random() * (10001));
	
	var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
	
	self.xmlHttpReq.open('GET', url + "?random=" + randomSeed, false);
	self.xmlHttpReq.send(null);
	
	if (self.xmlHttpReq.status != 200) {
		//TODO: Log error
		return;
	}

	return self.xmlHttpReq.responseText;
}


/**
 * Represents an element in the dialog queue
 * @param String Message
 * @param String Type
 * @param Array Callbacks
 * @param Array Captions
 * @author Cser Dániel
 */
function Dialog(dialogMessage, dialogType, dialogCallbacks, dialogCaptions) {
	
	/**
	 * Message
	 * @type String
	 */
	var message;
	
	/**
	 * Type
	 * @type Number
	 */
	var type;
	
	/**
	 * Callbacks
	 * @type Array
	 */
	var callbacks;
	
	/**
	 * Captions
	 * @type Array
	 */
	var captions;
	
	/**
	 * OK constant for captions and callbacks
	 * @type Number
	 */
	Dialog.OK = 0;
	
	/**
	 * YES constant for captions and callbacks
	 * @type Number
	 */
	Dialog.YES = 1;
	
	/**
	 * NO constant for captions and callbacks
	 * @type Number
	 */
	Dialog.NO = 2;
	
	/**
	 * Returns message
	 * @return Message
	 * @type String
	 */
	this.getMessage = function() {
		return message;
	}
	
	/**
	 * Sets message
	 * @param String Message
	 */
	this.setMessage = function(dialogMessage) {
		if (! dialogMessage) {
			//TODO: Log error
			return;
		}
		
		message = String(dialogMessage);
	}
	
	/**
	 * Returns type
	 * @return Type
	 * @type Number
	 */
	this.getType = function() {
		return type;
	}
	
	/**
	 * Sets type
	 * @param Number Type
	 */
	this.setType = function(dialogType) {
		if (! dialogType) {
			//TODO: Log error
			return;
		}
		
		type = Number(dialogType);
	}
	
	/**
	 * Returns the requested callback
	 * @param Number Which callback
	 * @return Requested callback
	 * @type String
	 */
	this.getCallback = function(callbackType) {
		//az összes callback állítása esetén ez nem tömb, ezért ezzel csak az x karaktert adja vissza,
		//mivel String tömbként kezeli, így ezt vizsgálni és kezelni kell
		//return callbacks[Number(callbackType)];
		if( callbacks instanceof Array )
			return callbacks[Number(callbackType)];	
		else
			return callbacks;
	}
	
	/**
	 * Sets the given callback
	 * @param Number Which callback
	 * @param Function Callback function
	 */
	this.setCallback = function(callbackType, dialogCallback) {
		if (! callbackType || ! dialogCallback) {
			//TODO: Log error
			return;
		}
		
		callbacks[Number(callbackType)] = dialogCallback;
	}
	
	/**
	 * Sets all callbacks
	 * @param Array Callback array
	 */
	this.setCallbacks = function(dialogCallbacks) {
		if (! dialogCallbacks || ! dialogCallbacks instanceof Array) {
			//TODO: Log error
			return;
		}
		
		callbacks = dialogCallbacks;
	}
	
	/**
	 * Returns the requested caption
	 * @param Number Which caption
	 * @return Requested caption
	 * @type String
	 */
	this.getCaption = function(captionType) {
		return captions[Number(captionType)];
	}
	
	/**
	 * Sets the given caption
	 * @param Number Which caption
	 * @param String Caption
	 */
	this.setCaption = function(captionType, dialogCaption) {
		if (! captionType || ! dialogCaption) {
			//TODO: Log error
			return;
		}
		
		captions[Number(captionType)] = String(dialogCaption);
	}
	
	/**
	 * Sets all captions
	 * @param Array Captions array
	 */
	this.setCaptions = function(dialogCaptions) {
		if (! dialogCaptions || ! dialogCaptions instanceof Array) {
			//TODO: Log error
			return;
		}
		
		captions = dialogCaptions;
	}
	
	//Initialize
	message = dialogMessage || "";
	type = dialogType || "";
	callbacks = dialogCallbacks || [null, null, null];
	captions = dialogCaptions || ["Ok", "Igen", "Nem"];
	
}

/**
 * Default parser used to parse template
 * @constructor
 * @author Cser Dániel
 */
var DefaultParser = {
	
	/**
	 * Object containing statements
	 * @type Object
	 */
	statements: {
		"if":      { delta: 1,  prefix: "if (", suffix: ") {\n", minParams: 1 },
		
		"elseif":  { delta: 0,  prefix: "} else if (", suffix: ") {\n" },
		
		"else":    { delta: 0,  prefix: "} else {\n" },
		
		"/if":     { delta: -1, prefix: "}\n" },
		
		"for":     {
			delta: 1,
			
			prefix: function(parameters) {
				if (parameters[1] != "in") {
					throw new TemplateParseError("Error parsing template " + name + ", loop with bad parameters: " + parameters.join(" ") + ".");
				}
				
				return [
					"if (typeof(_FORS) == \"undefined\" || ! _FORS.length) {\n  var _FORS = [];\n}\n",
					"_FORS.push(0);\n",
					"if (typeof(" + parameters[2] + ") != \"undefined\" && " + parameters[2] + " instanceof Array) {\n",
					"  var " + parameters[0] + "Array = " + parameters[2] + ";\n",
					"  for (var " + parameters[0] + "Iterator = 0; " + parameters[0] + "Iterator < " + parameters[0] + "Array.length; " + parameters[0] + "Iterator++) {\n",
					"    var " + parameters[0] + " = " + parameters[0] + "Array[" + parameters[0] + "Iterator];\n",
					"    _FORS[_FORS.length - 1]++;\n"].join("");
			},
			
			minParams: 3
		},
		
		"forelse": { delta: 0,  prefix: "  }\n}\n if (_FORS[_FORS.length - 1] == 0) {\n  if (true) {\n" },
		
		"/for":    { delta: -1, prefix: "  }\n}\n" },
		
		"eat":     { delta: 1, prefix: "/*\n" },
		
		"/eat":    { delta: -1, prefix: "*/\n" },
		
		"include": {
			delta: 0,
			
			prefix: function(parameters) {
				var templateName = parameters.shift();
				var templateWith = parameters.shift();
				
				if (templateWith != "with") {
					throw new TemplateParseError("Error parsing template " + name + ", include with bad parameters: " + parameters.join(" ") + ".");
				}
				
				return "_OUT.push(templateManager.getTemplate(" + templateName + ").process({ " + parameters.join(" ") + " }));\n";
			},
			
			minParams: 3 }
	},
	
	/**
	 * Object containing modifiers
	 * @type Object
	 */
	modifiers: {
		//Eats the whole string
		"eat":        function(s) { return ""; },
		
		//Upper-cases string
		"upperCase":  function(s) { return String(s).toUpperCase(); },
		
		//Lower-cases string
		"lowerCase":  function(s) { return String(s).toLowerCase(); },
		
		//Return first param if that is not a nullstring, second param else
		"default":    function(s1, s2) { return String(s1).length > 0 ? s1 : s2; },
		
		//Upper-cases first characters of every word
		"capitalize": function(s) {
			var words = String(s).split(" ");
			var capitalized = [];
			
			for (var i = 0; i < words.length; i++) {
				capitalized.push(this["ucFirst"](words[i]));
			}
			
			return capitalized.join(" ");
		},
		
		//Upper-cases first character
		"ucFirst":    function(s) {
			var oldStr = String(s);
			var newStr = String(oldStr[0]).toUpperCase();
			
			for (var i = 1; i < oldStr.length; i++) {
				newStr += oldStr[i];
			}
			
			return newStr;
		},
		
		//Lower-cases first character
		"lcFirst":    function(s) {
			var oldStr = String(s);
			var newStr = String(oldStr[0]).toLowerCase();
			
			for (var i = 0; i < oldStr.length; i++) {
				newStr += oldStr[i];
			}
			
			return newStr;
		},
		
		//Trims whitespaces form the beginning and end of the string
		"trim":       function(s) { return String(s).replace(/^\s+|\s+$/, ''); }
	}
	
}



/**
 * Represents a parsed template
 * @constructor
 * @author Cser Dániel
 */
function Template(templateName, tmpl, templateParser) {
	
	/**
	 * Template source
	 * @type String
	 */
	var source;
	
	/**
	 * Parsed string
	 * @type String
	 */
	var template;
	
	/**
	 * Name of template
	 * @type String
	 */
	var name;
	
	/**
	 * Template parser object
	 * @type Object
	 */
	var parser;
	
	/**
	 * Temp variable to check the number of start/end tags
	 * @type Number
	 */
	var delta;
	
	/**
	 * Parses the whole template and return the parsed and eval'd code
	 * @param String Template to parse
	 * @throws TemplateParseError on template parsing errors
	 * @return Parsed template
	 * @type String
	 */
	function parse(tmpl) {
		tmpl = new String(tmpl);
		
		tmpl = tmpl.replace(/\t/g, "    "); //convert \t to four spaces
		tmpl = tmpl.replace(/\r\n/g, "\n"); //convert windows line delimiters to unix style
		tmpl = tmpl.replace(/\r/g, "\n"); //convert macosx line delimiters to unix style
		
		var actualPos = -1;
		var parsed = ["function evalTmpl(_OUT, _CONTEXT, _MODIFIERS) { with (_CONTEXT) {\n"];
		
		while (actualPos + 1 < tmpl.length) {
			var statementStart = tmpl.indexOf("{", actualPos);
			
			if (statementStart < 0) {
				break;
			}
			
			var statementEnd = tmpl.indexOf("}", statementStart + 1);
			
			if (statementEnd < 0) {
				break;
			}
			
			if (tmpl.charAt(statementStart - 1) == "$") { //expression which will be shown
				parseText(parsed, tmpl.substring(actualPos, statementStart - 1));
				parseExpression(parsed, tmpl.substring(statementStart + 1, statementEnd));
			} else { //statement
				parseText(parsed, tmpl.substring(actualPos, statementStart));
				parseStatement(parsed, tmpl.substring(statementStart + 1, statementEnd));
			}
			
			actualPos = statementEnd + 1;
		}
		
		if (delta != 0) {
			throw new TemplateParseError("Error parsing template " + name + ", tag start/end tags number are not the same.");
		}
		
		//last piece of text
		parseText(parsed, tmpl.substring(actualPos, tmpl.length));
		
		parsed.push("} }");
		
		eval(parsed.join(""));
		
		return evalTmpl;
	}
	
	/**
	 * Parses the text
	 * @param Array Array to push results
	 * @param String Text to parse
	 */
	function parseText(out, text) {
		if (! text && text.length == 0) {
			return "";
		}
		
		var nlPrefix = 0; //index to first non-newline in prefix.
	    var nlSuffix = text.length - 1; //index to first non-space/tab in suffix.
	    
	    while (nlPrefix < text.length && text.charAt(nlPrefix) == "\n") {
	    	nlPrefix++;
	    }
	    
	    while (nlSuffix >= 0 && (text.charAt(nlSuffix) == " " || text.charAt(nlSuffix) == "\t")) {
	    	nlSuffix--;
	    }
	    
	    if (nlSuffix < nlPrefix) {
	    	nlSuffix = nlPrefix;
	    }
	    
	    var lines = text.substring(nlPrefix, nlSuffix + 1).split("\n");
	    
	    for (var i = 0; i < lines.length; i++) {
			out.push("_OUT.push(\"" + lines[i].replace(/"/g, "\\\"") + "\");\n");
			
			if (i < lines.length - 1) {
	            out.push('_OUT.push("\\n");\n');
	        }
		}
	}
	
	/**
	 * Parses the expressions
	 * @param Array Array to push results
	 * @param String Expression to parse
	 * @throws TemplateParseError on template parsing errors
	 */
	function parseExpression(out, expression) {
		if (! expression && expression.length == 0) {
			return "";
		}
		
		var modifiers = expression.split("|");
		expression = modifiers.shift();
		
		var expr = expression;
		var parts;
		var modifier;
		
		for (var i = 0; i < modifiers.length; i++) {
			parts = modifiers[i].split(":");
			modifier = parts.shift();
			
			if (parser.modifiers[modifier] == null) {
				throw new TemplateParseError("Error parsing template " + name + ", no such modifier: " + modifier + ".");
			}
			
			expr = "_MODIFIERS[\"" + modifier + "\"](" + expr + (parts.length > 0 ? ", " + parts[0].replace(/"/g, "\"") : "") + ")";
		}
		
		out.push("_OUT.push(" + expr + ");\n");
	}
	
	/**
	 * Parses the statements
	 * @param Array Array to push results
	 * @param String Statements to parse
	 * @throws TemplateParseError on template parsing errors
	 */
	function parseStatement(out, stmt) {
		if (! stmt && stmt.length == 0) {
			return;
		}
		
		parameters = stmt.split(" ");
		statement = parameters.shift();
		
		statement = parser.statements[statement];
		
		if (statement == null) {
			parseText(out, stmt);
		}
		
		delta += statement.delta;
		
		if (delta < 0) {
			throw new TemplateParseError("Error parsing template " + name + ", fewer start tags then end tags.");
		}
		
		if (statement.minParams != null && statement.minParams > parameters.length) {
			throw new TemplateParseError("Error parsing template " + name + ", too few parameters.");
		}
		
		if (typeof(statement.prefix) == "function") {
			out.push(statement.prefix(parameters));
		} else {
			out.push(statement.prefix);
		}
		
		if (statement.suffix != null) {
			out.push(parameters.join(" "));
			out.push(statement.suffix);
		}
	}
	
	/**
	 * Processes the template with the given context
	 * @param Object Context of template
	 * @throws TemplateProcessError template on processing errors
	 * @return Ready-to-use template
	 * @type String
	 */
	this.process = function(context) {
		if (! context || ! template) {
			return "";
		}
		
		var processed = [];
		
		try {
			template(processed, context, parser.modifiers);
		} catch(e) {
			throw new TemplateProcessError(e.message, e.fileName, e.lineNumber, e.stack);
		}
		
		return processed.join("");
	}
	
	/**
	 * Returns HTML source
	 * @return HTML source
	 * @type String
	 */
	this.getSource = function() {
		return source;
	}
	
	//Initialize
	if (! tmpl || ! templateName || tmpl.length == 0 || templateName.length == 0) {
		return null;
	}
	
	if (templateParser != null) {
		parser = templateParser;
	} else {
		parser = DefaultParser;
	}
	
	name = templateName;
	delta = 0;
	source = new String(tmpl);
	template = parse(tmpl);
	
}
/**
 * Loads and caches templates.
 * @constructor
 * @author Cser Dániel
 */
function TemplateManager() {
	
	/**
	 * Base dir of templates.
	 * Set in config.js
	 * @type String
	 */
	TemplateManager.URL = String(utvonal)+"dialogtemplate/";
	
	/**
	 * Map to store templates
	 * @type Map
	 */
	var templates;
	
	/**
	 * Corrects the name of template
	 */
	function correctName(templateName) {
		return String(templateName).toLowerCase();
	}
	
	/**
	 * Returns the template and loads it when necessary
	 * @param String Name of template
	 * @throws On parsing errors
	 * @return Template
	 * @type Template
	 */
	function get(templateName) {
		templateName = correctName(templateName);
		if (! templates.containsKey(templateName)) {
			if (! check(TemplateManager.URL)) {
				//TODO: Log error
				return null;
			}
			
			var templateUrl = TemplateManager.URL + templateName.replace(/_/g, "/") + ".tmpl";
			
			try {
				var templateData = getStringByUrl(templateUrl);
			} catch (e) {
				alert("TemplateHandler.get(): Couldn't read file " + templateUrl + ".");
				//throw new TemplateParseError("TemplateHandler.get(): Couldn't read file " + templateUrl + ".");
			}
			templates.put(templateName, new Template(templateName, templateData));
		}
		return templates.get(templateName);
	}
	
	/**
	 * Returns the given template
	 * @param String Name of template
	 * @throws On parsing errors
	 * @return Template
	 * @type Template
	 */
	this.getTemplate = function(templateName) {
		return get(templateName);
	}
	
	/**
	 * Processes the given template with the given context, then puts it into the given DOM object
	 * @param String Name of template
	 * @param Object Template context
	 * @param String Id of DOM object to put the template
	 * @throws On parsing errors
	 */
	this.processTemplate = function(templateName, templateData, domId) {
		$(domId).innerHTML = get(templateName).process(templateData);
	}
	
	//Initialize
	templates = new Map();
	
}
/**
 * Represents a template parsing error.
 * @constructor
 * @author Cser Dániel
 */
function TemplateParseError(message, fileName, lineNumber, stack) {
	
	/**
	 * Message of error
	 * @type String
	 */
	this.message = message;
	
	/**
	 * Name of the file where the error occured
	 * @type String
	 */
	this.fileName = fileName;
	
	/**
	 * Number of line where the error occured
	 * @type String
	 */
	this.lineNumber = lineNumber;
	
	/**
	 * Stact trace of error
	 * @type Object
	 */
	this.stack = stack;
	
	/**
	 * Name of error
	 * @type String
	 */
	this.name = "TemplateParseError";
	
}
/**
 * Represents a template processing error.
 * @constructor
 * @author Cser Dániel
 */
function TemplateProcessError(message, fileName, lineNumber, stack) {
	
	/**
	 * Message of error
	 * @type String
	 */
	this.message = message;
	
	/**
	 * Name of the file where the error occured
	 * @type String
	 */
	this.fileName = fileName;
	
	/**
	 * Number of line where the error occured
	 * @type String
	 */
	this.lineNumber = lineNumber;
	
	/**
	 * Stact trace of error
	 * @type Object
	 */
	this.stack = stack;
	
	/**
	 * Name of error
	 * @type String
	 */
	this.name = "TemplateProcessError";
	
}




/**
 * Dialog window manager class.
 * @constructor
 * @author Cser Dániel
 */
function DialogManager() {
	
	/**
	 * DialogBox width size
	 * @type integer
	 */
	var width = 310;
	
	/**
	 * DialogBox height size
	 * @type integer
	 */
	var height = 180;

	/**
	 * Array of disabled selects
	 * @type Array
	 */
	var disabledSelects;
	
	/**
	 * Queue array
	 * @type Array
	 */
	var queue;
	
	/**
	 * Running state
	 * @type Boolean
	 */
	var running;
	
	/**
	 * Adds a new task
	 * @param Dialog Dialog to add
	 */
	this.add = function(dialog) {
		//when this is a progress or there's no progress in the queue
		queue.push(dialog);
		//return when already displaying or there's nothing to display
		if (running) {
			return;
		}
		
		//start showing
		this.running = true;
	    
	    //disable active selects
		var allSelects = document.getElementsByTagName("select");
		for (i = 0; i < allSelects.length; i++) {
    		if (allSelects[i].disabled == false) {
    			disabledSelects[i] = allSelects[i];
    			disabledSelects[i].disabled = true;
    		}
			allSelects[i].style.visibility = 'hidden';
    	}
	    
	    //hider div
	    var pageSize = getPageSize();
	    setOpacity( $("DialogBackground"), 0.9 );
	    $("DialogBackground").style.height = pageSize.pageHeight+'px';
	    $("DialogBackground").style.display = "block";
	    
	    //dialog box
	    getWindow( height, width );
	    
	    //start showing
	    show();
	}
	
	/**
	 * Shows a task
	 */
	function show() {
		try {
			window.scrollBy(0, 0);
		    templateManager.processTemplate(queue[0].getType(), { dialog: queue[0] }, "dialogContent");
		} catch(e) {
			//TODO: Log error
		}
	}
	
	/**
	 * One task ended
	 * @param Number Result code
	 */
	this.done = function(result) {		
		
		if (queue.length == 0 || result == null || result == undefined) {
			//TODO: Log error
			return;
		}
		
		var fn = queue[0].getCallback(result);
		if (typeof(fn) == "function") {
			try {
				fn();
			} catch(e) {
				//TODO: Log error
			}
		}
	    //remove first element
	    queue.shift();
	    //when this was the last one in queue
	    if (queue.length == 0) {
	    	running = false;
	    	
			//hide dialog and bakground
			$("DialogBackground").style.display = "none";
			$("DialogBox").style.display = "none";
			$("dialogContent").innerHTML = "";
			//enable all disabled selects and clear the array holding them
	    	for (var i = 0; i < disabledSelects.length; i++) {
		    	disabledSelects[i].disabled = false;
				disabledSelects[i].style.visibility = 'visible';
	    	}
	    	
	    	disabledSelects = new Array();
			
		    return;
	    }
	    show();
	}
	
	/**
	 *
	 */
	this.showBackground = function() {
		var pageSize = getPageSize();
	    setOpacity( $("DialogBackground"), 0.3 );
	    $("DialogBackground").style.height = pageSize.pageHeight + 'px';
	    $("DialogBackground").style.display = "block";
		return;
	}
	
	/**
	 *
	 */
	this.hideBackground = function() {
		$("DialogBackground").style.display = "none";
		return;
	}
	
	/**
	* set DialogBackground style
	* @param htmlObject 
	* @param opacity value
	*/
	function setOpacity(element, value) {
	    if (typeof element == 'string')
		element= $(element);
	    if (value == 1) {
		element.style.opacity = (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0 ;
		if(/MSIE/.test(navigator.userAgent) && !window.opera)
		    element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'');
	    } else {
		if(value < 0.00001) value = 0;
		    element.style.opacity = value;
		if(/MSIE/.test(navigator.userAgent) && !window.opera)
		    element.style.filter = element.style.filter.replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')';
	    }
	    return element;
	}
	
	
	/**
	* set DialogBox style and position
	* @param box height
	* @param box width
	*/
	function getWindow(height, width) {
	    var DialogBox = $("DialogBox");
	    var pageSize = getPageSize();
	    var pos = realOffset(document.body);
	    
	    DialogBox.style.top = (pageSize.windowHeight/2 - height/2 + pos[1])+'px';
	    DialogBox.style.left = (pageSize.windowWidth/2 - width/2 + pos[0])+'px';
	    
	    DialogBox.style.display = "block";
	}
	
	/**
	* set DialogBox real position
	* @return top, left size
	* @type Array
	*/
	function realOffset(element) {
	    var valueT = 0, valueL = 0;
	    do {
		valueT += element.scrollTop  || 0;
		valueL += element.scrollLeft || 0;
		element = element.parentNode;
	    } while (element);
	    return [valueL, valueT];
	}
	
	
	/**
	* get page, widow, scroll height and width size 
	* @return size data
	* @type object
	*/
	function getPageSize() {
	    var xScroll, yScroll;
            if (window.innerHeight && window.scrollMaxY) {
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	    } else if (document.body.scrollHeight > document.body.offsetHeight) {
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	    } else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	    }
	    
	    var windowWidth, windowHeight;
	    if (self.innerHeight) {
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	    } else if (document.documentElement && document.documentElement.clientHeight) {
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	    } else if (document.body) {
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	    }
	    
	    if(yScroll < windowHeight) {
		pageHeight = windowHeight;
	    } else {
		pageHeight = yScroll;
	    }
            if(xScroll < windowWidth) {
	        pageWidth = windowWidth;
	    } else {
		pageWidth = xScroll;
	    }
	    return {
		'pageWidth':pageWidth,
		'pageHeight':pageHeight,
		'windowWidth':windowWidth,
		'windowHeight':windowHeight,
		'yScroll':yScroll,
		'xScroll':xScroll
	    }
	}
	
	//Initialize
	disabledSelects = new Array();
	queue = new Array();
	running = false;
	
}

templateManager = new TemplateManager();
dialogManager = new DialogManager();	
	
var NS4 = (document.layers)? 1 : 0;
var IE4 = (document.all)? 1 : 0;
var W3C = (document.getElementById)? 1 : 0;
var aGalery = new Array();
var aMenu = new Array();
var aMarkaTomb = new Array();
var almenuClose = null;
var almenuCloseId = -1;
var cMenu = -1;
var pTimer = -1;

function fLeptetAuto(){
	if(pTimer != -1)
		fLeptet(-1);
	clearTimeout(pTimer);
	pTimer = setTimeout("fLeptetAuto()", 5000);
}

function fCheckUzenet(){
	if(document.sform.uname.value == ""){
		dialogManager.add(new Dialog('Név megadása kötelező!', 'alert'));
		return false;
	}	
	
	if(document.sform.uemail.value == ""){
		dialogManager.add(new Dialog('E-mail cím megadása kötelező!', 'alert'));
		return false;
	}
	
	var strtmp = new String(document.sform.uemail.value);
	if(strtmp.indexOf(".") == -1 || strtmp.indexOf("@") == -1){
		dialogManager.add(new Dialog('Az e-mail címed formátuma nem megfelelő!', 'alert'));
		 return false;
	}
	 
	if(document.sform.umesage.value == ""){
		dialogManager.add(new Dialog('Az észrevétel, üzenet megadása kötelező!', 'alert'));
		return false;
	}
	 
	return true;
}

function fBadFel1(){
	dialogManager.add(new Dialog('Hiányzó adatok, feliratkozás sikertelen!', 'alert'));
}

function fBadFel2(){
	dialogManager.add(new Dialog('Feliratkozás sikertelen, ezzel az e-mail címmel már regisztráltak!', 'alert'));
}

function fFel1(){
	dialogManager.add(new Dialog('Sikeres hírlevél feliratkozás!', 'alert'));
}

function fCheckHirlevel(){
	if(document.hirlevel.snev.value == ""){
		dialogManager.add(new Dialog('Kérem adja meg a nevét!', 'alert'));
		return false;
	}
	if(document.hirlevel.semail.value == ""){
		dialogManager.add(new Dialog('E-mail cím megadása kötelező!', 'alert'));
		return false;
	}
	var strtmp = new String(document.hirlevel.semail.value);
	if(strtmp.indexOf("@") == -1 || strtmp.indexOf(".") == -1){
		dialogManager.add(new Dialog('Az e-mail cím formailag nem megfelelő!', 'alert'));
		return false;
	}
	return true;
}

function fClickPromo(pId){
	if(pId == "" || pId == "-1"){
		q = 0;
		if(pId == ""){			
			while(fGetObject("div_promo_r"+String(++q))){
				fGetObject("div_promo_r"+String(q)).style.display = "none";
			}
		}else if(pId == "-1"){
			while(fGetObject("div_pr_"+String(++q))){
				fGetObject("div_pr_"+String(q)).style.display = "none";
			}
		}
		
		t1 = Math.floor(1+Math.random()*9);
		
		t2 = Math.floor(1+Math.random()*9);
		while(t2==t1)
			t2 = Math.floor(1+Math.random()*9);
			
		t3 = Math.floor(1+Math.random()*9);
		while(t3==t1 || t3==t2)
			t3 = Math.floor(1+Math.random()*9);
			
		fGetObject("div_pr_"+String(t1)).style.display = "block";
		fGetObject("div_pr_"+String(t2)).style.display = "block";
		fGetObject("div_pr_"+String(t3)).style.display = "block";
		
		fGetObject("div_promo_lista").style.display = "block";
	}else{
		fGetObject("div_promo_lista").style.display = "none";
		fGetObject("div_promo_r"+pId).style.display = "block";
		q = 0;
		while(fGetObject("div_pr_"+String(++q))){
			fGetObject("div_pr_"+String(q)).style.display = "none";
		}
	}
}

function fAktTerKepviselo(did){
	for(i = 1; i <= 12; i++){
		if(i != did)
			fGetObject('ter_kepv_'+String(i)).style.display = "none";			
		else
			fGetObject('ter_kepv_'+String(i)).style.display = "block";
	}	
}

function fBovebben(){
	if(fGetObject('bovebben_zarva')){
		if(fGetObject('bovebben_nyitva').style.display == "block"){
			fGetObject('bovebben_nyitva').style.display = "none";
			fGetObject('bovebben_zarva').style.display = "block";
		}else{			
			fGetObject('bovebben_zarva').style.display = "none";
			fGetObject('bovebben_nyitva').style.display = "block";			
		}
	}
}

aMarkaTomb.push("gasztro_logo_mini.gif");
aMarkaTomb.push("csardas_logo_mini.gif");
aMarkaTomb.push("krajcar_logo_mini.gif");
aMarkaTomb.push("macko_logo_mini.gif");
aMarkaTomb.push("bakony_logo_mini.gif");
aMarkaTomb.push("tihany_logo_mini.gif");
aMarkaTomb.push("karavan_logo_mini.gif");
aMarkaTomb.push("medve_logo_mini.gif");
var aktualis = aMarkaTomb.length-1;

function fLeptet(pnext){	
	clearTimeout(pTimer);
	for(w=0; w<aMarkaTomb.length; w++){
		picpath = new String(aMarkaTomb[w]);
		if(fGetObject(picpath.substr(0, picpath.length-4)))
			fGetObject(picpath.substr(0, picpath.length-4)).style.display = "none";
	}
	
	if(fIsNum5(pnext)){
		aktualis += pnext;
		
		if(aktualis < 0)
			aktualis = aMarkaTomb.length-1;
		if(aktualis >= aMarkaTomb.length)
			aktualis = 0;			
	}else{
		picpath = new String(pnext);
		picpath = picpath.substr(picpath.lastIndexOf("/")+1);
		
		for(w=0; w<aMarkaTomb.length; w++){
			if(aMarkaTomb[w] == picpath){
				aktualis = w;
				break;
			}
		}
	}
		
	for(q=1; q<5; q++){
		if(aktualis-(4-q) < 0)
			tmp = aktualis - (4-q) + aMarkaTomb.length;
		else
			tmp = aktualis- (4-q);
			
		picpath = new String(aMarkaTomb[tmp]);
			
		if(q < 4){
			fGetObject('img_'+String(q)).src = "../img/"+aMarkaTomb[tmp];			
		}else{			
			if(fGetObject(picpath.substr(0, picpath.length-4)))
				fGetObject(picpath.substr(0, picpath.length-4)).style.display = "block";
				
			picpath = "../img/"+picpath.substr(0, picpath.lastIndexOf("_"))+"_big.gif";
			fGetObject('img_'+String(q)).src = picpath;
		}
	}
	pTimer = setTimeout("fLeptetAuto()", 15000);
}


function fMoveAlmenu(){
	for(k=0; k<aMenu.length; k++){
		obj = fGetObject(aMenu[k][0]);
		swidth = String(obj.style.width);
		pwidth = Number(swidth.substr(0, swidth.length-2));
		if(pwidth != aMenu[k][1]){
			if(aMenu[k][1]-pwidth < 8 && aMenu[k][1]-pwidth > -8){
				obj.style.width = String(aMenu[k][1])+"px";
				if(aMenu[k][2] != 0){
					fGetObject('almenuk_'+aMenu[k][2]).style.display = "block";
				}
			}
			else{
				if(aMenu[k][1] < pwidth)
					obj.style.width = String(aMenu[k][1])+"px";
				else
					obj.style.width = String(pwidth + (aMenu[k][1]-pwidth)/4)+"px";
			}
		}		
	}
	setTimeout("fMoveAlmenu()", 1);
}

function fClearClear(cId){
	if(almenuCloseId == cId){
		clearTimeout(almenuClose);
	}
}

function fClear(cId){
	if(almenuCloseId == -1 || cId == almenuCloseId){
		almenuCloseId = cId;
		almenuClose = setTimeout("fClear2()", 1500);
	}
}

function fClear2(){
	cMenu = -1;
	cId = almenuCloseId;
	for(k=0; k<aMenu.length; k++){
		//if(cId != k+1)
		fGetObject('almenuk_'+(k+1)).style.display = "none";
			
		//if(aMenu[k][1] != 0 && cId != aMenu[k][2]){
		if(aMenu[k][1] != 0){
			aMenu[k][1] += (-1)*200;
			aMenu[k][2] = 0;
		}
	}	
	almenuCloseId = -1;
}

function fAlmenuPlaceMod(objname, kapcs, menuid){
	if(cMenu != menuid){
		if(almenuCloseId != -1){
			clearTimeout(almenuClose);
			fClear2();
			almenuCloseId = -1;
		}
		cMenu = menuid;
		for(m=0; m<aMenu.length; m++){
			if(aMenu[m][0] == objname){
				currentrow = m;			
				break;
			}
		}
		aMenu[currentrow][2] = menuid;
		aMenu[currentrow][1] += kapcs*200;	
	}
}

function fMoveGalery(){
	for(k=0; k<aGalery.length; k++){
		obj = fGetObject(aGalery[k][0]);
		sleft = String(obj.style.left);
		pleft = Number(sleft.substr(0, sleft.length-2));
		if(pleft != aGalery[k][1]){
			if(aGalery[k][1]-pleft < 8 && aGalery[k][1]-pleft > -8)
				obj.style.left = String(aGalery[k][1])+"px";
			else
				obj.style.left = String(pleft + (aGalery[k][1]-pleft)/6)+"px";
		}		
	}
	setTimeout("fMoveGalery()", 100);
}

function fGalPlaceMod(objname, kapcs, nyil){
	sleft = String(fGetObject(objname).style.left);
	nleft = Number(sleft.substr(0, sleft.length-2));
	
	swidth = String(fGetObject(objname).style.width);
	nwidth = Number(swidth.substr(0, swidth.length-2));
	
	for(k=0; k<aGalery.length; k++){
		if(aGalery[k][0] == objname){
			currentrow = k;
			break;
		}
	}
	
	aGalery[currentrow][1] += kapcs*113;
	//nyilacska
	if(aGalery[currentrow][1] == -(nwidth-339)){
		fGetObject(nyil+'_1_on').style.display = "none";
		fGetObject(nyil+'_1_off').style.display = "block";
	}else{
		fGetObject(nyil+'_1_on').style.display = "block";
		fGetObject(nyil+'_1_off').style.display = "none";
	}
	
	if(aGalery[currentrow][1]  == 0){
		fGetObject(nyil+'_2_on').style.display = "none";
		fGetObject(nyil+'_2_off').style.display = "block";
	}else{
		fGetObject(nyil+'_2_on').style.display = "block";
		fGetObject(nyil+'_2_off').style.display = "none";
	}
	
}



function fFileBrowse(obj, ext){
	var tmp = new String(obj.value);
	tmp = tmp.substr(tmp.length-4, 4);
	if(tmp.toLowerCase() != ext){
		obj.value = "";
		dialogManager.add(new Dialog('Csak '+ext+' file-t lehet feltölteni!', 'alert'));
	}
}

function fGetObject(obj_name){
	if(W3C)
		return document.getElementById(obj_name);
	else if(NS4)
		return document.layers[obj_name];
	else
		return window.opener.document.all[obj_name];
}

function fIsNum(tmp){
	var szam = new String(tmp);
	var jok = new String("0123456789");
	for(k=0; k<szam.length; k++){
		if(jok.indexOf(szam.charAt(k)) == -1)
			return false;
	}
	return true;
}

function fIsNum5(tmp){
	var szam = new String(tmp);
	var jok = new String("-0123456789");
	for(k=0; k<szam.length; k++){
		if(jok.indexOf(szam.charAt(k)) == -1)
			return false;
	}
	return true;
}

function fIsNum2(tmp){
	var szam = new String(tmp);
	var jok = new String("0123456789.");
	var ispoint = false;
	for(k=0; k<szam.length; k++){
		if(szam.charAt(k) == "." && ispoint)
			return false;
		else if(szam.charAt(k) == ".")
			ispoint = true;
			
		if(jok.indexOf(szam.charAt(k)) == -1)
			return false;
	}
	return true;
}

function fIsNum3(obj){
	var szam = new String(obj.value);
	while(szam.indexOf(",") != -1)
		szam = szam.replace(",", ".");
		
	while(szam.indexOf(" ") != -1)
		szam = szam.replace(" ", "");
	obj.value = szam;
	
	var jok = new String("0123456789.");
	var ispoint = false;
	for(k=0; k<szam.length; k++){
		if(szam.charAt(k) == "." && ispoint){
			obj.value = "";
			return false;			
		}else if(szam.charAt(k) == ".")
			ispoint = true;
			
		if(jok.indexOf(szam.charAt(k)) == -1){
			obj.value = "";
			return false;
		}
	}
	return true;
}

function fIsNum4(obj){
	var szam = new String(obj.value);
	while(szam.indexOf(",") != -1)
		szam = szam.replace(",", ".");
		
	while(szam.indexOf(" ") != -1)
		szam = szam.replace(" ", "");
	obj.value = szam;
	
	var jok = new String("0123456789");
	for(k=0; k<szam.length; k++){			
		if(jok.indexOf(szam.charAt(k)) == -1){
			obj.value = 0;
			return false;
		}
	}
	return true;
}

function fIsTime(obj){
	var time = new String(obj.value);	
	while(time.indexOf(",") != -1)
		time = time.replace(",", ":");
		
	while(time.indexOf(".") != -1)
		time = time.replace(".", ":");
		
	while(time.indexOf(" ") != -1)
		time = time.replace(" ", ":");
		
	tmp = time.indexOf(":");
	if(tmp == 1){
		time = "0" + time;
	}	
	
	obj.value = time;
		
	if(time.length != 5){
		alert("Az idő formátuma nem megfelelő, helyesen: 16:30");
		return false;
	}	
	
	
	var hour = new String(time.substr(0,2));
	var minute = new String(time.substr(3,2));

	if(!fIsNum(hour)){
		alert("Az óra csak szám lehet!");
		return false;
	}
	
	if(!fIsNum(minute)){
		alert("A perc csak szám lehet!");
		return false;
	}
	
	if(hour<0 || hour>23){
		alert("Az óra 01-23 lehet!");
		return false;
	}
	
	if(!fIsNum(minute)){
		alert("A perc csak szám lehet");
		return false;
	}
	
	if(minute<0 || minute>59){
		alert("A perc 00-59 lehet!");
		return false;
	}
	
	return true;
}

function fIsDate(obj){
	var date = new String(obj.value);	
	while(date.indexOf(",") != -1)
		date = date.replace(",", "-");
		
	while(date.indexOf(".") != -1)
		date = date.replace(".", "-");
		
	while(date.indexOf(" ") != -1)
		date = date.replace(" ", "-");
		
	obj.value = date;
		
	if(date.length != 10){
		alert("A dátum formátuma nem megfelelő: 1999-09-09");
		return false;
	}	
	
	var year = new String(date.substr(0,4));
	var month = new String(date.substr(5,2));
	var day = new String(date.substr(8,2));

	if(!fIsNum(year)){
		alert("Az év csak szám lehet");
		return false;
	}
	
	if(!fIsNum(month)){
		alert("A hónap csak szám lehet");
		return false;
	}
	
	if(month<1 || month>12){
		alert("A hónap 01-12 lehet!");
		return false;
	}
	
	if(!fIsNum(day)){
		alert("A nap csak szám lehet");
		return false;
	}
	
	if(day<1 || day>31){
		alert("A nap 01-31 lehet!");
		return false;
	}
	
	return true;
}

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

String.prototype.replaceAll = function (str1, str2) {
	str = this;
	pos = str.indexOf(str1);
    while(pos != -1){
		str = str.replace(str1, str2);
		pos = str.indexOf(str1,pos+str2.length-str1.length);
	}
	return str;
}

Number.prototype.valuta = function () {
	var str = new String(this);
	
    str = str.replaceAll(".", ",");
	
	if(str.indexOf(".")>-1)
		tmp = false;
	else
		tmp = true;
	w=0;
	for(q=str.length-1; q>=0; q--){
		if(tmp)
			w++;
		
		if(str.charAt(q) == ",")
			tmp = true;
			
		if(w%3==0 && w>0)
			str = str.substr(0,q)+"&nbsp;"+str.substr(q);
	}
	return str;
}

function fShowDiv(gyid) {
	
	var divnev = "v_"+gyid;
	var anev = "a_"+gyid;

	if(fGetObject(divnev).value == 1){
		fGetObject(divnev).style.display = "none";	
		fGetObject(divnev).value = 0;
	}else{
		fGetObject(divnev).style.display = "block";	
		fGetObject(divnev).value = 1;
	}
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}	
	

