var hasErrors = null;

function validate() {

	hasErrors = false;
	
	//////////////////////////////
	// login
	//////////////////////////////
	
	// check that username isn't blank
	if($F('account_email_1').match(/^([\w\.\-])+\@(([\w\-])+\.)+([a-zA-Z0-9]{2,4})+$/) == null)
		addError('account_email_1', {message:'Please enter your email address'});
	else
		removeError('account_email_1', {message:'Your email address'});
	
	// check that password isn't blank
	if($F('account_password_1') == '')
		addError('account_password_1', {message:'Please enter your password'});
	else
		removeError('account_password_1', {message:'Your eteamz account password'});
	
	
	
	//////////////////////////////
	// new user account
	//////////////////////////////
	if(new_user) {
	

		// check that password_2 isn't blank
		if($F('account_password_2') == '')
			addError('account_password_2', {message:'Please confirm your password'});
		else
			removeError('account_password_2', {message:'Your eteamz account username'});
		

		// check that password_1 and password_2 are the same
		if($F('account_password_1') != $F('account_password_2'))
			addError('account_password_2', {message:'Your passwords don\'t match'});
		else
			removeError('account_password_2', {message:'Enter your password again'});
		
		
		/*
		// check that email_1 isn't blank
		if($F('account_email_1') == '') {
			addError('account_email_1', {message:'Please enter your email address'});
		} else {
			removeError('account_email_1', {message:'Enter your email address'});
			
			// check that the email address is valid
			if(!validEmail($F('account_email_1'))) {
				addError('account_email_1', {message:'Please enter a valid email address'});
			}
		}
		*/
		
		
		// check that first_name isn't blank
		if($F('account_first_name') == '')
			addError('account_first_name');
		else
			removeError('account_first_name');
		
		
		// check that last_name isn't blank
		if($F('account_last_name') == '')
			addError('account_last_name');
		else
			removeError('account_last_name');
		
		
		// check that address_1 isn't blank
		if($F('account_address_1') == '')
			addError('account_address_1');
		else
			removeError('account_address_1');
		
		
		// check that country has been selected
		if($('account_country').value == '')
			addError('account_country');
		else
			removeError('account_country');

		
		// if country is selected, look at city, state and zip
		if($('account_country').value != '') {
			
			// check that city isn't blank
			if($('account_city').value == '')
				addError('account_city');
			else
				removeError('account_city');
				
				
			// check that state is selected (or filled out)
			if(Element.visible('account_state_select_div')) {
				if($('account_state_select').value == '') 
					addError('account_state_select');
				else
					removeError('account_state_select');
			} else {
				if($F('account_state_text') == '') 
					addError('account_state_text');
				else
					removeError('account_state_text');
			}
			
			
			// check that zip isn't blank
			if($F('account_zip') == '')
				addError('account_zip');
			else
				removeError('account_zip');
				
		}	// end check to see if country has already been selected
		
		
		// check that gender is selected
		var gender_group = document.build_site_form.account_gender;
		
		if(!gender_group[0].checked && !gender_group[1].checked) {
			$('account_gender_m').classNames().add('error');
			$('account_gender_f').classNames().add('error');
			$('account_gender_label').classNames().add('error');
			$('account_gender_example').innerHTML = 'Please select your gender';
			$('account_gender_example').classNames().add('error');
			$('account_gender_m').hasErrors = $('account_gender_f').hasErrors = true;
			hasErrors = true;
		} else {
			$('account_gender_m').classNames().remove('error');
			$('account_gender_f').classNames().remove('error');
			$('account_gender_label').classNames().remove('error');
			$('account_gender_example').innerHTML = '';
			$('account_gender_example').classNames().remove('error');
			$('account_gender_m').hasErrors = $('account_gender_f').hasErrors = false;
		}
			
			
		// check that birthday is completely filled out
		if($('account_birthday_month').value == '')
			addError('account_birthday_month', {message:'Please enter your complete birthday',example:'account_birthday',label:'account_birthday'});
		else
			removeError('account_birthday_month', {message:'Birthday and address information is for eteamz demographic purposes only',example:'account_birthday',label:'account_birthday'});
			
			
		// check that birthday is completely filled out
		if($('account_birthday_day').value == '')
			addError('account_birthday_day', {message:'Please enter your complete birthday',example:'account_birthday',label:'account_birthday'});
		else
			removeError('account_birthday_day', {message:'Birthday and address information is for eteamz demographic purposes only',example:'account_birthday',label:'account_birthday'});
			
			
		// check that birthday is completely filled out
		if($('account_birthday_year').value == '')
			addError('account_birthday_year', {message:'Please enter your complete birthday',example:'account_birthday',label:'account_birthday'});
		else
			removeError('account_birthday_year', {message:'Birthday and address information is for eteamz demographic purposes only',example:'account_birthday',label:'account_birthday'});
			
			
		/*
		
		// check that the security question is picked
		if($('account_security_question').value == '')
			addError('account_security_question', {message:'Please choose a security question'});
		else
			removeError('account_security_question', {message:'For added security, pick a security question'});
			
			
		// check that the security answer isn't blank
		if($F('account_security_answer') == '')
			addError('account_security_answer', {message:'Please enter an answer to the security question'});
		else
			removeError('account_security_answer', {message:'Your answer to the above question'});
		*/
			
		// check that the referral option isn't blank
		if($F('account_hear_about') == '')
			addError('account_hear_about', {message:'Please tell us know how you heard about eteamz'});
		else
			removeError('account_hear_about', {message:''});

		
		// if younger than 13, check that the parent's email is filled out
		if(younger_than_13 && $F('parent_email') == '')
			addError('parent_email');
		else
			removeError('parent_email');
			
			
	}	// end check to see if this is a new account
	
	
	//////////////////////////////
	// site info
	//////////////////////////////
	
	if(!younger_than_13) {
		// only validate site stuff if this person isn't younger than 13
		
	
		// check that the site name isn't blank
		if($F('site_info_name') == '')
			addError('site_info_name');
		else
			removeError('site_info_name');
				
				
		// check that the site address isn't blank
		if($F('site_info_address') == '')
			addError('site_info_address', {message:'Please enter a URL for your site'});
		else
			removeError('site_info_address', {message:'This will be the URL to your website (you can change this later)'});
			
			
			
		//////////////////////////////
		// sports & activities
		//////////////////////////////
		
		// check that the sport is selected
		if($('sport_info_primary_sport').value == '')
			addError('sport_info_primary_sport', {message:'Please choose a sport your team is involved with'});
		else
			removeError('sport_info_primary_sport', {message:'The primary sport your team is involved with. You can add more later.'});
		
			
		// check that the site name isn't blank
		if($('sport_info_age').value == '')
			addError('sport_info_age', {message:'Please complete the demographic information', label:'sport_info', example:'sport_info'});
		else
			removeError('sport_info_age',  {message:'The age groups, skill level and gender of your team', label:'sport_info', example:'sport_info'});
			
			
		// check that the site name isn't blank
		if($('sport_info_skill').value == '')
			addError('sport_info_skill', {message:'Please complete the demographic information', label:'sport_info', example:'sport_info'});
		else
			removeError('sport_info_skill',  {message:'The age groups, skill level and gender of your team', label:'sport_info', example:'sport_info'});
			
			
		// check that the site name isn't blank
		if($('sport_info_gender').value == '')
			addError('sport_info_gender', {message:'Please complete the demographic information', label:'sport_info', example:'sport_info'});
		else
			removeError('sport_info_gender',  {message:'The age groups, skill level and gender of your team', label:'sport_info', example:'sport_info'});
			
			
			
			
		//////////////////////////////
		// contact info
		//////////////////////////////
			
			// check that address_1 isn't blank
			if($F('contact_address') == '')
				addError('contact_address');
			else
				removeError('contact_address');
			
			
			// check that country has been selected
			if($('contact_country').value == '')
				addError('contact_country');
			else
				removeError('contact_country');
	
			
			// if country is selected, look at city, state and zip
			if($('contact_country').value != '') {
				
				// check that city isn't blank
				if($F('contact_city') == '')
					addError('contact_city');
				else
					removeError('contact_city');
					
					
				// check that state is selected (or filled out)
				if(Element.visible('contact_state_select_div')) {
					if($('contact_state_select').value == '') 
						addError('contact_state_select');
					else
						removeError('contact_state_select');
				} else {
					if($F('contact_state_text') == '') 
						addError('contact_state_text');
					else
						removeError('contact_state_text');
				}
				
				
				// check that zip isn't blank
				if($F('contact_zip') == '')
					addError('contact_zip');
				else
					removeError('contact_zip');
					
			}	// end check to see if country has already been selected
			
			
			
			
		//////////////////////////////
		// site features
		//////////////////////////////
			
		// make sure a site type is chosen
		var site_type_group = document.build_site_form.site_type;
		
		if(!site_type_group[0].checked && !site_type_group[1].checked && !site_type_group[2].checked) {
			$('site_type_team').classNames().add('error');
			$('site_type_league').classNames().add('error');
			$('site_type_label').classNames().add('error');
			$('site_type_example').innerHTML = 'Please select a site type';
			$('site_type_example').classNames().add('error');
			$('site_type_team').hasErrors = $('site_type_league').hasErrors = true;
			hasErrors = true;
		} else {
			$('site_type_team').classNames().remove('error');
			$('site_type_league').classNames().remove('error');
			$('site_type_label').classNames().remove('error');
			$('site_type_example').innerHTML = 'Once your site is created, you can not change the site type';
			$('site_type_example').classNames().remove('error');
			$('site_type_team').hasErrors = $('site_type_league').hasErrors = false;
		}
		
		
		
		//////////////////////////////
		// league contact info
		//////////////////////////////
		
		// first make sure that league is actually selected
		if($('site_type_league').checked) {
		
			
			// check that the league contact name is filled in
			if($('league_info_name').value == '')
				addError('league_info_name', {message:'Please enter the name of a contact for your league'});
			else
				removeError('league_info_name', {message:'The person in charge of the registration for your league'});
			
			
			// check that the league email address is filled in
			if($('league_info_email').value == '') {
				addError('league_info_email', {message:'Please enter the email address of the contact for your league'});
			} else {
				removeError('league_info_email', {message:'The email address of the person above'});
							
				// check that the email address is valid
				if(!validEmail($F('league_info_email'))) {
					addError('league_info_email', {message:'Please enter a valid email address'});
				}
			}
			
			
			// check that the phone is filled in
			if($F('league_info_phone') == '') {
				addError('league_info_phone', {message:'Please enter the phone number of the contact for your league'});
			} else {
				removeError('league_info_phone', {message:'The phone number of the person above'});
				
				// check that it's formatted like an actual phone number
				if($F('league_info_phone').match(/[A-Za-z]/)) {
					addError('league_info_phone', {message:'Please enter a valid phone number'});
				} else {
					// If the phone number is okay, check that the time of day is still checked
					var phone_group = document.build_site_form.league_info_phone_type;
		
					if(!phone_group[0].checked && !phone_group[1].checked && !phone_group[2].checked) {
						addError('', {label:'league_info_phone', example:'league_info_phone',message:'Please enter the best time to call this number'});
					}
				}
			}
			
			
			// check that at least one registration/signups field is checked
			var league_info_signups_group = document.build_site_form.league_info_signups;
			var at_least_one_checked = false;
			var months = [];
			
			// turn the collection of checkboxes into an array
			for(var i=0;i<league_info_signups_group.length;i++) {
				months.push(league_info_signups_group[i]);
			}
			
			// for each month check to see if it was checked on or not
			months.each( function(checkbox){
				if(checkbox.checked) {
					at_least_one_checked = true;
				}
			});
			
			if(!at_least_one_checked) {
				$('league_info_signups_label').classNames().add('error');
				$('league_info_signups_example').innerHTML = 'Please select the months in which you hold registrations';
				$('league_info_signups_example').classNames().add('error');
				hasErrors = true;
			} else {
				$('league_info_signups_label').classNames().remove('error');
				$('league_info_signups_example').innerHTML = 'Check all that apply';
				$('league_info_signups_example').classNames().remove('error');
			}
			
			
			// see how many people signup each season
			if($('league_info_signup_count').value == '')
				addError('league_info_signup_count');
			else
				removeError('league_info_signup_count');
			
			
			
			// see how fees are collected
			var fees_group = document.build_site_form.league_info_signup_fee;
			
			if(fees_group[0].checked) {
				// per individual
				if($('league_info_signup_fees_individual').value == '')
					addError('league_info_signup_fees_individual');
				else
					removeError('league_info_signup_fees_individual');
			
				$('league_info_signup_fees_label').classNames().remove('error');
						
			} else if(fees_group[1].checked) {
				// per team
				if($('league_info_signup_fees_team').value == '')
					addError('league_info_signup_fees_team');
				else
					removeError('league_info_signup_fees_team');
				
				$('league_info_signup_fees_label').classNames().remove('error');
				
			} else if(fees_group[2].checked) {
				// both individual and team
				if($('league_info_signup_fees_individual').value == '')
					addError('league_info_signup_fees_individual');
				else
					removeError('league_info_signup_fees_individual');
					
				if($('league_info_signup_fees_team').value == '')
					addError('league_info_signup_fees_team');
				else
					removeError('league_info_signup_fees_team');
	
				$('league_info_signup_fees_label').classNames().remove('error');
				
			} else if(fees_group[3].checked) {
				// neither
				$('league_info_signup_fees_label').classNames().remove('error');
			
			} else {
				// nothing was selected, show normal error message
				$('league_info_signup_fees_label').classNames().add('error');
				hasErrors = true;
			}
		}		// end check to see if league is selected
		
	}		// if (!younger_than_13)
	
	
	//////////////////////////////
	// terms of service
	//////////////////////////////
	
	// make sure the user accepted the terms of service
	if(!$('site_terms_of_service').checked) {
		Element.show('site_terms_of_service_error');
		addError(field='site_terms_of_service');
	} else {
		Element.hide('site_terms_of_service_error');
		removeError('site_terms_of_service');
	}
	
		
	//////////////////////////////
	// check if we're still valid and show a message if not
	//////////////////////////////
	
	if (hasErrors) {
		// $('form_errors').innerHTML = error_message;
		Element.show('form_errors');
		location.href = '#form_errors';
	} else {
		Element.hide('form_errors');
	}
	
	return !hasErrors;
}

