var succeed;

// generic validation script
function validate_form(form_id) {
	disableForm();
	succeed = 1;
	$('.form-error').removeClass('form-error');

	var inputs = $('#' + form_id + ' input');
	inputs.each( function(index,element) { validate(element)});
	var selects = $('#' + form_id + ' select');
	selects.each( function(index,element) { validate(element)});
	var textareas = $('#' + form_id + ' textarea');
	textareas.each( function(index,element) { validate(element)});
	if(succeed == 0) {
		$('#errormessage').show();
		$('div.throbber').hide();
		enableForm();

		return false;
	} else {
		return true;
	}
}

function validate(input) {
	if(input.name == 'submit')
		return true;
	
	input = $(input);

	if($.inArray(input.attr('id'), optional) == -1 && (input.attr('value') == '' || input.attr('value') == null)) {
		return errorState(input);
	}

	// skip validation if the field is blank and not required
	if($.inArray(input.attr('id'), optional) != -1 && (input.attr('value') == '' || input.attr('value') == null)) {
		return true;
	}

	// browser will take care of maxlength 
	//if(input.attr('maxlength') && input.val().length > input.maxlength

	// validate email addresses
	if(input.attr('data') == 'email') {
		var emailregex = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
		if (!emailregex.test(input.attr('value'))) {
			return errorState(input);
		}

	}

	if(input.attr('data') == 'phone') {
		// a blank phone number passes validation (if it is required it will have already been marked as an error for being blank)
		if(input.attr('value') == '' || input.attr('value') == null) return true;
		var formattedPhone = formatPhone(input.val());
		if(formattedPhone) {
			input.attr('value', formattedPhone);
		} else {
			return errorState(input);
		}
	}


	if(input.attr('data') == 'numeric') {
		if(isNumber(input.val()) || input.val() == '') {
			return true;
		} else {
			return errorState(input);
		}
	}

	// mercury account numbers must be numbers and start with 65 or 64
	if(input.attr('data') == 'accountnumber') {
		var accountno = input.val();
		var leadingdigits = accountno.substring(0,2);
		if(leadingdigits != '64' && leadingdigits != '65') {
			return errorState(input);
		}
	}
}

// triggers the error state on the form for the given input
function errorState(input) {
		//input.parent().parent().children().last().html("Please enter a valid email address.");
		//input.parent().parent().addClass('form-error');
		//input.closest('tr').addClass('form-error');
		$('label[for='+input.attr('id')+']').addClass('form-error');
		// show the label of the field in the error message.
		//$('#errormessage').append("<li>" + $("label[for='" + input.attr('id') + "']").html() + " - " + input.attr('name') + "</li>");
		var error_fields = $('#error_fields');
		if(error_fields.html() != "") error_fields.append(', ');
		error_fields.append($("label[for='" + input.attr('id') + "']").html());
		succeed = 0;
		return false;
}

function disableForm() {
	$('input[type=submit]').addClass('disabled');
	// clear out the list of failed items.
	$('#error_fields').html('');
}
function enableForm() {
	$('input[type=submit]').removeClass('disabled');
}

function isNumber(n) {
	return !isNaN(parseFloat(n)) && isFinite(n);
}

function formatPhone(digits) {
		var reformat = /(\d{3}).*(\d{3}).*(\d{4})/;
		var checkvalid = /\d{3}-\d{3}-\d{4}/;

		// test if the phone number was already valid
		if(checkvalid.test(digits))
			return digits;

		// leading parenthesis are carried along in the regex for some reason
		if(digits.substring(0,1) == '(')
			digits = digits.substring(1);

		var numbers = digits.replace(reformat, "$1-$2-$3");

		// if the phone number changed, it's now valid and correcly formatted
		if(digits != numbers) {
			return numbers;
		} else {
				return false;
		}
}

