var Validator = function () {

/*
 *  privates
 */	
		var formObj;
		var inputs;
		var variables = {};
	
		function run (){			
			variables['validators'] = {};
/*			
			formObj.getElementsByTagName('input').each( function(input){	
				Event.observe(input, 'focus', function(){	
					Element.addClassName( this, 'focused');					
				});
				Event.observe(input, 'blur', function(){	
					Element.removeClassName( this, 'focused');	
				});									
			});
			
			formObj.getElementsByTagName('textarea').each( function(input){	
				Event.observe(input, 'focus', function(){	
					Element.addClassName( this, 'focused');					
				});
				Event.observe(input, 'blur', function(){	
					Element.removeClassName( this, 'focused');	
				});									
			});
			
			formObj.getElementsByTagName('select').each( function(input){	
				Event.observe(input, 'focus', function(){	
					Element.addClassName( this, 'focused');					
				});
				Event.observe(input, 'blur', function(){	
					Element.removeClassName( this, 'focused');	
				});									
			});			
*/

			document.getElementsByClassName('required',formObj ).each( function(input){				
				input.validator = read(input.className) ? read(input.className): 'notempty';
						
				Event.observe(input, 'focus', function(){	
					Element.addClassName( input, 'focused');					
				});
				
				Event.observe(input, 'blur', function(){	
					Element.removeClassName( input, 'focused');					

					Validator.display(input.id,	Check[input.validator]( $F(input.id), input ) 	
					);
					
				});
			});			
		};
		
		function read ( classname ) {
			var r = new RegExp(/value-[a-zA-Z0-9]+\b/);
			var m = classname.match( r );
			if (m == null) {
				return false;
			} else {
				return m[0].replace(new RegExp("value-"), '');
			}
		}		

	
/*
 *  publics
 */	
		return {
			initialize: function( formId ) {	
				formObj = $(formId);				
				formObj.onsubmit = function(){
					return Validator.submit();
				}								
				run();
			},
			setVar: function ( name,value ) {
				variables[name] = value;
			},	
			getVar: function ( name ) {
				return variables[name];
			},
			display: function ( id, errorObj ){	
				if( errorObj.isError ){
					if($(id).error){
						$(id).error.innerHTML = ["<b>Hibásan kitöltött mező</b><br />",errorObj.message ].join('');
					}else{
						if ($(id).value) {
							span = document.createElement('span');	
							span.className = 'error';
							span.innerHTML = ["<b>Hibásan kitöltött mező</b><br />",errorObj.message ].join('');			
	
							Element.addClassName($(id), 'error')
							$(id).error = span;
							if($(id).nextSibling && $(id).nextSibling != null ){
								$(id).parentNode.insertBefore( span, $(id).nextSibling );
							} else {
								$(id).parentNode.appendChild(span);
							}
						}
					}
				} else if (errorObj.isOk) {
					if($(id).error){
						Element.removeClassName($(id), 'error')
						$(id).parentNode.removeChild( $(id).error );
						$(id).error = false;
					}					
				}				
			},
			submit: function (){
				_validated = true;				
				document.getElementsByClassName('required',formObj ).each( function(input){
					_val = Check[input.validator]( $F(input.id), input );
					_validated = !_val.isOk?_val.isOk:_validated;
					Validator.display( input.id,_val );							
				});
				if(_validated) formObj.submit();
				return false;
			}
		}	
	}();
	
	ErrorClass = Class.create();
	ErrorClass.prototype = {
		initialize: function() {
			this.level = 0;
			this.message = '';
			this.isError = false;
			this.isWarning = false;
			this.isOk = false;
	    },
	    setError: function( msg ) {
		this.level = 3;
		this.message = msg;
			this.isError = true;
			this.isWarning = false;
			this.isOk = false;
		return this;
	    },
	    setWarning: function( msg ) {
		this.level = 2;
		this.message = msg;
			this.isError = false;
			this.isWarning = true;
			this.isOk = false;
		return this;
	    },
	    setOk: function() {
		this.level = 1;
		this.message = '';
			this.isError = false;
			this.isWarning = false;
			this.isOk = true;
		return this;
	    }
	}
	