function addError(obj, args) {
	var options = $H({ example:null, message:null, label:null }).merge($H(args));
			
	// Dumb way of doing this. :( //			
	if (typeof(createASite) != "undefined") {			
		validate_me(obj, options.message);
	} else {
				
		var options = $H({ example:null, message:null, label:null }).merge($H(args));
		var field = $(obj);
		var labels = [];
		
		// turn the options into a good prototype Array
		options.label = $A(options.label);
		if(options.label) {
			options.label.each(function(label) {
				labels.push($(label+'_label'));
			});
		}
			
		if(options.example == null) {
			var example = $(obj+'_example');
		} else {
			var example = $(options.example+'_example');
		}
		
		if(field != null) {
			field.classNames().add('error');
			field.hasErrors = true;
		}
		
		// if a message was passed in, update the field's example text
		if(options.message != null) {
			if(example != null) {		// make sure the message exists
				example.innerHTML = options.message;
				example.classNames().add('error');
			}
		}
		
		// if a label was passed in, update that one specifically rather than the default label name
		if(labels.length) {
			labels.each(function(label) {
				if(label != null) {
					label.classNames().add('error');
				}
			});
		} else {
			var label = $(obj+'_label');
			if(label != null) {
				label.classNames().add('error');
			}
		}
		
		hasErrors = true;
	}
}

function removeError(obj, args) {
	// create some default options and merge in the args that were passed in (in hash form)
	var options = $H({ example:null, message:null, label:null }).merge($H(args));
	var field = $(obj);
	
	// turn the options into a good prototype Array
	options.label = $A(options.label);
	if(options.label) {
		options.label.each(function(label) {
			label.classNames().remove('error');
		});
	} else {
		$(obj+'_label').classNames().remove('error');
	}
		
	if(options.example == null)
		var example = $(obj+'_example');
	else
		var example = $(options.example+'_example');
		
	if(field != null) {
		field.classNames().remove('error');
		field.hasErrors = false;
	}

	if(options.message != null) {
		if(example != null) {
			example.innerHTML = options.message;
			example.classNames().remove('error');
		}
	}
}


function validEmail(email) {
	if(email.match(/^\S+?@\S+?\.\S+$/) == null)
		return false;
	else
		return true;
}