/*Előre beállított értékek az engedélyezni kívánt karakterekhez*/

/*InputType.SMALLABC="qwertzuiopasdfghjklyxcvbnm";
InputType.LARGEABC="QWERTZUIOPASDFGHJKLYXCVBNM";
InputType.ABC=InputType.SMALLABC + InputType.LARGEABC;
InputType.HUSMALLABC=InputType.SMALLABC + "öüóőúéáűí";
InputType.HULARGEABC=InputType.LARGEABC + "ÖÜÓŐÚÉÁŰÍ";
InputType.HUABC=InputType.HUSMALLABC + InputType.HULARGEABC;
InputType.NUMBER="0123456789";
InputType.EMAIL=InputType.ABC + InputType.NUMBER + "-@._";
InputType.PASSWORD=InputType.ABC + InputType.NUMBER + "_";*/

Input.automaticAllowedChars=new Array(8,9,27,36,37,38,39,40,46);

/*Input típus*/
function Input(){
	this.charStates=new Array();
	this.autoCharStates=new Array();
	this.allChars=false;

	this.name="";
	this.err_name="";
	this.maxLength=null;
	this.minLength=null;
	this.maximum=null;
	this.minimum=null;
	this.equal_with=null;


	this.allowAllChars = function(){this.allChars=true;}
	this.allowChars = function(chars){
		var i;
		if (chars=="ALL") {
			this.allowAllChars();
			return;
		}
		for (i=0;i<chars.length;i++)
			this.charStates[chars.charCodeAt(i)]=1;
	}

	for(var i=0;i<arguments.length;i++){
		switch(i){
			case 0:	//name
				this.name=arguments[i];
				break;
			case 1:	//error name
				this.err_name=arguments[i];
				break;
			case 2:	//allowed chars
				this.allowChars(arguments[i]);
				break;
			case 3:	//max length
				this.maxLength=arguments[i];
				break;
			case 4:	//min length
				this.minLength=arguments[i];
				break;
			case 5:	//max
				this.maximum=arguments[i];
				break;
			case 6:	//min
				this.minimum=arguments[i];
				break;
			case 7:	//equal with an other input (name)
				this.equal_with=arguments[i];
				break;				
		}
	}
	
	for (var i=0;i<Input.automaticAllowedChars.length;i++)
		this.autoCharStates[Input.automaticAllowedChars[i]]=1;
		
	this.setLength = function(minL,maxL){
		this.minLength=minL;
		this.maxLength=maxL;
	}
	this.setMinLength = function(minL){this.minLength=minL;}
	this.setMaxLength = function(maxL){this.maxLength=maxL;}
	this.setMin = function(minimum){this.minimum=minimum;}
	this.setMax = function(maximum){this.maximum=maximum;}

	this.denyChars = function(chars){
		var i;
		for (var i=0;i<chars.length;i++)
			delete(this.charStates[chars.charCodeAt(i)]);
	}
	this.isAllowedChar = function(chc){
		if (this.allChars) return true
		if (this.charStates[chc]) return true;
		return false;
	}
	this.isAutoAllowedChar = function(chc){
		if (this.allChars) return true
		if (this.autoCharStates[chc]) return true;
		return false;
	}
}

