var Validator = {
	controls : {},

	autoRegister: function(){
		var forms = $$('form.validate');
		forms.each(function(form){
			var inputs=$$('#'+form.get('id')+' input', '#'+form.get('id')+' textarea').erase($$('#'+form.get('id')+' input[type=submit]'));

			inputs.each(function(input){
				var type=input.getProperty('type');
				if((type!='file')&&(type!='button')&&(type!='submit'))
					Validator.register(input);
			});
			form.addEvent('submit',function(evt){
				if(!Validator.isValid(this)) evt.stop();
			}.bind(form));
		});
	},

	register : function(input){
		var id=(input.get)?input.get('id'):false;
		if(id){
			var regexp=[];
			if(input.hasClass('required')) regexp.extend([".+"]);
			if(input.hasClass('numeric')) regexp.extend(["^[0-9]*$"]);
			if(input.hasClass('year')) regexp.extend(["^[0-9]{4}$"]);
			if(input.hasClass('irszam')) regexp.extend(["^[0-9]{4}$"]);
			if(input.hasClass('street')) regexp.extend([".+"]);
			if(input.hasClass('kapcstarto')) regexp.extend([".+"]);
			if(input.hasClass('city')) regexp.extend([".+"]);
			if(input.hasClass('url')) regexp.extend(["^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$"]);
			if(input.hasClass('email')) regexp.extend(["[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"]);

			this.controls[id]={
				'form':				input.getParent('form'),
				'regexp':			regexp,
				'validator':		false,
				'defaultValue':		'ehe',
				'msgPlace':			'validator_'+id,
				'errorMsg':			'Nincs megfelelően kitöltve.',
				'errorMsgWithLabel':'{0} nincs megfelelően kitöltve.',
				'setFocusOnError':	true
			};

			input.addEvent('blur',function(evt){
				Validator.validateField(this);
			}.bind(input));

			var fieldset=input.getParent('fieldset');
			var summary=(fieldset)?fieldset.getElement('.validation_summary'):false;
			if(!$(this.controls[id].msgPlace)){
				var msgPlace=new Element(((!summary)?'div':'span'),{
					'id':this.controls[id].msgPlace,
					'class':'errorMsg'
				});
				if(summary)
					summary.grab(msgPlace);
				else msgPlace.inject(input,'after');
			}
		} else if(input.setStyle) input.setStyle('border','dashed 1px yellow');
	},

	update : function(arg){
		for(var i=0;i<arg.length;i++){
			var obj=arg[i];
			var id=obj.id;
			var input=$(id);

			if(id && input){
				if(this.controls[id]){
					for(var key in obj){
						if(key=='regexp') this.controls[id][key].extend([obj[key]]);
						else this.controls[id][key]=obj[key];
					}
				} else this.register(input);

				if(this.controls[id].defaultValue){
					input.set('title',this.controls[id].defaultValue);
					if(!input.value){
						input.setStyles({'color':'#666','font-size':'10px'});
						input.value=this.controls[id].defaultValue;
					}
					input.addEvent('focus',function(evt){
						if(this.value==Validator.controls[this.get('id')].defaultValue){
							this.value='';
							this.setStyles({'color':'#000','font-size':'10px'});
						}
					}.bind(input));
					input.addEvent('blur',function(evt){
						if(this.value==''){
							this.setStyles({'color':'#666','font-size':'10px'});
							this.value=Validator.controls[this.get('id')].defaultValue;
						}
					}.bind(input));
				}
			}
		}
	},

	checkField : function(input){
		var valid=true;
		var id=input.get('id');

		if(id){
			for(var i=0;i<this.controls[id].regexp.length;i++)
				if(
					!input.value.test(new RegExp(this.controls[id].regexp[i])) ||
					((this.controls[id].defaultValue!='') && (this.controls[id].defaultValue==input.value))
				)
					valid=false;

			if(!valid && (!input.hasClass('required') && ((this.controls[id].defaultValue==input.value)||(input.value=='')))) valid=true;

			if(typeof(this.controls[id].validator)=='function')
				if(!(this.controls[id].validator)(input))
					valid=false;
		}

		return valid;
	},

	validateField: function(input){
		var id=input.get('id');
		var is_valid=Validator.checkField(input);

		var labels=$$('label[for='+id+']');
		if(!is_valid){
			input.addClass('invalid');
			labels.addClass('invalid');
		} else {
			input.removeClass('invalid');
			labels.removeClass('invalid');
		}

		var msgPlace=$('validator_'+id);
		if(labels && labels[0])
			msgPlace.set('html',(!is_valid)?Validator.controls[id].errorMsgWithLabel.replace('{0}',labels[0].get('html')):'');
		else msgPlace.set('html',(!is_valid)?Validator.controls[id].errorMsg:'');

		return is_valid;
	},

	isValid : function(form){
		var reply = true;
		var firstInvalid=false;

		for(var id in this.controls){
			if(this.controls[id].form.get('id')==form.get('id')){
				if(!this.validateField($(id))){
					reply=false;
					if(!firstInvalid) firstInvalid=$(id);
				}
			}
		}
		if(firstInvalid) firstInvalid.focus();

		if(reply)
			for(var id in this.controls)
				if((this.controls[id].form.get('id')==form.get('id'))&&(this.controls[id].defaultValue==$(id).value))
					$(id).value='';

		return reply;
	}
}

window.addEvent('domready', Validator.autoRegister);
