var webs_home = webs_home || {};

webs_home.streamlined_signup = (function(){

	var emailAddressSel = "input[name='emailAddress']",
		passwordSel = "input[name='password']",
		categorySel = "select#category",
		submitSel = "a#streamlined_signup_button_link",
		$form,
		$emailAddress,
		$password,
		$category,
		$submit,
		$emailLabel,
		$passwordLabel,
		$categoryLabel,
		validEmail = false,
		validPassword = false,
		
		// MODEL
		
		isInvalidPassword = function(password){
			if(password.length < 4)
				return glossary.your_password_length;
			if(password[0] === " " || password[password.length-1] === " ")
				return glossary.your_password_space;
			if(!isPasswordSafeAscii(password))
				return glossary.your_password_chars;

			return false;
		},

		isPasswordSafeAscii = function(password) {
			for (var i = 0; i < password.length; i++) {
				if (password.charCodeAt(i) < 32 || password.charCodeAt(i) > 127) 
					return false;
			}
			return true;
		},
		
		validWebsIdRE = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/,

		isValidWebsId = function(websId) {
			return validWebsIdRE.test(websId);
		},
		
		// VIEW
		
		setFormValid = function(valid){
			if(valid)
				$submit.css({opacity:1});
			else
				$submit.css({opacity:0.5});
		},
		
		setFieldValid = function($e, valid){
			$e.parent().removeClass("valid invalid").addClass(valid ? "valid":"invalid");
		},
		
		showError = function($e, message){
			if(!message){
				$e.siblings(".errorMessage").animate({opacity:0}, function(e){$(e).hide(); });
			} else {
				$e.siblings(".errorMessage")
					.text(glossary.your_password + " " + message)
					.css({opacity:0})
					.show()
					.animate({opacity:1}, 100);
			}
		},
		
		// CONTROLLER
		
		validateEmail = function(){
			var valid = isValidWebsId($emailAddress.val());
			validEmail = valid;
			setFieldValid($emailAddress, valid);
			return valid;
		},
		
		validatePassword = function(){
			var val = $password.val(),
			 	message = isInvalidPassword(val),
				valid = !message;
			
			validPassword = valid && $password.val() != "";
			setFieldValid($password, valid);
			
			if(message != $password.data('errorMessage')){
				showError($password, !valid && message);
				$password.data('errorMessage', message);
			}
			
			return !message;
		},
		
		labelFor = function($input){
			return $input == $emailAddress ? $emailLabel : $passwordLabel;
		}
		
		onFocus = function(e){
			labelFor(e.data.$e).hide();
		},
		
		onBlur = function(e){
			var $e = e.data.$e;
			if($e.val() == ""){
				labelFor($e).show();
			}
		}
		
		onSubmit = function(){
			if(validEmail && validPassword){
				// CAUTION: This is correct by really dumb luck.
				// When data-action is undefined, this is a getter, and things work.
				$form.attr('action', $form.attr('data-action'));
				$form.submit();
				return false;
			} else {
				window.location = $form.attr('action');
				return false;
			}
		},
	
		init = function(){
			$emailAddress = $form.find(emailAddressSel);
			$password = $form.find(passwordSel);
			$category = $form.find(categorySel);
			$submit = $form.find(submitSel);
			if($emailAddress.length == 0 || $password.length == 0)
				return;
				
			$emailAddress.keyup(validateEmail)
				.bind("focus", {$e: $emailAddress }, onFocus)
				.bind("blur", {$e: $emailAddress }, onBlur);
			$password.keyup(validatePassword)
				.bind("focus", {$e: $password}, onFocus)
				.bind("blur", {$e: $password}, onBlur);
				
			$submit.click(onSubmit);
			$emailAddress.add($password).bind('keypress', function(e) {
				if(e.keyCode==13){ onSubmit(); }
			});
			
			$emailLabel = $("label[for=emailAddress]");
			$passwordLabel = $("label[for=password]");
			$categoryLabel = $("label[for=category]").addClass("hidden");
		},
		
		use = function(formSel){
			$form = $(formSel);
			init();
			$form.css({opacity:1});
		},
		
		start = function(){
			webs_home.streamlined_signup.use("#signup");
		};		

	return {
		use: use,
		start: start
	};
})();

jQuery(webs_home.streamlined_signup.start);

