var player_data_div = 'player_data_div';
var player_container_id_base = 'player_container_';
var player_container_class_name = 'player_container';
var player_id_base = 'player_';
var parent_id_base = 'parent_';
var remove_link_class_name = 'remove_link';
var spacer_class_name = 'spacer';
var nested_form_element_class_name = 'nested_form_element';
var header_div_class_name = 'header_div';
var column_1_class_name = 'row_label';
var column_2_class_name = 'first_name';
var column_3_class_name = 'last_name';
var column_4_class_name = 'zip_code';
var column_5_class_name = 'email';
var column_6_class_name = 'date_of_birth';
var column_7_class_name = 'gender';
var column_8_class_name = 'parent_type';
var parent_type_options = new Array();
var sequences; // player containers that have data...after validation is successful, these will get posted
var data; // will hold form data

function start_with_players()
{
	$('start_with_div').hide();

	var how_many = $('start_with_how_many').getValue();
	for (i = 1; i <= how_many; i++)
	{
		add_player_row();
	}
		
	$('add_more_players_div').show();
}

function add_more_players(interactive)
{
	var how_many = $('add_how_many').getValue();
	for (i = 1; i <= how_many; i++)
	{
		add_player_row();
	}
}

function remove_player_row(sequence)
{
	var row_id = player_container_id_base + sequence;
	$(player_data_div).removeChild($(row_id));
}

function get_next_sequence()
{
	var containers = $$('.' + player_container_class_name);
	var sequence = 0;
	
	containers.each(
		function(e)
		{
			var this_sequence = get_sequence(e.id);
			if (this_sequence > sequence) sequence = this_sequence;
		}
	);
	
	return sequence + 1;
}

function get_sequence(element_id)
{
	return parseInt(element_id.split('_').last(), 10);
}

function add_player_row()
{
	var sequence = get_next_sequence();

	// outer container
	var container_div = document.createElement('div');
	container_div.id = player_container_id_base + sequence;
	container_div.className = player_container_class_name;

	container_div.appendChild(create_header_div(sequence));
	container_div.appendChild(create_player_div(sequence));
	container_div.appendChild(create_parent_div(1, sequence));
	container_div.appendChild(create_parent_div(2, sequence));
	
	// remove link
	var remove_link_div = document.createElement('div');
	remove_link_div.className = remove_link_class_name;
	remove_link_div.update("<a href='#' onclick='remove_player_row(" + sequence + ")'>Remove</a>");
	container_div.appendChild(remove_link_div);
	
	// spacer
	var spacer_div = document.createElement('div');
	spacer_div.className = spacer_class_name;
	spacer_div.update('&nbsp;');
	container_div.appendChild(spacer_div);
	
	$(player_data_div).appendChild(container_div);
} // function add_player_row()

function add_option(select, option)
{
	try
	{
		select.add(option, null); // standards compliant
	}
	catch (ex)
	{
		select.add(option); // IE only
	}
}

function create_option(value, text)
{
	var o = document.createElement('option');
	o.value = value;
	o.text = text;
	return o;
}

function create_clearer_div()
{
	var clearer_div = document.createElement('div');
	clearer_div.className = 'clearer';
	return clearer_div;
}

function create_header_div(sequence)
{
	var header_div = document.createElement('div');
	header_div.className = header_div_class_name;

	var column_1 = document.createElement('div');
	column_1.className = column_1_class_name;
	column_1.update('&nbsp;');

	var column_2 = document.createElement('div');
	column_2.className = column_2_class_name;
	column_2.update('First');
	
	var column_3 = document.createElement('div');
	column_3.className = column_3_class_name;
	column_3.update('Last');
	
	var column_4 = document.createElement('div');
	column_4.className = column_4_class_name;
	column_4.update('Zip');
	
	var column_5 = document.createElement('div');
	column_5.className = column_5_class_name;
	column_5.update('Email');
	
	var column_6 = document.createElement('div');
	column_6.className = column_6_class_name;
	column_6.update('DOB');
	
	var column_7 = document.createElement('div');
	column_7.className = column_7_class_name;
	column_7.update('Gender');
	
	var column_8 = document.createElement('div');
	column_8.className = column_8_class_name;
	column_8.update('Parent Type');
	
	header_div.appendChild(column_1);
	header_div.appendChild(column_2);
	header_div.appendChild(column_3);
	header_div.appendChild(column_4);
	header_div.appendChild(column_5);
	header_div.appendChild(column_6);
	header_div.appendChild(column_7);
	header_div.appendChild(column_8);
	header_div.appendChild(create_clearer_div());
	
	return header_div;
} // function create_header_div()

function create_first_name(entity, sequence)
{
	var first_name = document.createElement('input');
	first_name.type = 'text';
	first_name.id = entity + '_first_name_' + sequence;
	first_name.className = nested_form_element_class_name;
	return first_name;
}

