/*
Copyright Drew Broadley 2007
drew@topshelfmedia.co.nz
*/

var formvalid = new Object();

formvalid.debug = 0;

formvalid.add = function(field, desc, type, required)
{

	formvalid.fields[field] = new Array();
	formvalid.fields[field]['type'] = type;
	formvalid.fields[field]['desc'] = desc;	
	if (required)
	{
		formvalid.fields[field]['required'] = required;	
	}
	else
	{
		formvalid.fields[field]['required'] = 0;	
	}
}

formvalid.init = function()
{
	formvalid.fields = new Array();
}

formvalid.validate = function (formname, func)
{
	var field_value = '';
	var post_vars = new Array();
	
	var form_parent = eval('document.' + formname);
	
	var form_inputs = {
		"input"			:	form_parent.getElementsByTagName("input"),
		"textareas"	:	form_parent.getElementsByTagName("textarea"),
		"select"			:	form_parent.getElementsByTagName("select")
	};

	for (var form_input_type in form_inputs)
	{
		if (formvalid.debug == 1)
		{
			//alert("Field Type: " + form_input_type + " = " + form_inputs[form_input_type].length);
		}
		
		if (form_inputs[form_input_type].length == 0)
		{
			continue;
		}
		
		for (
			var form_input_type_number = 0; 
			form_input_type_number < form_inputs[form_input_type].length; 
			form_input_type_number++
		)
		{
			
			var field_name = form_inputs[form_input_type][form_input_type_number].name;
			var field = eval('document.' + formname + '[\'' + field_name + '\']');
					
			//alert(field_name + ": " + field_value);

			if (!field_name.match(/.+/))
			{
				continue;
			}
								
			if (field_name.match(/\,/))
			{
				matches = field_name.split(",");
				
				if (this.is_type(field_name) == "phone")
				{
					var field_value = eval('document.' + formname + '[\'' + matches[0] + '\'].value') + eval('document.' + formname + '[\'' + matches[1] + '\'].value');
					
				}
			}		
			else
			{
							
				if (field.length > 0)
				{
					for (var i = 0; i <= field.length; i++)
					{
						if (field[i])
						{
							if (field[i].checked || field[i].selected)
							{
								field_value = field[i].value;
							}
						}
					}
				}
				else
				{
					field_value = eval('document.' + formname + '[\'' + field_name + '\'].value');
				}
			}


			
			if (formvalid.fields[field_name])
			{				
				if (formvalid.fields[field_name]['type'])
				{
					
					field_type = this.is_type(field_name);
					field_desc = formvalid.fields[field_name]['desc'];	
					field_regex = formvalid.regex[field_type]['regex'];

					if (
						field_value.length == 0
					)
					{
						if (formvalid.fields[field_name]['required'] == 1)
						{
							return formvalid.error(field_desc, field_type, "req");
						}
					}
					else
					{
					
						if (
							field_value.length >= formvalid.regex[field_type]['length']
						)
						{
							if(
								!field_value.match(field_regex)
							)
							{
								return formvalid.error(field_desc, field_type, "regex");					
							}
						}
						else
						{
							return formvalid.error(field_desc, field_type, "length");
						}
					}
				}
			}
						
			//alert("NAME: " +field_name+"="+escape(field_value));
			post_vars.push(field_name + "="+escape(field_value));
		}
	}
	
	//alert(dom.dump(post_vars));
	this.vars = post_vars;
	
	if (func)
	{
		if (formvalid.debug == 1)
		{
			alert("Evaling: "+func);
		}
		eval(func);
	}
	else
	{
		//alert("Submitting: "+form_parent+" = "+form_parent.submit);
		form_parent.submit();
		//eval('document.' + formname + '.submit()');
		//eval('document.' + formname + '.submit()');
	}
	
	return true;
}

formvalid.error = function (field, type, error)
{
	var error_message = '';
	
	if (error == "regex")
	{
		error_message = formvalid.regex[field_type]['text'];
	}
	else if (error == "length")
	{
		error_message = "Field requires a minimum of " + formvalid.regex[field_type]['length'] + " characters.";
	}
	else
	{
		error_message = "Field is required.";
	}
	alert(field + ': ' + error_message);
	
	return false;
}
formvalid.is_type = function (field)
{
	return formvalid.fields[field]['type'];
}

formvalid.regex = function(type)
{
	return this.regex_code[type];
}


formvalid.valid = new Array();
formvalid.fields = new Array();

formvalid.regex = new Array();

formvalid.regex['any'] = new Array();
formvalid.regex['any']['regex'] = /.+/i;
formvalid.regex['any']['length'] = 1;
formvalid.regex['any']['text'] = "";


