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

// a regisztráció mezőinek alapértelmezett értékei
defValue["nev"] = "Kérjük írja be a nevét";
defValue["telefon"] = "Csak a számot írja be";
defValue["email"] = "Ígérjük, nem küldünk spamet";
defValue["alvazszam"] = "17 karakter!";

// "egyéni" hibaüzenetek
errMsg["nev"] = "Adja meg a nevét!";
errMsg["telefon"] = "Adja meg a telefonszámát!";
errMsg["email"] = "Adjon meg egy valós e-mail címet!";
errMsg["datum"] = "Adjon meg egy dátumot!";

// 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 IsString(str) {
	var reString = /^[a-zA-Z]/;
	return (str) ? reString.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;
}


// ****************************************************************************
// 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();
	}
}

// ****************************************************************************
// 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 reClassTelefon = new RegExp("\\e_telefon\\b");		// Ide kell beírni a wide required  értékét
	var reClassNev = new RegExp("\\e_nev\\b");
	var reClassDatum = new RegExp("\\e_datum\\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 (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 (reClassTelefon.test(formElem.className)) {
			if (formElem.type == "text" && !IsEmpty(formElem.value) && formElem.value != formElem.defaultValue && IsNumber(formElem.value) == false) {
				showFormError(formElem, "Nem számot adott meg!");
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
		}
		if (reClassNev.test(formElem.className)) {
			if (formElem.type == "text" && !IsEmpty(formElem.value) && formElem.value != formElem.defaultValue && IsString(formElem.value) == false) {
				showFormError(formElem, "Biztos jó adta meg a nevét?");
				firstBadElem = (firstBadElem) ? firstBadElem : formElem;
			}
		}
		if (reClassDatum.test(formElem.className)) {
			if (formElem.type == "text" && !IsEmpty(formElem.value) && formElem.value != formElem.defaultValue && IsDate(formElem.value) == false) {
				showFormError(formElem, "Hibás a dátum!");
				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);
}

// törlik az űrlap 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() {

	// inicializáljuk regisztrációs űrlapot
	if (document.getElementById("urlap")) {
		var form = document.getElementById("urlap");
		
		// 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); }
		
		// 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;
				}
			}
		}
		
		// naptárhoz
		var cal = Calendar.setup({
          onSelect: function(cal) { cal.hide() }     });
			cal.manageFields("naptar", "datum", "%Y.%m.%d");		
			cal.manageFields("naptar2", "datum2", "%Y.%m.%d");
			cal.manageFields("naptar3", "datum3", "%Y.%m.%d");
			// naptárhoz vége
			
	}
}

window.onload = initPage;