function create_last_name(entity, sequence)
{
	var last_name = document.createElement('input');
	last_name.type = 'text';
	last_name.id = entity + '_last_name_' + sequence;
	last_name.className = nested_form_element_class_name;
	return last_name;
}

function create_zip_code(entity, sequence)
{
	var zip_code = document.createElement('input');
	zip_code.type = 'text';
	zip_code.id = entity + '_zip_code_' + sequence;
	zip_code.className = nested_form_element_class_name;
	zip_code.maxLength = 5; 
	return zip_code;
}

function create_email(entity, sequence)
{
	var email = document.createElement('input');
	email.type = 'text';
	email.id = entity + '_email_' + sequence;
	email.className = nested_form_element_class_name;
	return email;
}

function create_date_of_birth(sequence)
{
	var date_of_birth = document.createElement('input');
	date_of_birth.type = 'text';
	date_of_birth.id = 'player_date_of_birth_' + sequence;
	date_of_birth.className = nested_form_element_class_name;
	date_of_birth.maxLength = 10;
	return date_of_birth;
}

function create_gender(sequence)
{
	var gender = document.createElement('select');
	gender.id = 'player_gender_' + sequence;
	gender.className = nested_form_element_class_name;
	var female = create_option('F', 'Female');
	var male = create_option('M', 'Male');
	add_option(gender, female);
	add_option(gender, male);
	
	return gender;
}

function create_parent_type(parent, sequence)
{
	var parent_type = document.createElement('select');
	parent_type.id = parent + '_parent_type_' + sequence;
	parent_type.className = nested_form_element_class_name;
	
	parent_type_options.each(
		function (o)
		{
			var pieces = o.split('|');
			add_option(parent_type, create_option(pieces[0], pieces[1]));
		}
	);
	
	return parent_type;
}

function create_player_div(sequence)
{
	var player_div = document.createElement('div');
	player_div.id = player_id_base + sequence;

	var column_1 = document.createElement('div');
	column_1.className = column_1_class_name;
	column_1.update('Player:');

	var column_2 = document.createElement('div');
	column_2.className = column_2_class_name;
	column_2.appendChild(create_first_name('player', sequence));
	
	var column_3 = document.createElement('div');
	column_3.className = column_3_class_name;
	column_3.appendChild(create_last_name('player', sequence));
	
	var column_4 = document.createElement('div');
	column_4.className = column_4_class_name;
	column_4.appendChild(create_zip_code('player', sequence));
	
	var column_5 = document.createElement('div');
	column_5.className = column_5_class_name;
	column_5.appendChild(create_email('player', sequence));
	
	var column_6 = document.createElement('div');
	column_6.className = column_6_class_name;
	column_6.appendChild(create_date_of_birth(sequence));
	
	var column_7 = document.createElement('div');
	column_7.className = column_7_class_name;
	column_7.appendChild(create_gender(sequence));
	
	var column_8 = document.createElement('div');
	column_8.className = column_8_class_name;
	column_8.update('&nbsp;');
	
	player_div.appendChild(column_1);
	player_div.appendChild(column_2);
	player_div.appendChild(column_3);
	player_div.appendChild(column_4);
	player_div.appendChild(column_5);
	player_div.appendChild(column_6);
	player_div.appendChild(column_7);
	player_div.appendChild(column_8);
	player_div.appendChild(create_clearer_div());

	return player_div;
} // function create_player_div()

function create_parent_div(number, sequence)
{
	var parent = 'parent_' + number;
	
	var parent_div = document.createElement('div');
	parent_div.id = parent_id_base + number + '_' + sequence;

	var column_1 = document.createElement('div');
	column_1.className = column_1_class_name;
	column_1.update('Parent ' + number + ':');

	var column_2 = document.createElement('div');
	column_2.className = column_2_class_name;
	column_2.appendChild(create_first_name(parent, sequence));
	
	var column_3 = document.createElement('div');
	column_3.className = column_3_class_name;
	column_3.appendChild(create_last_name(parent, sequence));
	
	var column_4 = document.createElement('div');
	column_4.className = column_4_class_name;
	column_4.appendChild(create_zip_code(parent, sequence));
	
	var column_5 = document.createElement('div');
	column_5.className = column_5_class_name;
	column_5.appendChild(create_email(parent, sequence));
	
	var column_6 = document.createElement('div');
	column_6.className = column_6_class_name;
	column_6.update('&nbsp;');
	
	var column_7 = document.createElement('div');
	column_7.className = column_7_class_name;
	column_7.update('&nbsp;');
	
	var column_8 = document.createElement('div');
	column_8.className = column_8_class_name;
	column_8.appendChild(create_parent_type(parent, sequence));
	
	parent_div.appendChild(column_1);
	parent_div.appendChild(column_2);
	parent_div.appendChild(column_3);
	parent_div.appendChild(column_4);
	parent_div.appendChild(column_5);
	parent_div.appendChild(column_6);
	parent_div.appendChild(column_7);
	parent_div.appendChild(column_8);
	parent_div.appendChild(create_clearer_div());

	return parent_div;
} // function create_parent_div()

