// -------------------------------------------------------------------------------------------------
// Form functions
// -------------------------------------------------------------------------------------------------

var formfunc = new Object; // Contains form validadtion functions

formfunc.p = new Object; // Global properties for formfunc

// PREPEND/APPEND ERROR MESSAGE
formfunc.p.prepend = '';
formfunc.p.append  = '';

// ERROR CLASS
// The class to add to form elements failing validation - optional
formfunc.p.error_class = 'fferr';

// HOOKS
formfunc.hook = new Object; // Holds 'hook' functions to do extra things
// Use as follows...
// formfunc.hook.field_passed = function(el) { ...
// formfunc.hook.field_failed = function([el, err_msg]) { ...
// formfunc.hook.val_passed = function([el, err_msg]) { ...

// ----------------------------------------------------------------------------------------------------

formfunc.init = function(form_name)
{
	// Set up validadtion array
	formfunc.p.form_name = form_name;
	formfunc.v = new Array; // What to validate and how
	
	// var f = $(document.forms[form_name]);
	// var s = f.get('events');
	
	// Add validation to submit event
	$(document.forms[form_name]).addEvent('submit', formfunc.validate); // NOT TESTED YET
}

formfunc.setup_validation_pass = function(val_arr, error_bump)
{
	// Add to multi-pass validation array
	if (!$defined(error_bump)) error_bump = '';
	formfunc.v.push([val_arr, error_bump]);
}

formfunc.validate = function(e)
{
	// Do the validation
		
	var cont = true;
	if (!$defined(e)) e = null;
	if ($defined(formfunc.hook.val_start)) cont = formfunc.hook.val_start(e);
	if (cont === false) return 'validation halted';

	var field, type, value, error, flag, val_arr, error_bump;
	var failed = new Array;
	var passed = new Array;
	var form = formfunc.p.form_name;
	
	formfunc.p.error = '';
	
	for (var j = 0; j < formfunc.v.length; j++)
	{

		val_arr		= formfunc.v[j][0];
		error_bump  = formfunc.v[j][1];
		
		for (var i = 0; i < val_arr.length; i++)
		{
			
			flag = false;
			field = val_arr[i][0];
			if (!$defined(document.forms[form][field])) continue;
			value = formfunc.get_field(document.forms[form][field]).replace(/^\s+|\s+$/g, ''); // Get and trim the value
			type  = val_arr[i][1].toLowerCase();
			error = val_arr[i][2];
			
			passed.push(field);
			var test = type.indexOf(':') != -1 ? type.slice(0, type.lastIndexOf(':')) : type;
			switch(test)
			{
				case 'notempty':
					if (value == '') flag = true;
					break;
					
				case 'islong':
					var result = type.match(/.*:(\d+)-(\d+)/);
					var min = result[1];
					var max = result[2];
					if (value.length < min || value.length > max) flag = true;
					break;
	
				case 'isnumeric':
					if (value == '') break;
					if (Math.floor(value).toString() == 'NaN') flag = true;
					break;
	
				case 'isinteger':
					if (value == '') break;
					if (Math.floor(value).toString() == 'NaN' || value != parseInt(value)) flag = true;
					break;
	
				case 'isemail':
					if (value == '') break;
					if (!value.match(/^.+@.+\..+$/)) flag = true;
					break;
	
				case 'isdate':
					// validates dates given in British order, eg 5/6/2007 or 05-10-2008
					if (value == '') break;
					var result = value.split(/[^\d]/); // Split on anything not numeric
					var d = result[0] * 1;
					var m = result[1] * 1;
					var y = result[2] * 1;
					var date = new Date(y, m-1, d);  
					var converted	= '' + date.getFullYear() + (date.getMonth() + 1) + date.getDate();  
					var given		= '' + y + m + d;  
					if (given != converted) flag = true;  
					break;
	
				case 'isalphanum':
					if (value == '') break;
					if (!value.match(/^[0-9A-Za-z]+$/)) flag = true;
					break;
	
				case 'matches':
					if (value == '') break;
					var result = type.match(/.*:(.+)/);
					var regex  = new RegExp(result[1]);
					if (!value.match(regex)) flag = true;
					break;
					
				case 'imatches':
					if (value == '') break;
					var result = type.match(/.*:(.+)/);
					var regex  = new RegExp(result[1], 'i');
					if (!value.match(regex)) flag = true;
					break;
	
				default:
					alert("UNKNOWN VALIDATION TEST\n" + type);
			}
			if (flag)
			{
				passed.pop();
				failed.push([field, error]);
			}
		}
		
		msg = formfunc.process_error(failed, passed);
		if (failed.length)
		{
			msg = formfunc.p.prepend + error_bump + msg + formfunc.p.append;
			formfunc.p.error = msg;
			if ($defined(formfunc.hook.val_failed)) formfunc.hook.val_failed(msg);
			return false;
		}
		
	}

	if ($defined(formfunc.hook.val_passed))
	{
		return formfunc.hook.val_passed(e);
	}
	else
	{
		return true;
	}
}

formfunc.harvest = function(form_name)
{
	// Harvest all the values in a form
	var theform = document.forms[form_name];

	var f = theform.elements;
	var vals = new Object;
	var arrx = new RegExp(/(\w*)\[(\w*)\]/);
	for (i=0; i<f.length; i++)
	{
		var arrayval = arrx.exec(f[i].name);
		var name = arrayval ? arrayval[1] : f[i].name;
		if (name && !$defined(vals[name])) vals[name] = formfunc.get_field(theform[f[i].name]);
	}
	return vals;
}

formfunc.get_field = function(el)
{
	if (!$defined(el)) return;
	type = $defined(el.type) ? el.type : el[0].type;
	switch (type)
	{
		case 'text':
		case 'textarea':
		case 'password':
		case 'hidden':
		case 'file':
			return el.value;
		case 'select-one':
			return (el.options[el.selectedIndex].value ? el.options[el.selectedIndex].value : '');
		case 'checkbox':
			if ($defined(el.length))
			{
				var arr = [];
				for (var i = 0; i < el.length; i++)
				{
					if (el[i].checked) arr.push(el[i].value ? el[i].value : 1);
				}
				return arr;
			}
			return (el.checked ? (el.value ? el.value : 1) : '');
		case 'radio':
			if ($defined(el.length))
			{
				for (var i = 0; i < el.length; i++)
				{
					if (el[i].checked) return (el[i].value ? el[i].value : 1);
				}
				return '';
			}
			return (el.checked ? (el.value ? el.value : 1) : '');
		default:
			return '';
	}
}

formfunc.process_error = function(failed, passed)
{
	var form = formfunc.p.form_name;
	var msg  = '';
	var add_class = $defined(formfunc.p.error_class);
	for (var i = 0; i < passed.length; i++)
	{
		if (add_class && $chk($(document.forms[form][passed[i]]))) $(document.forms[form][passed[i]]).removeClass(formfunc.p.error_class);
		if ($defined(formfunc.hook.field_passed)) formfunc.hook.field_passed(passed[i]);
	}
	for (var i = 0; i < failed.length; i++)
	{
		if (add_class &&  $chk($(document.forms[form][failed[i][0]]))) $(document.forms[form][failed[i][0]]).addClass(formfunc.p.error_class);
		if ($defined(formfunc.hook.field_failed)) formfunc.hook.field_failed(failed[i]);
		msg += failed[i][1] + '<br \/>';
	}
	return msg;
}
