var g_validation_array = new Array();
g_validation_array['email'] = '(?:^|\\s)[\\-A-Za-z0-9\_\.]+@([\\-A-Za-z0-9]\+\.)+[A-Za-z]{2,6}(?:\\s|$)';
g_validation_array['website'] = '^http\\:\\/\\/[A-Za-z0-9\\-]+\\.([A-Za-z0-9\\-]+\\.)?[A-Za-z]+';
g_validation_array['postcode'] = '^[A-Za-z]{1,2}[0-9]{1,2}\\s?[0-9][A-Za-z]{2}$';
g_validation_array['telephone'] = '^((\\+\\d{1,3}(-| )?\\(?\\d\\)?(-| )?\\d{1,3})|(\\(?\\d{2,3}\\)?))(-| )?(\\d{3,4})(-| )?(\\d{4})(( x| ext)\\d{1,5}){0,1}$';

var g_validation_feedback_array = new Array();
g_validation_feedback_array['required'] = 'Missing input';
g_validation_feedback_array['email'] = 'Invalid email address';
g_validation_feedback_array['website'] = 'Invalid URL';
g_validation_feedback_array['postcode'] = 'Invalid postcode';
g_validation_feedback_array['telephone'] = 'Invalid number';
g_validation_feedback_array['image-alt'] = 'Alternative text is required';

var g_error_className = 'error';

function form_validation_setup() {
	if(!document.createElement || !document.getElementsByTagName || !document.getElementById) return false;
	var form_array = document.getElementsByTagName('form');
	var form_array_length = form_array.length;
	for(var i=0; i<form_array_length; i++) {
		
		var form_elements_array_input = form_array[i].elements;
		var form_elements_array_length = form_elements_array_input.length;
		
		for(var j=0; j<form_elements_array_length; j++) {
			addEvent(form_elements_array_input[j],'blur',function() {
				var type = form_validation_setup_type(this);
				if(type!=null) form_validation_check(this,type);
			});

			if(hasClass(form_elements_array_input[j],'submit')
				&& !hasClass(form_elements_array_input[j],'submit-fieldset')
				&& !hasClass(form_elements_array_input[j],'delete')
				&& !hasClass(form_elements_array_input[j],'remove')) {
				addEvent(form_elements_array_input[j],'click',form_validation_all);
				addEvent(form_elements_array_input[j],'keypress',form_validation_all);
			}
		}
	}
}
function form_validation_setup_type(el) {
	var form_element_name = el.name;
	if(!form_element_name) return null;
	if(form_element_name.indexOf('email') != -1) var el_type = 'email';
	else if(form_element_name.indexOf('url') != -1 || form_element_name.indexOf('website')!= -1) var el_type = 'website';
	else if(form_element_name.indexOf('postcode') != -1) var el_type = 'postcode';
	else if(form_element_name.indexOf('telephone') != -1 || form_element_name.indexOf('fax') != -1) var el_type = 'telephone';
	else if(form_element_name.indexOf('required') != -1) var el_type = 'required';
	else if(form_element_name.indexOf('image-alt') != -1) var el_type = 'image-alt';
	return el_type;
}

function form_validation_all(e) {
	var this_form = traverse(this,'form','parent');

	//var this_form = this;
	var form_elements = this_form.elements;
	var form_elements_length = this_form.elements.length;
	
	// loop through the elements, check that they're correct
	for(var i=0; i<form_elements_length; i++) {
		var form_element = form_elements[i];
		if(form_element.nodeName.toLowerCase()=='fieldset') continue;
		var type = form_validation_setup_type(form_element);
		if(type!=null) form_validation_check(form_element,type);
	}
	
	// get any <em class="error"> in this form
	var form_label_array = getElementsByClassName(this_form,'em',g_error_className);
	var form_label_array_length = form_label_array.length;
	
	for(var i=0; i<form_label_array_length; i++) {
		error_label = getLabelFor(form_label_array[i].parentNode.getElementsByTagName('label')[0]);
		if(error_label && error_label.indexOf('required') == -1) {
			// there is an error, but the input is not required...
			form_label_array.splice(i,1);
		}
	}

	if(form_label_array_length>0) {
		// check whether there are any errors
		return false;
	}

	// if it's the contact form id - 'contact-form'
	// submit to the a_contact.js script and do the xhr
	form_element_id = this_form.id;
	if(form_element_id && form_element_id.toLowerCase()=='contact-form') {
		// it's the contact form, load xhr script
		contact_form_submit(this_form);
		return false;
	}
	else if(form_element_id && form_element_id.toLowerCase()=='comments-form') {
		if(this.id.toLowerCase()=='preview') {
			// it's the comment form, load preview script
			comment_form_preview();
			return false;
		}
		else {
			// add the comment
		}
	}
}

function form_validation_check(el,type) {
	var type_check = type.toLowerCase();
	
	var validation_regex = '';
	var validation_string = g_validation_feedback_array['required'];
	
	el_value = trim(el.value);
	el_value = remove_whitespace(el_value);
	
	if(type_check!='required' && type_check!='image-alt' && el_value!='') {
		if(type_check=='website') el_value = normalise_website_string(el_value);
		var validation_regex = g_validation_array[type_check];
		var validation_string = g_validation_feedback_array[type_check];
	}
	else if(el.name.indexOf('required') == -1 && type_check!='required') {
		// is not required, but has a type
		// if it's empty skip it
		// if contains a value, then validate it
		form_validation_error_remove(el);
		return;
	}

	if(el_value=='' || (el.nodeName.toLowerCase()=='select' && el_value==0)) {
		form_validation_error_create(el,validation_string);
	}
	else if(validation_regex!='' && !el_value.match(validation_regex)) {
		form_validation_error_create(el,validation_string);
	}
	else form_validation_error_remove(el);
	
}

function form_validation_error_create(form_input,feedback_text) {
	form_validation_error_remove(form_input);
	var form_label = getLabel(form_input);
	var form_dt = form_label.parentNode;
	
	var error_em = document.createElement('em');
	var error_text = document.createTextNode(feedback_text);
	var error_space = document.createTextNode(' ');
	
	error_em.appendChild(error_text);
	form_dt.appendChild(error_space); // append it to the label parent node, which is the dt
	form_dt.appendChild(error_em);

	form_dd = traverse(form_label.parentNode,'dd','next');
	
	addClass(error_em,g_error_className);
	addClass(form_label.parentNode,g_error_className);
	addClass(form_dd,g_error_className);
}
function form_validation_error_remove(form_input) {
	var form_label = getLabel(form_input);
	if(!form_label) return false;
	var form_dt = form_label.parentNode;
	
	//alert(form_label);
	var form_label_array = getElementsByClassName(form_dt,'em',g_error_className);
	var form_label_array_length = form_label_array.length;
	if(form_label_array_length>0) {
		form_label_array[0].parentNode.removeChild(form_label_array[0]); // em -> dt, remove from the dt
	}
	form_dd = traverse(form_dt,'dd','next');
	
	removeClass(form_dt,g_error_className);
	removeClass(form_dd,g_error_className);
}

addEvent(window,'load',form_validation_setup);