function zip_code_lookup(zip_code, coach_or_team)
{
	if (zip_code == '') return;
	if (isNaN(zip_code)) return;
	
	var ajax = new Ajax.Request('/zipCode.php', {
		asynchronous: false,
		method: 'get',
		eval: false,
		parameters: {
			action: 'search',
			zipcode: zip_code
		}
	});
	
	var xml = ajax.transport.responseXML;
	var is_new_zip = xml.getElementsByTagName('NewZip')[0].firstChild.data == 'true';

	if (is_new_zip)
	{
		$(coach_or_team + '_city').activate();
	}
	else
	{
		var city = xml.getElementsByTagName('City')[0].firstChild.data;
		var state = xml.getElementsByTagName('State')[0].firstChild.data;
		$(coach_or_team + '_city').value = city;
		setSelectedItem($(coach_or_team + '_state'), state);
		if (coach_or_team == 'coach') $('coach_phone_1').activate(); 
	}
}

function submit_players()
{
	// disable the submit button to prevent multiple clicks
	$('submit_button').disabled = true;
	
	// set borders back to normal
	reset_border_color();
	
	// need to validate it all client-side first
	if (validate_data())
	{
		submit_data();
	}
	
	$('submit_button').disabled = false;
}

function validate_data()
{
	// (re)initialize data
	data = $A(new Array);

	var errors = $A(new Array);
	
	// get all of the player_containers
	var containers = $$('.' + player_container_class_name);

	// check each container to see if there is any player information
	containers.each(
		function (c)
		{
			var sequence = get_sequence(c.id);
			var datum = new Object;
			datum['sequence'] = sequence;
			// objects are passed by reference
			if (player_contains_data(datum)) data.push(datum);
		}
	);

	if (data.length == 0)
	{
		alert('No players entered.');
		return false;
	}
	
	// for each sequence that has data, validate it
	data.each(
		function (datum)
		{
			var datum_errors = validate_player_data(datum);
			if (datum_errors.length > 0) errors = errors.concat(datum_errors);
		}
	);
	
	if (errors.length > 0)
	{
		errors = errors.uniq(false);
		var message = '';
		
		errors.each(
			function (e)
			{
				message += e + "\n";
			}
		);
		
		alert(message);
		return false;
	}
	
	return true;
}

function player_contains_data(datum)
{
	var player = new Object;
	
	// collect references to the fields into datum so we can access them later
	player['first_name'] = $('player_first_name_' + datum['sequence']);
	player['last_name'] = $('player_last_name_' + datum['sequence']);
	player['zip_code'] = $('player_zip_code_' + datum['sequence']);
	player['email'] = $('player_email_' + datum['sequence']);
	player['date_of_birth'] = $('player_date_of_birth_' + datum['sequence']);
	player['gender'] = $('player_gender_' + datum['sequence']);
	
	// normalize values
	player['first_name'].setValue(player['first_name'].getValue().strip().toUpperCase());
	player['last_name'].setValue(player['last_name'].getValue().strip().toUpperCase());
	player['zip_code'].setValue(player['zip_code'].getValue().strip());
	player['email'].setValue(player['email'].getValue().strip().toLowerCase());
	player['date_of_birth'].setValue(player['date_of_birth'].getValue().strip());
	
	var has_data = (
		!player['first_name'].getValue().blank() || 
		!player['last_name'].getValue().blank() ||
		!player['zip_code'].getValue().blank() ||
		!player['email'].getValue().blank() ||
		!player['date_of_birth'].getValue().blank()
	);
	
	if (has_data) datum['player'] = player;
	return has_data;
}

function parent_contains_data(datum, number)
{
	if (!datum['parents']) datum['parents'] = new Array;
	var parent = new Object;
	
	// collect references to the fields into datum so we can access them later
	parent['first_name'] = $('parent_' + number + '_first_name_' + datum['sequence']);
	parent['last_name'] = $('parent_' + number + '_last_name_' + datum['sequence']);
	parent['zip_code'] = $('parent_' + number + '_zip_code_' + datum['sequence']);
	parent['email'] = $('parent_' + number + '_email_' + datum['sequence']);
	parent['parent_type'] = $('parent_' + number + '_parent_type_' + datum['sequence']);
	
	// normalize values
	parent['first_name'].setValue(parent['first_name'].getValue().strip().toUpperCase());
	parent['last_name'].setValue(parent['last_name'].getValue().strip().toUpperCase());
	parent['zip_code'].setValue(parent['zip_code'].getValue().strip());
	parent['email'].setValue(parent['email'].getValue().strip().toLowerCase());
	
	var has_data = (
		!parent['first_name'].getValue().blank() || 
		!parent['last_name'].getValue().blank() ||
		!parent['zip_code'].getValue().blank() ||
		!parent['email'].getValue().blank()
	);
	
	if (has_data) datum['parents'].push(parent);
	return has_data;
}