formvalid.regex['anything'] = new Array();
formvalid.regex['anything']['regex'] = /.*/i;
formvalid.regex['anything']['length'] = 1;
formvalid.regex['anything']['text'] = "Only anything characters can be used";


formvalid.regex['alphanumeric'] = new Array();
formvalid.regex['alphanumeric']['regex'] = /^.+$/;
formvalid.regex['alphanumeric']['length'] = 1;
formvalid.regex['alphanumeric']['text'] = "Only alphanumeric characters can be used";

formvalid.regex['alpha'] = new Array();
formvalid.regex['alpha']['regex'] = /^[a-zA-Z\s]+$/;
formvalid.regex['alpha']['length'] = 1;
formvalid.regex['alpha']['text'] = "Only alphabetical characters can be used";

formvalid.regex['numeric'] = new Array();
formvalid.regex['numeric']['regex'] = /^[0-9\.\,\-]+$/;
formvalid.regex['numeric']['length'] = 1;
formvalid.regex['numeric']['text'] = "Only numeric characters can be used";

formvalid.regex['phone'] = new Array();
formvalid.regex['phone']['regex'] = /^[0-9\-\(\)\+\s]+$/;
formvalid.regex['phone']['length'] = 9;
formvalid.regex['phone']['text'] = "Only valid phone number characters can be used: i.e. +64 4 444-444, 04 444-4444 or (04)444-4444";

formvalid.regex['email'] = new Array();
formvalid.regex['email']['regex']= /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
formvalid.regex['email']['length'] = 5;
formvalid.regex['email']['text'] = "Only valid email addresses can be used: i.e. user@domain.co.nz";


formvalid.regex['file'] = new Array();
formvalid.regex['file']['regex']= /^.+$/;
formvalid.regex['file']['length'] = 1;
formvalid.regex['file']['text'] = "You are trying to upload a file with an invalid filename, please remove any obscure characters and try again";

formvalid.regex['url'] = new Array();
formvalid.regex['url']['regex'] = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
formvalid.regex['url']['length'] = 5;
formvalid.regex['url']['text'] = "Only valid website addresses can be used, make sure you use http:// etc. to start your website address";

formvalid.regex['select'] = new Array();
formvalid.regex['select']['regex'] = /^.+$/;
formvalid.regex['select']['length'] = 1;
formvalid.regex['select']['text'] = "You must make a selection from this drop down.";

formvalid.regex['select_number'] = new Array();
formvalid.regex['select_number']['regex'] = /^[0-9]+$/;
formvalid.regex['select_number']['length'] = 1;
formvalid.regex['select_number']['text'] = "You must make a selection from this drop down.";

formvalid.valid = new Array();

formvalid.valid['tag'] = new Array();
formvalid.valid['tag']['invalid'] 	= /[^0-9a-zA-Z\-\s]+/g;
formvalid.valid['tag']['valid'] 		= /^[0-9a-zA-Z\-\s]+$/;
formvalid.valid['tag']['error'] 		= "Your tag address is not valid, please try again";

formvalid.valid['email'] = new Array();
formvalid.valid['email']['invalid'] 	= /[^0-9a-zA-Z_\-\.\@\+]+/g;
formvalid.valid['email']['valid'] 		= /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
formvalid.valid['email']['error'] 		= "Your email address is not valid, please try again";

formvalid.valid['currency'] = new Array();
formvalid.valid['currency']['invalid'] 	= /[^0-9\.\,]+/g;
formvalid.valid['currency']['valid'] 		= /^[0-9\,]+[0-9]+(\.[0-9]{2}?)$/;
formvalid.valid['currency']['error'] 		= "Your currency value is not valid, please try again";

formvalid.valid['phone'] = new Array();
formvalid.valid['phone']['invalid'] 	= /[^0-9\(\)\-]+/g;
formvalid.valid['phone']['valid'] 	= /^[0-9\(\)\-]+$/;
formvalid.valid['phone']['error'] 	= "Your phone number is not valid, it can only contain the characters 0-9 () and -, please try again";

formvalid.valid['027phone'] = new Array();
formvalid.valid['027phone']['invalid'] 	= /^[^027]{3}[^0-9\(\)\-]+/g;
formvalid.valid['027phone']['valid'] 	= /^[(]*027[0-9\(\)\-]+$/;
formvalid.valid['027phone']['error'] 	= "Your phone number is not valid, it must be an 027 phone number";

formvalid.validateKey = function (form, type)
{
	formvalid.validate_key(form, type);
	form.value = form.value.replace(formvalid.valid[type]['invalid'], "");
	if (form.value == undefined)
	{
		form.value = '';
	}
}

formvalid.validate_key = function (form, type)
{
	form.value = form.value.replace(formvalid.valid[type]['invalid'], "");
	if (form.value == undefined)
	{
		form.value = '';
	}
}