/*
 * ellenorzo osztaly, metodusok
 */	
	var Check = function () {		
		function parameters(obj, regExp){
			var m = obj.className.match( regExp );
			if (m == null) {
				return false;
			} else {
				return m[0].split(':');
			}
		}		
		return {		
			notempty: function(_val){
				error = new ErrorClass;
				if (_val.length < 1) return error.setError('A mező kitöltése kötelező');
		
				return error.setOk();	
			},
		
			/*
			 * mailcim tipus
			 */
			email: function(_val){
				error = new ErrorClass;
				var kukac = _val.indexOf('@');
				var kukac2 = _val.split('@');
				
				if (kukac < 1) return error.setError('Az email címnek egy \"@\" karaktert kell tartalmaznia.');
				if (kukac2.length > 2) return error.setError('Az email címnek egy \"@\" karaktert kell tartalmaznia.');
				if (_val.length < kukac+3) return error.setError('Az email címnek legalább egy pontot kell tartalmaznia.');
		
				var vege = _val.substr(kukac+1);
				var vanbenne = false;
		
				if (kukac+1 == _val.length) return error.setError('Az email címnek legalább egy pontot kell tartalmaznia.');
				for (i=kukac+1;i<_val.length;i++){
					if (_val.charAt(i) == '.') vanbenne = i;
				}
				if (!vanbenne) return error.setError('Az email címnek legalább egy pontot kell tartalmaznia.');
				if (_val.length-vanbenne < 3) return error.setError('Az email cím nem megfelelő.');
		
				return error.setOk();				
			},
			/*
			 * jelszo tipus
			 */
			password: function(_val){
				error = new ErrorClass;
				var r = new RegExp(/val:[a-zA-z0-9]+\b/);				
				param = parameters(arguments[1],r );			
					
				if(_val.length < 1)	{ 
					return error.setError('Jelszó megadása kötelező'); 
				} else {		
				
					if(_val.length < param[2]) return error.setError('A jelszó hossza nem lehet kevesebb mint '+param[2]+' karakter');
					if(_val.length > param[3]) return error.setError('A jelszó hossza nem lehet több mint '+param[3]+' karakter');
					
					
					if($F(param[1]).length < 1){
						return error.setError('Kérjük ismételje meg a jelszót');
					}		
					
					if($F(param[1]) != _val ){
						return error.setError('Kérjük ismételje meg a jelszót');
					} else {
						if( $(param[1]).error ) {
							Element.removeClassName($(param[1]), 'error')
							$(param[1]).parentNode.removeChild( $(param[1]).error );
							$(param[1]).error = false;
						}
					}		
				}
				return error.setOk();				
			},
			/*
			 * minimum-maximum tipus
			 */				
			minmax: function(_val){
				error = new ErrorClass;
				var r = new RegExp(/val:[0-9:]+\b/);
				param = parameters(arguments[1],r );

				if(param[1]==0 && _val.length <= param[1])return error.setError('A mező kitöltése kötelező');
				
				if(_val.length < param[1]) return error.setError('A mezőben nem lehet kevesebb mint '+param[1]+' karakter');
				if(_val.length > param[2]) return error.setError('A mezőben nem lehet több mint '+param[2]+' karakter');
				
				return error.setOk();
			},
			datefields: function(_val){
				error = new ErrorClass;
				var r = new RegExp(/val:[a-zA-z0-9:]+\b/);				
				param = parameters(arguments[1],r );			

				if( $F(param[1]).length < 4 ){
					Validator.display(
						$(param[3]).id,
						error.setError('Év megadása kötelező')
					);					
					Element.addClassName( $(param[1]), 'error' );
					Element.addClassName( $(param[2]), 'error' );
					Element.addClassName( $(param[3]), 'error' );
					return true;
				}
				if( $F(param[2]) == 0 || $F(param[2]) > 12){
					Validator.display(
						$(param[3]).id,
						error.setError('Hónap megadása kötelező')
					);
					Element.addClassName( $(param[1]), 'error' );
					Element.addClassName( $(param[2]), 'error' );
					Element.addClassName( $(param[3]), 'error' );					
					return true;
				}
				if( $F(param[3]) == 0 || $F(param[3]) > 31 ){
					Validator.display(
						$(param[3]).id,
						error.setError('Nap megadása kötelező')
					);
					Element.addClassName( $(param[1]), 'error' );
					Element.addClassName( $(param[2]), 'error' );
					Element.addClassName( $(param[3]), 'error' );					
					return true;
				}

				Element.removeClassName( $(param[1]), 'error' );
				Element.removeClassName( $(param[2]), 'error' );
				Element.removeClassName( $(param[3]), 'error' );
					
				return error.setOk();				
			},
			phonefields: function( _val ){
				error = new ErrorClass;
				var r = new RegExp(/val:[a-zA-z0-9:]+\b/);				
				param = parameters(arguments[1],r );	
				
				if( $F(param[1]).length < 2 ){
					Validator.display(
						$(param[2]).id,
						error.setError('Körzetszám megadása kötelező')
					);					
					Element.addClassName( $(param[1]), 'error' );
					Element.addClassName( $(param[2]), 'error' );
					return true;
				}				
				
				if( $F(param[2]).length < 7 || $F(param[2]).length > 7 ){
					Validator.display(
						$(param[2]).id,
						error.setError('Telefonszám megadása kötelező')
					);					
					Element.addClassName( $(param[1]), 'error' );
					Element.addClassName( $(param[2]), 'error' );
					return true;
				}	
				
				Element.removeClassName( $(param[1]), 'error' );
				Element.removeClassName( $(param[2]), 'error' );		
				return error.setOk();					
			},
			selection: function( _val ){
				error = new ErrorClass;
				var r = new RegExp(/val:[a-zA-z0-9]+\b/);				
				param = parameters(arguments[1],r );	
				if( $F(arguments[1].id) == param[1] ) return error.setError('Kérjük válasszon egyet a lehetőségek közül');
	
				return error.setOk();					
			}			
	
		}
	}();
	
function resetform(obj) {
	var input = obj.form.getElementsByTagName('input');
	for (var i=0; i<input.length; i++) {
		if (input[i].error) {
			Element.removeClassName(input[i], 'error')
			input[i].parentNode.removeChild( input[i].error );
			input[i].error = false;
		}
	}
}

