
function validatePhoneNumber(number) {
	var reg = new RegExp(/^([0-9 \+\-\(\)]){10,}$/);
	return reg.test(number);
}

function validateEmail(email) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	return reg.test(email);
}

function markError(elem) {
	$(elem).each( function() {
		$(this).addClass('error');
		$('[for=' + $(this).attr('name') + ']').addClass('error');
	});
}

function removeError(elem) {
	$(elem).each( function() {
		$(this).removeClass('error');
		$('[for=' + $(this).attr('name') + ']').removeClass('error');
	});
}

$(document).ready( function() {
	$('form.js_validate').submit( onFormSubmit );
});

function onFormSubmit(event) {
	//log('onFormSubmit');
	
	event.stopPropagation();
	
	$('.required', this).
		removeClass('validated').
		each( function() {
		
		switch (this.nodeName.toUpperCase()) {
			case 'INPUT' :
				
				var type = $(this).attr('type').toLowerCase();
				
				if(type === 'radio') {
					// make sure at least on of the radio buttons is checked
					
					if(!$(this).hasClass('validated')) {
						var group = $(this).attr('name');
					
						var relatives = $('.required[name=' + group + ']', 'form.js_validate');
					
						/*log('relatives:');
						log(relatives);*/
						
						var checked = false;
						for(var i = 0; i < relatives.length; i++) {
							if( $(relatives[i]).attr('checked') == true) {
								checked = true;
								//break;
							}
						}
						
						if(checked === false) {
							// mark 'em all as errored
							markError(this);
							markError(relatives);
						}
						else {
							removeError(this);
							removeError(relatives);
						}
						
						relatives.addClass('validated');
					}
				}
				else if(type === 'checkbox') {
					// make sure at least on of the checkboxes buttons is checked
				}
				else if(type === 'text') {
					
					var name = $(this).attr('name').toLowerCase();
					
					if(name.indexOf('phone') !== -1) {
						// make sure phone format is valid
						
						if( !validatePhoneNumber($(this).val()) ) {
							markError(this);
						}
						else {
							removeError(this);
						}
					}
					else if(name.indexOf('email') !== -1) {
						// make sure email address is valid
						
						if( !validateEmail($(this).val()) ) {
							markError(this);
						}
						else {
							removeError(this);
						}
					}
					else {
						// make sure it's valid
						
						if( $(this).val() === '' || $(this).val() === null ) {
							markError(this);
						}
						else {
							removeError(this);
						}
					}
				}
				
				break;
			
			case 'SELECT' :
			
				// make sure the current selection is not an invalid default
				
				var selected = false;
				$(this).children('option').each( function() {
					if( $(this).attr('selected') == true) {
						if(!$(this).hasClass('invalid')) {
							selected = true;
						}
					}
				});
				
				if(!selected) {
					markError(this);
				}
				else {
					removeError(this);
				}
				
				$(this).addClass('validated');
				
				break;
			
			default:
				break;
		}
	});
		
	if($('.error', this).length !== 0) {
		alert("Please complete the items marked in red and resubmit the form.");
		event.stopPropagation();
		return false;
	}
}