$(function() {
	$.validation_errors = [];
	$.validation_values = [];
	$.validation_messages = {
		'username' : 'Username should contain at least 6 letters or digits',
		'email' : 'Enter valid email address',
		'zip_code' : '5 Digit US Zip Code Only',
		'dob' : 'Select your date of birth',
		'terms' : 'You do not agree with the terms of service'
	}

	$('form').submit(function() {
		$.validation_values['username'] = $('#username').val();
		$.validation_values['email'] = $('#email').val();
		$.validation_values['zip_code'] = $('#zip_code').val();
		$.validation_values['dob'] = [
			$('#birth_day').val(),
			$('#birth_month').val(),
			$('#birth_year').val()
		];
		$.validation_values['terms'] = $('#terms').attr('checked');
		
		if(
			$.validation_values['username'] == '' || 
			$.validation_values['username'].search(/^[a-zA-Z0-9]+$/) == -1 ||
			$.validation_values['username'].length < 6
		) {
			$.validation_errors[0] = 'username';
		} else {$.validation_errors[0] = ''; }
		
		if(
			$.validation_values['email'] == '' ||
			$.validation_values['email'].search(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i) == -1
		) {
			$.validation_errors[1] = 'email';
		} else {$.validation_errors[1] = ''; }
		
		if(
			$.validation_values['zip_code'] == '' || 
			$.validation_values['zip_code'].search(/^\d+$/) == -1 ||
			$.validation_values['zip_code'].length != 5
		) {
			$.validation_errors[2] = 'zip_code';
		} else {$.validation_errors[2] = ''; }
		

		if(
			$.validation_values['dob'][0] == 0 ||
			$.validation_values['dob'][1] == 0 ||
			$.validation_values['dob'][2] == 0
		) {
			$.validation_errors[3] = 'dob';
		} else {$.validation_errors[3] = ''; }
		
		if(
			$.validation_values['terms'] == false
		) {
			$.validation_errors[4] = 'terms';
		} else {$.validation_errors[4] = ''; }
		
		// No validation errors - process the form
		if($.validation_errors.join('') == '') {
			return true;
		} 
		// Some errors - show notification popup
		else {
			$('#validation_popup').remove();
		
			$.validation_info = '<ul>';
			for(var i = 0; i < 5; i++) {
				if($.validation_errors[i] != '') {
					$.validation_info += '<li>' + $.validation_messages[$.validation_errors[i]] + '</li>';
				}
			}
			$.validation_info += '</ul>';
			
			var correct_x = 0;
			var correct_y = 0;
			if(typeof(form_popup) != "undefined")
			{
				var correct_x = 290 + 24
				var correct_y = 0;
			}
			
			$('body')
			.append('<div id="validation_popup">' + 
			'	<div id="validation_sign"></div>' +
			'	<div class="validation_header">The following error(s) occured:</div>' +
			'	<div class="validation_info">' + $.validation_info + '</div>' +
			'	<div class="validation_button"><img src="validation/ok.png" /></div>' +
			'</div>')
			.find('#validation_popup')
			.css(
				{'top' : $('form').offset().top + correct_y, 'left' : $('form').offset().left - 290 + correct_x }
			);
			
			$('#validation_sign')
			.animate({'opacity' : 0.5}, 300)
			.animate({'opacity' : 1.0}, 300)
			.animate({'opacity' : 0.5}, 300)
			.animate({'opacity' : 1.0}, 300)
			.animate({'opacity' : 0.5}, 300)
			.animate({'opacity' : 1.0}, 300);
			
			$('div.validation_button img').click(function(){ $('#validation_popup').remove(); });
		}
		
		return false;
	});
});