//$cmignore
/*
	The following JSON object represents the set of validation rules used to
	validate the user's input.
*/

var REQUIRED = {
	"name": "#first-name, #last-name",
	"address": "#address-line-1, #city, #postal-zip-code, #country"
}

var RULES = {
	"email": {
		"message": "The entered email address is invalid",
		"validator": "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*\\.(\\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$"
	},
	"phone": {
		"message": "The entered phone number is invalid",
		"validator": "^((\\+\\d{1,3}(-| )?\\(?\\d\\)?(-| )?\\d{1,5})|(\\(?\\d{2,6}\\)?))(-| )?(\\d{3,4})(-| )?(\\d{4})(( x| ext)\\d{1,5}){0,1}$"
	},
	"fax": {
		"message": "The entered fax number is invalid",
		"validator": "^((\\+\\d{1,3}(-| )?\\(?\\d\\)?(-| )?\\d{1,5})|(\\(?\\d{2,6}\\)?))(-| )?(\\d{3,4})(-| )?(\\d{4})(( x| ext)\\d{1,5}){0,1}$"
	},
	"postal-zip-code": {
		"message": "The entered zip code is invalid",
		"validator": "^\\d{5}$"
	}
}


/*
	Apply the validator to the form.
*/

function validationSystem() {
	$('#content form').submit( function() {
		var ERRORS = false;
		
		var determineErors = function(targetField, isEmpty, elements, blankMessage) {
			if (targetField.isRequired() && isEmpty) addError(targetField, blankMessage);
			else {
				elements.each( function() {
					var element = $(this);
					var identifier = element.attr('id');
					
					if (!!RULES[identifier] && !isEmpty && !element.val().match(RULES[identifier]['validator'])) {
						addError(targetField, RULES[identifier]['message']);
					}
				});
			}
		};
		
		var addError = function(targetField, errorMessage) {
			targetField.prepend('<div class="associated-error">' + errorMessage + '</div>');
			targetField.addClass('error');
			ERRORS = ERRORS || true;
		};
		
		$('> .form-field, > fieldset', this).each( function() {
			var field = $(this);
			field.children().remove('.associated-error');
			field.removeClass('error');
			
			if (field.is('.name')) {
				var elements = $(REQUIRED['name'], field);
				var isEmpty = elements.isEmpty();
				
				determineErors(field, isEmpty, elements, 'Name is missing required parts');
				
			} else if (field.is('#contact-person-field')) {
				var elements = $('input[@type=checkbox]', field);
				var isEmpty = elements.isEmpty();
				determineErors(field, isEmpty, elements, 'Please specify what your request is regarding, making at least one choice.');
				
			} else if (field.is('.address')) {
				var elements = $(REQUIRED['address'], field);
				
				var isEmpty = $(elements, field).isEmpty();
				var country = $('#country').val();
				
				if ((country == 'United States') || (country == 'Canada')) {
					isEmpty = isEmpty || $('#state-province-region').isEmpty();
				}
				
				determineErors(field, isEmpty, elements, 'Address is missing required parts');
				
			} else if (field.is('.form-field')) {
				var elements = $('input[@type=text], select, textarea', field); 
				var isEmpty = elements.isEmpty();
				
				determineErors(field, isEmpty, elements, ('The ‘' + $('label', field).text() + '’ field is required.'));
				
			} else if (field.is('fieldset')) {
				// assume that multiples do not need to be validated against regex
				var isEmpty = $('input[@type=radio]', field).isEmpty();
				if (field.isRequired() && isEmpty) addError(field, $('label', field).text() + ' is required.');
			}
		});
		
		return !ERRORS;
	});
}


/*
	Apply form aesthetics 
*/
function prettyForm() {
	// apply active, yellow tint to form fields that are currently selected
	$('#content form input, #content form select').each( function() {
		var input = $(this);
		var parent = input.parents('fieldset');
		parent = (parent.length > 0) ? parent : input.parents('.form-field');
		
		input.bind('focus', function() {
			parent.addClass('active');
		});
		input.bind('blur', function() {
			parent.removeClass('active');
		});
	});
	
	// wire the facility location activator
	var facilityLocationField = $('#facility-location-field');
	facilityLocationField.hide();
	
	$('#is-customer').change(  function(){
		if ($('#is-customer').val() == 'yes') {
			facilityLocationField.show();
			$('#facility-location').attr('value', '');
		} else {
			facilityLocationField.hide();
			$('#facility-location').attr('value', 'n/a');
		}
	});
	
	// wire the technical inquery activator to display technical fields
	var technicalFields = $('#area-requiring-assistance-field, #production-finishing-system-field');
	technicalFields.hide();
	
	$('#contact-person-technical').bind('change',  function(){
		if ($('#contact-person-technical')[0].checked) technicalFields.show();
		else technicalFields.hide();
	});
	
	// wire the request literature activator to display literature list
	var literatureField = $('#requested-literature-field');
	literatureField.hide();
	
	$('#contact-person-request-literature').bind('change',  function(){
		if ($('#contact-person-request-literature')[0].checked) literatureField.show();
		else literatureField.hide();
	});
}

$(document).ready(validationSystem);
$(document).ready(prettyForm);
//$/cmignore
