
var validator = {
	init : function(){
		$(document.body).qgDelegate('keydown', 'input, textarea', validator.checkElEvent );
		$(document.body).qgDelegate('keyup', 'input, textarea', validator.checkElEvent );
		$(document.body).qgDelegate('blur', 'input, textarea', validator.checkElEvent );
		$(document.body).qgDelegate('click', 'select,input[type=radio],input[type=checkbox]', validator.checkElEvent );
		$(document.body).qgDelegate('change', 'select', validator.checkElEvent );
		$$('input, select, textarea').each( validator.checkEl );
		$A(document.forms).each( validator.initForm );
	},
	checkElEvent: function(e){
		var el = $(e.target);
	    if(!el.get){return;}
		if( el.type==='radio' && el.form ){
			$each( el.form[el.name], validator.checkEl )
		} else {
			validator.checkEl($(e.target));
		}
	},
	checkEl : function(el){
		if($(el).form === undefined){return;}
		var ok = true;
		var check = function(v){ ok = el.getV().match(v)?ok:false; };
		var keep = function(v){ 
			check(v);
			var ov = el.getV();
			(function(){ !el.getV().match(v) && el.setV(ov)  }).delay(30);
		};
		var x = 0;
		if( x = el.getAttribute('qg:regExpCheck')){ check( eval(x) ); }
		if( x = el.getAttribute('qg:regExpKeep') ){ keep( eval(x) ); }
		if( x = el.getAttribute('qg:validate') ){
			x.split(' ').each( function(handle){
				if( !(x = validator.handler[handle]) ){ return; }
				x.check && check(x.check);
				x.keep && keep(x.keep);
				x.keyup  && x.keyup(el);
			});
		}
		ok = (ok?'remove':'add')+'Class';
		el[ok] && el[ok]('qgNotValid');
		el.getLabel() && el.getLabel()[ok]('qgNotValid');
	},
	checkForm : function(form){
		var els = [];
		form.getElements('.qgNotValid').each( function(el){ 
			if( el.offsetWidth && el.get('tag')!== 'label' ){
				els.push(el);
			} 
		});
		var ok = els.length===0;
		if(!ok){
			if(form.onSubmitError){
				form.onSubmitError(els);
			} else {
				validator.onSubmitError(els);
			}
		}
		return ok;
	},
	initForm: function(form){
		$(form).addEvent('submit', function(e){ validator.checkForm(form) || e.stop();  } );
	},
	onSubmitErrot: function(){
		alert( "Bitte überprüfen Sie die eingefärbten Eingaben" );
		var fx = new Fx.Scroll(window);
		var pos = e.els[0].getPosition();
		fx.start(pos.x, pos.y-50);
	},
	setElement: function(el,value){
		el = $(el);
		el.setAttribute('qg:validate',value);
		validator.checkEl(el);
	}
};
//$extend(validator, Events.prototype);

validator.handler = {
	trim : {
		keep:/^$|^[^\s].*$/,
		check:/^$|^[^\s]$|^[^\s].*[^\s]$/
	},
	required : {
		check : /^.+/
	},
	numeric : {
		keep : /^[0-9',\.]*$/,
		check : /^$|^[^\,\.]*[\,\.]{0,1}[^\,\.]+$/,
		keyup: function(el){
			if(!el.selectionStart){return;}
			return;
			var pos = inputSelectionPosGet(el);
			var length = el.value.length;
			var v = el.value.replace(/[^0-9\.,]/g,'')
			.replace(/,/g,'.')
			.replace(/^[^.]*/, function(e){
				var s = '';
				(e.length).times(function(i){
					s += (e.length-i)%3===0 ? "'"+e.charAt(i) : e.charAt(i);
				})
				return s.replace(/^'/,'');
			})
			el.value = v;
			inputSelectionPosSet(el,pos.start+( v.length-length));
		}
	},
	integer : {
		keep : /^[0-9]*$/,
		check : /^$|^[0-9]+$/
	},
	phone : {
		keep : /^[0-9#+ \/]{0,20}$/,
		check : /^$|^.{7,20}$/
	},
	email : {
		keep : /^[a-zA-Z0-9_\.\-@\+]*$/,
		check : /^$|^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
	},
	string : {
		check : /.+/
	},
	url: {
		check : /^$|^http[s]{0,1}:\/\/[^\s]+$/,
		keyup : function(el){
			if( el.value.indexOf('.')>-1 && el.value.indexOf('http') !== 0 ){
				el.value = 'http://'+el.value;
			}
		}
	}
}
