// JavaScript Document

function validate_form(event,p_form_id){
	//Detect the form that requests validation
	//var element = Event.element(event);
	
	var target_form = '';
	if(p_form_id)
	{
		target_form = '#'+p_form_id;
	}
	else
	{
		target_form = Event.findElement(event, 'FORM');
		
		if (!target_form || target_form == document) 
		{
			target_form = '';
		}
		else
		{
			if(!target_form.id)
			{
				alert('Form to validate does not contain an id value.');
				return false;
			}
			target_form = '#'+target_form.id;
		}
	}
	
	$$(target_form+' .v_err_msg').each(function(e){e.remove()});
	$$(target_form+' .v_error').each(function(e){e.removeClassName('v_error');}); 
	b_form_has_errors = false;
	
	a_v_controls = $A([ 
		 $H({'class_name':'v_required','msg':'This is a required field.','f_validate':function(e){return e.value.strip() == '';}}).toObject()
		,$H({'class_name':'v_match','msg':'These fields do not match','f_validate':function(e){return $F(e) != $F(e.id + '_match');},'f_failed':function(e,v_control){display_error($(e.id + '_match'),v_control);}}).toObject()
		,$H({'class_name':'v_email','msg':'This is not a valid email.','f_validate':function(e){var re = /^[\w-_.]*[\w-_.]\@[\w].+[\w]+[\w]$/; return !e.value.match(re)}}).toObject()
		,$H({'class_name':'v_domain','msg':'This is not a valid domain.','f_validate':function(e){var re = /^[\w-_.]*[\w-_.]\.+[\w]+[\w]$/; return !e.value.match(re)}}).toObject()
		,$H({'class_name':'v_checked','msg':'This is a required field.','f_validate':function(e){return !e.checked;}}).toObject()
		,$H({'class_name':'v_radio_checked','msg':'This is a required field.','f_validate':function(e){var b_checked = $$(target_form+' input[name="'+e.name+'"]').any(function(e){return e.checked});return !b_checked;}}).toObject()
	]);
	
	
	// SLOW : 		,$H({'class_name':'v_radio_checked','msg':'This set of inputs is not checked.','f_validate':function(e){var b_checked = $$('input[name="'+e.name+'"]').any(function(e){return e.checked});return !b_checked;}}).toObject()

	//		,$H({'class_name':'v_radio_checked','msg':'This set of inputs is not checked.','f_validate':function(e){var e_parent = $(e).up('.v_error_display'); var b_checked = e_parent.descendants().any(function(e){return e.checked});return !b_checked;}}).toObject()

	 //var start = new Date().getTime();descendants(); // 
	/* array_length = a_v_controls.length;
	 	for(i=0;i<array_length;i++)
				{
					targeted_class = '.' + a_v_controls[i].class_name;
					ea = $$(targeted_class);
				 array_length2 = ea.length;
					for(j=0;j<array_length2;j++)
						{
							if(a_v_controls[i].f_validate(ea[j]))
								{
									error_display = ea[j].up('.v_error_display');
									error_display.addClassName('v_error');
									new Insertion.Bottom(error_display, '<div class="v_err_msg">' + a_v_controls[i].msg + '</div>');
									b_form_has_errors = true;
								}
						}
				}
	*/


	a_v_controls.each
		(
			function(v_control)
				{
					
					$$(target_form+' .' + v_control.class_name).each(function(e){
					if(v_control.f_validate(e))
						{
							display_error(e,v_control);
							if(v_control.f_failed) v_control.f_failed(e,v_control); 
							b_form_has_errors = true;
						}
					});
				}
		)
	 //var end = new Date().getTime();alert(end - start);
	if(b_form_has_errors)
	{
		Event.stop(event);
		alert('There are some problems with your form, please check your form and submit again.');
		return false;
	}
	else
	{
		return true;
	}
}
function display_error(e,v_control)
{
	error_display = e.up('.v_error_display');
	if(typeof b_archetype_js_debug !== 'undefined' && b_archetype_js_debug && !error_display)
	{
		alert('Missing error_display for form element named: \n\n'+e.name+'\n\nRequires css class "v_error_display" on parent element.');
		return;
	}
	error_display.addClassName('v_error');
	new Insertion.Bottom(error_display, '<div class="v_err_msg">' + v_control.msg + '</div>');
}
