AccountModule={};

AccountValidation = {
	
	init: function(fields)
	{
		Validation.init(fields);
	},

	
	validateUsername: function(silent)
	{
		var username_field = document.getElementById("username");
		var username = username_field.value;

		if (username == null || username == "")
		{
			Validation.displayValidation("username", "error", "Cannot be blank", silent);
		}
		else if (username.match(/\s/))
		{
			Validation.displayValidation("username", "error", "No spaces allowed", silent);
		}
		else if (! username.match(/[a-zA-Z]/))
		{
			Validation.displayValidation("username", "error", "Must have letters.", silent);
		}
		else if (m = username.match(/[^a-zA-Z0-9~\^\*\-\\|\]\}\[\{\.,;]/))
		{
			Validation.displayValidation("username", "error", "Illegal character: " + Nexopia.Utilities.escapeHTML(m.toString()), silent);
		}
		else
		{
			Validation.ajaxValidate("username", "/account/check_username", silent);
		}
	},
	
	
	validateEmail: function(silent)
	{
		var email_field = document.getElementById("email");
		var email_confirm_field = document.getElementById("email_confirm");
		var email = email_field.value;
		
		var not_supported_regex = /.*@((?:mailinator|dodgeit)\.com)$/;
		var valid_email_regex = /^[a-z0-9]+[a-z0-9_.+&-]*@[a-z0-9.-]+\.[a-z0-9.-]+$/;
		
		if (email == null || email == "")
		{
			Validation.displayValidation("email", "error", "Cannot be blank", silent);
		}
		else if (email.match(not_supported_regex))
		{
			var holder = email.replace(not_supported_regex, "$1");
			Validation.displayValidation("email", "error", holder + " cannot currently be used with Nexopia.", silent);
		}
		else if (! email.toLowerCase().match(valid_email_regex))
		{
			Validation.displayValidation("email", "error", "Not a valid email address", silent);
		}
		else
		{
			Validation.ajaxValidate("email", "/account/check_email", silent);
		}		
	},
	
	
	validateEmailConfirm: function(silent)
	{
		var results = email_confirm_chain.validate();
		Validation.displayValidation("email_confirm", results.state, results.message, silent);
	},


	validatePassword: function(silent)
	{
		var password_field = document.getElementById("password");
		var password = password_field.value;

		var username_field = document.getElementById("username");
		var username = username_field.value;

		if (password == null || password == "")
		{
			Validation.displayValidation("password", "error", "Cannot be blank", silent);
		}
		else if (password.length < 4)
		{
			Validation.displayValidation("password", "error", "4 characters minimum", silent);
		}
		else if (password.length > 32)
		{
			Validation.displayValidation("password", "error", "32 characters maximum", silent);
		}
		else
		{
			if ((username != null && username != "" && password.indexOf(username) >= 0) ||
				password == "secret" || password == "password")
			{
				Validation.displayValidation("password", "warning", "Weak", silent);
			}
			else if(password.match(/^[A-Z]?[a-z]+$/) || password.match(/^[A-Z]+$/) || password.match(/^\d+$/))
			{
				Validation.displayValidation("password", "warning", "Medium", silent);
			}
			else
			{
				Validation.displayValidation("password", "valid", "Strong", silent);
			}
		}
	},

	passwordFocus: function()
	{
		var password_field = document.getElementById("password");
		var password = password_field.value;
		if (password.length < 4)
		{
			Validation.displayValidation("password", "error", "4 characters minimum");
		}
	},
	
	validatePasswordConfirm: function(silent)
	{
		var results = password_confirm_chain.validate();
		Validation.displayValidation("password_confirm", results.state, results.message, silent);
	},
	
	
	validateDOB: function(silent)
	{
		var results = dob_chain.validate();
		Validation.displayValidation("dob", results.state, results.message, silent);
	},
	
	
	validateLocation: function(silent)
	{
		var results = location_chain.validate();
		Validation.displayValidation("location", results.state, results.message, silent);
	},
	
	
	validateSex: function(silent)
	{	
		var results = sex_chain.validate();
		Validation.displayValidation("sex", results.state, results.message, silent);
	},
	
	
	validateTimezone: function(silent)
	{	
		var results = timezone_chain.validate();
		Validation.displayValidation("timezone", results.state, results.message, silent);
	},

	
	calculateAge: function(year, month, day)
	{
		var current = new Date();
		var current_year = current.getFullYear();
		var current_month = current.getMonth() + 1;
		var current_day = current.getDate();
		var age = current_year - year;
		
		if (month > current_month || (month == current_month && day > current_day))
		{
			age = age - 1;
		}
		
		return age;
	},
	
	
	failIfNotValid: function(element)
	{
		if(!Validation.allStatesAreValid())
		{
			var form = YAHOO.util.Dom.getAncestorByTagName(element, "form");
			form.submit();

			return false;
		}
		else
		{
			return true;
		}
	},
	
	
	updateValidationStates: function()
	{
		AccountValidation.validateUsername(true);
		AccountValidation.validatePassword(true);
		AccountValidation.validateEmail(true);
		AccountValidation.validateEmailConfirm(true);
		AccountValidation.validateDOB(true);
		AccountValidation.validateSex(true);
	}
}
InviteFriends = 
{
	addRow: function ()
	{
		// Get the table and form from the page
		form = document.getElementById("invite_form");
		table = document.getElementById("invite_table");
	
		index = table.rows.length - 5;
	
		// Create a new input field for the tag
		name_input = document.createElement("input");
		name_input.setAttribute("type","text");
		name_input.setAttribute("class", "text_small");
		name_input.setAttribute("name","friend_name[" + index + "]");
		name_input.setAttribute("id","friend_name[" + index + "]");
		name_input.setAttribute("value","");
	
		// Create a new input field for the username
		email_input = document.createElement("input");
		email_input.setAttribute("type","text");
		email_input.setAttribute("class","text");
		email_input.setAttribute("name","friend_email[" + index + "]");
		email_input.setAttribute("id","friend_email[" + index + "]");
		email_input.setAttribute("value","");
	
		// Get the table body
		table_body = table.getElementsByTagName("tbody")[0];
	
		// Create the new tr/td elements for the table.
		tr = document.createElement("tr");
		td_name = document.createElement("td");
		td_email = document.createElement("td");
	
		// Put the input fields in the appropriate td elements.
		td_name.appendChild(name_input);
		td_email.appendChild(email_input);
	
		// Attach the entire row to the table body.
		tr = table_body.insertRow(index + 4);
		
		// Attach the td elements to their tr parent
		tr.appendChild(td_name);
		tr.appendChild(td_email);
	},
	
	
	/////////////// Validation stuff ///////////////////////	
	validateMyName: function()
	{
		my_name_field = document.getElementById("my_name");
		my_name = my_name_field.value;
		if (my_name == "")
		{
			Validation.displayValidation("my_name", "error", "Cannot be blank");
		}
		else
		{
			Validation.displayValidation("my_name", "valid", "");
		}
	},
	
	
	validateFriend: function(row_number)
	{
		friend_name_field = document.getElementById("friend_name[" + row_number + "]");
		friend_email_field = document.getElementById("friend_email[" + row_number + "]");
		friend_name = friend_name_field.value;
		friend_email = friend_email_field.value;
		
		valid_email_regex = /^[a-z0-9]+[a-z0-9_.+&-]*@[a-z0-9.-]+\.[a-z0-9.-]+$/;
							
		if (friend_email == "" && friend_name == "")
		{
			Validation.displayValidation("friend[" + row_number + "]", "none", "");
			return;
		}
		
		if (friend_email == "" && friend_name != "")
		{
			Validation.displayValidation("friend[" + row_number + "]", "error", "Email cannot be blank");
		}
		else if (! friend_email.toLowerCase().match(valid_email_regex))
		{
			Validation.displayValidation("friend[" + row_number + "]", "error", "Not a valid mail address");
		}
		else if (friend_email != "" && friend_name == "")
		{
			Validation.displayValidation("friend[" + row_number + "]", "error", "Name cannot be blank");
		}
		else
		{
			Validation.displayValidation("friend[" + row_number + "]", "valid", "");
		}
	}
};
Overlord.assign({
	minion: "join:show_login",
	click: function(event, element) {
		YAHOO.util.Event.preventDefault(event);

		YAHOO.util.Dom.setStyle('inline_join_container', 'display', 'none');
		YAHOO.util.Dom.setStyle('join_page', 'display', 'none');

		YAHOO.util.Dom.setStyle('inline_login_page_container', 'display', 'block');
		YAHOO.util.Dom.setStyle('login_page', 'display', 'block');

 		YAHOO.util.Dom.getElementsByClassName("post_response", "div", null, function(e){ YAHOO.util.Dom.setStyle(e, 'display', 'none') });

		document.getElementById("login_username").focus();
	}
});

