var sortCol;												// a tábla ezen oszlop szerint van rendezve
var actTab;													// az aktuális "oldal" azonosítója
var ext = new Array("pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "jpg", "gif", "png", "cdr");		// a figyelt kiterjesztések
var defValue = new Array();									// ebben lesznek a mezők alapértelmezett értékei
var errMsg = new Array();									// ide jönnek az "egyéni" hibaüzenetek

var radW = 16; 												// a radio szélessége
var radH = 16; 												// a radio magassága
var chkW = 16; 												// a checkbox szélessége
var chkH = 16; 												// a checkbox magassága

// a regisztráció mezőinek alapértelmezett értékei
defValue["lastname"] = "Vezetéknév";
defValue["firstname"] = "Keresztnév";
defValue["organization"] = "A szervezet, akit képvisel";
defValue["email"] = "Ígérjük, nem küldünk spamet";

// "egyéni" hibaüzenetek
errMsg["lastname"] = "Adja meg a vezetéknevét!";
errMsg["firstname"] = "Adja meg a keresztnevét!";
errMsg["organization"] = "Adja meg a képviselt szervezet nevét!";
errMsg["country"] = "Válasszon országot!";
errMsg["email"] = "Adjon meg egy valós e-mail címet!";
errMsg["lunch16"] = "Adja meg, hogy kér-e ebédet 16-án!";
errMsg["lunch17"] = "Adja meg, hogy kér-e ebédet 17-én!";

// string funkciók
function LTrim(str) { return str.replace(/\s*((\S+\s*)*)/, "$1"); }
function RTrim(str) { return str.replace(/((\s*\S+)*)\s*/, "$1"); }
function Trim(str)  { return LTrim(RTrim(str)); }

// formátum-ellenőrzők
function IsEmpty(str) {
	return (str == null | Trim(str) == "") ? true : false;
}

function IsEmail(str) {
	var reEmail = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	return (str) ? reEmail.test(Trim(str)) : false;
}

function IsInteger(str) {
	var reInteger = /^[+-]?\d+?$/;
	return (str) ? reInteger.test(Trim(str)) : false;
}

function IsNumber(str) {
	var reNumber = /^[+-]?\d+([,\.]\d+)?$/;
	return (str) ? reNumber.test(Trim(str)) : false;
}

function IsDate(str) {
	var reDate = /^(19|20)\d\d([-/.])(0[1-9]|1[0-2])\2(0[1-9]|[12][0-9]|3[01])$/;
	return (str) ? reDate.test(Trim(str)) : false;
}

function CorrectDate(str) {
	if (IsDate(str))
		return Trim(str).replace(/^(\d{4})[-/.](\d{2})[-/.](\d{2})$/, "$1.$2.$3");
	else
		return null;
}

// adott stílusú elemek gyűjteménye
function getElementsByClass(clas, tag, node) {
	if (clas == null || Trim(clas) == "")
		return null;
	
	var elements = new Array();

	if ( node == null ) node = document;
	if ( tag == null )  tag = "*";
	
	var elems = node.getElementsByTagName(tag);
	var reClass = new RegExp("\\b" + clas + "\\b");

	for (var e = 0; e < elems.length; e++) {
		if (reClass.test(elems[e].className))
			elements.push(elems[e]);
	}
	
	return elements;
}

// ****************************************************************************
// (át)rendezzük a táblát
// ****************************************************************************
function sortTable(column) {
	// megkeressük a táblát, amin dolgoznunk kell
	var table = document.getElementById("sortable");

	// ha csak egy sora van, akkor nem foglalkozunk vele
	if (table.rows.length <= 1) return;						

	var actHead = table.tHead.rows[0].cells[Math.abs(sortCol) - 1];
	if (actHead) {
		actHead.className = actHead.className.replace((sortCol > 0) ? "asc" : "des", "");
	}

	// ha a jelenlegivel azonos oszlopra kattintott, akkor megfordítjuk a rendezést
	sortCol = column * ((column == sortCol) ? -1 : 1);
	
	// kell egy tömb, amibe kigyűjtjük a teljes táblatestet
	var newRows = new Array();
	
	// a tömbbe betöltjük az összes cella tartalmát és stílusát
	for (var r = 0; r < table.tBodies[0].rows.length; r++) {
		newRows[r] = new Array();
		for (var c = 0; c < table.tBodies[0].rows[r].cells.length; c++) {
			newRows[r][c] = new Object();
			newRows[r][c].value = table.tBodies[0].rows[r].cells[c].innerHTML;
			newRows[r][c].style = table.tBodies[0].rows[r].cells[c].className;
		}
	}

	// a tömböt lerendezzük a sortFn függvény segítségével
	newRows.sort(sortFn);
		
	// a tömb tartalmát visszaírjuk a táblatestbe
	for (var r = 0; r < table.tBodies[0].rows.length; r++) {
		for (var c = 0; c < table.tBodies[0].rows[r].cells.length; c++) {
			table.tBodies[0].rows[r].cells[c].innerHTML = newRows[r][c].value;
			table.tBodies[0].rows[r].cells[c].className = newRows[r][c].style;
		}
	}
		
	var newHead = table.tHead.rows[0].cells[Math.abs(sortCol) - 1];
	newHead.className += (sortCol > 0) ? " asc" : " des";
	newHead.firstChild.blur();
}

// egy kis segítség a sort() metódusnak
function sortFn(a, b) {
	if (Math.abs(sortCol) != 4) {
		var aa = removeAccents(a[Math.abs(sortCol) - 1].value.toLowerCase());
		var bb = removeAccents(b[Math.abs(sortCol) - 1].value.toLowerCase());
	} else {
		var aa = removeAccents(a[3].value.substr(a[3].value.indexOf(">") + 2, 99));
		var bb = removeAccents(b[3].value.substr(b[3].value.indexOf(">") + 2, 99));
	}

	if (aa == bb)
		return 0;
	else
		return ((aa < bb) ? -1 : 1) * ((sortCol < 0) ? -1: 1);
}

function removeAccents(str) {
	// a rendezéskor az ékezetes betűk zavaróak, ezért eltűntetjük az ékezeteket
	str = str.replace(/á/g, "a"); str = str.replace(/é/g, "e"); str = str.replace(/í/g, "i");
	str = str.replace(/ó/g, "o"); str = str.replace(/ö/g, "o"); str = str.replace(/ő/g, "o");
	str = str.replace(/ú/g, "u"); str = str.replace(/ü/g, "u"); str = str.replace(/ű/g, "u");
	
	str = str.replace(/Á/g, "A"); str = str.replace(/É/g, "E"); str = str.replace(/Í/g, "I");
	str = str.replace(/Ó/g, "O"); str = str.replace(/Ö/g, "O"); str = str.replace(/Ő/g, "O");
	str = str.replace(/Ú/g, "U"); str = str.replace(/Ü/g, "U"); str = str.replace(/Ű/g, "U");

	return str;
}

// ****************************************************************************
// a "fülek" megjelenítése/eltüntetése
// ****************************************************************************
function showTab(tab) {
	var tabNum = tab.id.replace("_tab", "");
	
	if (actTab != tabNum) {														// ha nem az aktuális fülre kattintott
		actTabDiv = document.getElementById("_head" + actTab).parentNode;		// eltüntetjük az aktuális fül tartalmát
		actTabDiv.style.display = "none";
		actTabLi = document.getElementById("_tab" + actTab)						// az aktuális fül LI eleme
		actTabLi.className = actTabLi.className.replace(/selected/g, "");		// már nem aktuális listaelem

		actTab = tabNum;														// mostantól ez lesz az aktuális fül

		actTabDiv = document.getElementById("_head" + actTab).parentNode;
		actTabDiv.style.display = "block";
		document.getElementById("_tab" + actTab).className += " selected";		// az aktuális fülnek más a színe
	}
	
	tab.childNodes[0].blur();													// eldobjuk a kijelölés keretét
}

// ****************************************************************************
// a szövegből eltávolítjuk a fájlnevekben nem használható karaktereket
// ****************************************************************************
function text2file(text) {
	var remove = '.,:;|/*?<>"';

	text = removeAccents(text.toLowerCase());		// kisbetűssé alakítjuk, és eltávolítjuk az ékezeteket
	text = text.replace(/\s/g, "_");				// a szóközöket aláhúzásaokká alakítjuk
	var file = "";									// eltávolítjuk a nemkívánatos karaktereket
	for (c = 0; c < text.length; c++) {
		file += (remove.indexOf(text.substr(c, 1)) == -1 && text.substr(c, 1) != "\\") ? text.substr(c, 1) : "";
	}
	
	return file;	
}

// ****************************************************************************
// a címsorok képeinek kezelése
// ****************************************************************************
function loadHeadImg(headImg) {
	headImg.alt = "";					// ha betöltődött a kép, nem kell ALT neki
}

function errorHeadImg(headImg) {
	// valami hiba történt
	var head = headImg.parentNode;		// ebben a címsorban vagyunk
	if (head) {							// az IE egyszer szülő nélkül is hibát ad
		head.removeChild(headImg);		// eltávolítjuk a képet
		head.innerHTML = headImg.alt;	// visszaírjuk az eredeti szöveget
		headImg = null;					// a memóriából töröljük a képobjektumot
	}
}

// ****************************************************************************
// az űrlapkezelés funckiói
// ****************************************************************************

// kijelöljük a kontrol csoportját
function selectControl(obj) {
	// melyik fieldset-ben található a kontrol
	var parentFS = obj.parentNode;
	while (parentFS != null && parentFS.nodeName.toLowerCase() != "fieldset") {
		parentFS = parentFS.parentNode;
	}
	
	// ha megtaláltuk, kijelöljük
	if (parentFS != null) {
		var fieldsets = document.getElementsByTagName("fieldset");
		
		for (var f = 0; f < fieldsets.length; f++) {
			if (fieldsets[f] == parentFS) {
				if (parentFS.className.indexOf("selected") == -1)
					parentFS.className += " selected";
			} else {
				fieldsets[f].className = fieldsets[f].className.replace(/selected/g, "");
			}
		}
	}
	
	if (obj.type == "text") {
		if (obj.className.indexOf("selected") == -1)
			obj.className += " selected";
		
		if (defValue[obj.name] != null && obj.value == defValue[obj.name]) {
			obj.value = "";
			obj.className = obj.className.replace(/default/g, "");
		}
	}
}

// a kontrol már nem kijelölt
function releaseControl(obj) {
	obj.className = obj.className.replace(/selected/g, "");
	
	if (defValue[obj.name] != null && obj.value.replace(/\s/g,"") == "") {
		obj.value = defValue[obj.name];
		obj.className += " default";
	}
}

// hosszú szöveges mezők karakterszámlálója és -ellenőrzője
function textCounter(obj) {
	// megadtak-e maximális hosszt
	var maxLength = 0;
	if (obj.className) {
		var match = new RegExp(/\bmaxlen(\d{1,4})\b/).exec(obj.className);
		if (match != null) maxLength = parseInt(match[1]);
	}
	
	// ha igen, akkor nem engedünk többet bevinni
	if (maxLength > 0 && obj.value.length > maxLength) {
		obj.value = obj.value.substr(0, maxLength);
		alert("Túl hosszú szöveg! (maximum " + maxLength + " karakter)");
	}

	// kiírjuk az aktuális karakterszámot
	document.getElementById(obj.id + "_charnum").innerHTML = obj.value.length;
}

// kontrolcsoport kezelése
function jumpNextElem(evt) {
	var evt = evt || window.event;
	var obj = evt.target || evt.srcElement

	// számot nyomtak és a szöveg elérte a maximális hosszt
	if ((evt.keyCode >= 48 && evt.keyCode <= 57) && obj.value.length == obj.maxLength) {
		// melyik a következő elem
		var pos = obj.id.lastIndexOf("_") + 1;
		var dest = obj.id.substr(0, pos) + (parseInt(obj.id.substr(pos, 3)) + 1)
		
		// ha van ilyen, akkor átváltunk rá
		if (document.getElementById(dest))
			document.getElementById(dest).focus();
	}
	
	// Backspace-t vagy balra nyilat nyomtak és üres az elem
	if ((evt.keyCode == 8 || evt.keyCode == 37) && obj.value.length == 0) {
		// melyik az előző elem
		var pos = obj.id.lastIndexOf("_") + 1;
		var dest = obj.id.substr(0, pos) + (parseInt(obj.id.substr(pos, 3)) - 1)

		// ha van ilyen, akkor átváltunk rá
		if (document.getElementById(dest))
			document.getElementById(dest).focus();
	}
}

// a képpel helyettesített kontrolok kezelése
function checkControl(obj) {
	if (obj.nodeName.toLowerCase() == "span") {
		span = obj;
		control = obj.nextSibling;
		
		if (control.disabled) return;
		control.checked = (control.type == "radio") ? true : !control.checked;
	} else {
		span = obj.previousSibling;
		control = obj;
	}
	
	if (control.type == "radio") {
		var controls = document.getElementsByTagName("input");
		for (var c = 0; c < controls.length; c++) {
			if (controls[c].name == control.name) {
				var posX = controls[c].disabled ? -radW : 0;
				var posY = controls[c].checked  ? 0 : -radH;
				controls[c].previousSibling.style.backgroundPosition = posX + "px " + posY + "px";
			}
		}
	} else {
		span.style.backgroundPosition = "0 " + (control.checked ? 0 : -chkH) + "px";
	}
}

// ****************************************************************************
// az űrlapkezelés ellenőrzése elküldés előtt
// ****************************************************************************
function CheckForm(form) {
 	var firstBadElem;
	var reClass = new RegExp("\\brequired\\b");
	var reClassEmail = new RegExp("\\email\\b");
	var msg;

	// először ellenőrizzük a szöveges elemeket
	for (var e = 0; e < form.elements.length; e++) {
		var formElem = form.elements[e];

		if (reClass.test(formElem.className)) {
			// ha volt hozzá hibajelzés, akkor azt most eltűntetjük
			if (formElem.type == "radio")
				hideFormError(formElem.parentNode.parentNode);
			else
				hideFormError(formElem);

			if (formElem.type == "text" && (IsEmpty(formElem.value) || formElem.value == formElem.defaultValue)) {
				msg = (errMsg[formElem.name]) ? errMsg[formElem.name] : "Töltse ki ezt a mezőt!";
				showFormError(formElem, msg);
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
			
			if (formElem.type == "select-one" && IsEmpty(formElem.value)) {
				msg = (errMsg[formElem.name]) ? errMsg[formElem.name] : "Válasszon a listából!";
				showFormError(formElem, msg);
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
			
			if (formElem.type == "radio" && radioValue(formElem.name) == "") {
				msg = (errMsg[formElem.name]) ? errMsg[formElem.name] : "Válasszon a lehetőségek közül!";
				showFormError(formElem.parentNode.parentNode, msg);
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
		}
		
		if (reClassEmail.test(formElem.className)) {
			if (formElem.type == "text" && !IsEmpty(formElem.value) && formElem.value != formElem.defaultValue && IsEmail(formElem.value) == false) {
				showFormError(formElem, "Hibás e-mail cím!");
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
		}
	}

	if (firstBadElem) {			// volt hibás elem?
		firstBadElem.focus();	// ha igen, akkor kijelöljük
		return false;			// és nem engedjük elküldeni a kérdőívet
	} else {
		return true;			// ha nem volt, akkor mehetnek az adatok
	}
}

// hiba üzenet a hiányzó/hibás mező alá
function showFormError(formElem, errorMsg) {
	var errorPara = document.createElement("p");
	errorPara.className = "formerror";

	errorPara.innerHTML = errorMsg;
	formElem.parentNode.insertBefore(errorPara, formElem.nextSibling);
}

// a hibaüzenet eltüntetése
function hideFormError(formElem) {
	var nextElem = formElem.nextSibling;
	if (nextElem.className && nextElem.className.indexOf("formerror") != -1)
		formElem.parentNode.removeChild(nextElem);
}

function radioValue(radioName) {
	var ret = "";
	
	var radios = document.getElementsByTagName("input");
	for (var r = 0; r < radios.length; r++) {
		if (radios[r].type == "radio" && radios[r].name == radioName && radios[r].checked) {
			ret = radios[r].value;
			break;
		}
	}
	
	return ret;
}

// törlik az urlap adatait
function ResetForm(form) {
	// az adatok törlésekor is szürkévé tesszük az alapértelmezett értékkel rendelkező szöveges mezőket
	var controls = form.getElementsByTagName("input");
	for (var c = 0; c < controls.length; c++) {
		if (defValue[controls[c].name] != null)
			controls[c].className += " default";
		
		if (controls[c].type == "radio" || controls[c].type == "checkbox") {
			controls[c].checked = false;

			var span = controls[c].previousSibling;
			var posX = (controls[c].disabled) ? ((controls[c].type == "radio") ? -radW : -chkW) : 0;
			var posY = (controls[c].type == "radio") ? -radH : -chkH;
			span.style.backgroundPosition = posX + "px "+ posY + "px";
		}
	}

	// eltüntetjük az összes hibaüzenetet
	var errors = getElementsByClass("formerror", "p", form);
	for (var i = 0; i < errors.length; i++)
		errors[i].parentNode.removeChild(errors[i]);
}


// ****************************************************************************
// inicializáljuk az oldalt
// ****************************************************************************
function initPage() {
	// az összes linket átnézzük és beállítjuk 
	var links = document.getElementsByTagName("a");
	
	for (var l = 0; l < links.length; l++) {
		if (links[l].hostname != location.hostname) {
			links[l].target = "_blank";
			links[l].className += " out";
		}

		for (e in ext) {
			if (RegExp(eval("/\." + ext[e] + "$/i")).test(links[l].href))
				links[l].className += " " + ext[e];
		}
		
		if (RegExp(/#$/).test(links[l].href))
			links[l].onclick = function() { return false; }
	}

	// végignézzük az összes táblát 
	var tables = document.getElementsByTagName("table");
	
	for (var t = 0; t < tables.length; t++) {
		if (tables[t].className.indexOf("zebra") > -1) {
			// becsíkozzuk a táblát
			for (var b = 0; b < tables[t].tBodies.length; b++) {
				for (var r = 0; r < tables[t].tBodies[0].rows.length; r++) {
					// a páros sorok "even", a páratlanaok "odd" stílust kapnak
					tables[t].tBodies[0].rows[r].className += (r % 2 == 0) ? " even" : " odd";
					
					// kiváltjuk a tr:hover-t két egyszerű függvénnyel
					tables[t].tBodies[0].rows[r].onmouseover = function() { this.className += " activerow"; }
					tables[t].tBodies[0].rows[r].onmouseout  = function() { this.className = this.className.replace(/activerow/g, ""); }
				}
			}
		}
					
		if (tables[t].id == "sortable") {
			// a fejlécre linkeket helyezünk a rendezéshez
			for (var c = 0; c < tables[t].tHead.rows[0].cells.length; c++) {
				// létrehozunk egy új linket
				var newLink = document.createElement("a");
				newLink.href = "javascript:sortTable(" + (c + 1) + ")";
		
				// a linkhez hozzáadjuk a cella összes elemét
				var children = tables[t].tHead.rows[0].cells[c].childNodes;
				for (var n = 0; n < children.length; n++) {
					newLink.appendChild(children[n]);
				}
				
				// az új linket hozzáadjuk a cellához
				tables[t].tHead.rows[0].cells[c].appendChild(newLink);
			}
		}
	}
	
	// van-e navigátor div a lapon?
	var nav = document.getElementById("navigator");
	if (nav) {
		// létrehozunk egy új listát
		var list = document.createElement("ul");
		
		var heads = document.getElementById("jobb_panel").getElementsByTagName("h2");
		for (h = 0; h < heads.length; h++) {
			heads[h].id = "_head" + h;											// azonosítót adunk a címsornak
			
			var listelem = document.createElement("li");						// létrehozunk egy új LI elemet
			listelem.id = "_tab" + h;											// azonosítót adunk a linknek
			listelem.innerHTML = '<A href="#">' + heads[h].innerHTML + '</A>';	// kell egy link
			listelem.onclick   = function() { showTab(this); return false; }  	// amire ha kattintanak, váltson fület
			list.appendChild(listelem);											// felfűzzük a listára
			
			if (h == 0) {														// az első a kiválasztott
				listelem.className = "selected";
			} else {
				tabDiv = heads[h].parentNode;									// az összes többit eltüntetjük
				tabDiv.style.display = "none";
			}
		}
		nav.appendChild(list);													// a listát beillesztjük a DIV-be
		actTab = "0";															// az aktuális "fül" a 0.
	}
	
	// a résztvevők táblájában az országnevek elé odatesszük a zászlókat
	if (document.body.id == "resztvevok") {
		var table = document.getElementById("sortable");

		for (var r = 0; r < table.tBodies[0].rows.length; r++) {
			var county = table.tBodies[0].rows[r].cells[3].innerHTML;
			var cocode = "empty";
			
			for (var c = 0; c < country.length; c++) {
				if (country[c][1].toLowerCase() == county.toLowerCase()) {
					cocode = country[c][0].toLowerCase();
					break;
				}
			}
			table.tBodies[0].rows[r].cells[3].innerHTML = '<img src="../images/flags/' + cocode + '.gif" alt=""/> ' + county;
		}
	}
		
	// cikkekhez tartalomjegyzéket készítünk
	if (document.body.id == "cikkek") {
		var toc = document.getElementById("tartalom");
		var art = document.getElementById("cikk");
		
		if (toc && art) {
			var tocList = document.createElement("ul");
			var tocLine = 0;
		
			// helyet csinálunk a tartalomnak
			toc.style.width = "210px";
			toc.style.padding = "6px";
			art.style.width = "712px";
			art.style.marginLeft = "220px";
			
			var tocTitle = document.createElement("h1");
			tocTitle.innerHTML = "Tartalom";
			toc.appendChild(tocTitle);
			
			var elems = art.getElementsByTagName("*");
			for (e = 0; e < elems.length; e++) {
				var nodeName = elems[e].nodeName.toLowerCase();
				if (nodeName == "h1" || nodeName == "h2" || nodeName == "h3" || nodeName == "h4") {
					if (elems[e].id) {
						id = elems[e].id
					} else {
						id = "_toc" + ++tocLine;
						elems[e].id = id;
					}

					var tocElem = document.createElement("li");
					tocElem.innerHTML = '<a href="#' + id + '">' + elems[e].innerHTML + '</a>';
					tocElem.className = "toclevel" + nodeName.substr(1, 1);
					tocList.appendChild(tocElem);
				}
			}
			toc.appendChild(tocList);
		}
	}
	
	// cikkek címsorainak szövegeit képekre cseréljük
	if (document.body.id == "cikkek" && document.body.className) {
		var art = document.getElementById("cikk");
		var imgPath = "images/heads/" + document.body.className + "/";
		
		if (art) {
			var h1s = art.getElementsByTagName("h1");
			var h2s = art.getElementsByTagName("h2");
			var h3s = art.getElementsByTagName("h3");
			
			for (var h = 0; h < h1s.length + h2s.length + h3s.length ; h++) {
				if (h < h1s.length)
					var head = h1s[h];
				else if (h < h1s.length + h2s.length)
					var head = h2s[h - h1s.length];
				else
					var head = h3s[h - h1s.length - h2s.length];
				
				var headImg = document.createElement("img");
				headImg.alt = head.innerHTML;
				headImg.onload  = function() { loadHeadImg(this); };
				headImg.onerror = function() { errorHeadImg(this); };
				headImg.src = imgPath + text2file(head.innerHTML) + ".gif";
						
				head.innerHTML = "";
				
				head.appendChild(headImg);
			}
		}
	}
	
	// inicializáljuk regisztrációs űrlapot
	if (document.getElementById("registration")) {
		var form = document.getElementById("registration");
		
		// az űrlap küldés gombjaihoz hozzárendeljük a saját funkcióinkat
		form.onsubmit = function() { return CheckForm(this); }
		form.onreset = function() { return ResetForm(this); }

		// az országválasztó listában a nevek elé kitesszük a zászlót
		var optCountries = document.getElementById("country").getElementsByTagName("option");
		
		for (var o = 0; o < optCountries.length; o++) {
			if (optCountries[o].value != null) {
				optCountries[o].style.paddingLeft = "22px";
				optCountries[o].style.backgroundImage = "url(images/flags/" + optCountries[o].value.toLowerCase() + ".gif)";
				optCountries[o].style.backgroundRepeat = "no-repeat";
				optCountries[o].style.backgroundPosition = "0 2px";
			}
		}
		
		// a kijelölt kontrolok csoportját kiemeljük
		var controls = form.getElementsByTagName("select");
		for (var c = 0; c < controls.length; c++)
			controls[c].onfocus = function() { selectControl(this); }

		// emelett a szövegdobozoknál kezeljük az alapértelmezett értékeket
		var controls = form.getElementsByTagName("input");
		for (var c = 0; c < controls.length; c++) {
			controls[c].onfocus = function() { selectControl(this); }
			controls[c].onblur = function() { releaseControl(this); }

			// van-e hozzátartozó alapértelmezett érték
			if (defValue[controls[c].name] != null) {
				controls[c].value = defValue[controls[c].name];
				controls[c].defaultValue = defValue[controls[c].name];
				controls[c].className += " default";
			}
		}

		// a szövegdobozoknál pedig számoljuk és limitáljuk a karaktereket
		var controls = form.getElementsByTagName("textarea");
		for (var c = 0; c < controls.length; c++) {
			controls[c].onfocus = function() { selectControl(this); }
			
			// mindeképpen kell egy azonosító
			controls[c].id = controls[c].id || "_textarea_" + c;
			
			// megadtak-e maximális hosszt
			var maxLength = 0;
			if (controls[c].className) {
				var match = new RegExp(/\bmaxlen(\d{1,4})\b/).exec(controls[c].className);
				if (match != null) maxLength = parseInt(match[1]);
			}
			
			// létrehozzuk a számláló div-et
			var counterDiv = document.createElement("div");
			counterDiv.className = "counter";
			counterDiv.innerHTML = '<span class="charnum" id="' + controls[c].id + '_charnum">0</span>';
			if (maxLength > 0)
				counterDiv.innerHTML += '/' + maxLength;
			counterDiv.innerHTML += ' karakter';
			
			// a számlálót beszúrjuk a szövegdoboz mögé
			controls[c].parentNode.insertBefore(counterDiv, controls[c].nextSibling)
					
			// hozzáfűzzűk a szükséges funkciót is
			controls[c].onkeyup = function() { textCounter(this); }
		}
			
		// a szövegcsoportoknál gondoskodunk a következő/előző elemre ugrásról
		var lists = form.getElementsByTagName("ul");
		for (var l = 0; l < lists.length; l++) {
			if (lists[l].className.indexOf("textgroup") > -1) {
				var elems = lists[l].getElementsByTagName("input");
				for (var e = 0; e < elems.length; e++) {
					elems[e].id = "_tg_" + l + "_" + e;
					
					elems[e].onkeypress = function(evt) {
						var charCode = (evt) ? evt.charCode : window.event.keyCode;
						if (charCode > 31 && (charCode < 48 || charCode > 57))
				            return false;
						else
					         return true;
					}
					
					elems[e].onkeyup = jumpNextElem;
				}
			}
		}
		
		// átalakítjuk a radio gombokat és a jelölőmezőket
		var firefox = (navigator.userAgent.indexOf("Firefox") > -1);
		
		var controls = document.getElementsByTagName("input");
		for (var c = 0; c < controls.length; c++) {
			if (controls[c].type == "radio" || controls[c].type == "checkbox") {
				var span = document.createElement("span");
				span.className = controls[c].type;
	
				var posX = (controls[c].disabled) ? ((controls[c].type == "radio") ? -radW : -chkW) : 0;
				var posY = (controls[c].checked)  ? 0 : ((controls[c].type == "radio") ? -radH : -chkH);
				span.style.backgroundPosition = posX + "px "+ posY + "px";
				
				span.onclick = function() { checkControl(this); }
				controls[c].onclick = function() { checkControl(this); }
	
				controls[c].parentNode.insertBefore(span, controls[c]);
				if (firefox) {
					controls[c].style.display = "none";
				} else {
					controls[c].style.width = "0";
				}
			}
		}
	}
}

window.onload = initPage;