function set_border_color(element, is_error)
{
	element.style.borderColor = is_error ? 'red' : 'gray';
}

function reset_border_color()
{
	var elements = $$('.' + nested_form_element_class_name);
	elements.each(
		function (e)
		{
			set_border_color(e, false);
		}
	);
}

function validate_player_data(datum)
{
	var errors = $A(new Array);
	
	if (datum['player']['first_name'].getValue().blank())
	{
		errors.push('Player first name cannot be blank.');
		set_border_color(datum['player']['first_name'], true);
	}

	if (datum['player']['last_name'].getValue().blank())
	{
		errors.push('Player last name cannot be blank.');
		set_border_color(datum['player']['last_name'], true);
	}

	if (!validate_zip_code(datum['player']['zip_code'].getValue()))
	{
		errors.push('Player zip code is invalid.');
		set_border_color(datum['player']['zip_code'], true);
	}

	if (!validate_email(datum['player']['email'].getValue(), true))
	{
		errors.push('Player email is invalid.');
		set_border_color(datum['player']['email'], true);
	}

	if (!validate_date(datum['player']['date_of_birth'].getValue()))
	{
		errors.push('Player date of birth is invalid.');
		set_border_color(datum['player']['date_of_birth'], true);
	}

	var parent = new Object;
	
	// need to first check to see if there is anything in any of the parent fields
	$A(new Array(1, 2)).each(
		function(number)
		{
			if (parent_contains_data(datum, number))
			{
				parent = datum['parents'].first();
				if (parent['first_name'].getValue().blank())
				{
					errors.push('Parent first name cannot be blank.');
					set_border_color(parent['first_name'], true);
				}

				if (parent['last_name'].getValue().blank())
				{
					errors.push('Parent last name cannot be blank.');
					set_border_color(parent['last_name'], true);
				}

				if (!validate_zip_code(parent['zip_code'].getValue()))
				{
					errors.push('Parent zip code is invalid.');
					set_border_color(parent['zip_code'], true);
				}

				if (!validate_email(parent['email'].getValue(), true))
				{
					errors.push('Parent email is invalid.');
					set_border_color(parent['email'], true);
				}
			}
		}
	);

	return errors;
}

function submit_data(skip_roster)
{
	var params = 'step=5&dist_id=' + dist_id + '&team_registration_id=' + team_registration_id;
	if (coach_logged_in) params += '&coach_logged_in=true';
	if (skip_roster) params += '&skip_roster=true';
	
	if (!skip_roster)
	{
		var sequences = new Array;
	
		data.each(
			function (datum)
			{
				var sequence = datum['sequence'];
				sequences.push(sequence);
			
				params += '&player_first_name_' + sequence + '=' + datum['player']['first_name'].getValue();
				params += '&player_last_name_' + sequence + '=' + datum['player']['last_name'].getValue();
				params += '&player_zip_code_' + sequence + '=' + datum['player']['zip_code'].getValue();
				params += '&player_email_' + sequence + '=' + datum['player']['email'].getValue();
				params += '&player_date_of_birth_' + sequence + '=' + datum['player']['date_of_birth'].getValue();
				params += '&player_gender_' + sequence + '=' + datum['player']['gender'].getValue();

				if (datum['parents'].length > 0)
				{
					for (number = 1; number <= datum['parents'].length; number++)
					{
						var parent = datum['parents'][number - 1];
						params += '&parent_' + number + '_first_name_' + sequence + '=' + parent['first_name'].getValue();
						params += '&parent_' + number + '_last_name_' + sequence + '=' + parent['last_name'].getValue();
						params += '&parent_' + number + '_zip_code_' + sequence + '=' + parent['zip_code'].getValue();
						params += '&parent_' + number + '_email_' + sequence + '=' + parent['email'].getValue();
						params += '&parent_' + number + '_parent_type_' + sequence + '=' + parent['parent_type'].getValue();
					}
				}

			}
		);

		params += '&sequences=' + sequences.join('|');
	} // if (!skip_roster)
	
	new Ajax.Request('team.php', {
		asynchronous: false,
		method: 'post',
		parameters: params,
		onFailure: function(){ alert('Save failed.') },
		onException: function(o,e) { alert(e) }
	});
}

function complete_registration()
{
	$('add_players_div').hide();
	$('registration_complete_div').show();
}
