
	Event.observe(window, 'load', function() {
	
		validation_init ();
	
	});
	
	var validators_list = new Array ();
	
	
	function validation_init ()
	{
		
		var validators = $$('*[validation_for]');
		validators.each(function(s) {

			validator_obj = s;

			var validator = new Object();
			validators_list[validators_list.length] = validator;
			
			validator.obj 		= validator_obj;
			validator.input_id	= validator_obj.getAttribute ('validation_for');
			validator.required	= validator_obj.getAttribute ('required');
			validator.pattern	= validator_obj.getAttribute ('pattern');
			validator.minlen	= validator_obj.getAttribute ('minlen');
			validator.maxlen	= validator_obj.getAttribute ('maxlen');
			validator.confirm	= validator_obj.getAttribute ('confirm');
			validator.input   	= (validator.input_id) ? $(validator.input_id) : null;
			
			
			if (validator.input)
			{
				if (validator.input.type == 'radio')
				{
					var first_radio =  validator.input;
					var radios = $(first_radio.form).getInputs ('radio', first_radio.name);
					
					for (var radio_index = 0; radio_index < radios.length; radio_index++)
					{
						var cur_radio = radios[radio_index];
						
						Event.observe (cur_radio, 'click', 
							function(event) {
								var input = event.element();
								validate_input (input);
								
							});
						
						if (!cur_radio.validators)
							cur_radio.validators = new Array ();
						
						cur_radio.validators [cur_radio.validators.length] = validator;
					}
				}
				
				
				else
				{
					if (!validator.input.validators)
					{
						validator.input.validators = new Array ();
						
						Event.observe (validator.input, 'blur', 
						function(event) {
							var input = event.element();
							validate_input (input);
							
						});
						
					}
					validator.input.validators [validator.input.validators.length] = validator;
				}

			}


		});
	}
	

	function $RF(el, radioGroup)
	{
		if($(el).type && $(el).type.toLowerCase() == 'radio')
		{
			var radioGroup = $(el).name;
			var el = $(el).form;
		}
		else if ($(el).tagName.toLowerCase() != 'form')
		{
		return false;
		}
		var checked = $(el).getInputs('radio', radioGroup).find(
			function(re) {return re.checked;}
		);
		return (checked) ? $F(checked) : null;
	}


	function validate_input (input)
	{
		if (input.type == 'checkbox')
		{
			value = (input.checked ? input.value : null);
		}
		else if (input.type == 'radio')
		{
			value = $RF(input);
			input =  $(input.form).getInputs ('radio', input.name)[0];
		}
		else
			value = input.value;
		
		try {	console.log ('start:', value, '[',value.length,']', '; type:', input.type, ';validators:' + input.validators);}	catch (exc) {}
		
		if (input.validators)
		{

			var validator_active = null;
			for ( var validator_index=0 ; validator_index < input.validators.length; validator_index++ )
			{
				var validator = input.validators[validator_index];
				
				if (validator.required)
				{
					if (!value || value.length == 0)
					{
						validator_active = validator_index;
						break;
					}
				}
				else if (validator.pattern)
				{
					if (!value)
						value = '';
					new_value = value.replace (new RegExp (validator.pattern, 'gi'), '');
					if (new_value.length > 0)
					{
						validator_active = validator_index;

						break;
					}
					
				}
				else if (validator.minlen)
				{
					if (!value)
						value = '';
					if (value.length < validator.minlen)
					{
						validator_active = validator_index;
						break;
					}
				}
				else if (validator.maxlen)
				{
					if (!value)
						value = '';
					if (value.length > validator.maxlen)
					{
						validator_active = validator_index;
						break;
					}
				}
				else if (validator.confirm)
				{
					if (!value)
						value = '';


					if ($(validator.confirm))
					{
						var confirm_value = $(validator.confirm).value;
						if (confirm_value != value)
						{
							validator_active = validator_index;
							break;
						}
					}
				}
				
			}
			
			try {	console.log ('input.validator_active', 	input.validator_active, input.validators[input.validator_active].obj); 	} catch(exc) {}
			try {	console.log ('validator_active', 		validator_active, 		input.validators[validator_active].obj);		} catch(exc) {}

		
			if (input.validator_active != validator_active)
			{
				if (input.validator_active != null)
					dom_display (input.validators[input.validator_active].obj, false);
				input.validator_active = validator_active;
				if (input.validator_active != null)
					dom_display (input.validators[input.validator_active].obj, true);
			}
			return input.validator_active;
		}
		return null;
	}


	
	function validation_submit(form_name)
	{
		var is_ok = true;
		for (var index = 0 ; index < validators_list.length; index++)
		{
			validator = validators_list[index];
				
			var result = validate_input (validator.input);
			
			if (is_ok)
				is_ok = (result == null);
		}
	
		if (is_ok)
		{
			return $(form_name).submit();
		}
	}

	
	
	
	
	
	