/*Input ellenőrző*/
function FormValidator(name){
	this.name=name;	
	this.form=null;
	this.inputs=new Array();
	this.inited=0;
	this.changed_inputs=new Array();
	
	this.addInput = function(input){
		this.inputs[input.name]=input;
	}
	
	this.init = function(){
		var i,j,form,name,validator,obj,tmp;
		this.form=document.forms[this.name];
		this.form.onsubmit=this.onsubmitValidate;
		
		obj=this.form.elements["changed_inputs"];
		if (typeof(obj)!='undefined' && obj.value.length>0){
			tmp=obj.value.split(",");
			for (i=0; i<tmp.length; i++){
				if (typeof(this.inputs[tmp[i]])!='undefined') this.changed_inputs[tmp[i]]=1;
			}
		}
		
		for (name in this.inputs){
			validator=this.inputs[name];
			if (typeof(this.form.elements[name])=='undefined'){	//multiobject
				for(i=0;;i++){
					if (typeof(this.form.elements[name + "[" + i + "]"])=='undefined') break;
					this.input_init(name + "[" + i + "]",validator);
				}
				delete(this.inputs[name]);
			}
			else
				this.input_init(name,validator);
		}
		this.form.validator=this;
		this.inited=1;
	}
	
	this.input_init = function (name,validator){
		var obj;
		obj=this.form.elements[name];
		obj.validator=validator;
		obj.onkeypress=this.onkeypressValidate;
		obj.onkeyup=this.onkeyupValidate;
		obj.parent=this.form;
		obj.onchange=function(){
			this.parent.validator.changed_inputs[this.name]=1;
		}
		if (obj.type=="text") obj.maxLength=obj.validator.maxLength;	//WARNING: útólagos módosítás estén nem változik meg
		this.inputs[name]=obj;	
	}
	this.isChanged = function(name){
		if (this.changed_inputs[name]==1) return true;
		var tmp=name.split("[");
		if (this.changed_inputs[tmp[0]]==1) return true;
		return false;
	}
	this.alwaysSend = function(input_name){
		if (!this.inited) return false;
		for (var i=0;i<arguments.length;i++){
			var name=arguments[i];
			if (typeof(this.inputs[name])!='undefined' && this.inputs[name]!=null)
				this.inputs[name].changed=1;
			else{
				for(var j=0;;j++){
					if (typeof(this.inputs[name + '[' + j + ']'])=='undefined' || this.inputs[name + '[' + j + ']']==null) break;
					this.inputs[name + '[' + j + ']'].changed=1;
				}
			}
		}
		return true;
	}
	
	this.onkeypressValidate = function(e){
		if( !e ) {
			if( window.event ) e = window.event;
			else return true;
		}
		if( typeof( e.keyCode ) == 'number' && e.keyCode!=0) e = e.keyCode;
		else if( typeof( e.which ) == 'number' && e.which!=0) e = e.which;
		else if( typeof( e.charCode ) == 'number' && e.charCode!=0) e = e.charCode;
		else return true;
		//alert(e);
		if (this.type=="password" || this.validator.isAllowedChar(e) || this.validator.isAutoAllowedChar(e)) return true;
		return false;
	}
	//billentyűleütés után ellenőrzi nem-e lett túl hosszú az input és hogy nem-e tartalmaz véletlenül rossz karaktereket
	this.onkeyupValidate=function(){
		var i;
		if (this.type!="password" && !this.validator.allChars){
			//karakterek ellenőrzése (pl. a "%" beírható a balnyíl miatt)
			for (i=0;i<this.value.length;i++){
				if (!this.validator.isAllowedChar(this.value.charCodeAt(i))){
					this.value=this.value.substr(0,i) + this.value.substr(i+1,this.value.length);
					i--;
				}
			}
		}
		//maximum hossz ellenőrzés
		if (this.validator.maxLength>-1 && this.value.length>this.validator.maxLength) 
			this.value=this.value.substr(0,this.validator.maxLength);

	}
	this.onsubmitValidate = function(){
		var name,input,result=true,i,hiba,tmp;
		for (name in this.validator.inputs){
			hiba="";tmp="";
			input=this.validator.inputs[name];
			input.value=input.value.trim();
			//minimum hossz ellenőrzés
			if (input.validator.minLength!=null && input.validator.minLength>input.value.length){
				if (input.value.length==0) hiba+="  - Kitöltése kötelező!\n";
				else hiba+="  - Túl rövid! Legalább "+input.validator.minLength+" hosszúnak kell lennie.\n";
			}
			//maximum hossz ellenőrzés
			if (input.validator.maxLength!=null && input.validator.maxLength>-1 && input.value.length>input.validator.maxLength) 
				hiba+="  - Túl hosszú! Legfeljebb "+input.validator.maxLength+" hosszú lehet.\n";
				
			if (input.validator.minimum!=null && input.validator.minimum > input.value) 
				hiba+="  - Túl kicsi! A minimális érték: " + input.validator.minimum  + ".<br/>";
			if (input.validator.maximum!=null && input.validator.maximum > input.value) 
				hiba+="  - Túl nagy! A maximális érték: " + input.validator.maximum  + ".<br/>";
			//karakterek ellenőrzése 
			if (!input.validator.allChars){
				for (i=0;i<input.value.length;i++){
					if (!input.validator.isAllowedChar(input.value.charCodeAt(i))) 
						tmp+=" '" + input.value.charAt(i) + "'";
				}
			}
			if (tmp.length>0) hiba+="  - Nem megfelelő karakter(eke)t tartalmaz:" + tmp + "!\n";
			//esetleges egyenlőség kötelezetség vizsgálata:
			if (input.validator.equal_with!=null){
				if (this.validator.inputs[input.validator.equal_with].value!=input.value){
					hiba+="  - Nem egyezik meg a(z) \""+ this.validator.inputs[input.validator.equal_with].validator.err_name +"\" mezővel!"; 
				}
			}
			if (hiba.length>0){
				hiba='A(z) "' + input.validator.err_name + '" mező hibásan lett kitöltve:\n' + hiba;
				alert(hiba);
				result=false;
			}
			result&=true;
			
		}
		if (result) {
			tmp=this.elements["changed_inputs"];
			if (typeof(tmp)!='undefined'){
				for (name in this.validator.inputs){	
					input=this.validator.inputs[name];
					if (!this.validator.isChanged(name)) input.disabled="disabled";
				}
				tmp.value="";
				for (name in this.validator.changed_inputs)
					if (this.validator.changed_inputs[name]==1) tmp.value+=name + ",";
				tmp.value=tmp.value.substr(0,tmp.value.length-1);
			}
			this.submit();
		}
		return false;
	}
}