Overlord.assign({
	minion: "join:main",
	load: function(element) {
		AccountValidation.init(["username","password","email","email_confirm","dob","sex"]);
		AccountValidation.updateValidationStates();
		NexopiaPanel.linkBeforeOpenMap["join_button-button"] = AccountValidation.failIfNotValid;
	}
});

Overlord.assign({
	minion: "login:show_join",
	click: function(event, element) {
		YAHOO.util.Event.preventDefault(event);
		
		YAHOO.util.Dom.setStyle('inline_login_page_container', 'display', 'none');
		YAHOO.util.Dom.setStyle('login_page', 'display', 'none');
		
		YAHOO.util.Dom.setStyle('inline_join_container', 'display', 'block');
		YAHOO.util.Dom.setStyle('join_page', 'display', 'block');

		YAHOO.util.Dom.getElementsByClassName("post_response", "div", null, function(e){ YAHOO.util.Dom.setStyle(e, 'display', 'none') });

		document.getElementById("username").focus();
	}
});

Overlord.assign({
	minion: "login:lost_toggle",
	click: function(event, element) {
		YAHOO.util.Event.preventDefault(event);

		var display = YAHOO.util.Dom.getStyle('get_password_panel', 'display');
		if(display == "none")
		{
			display = "block";
		}
		else
		{
			display = "none";
		}
		
		YAHOO.util.Dom.setStyle('get_password_panel', 'display', display);
	}
});

