//// local rules for login fields
// should be a major subset of what's going on on the server side

var namecheck = /^([ \w]){2,12}$/;
function invalidName() {
	var name = $('name').value;
	if (name.length == 0) return " ";
	if (name.length < 2) return "enter a name";
	if (name.substr(0, 1) == ' ') return "begins with a space";
	if (name.substr(-1) == ' ') return "ends with a space";
	if (name.length > 12) return "too long";
	if (!namecheck.test(name)) return "illegal characters";
	return null;
}

function invalidPassword() {
	var password = $('password').value;
	if (password.length < 7) return "too short";
	if (password.length > 40) return "too long";
	return null;
}

function invalidRepeat() {
	if ($('repeat').value != $('password').value) return "must match";
	return null;
}

var emailcheck = /^([a-zA-Z0-9])+([a-zA-Z0-9\.\\+=_-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/;
function invalidEmail() {
	var email = $('email').value;
	if (!emailcheck.test(email)) return "valid email required";
	return null;
}

function invalidLogin() {
	if ($('newuser_prompt').style.display == "none")
		return invalidName() || invalidPassword();
	else
		return invalidName() || invalidPassword() || invalidRepeat() || invalidEmail(); 
}



//// form submission

var oldLoginButtonValue;

function disableLoginButton(color, reason) {
	lava($('loginbutton'), [0,0,0], color);
	oldLoginButtonValue = $('loginbutton').value; 
	$('loginbutton').value = reason;
	$('loginbutton').disabled = true;
}

function enableLoginButton() {
	lava($('loginbutton'), [0,0,0]);
	$('loginbutton').value = oldLoginButtonValue;
	$('loginbutton').disabled = false;
}

function loginCallback(response) {
	var v = eval(response); // JSON-encoded: ['a','b']
	var code = v[0], why = v[1];

	var errorbox = null;

	switch (code) {
		case 0: errorbox = $('name_errors'); break;
		case 1: errorbox = $('password_errors'); break;
		case 2: errorbox = $('email_errors'); break;
		case 3: alert(why); break;
		case 4: window.location.href = "/news/news.php";
	}

	if (errorbox) errorbox.innerHTML = why;

	if (code != 4) enableLoginButton();
}

function onLoginSubmit() {
	if (invalidLogin()) return false;

	if ($('newuser_prompt').style.display == "none") {
		xhrRequest("/common/login.php", loginCallback, true, {l:$('name').value, p:$('password').value});
		disableLoginButton([0,255,0], "logging...");
	} else {
		xhrRequest("/common/register.php", loginCallback, true, {l:$('name').value, p:$('password').value, e:$('email').value});
		disableLoginButton([0,0,255], "creating...");
	}

	return false;
}

function onLogoutSubmit() {
	xhrRequest("/common/logout.php", loginCallback);
	disableLoginButton([255,0,0], "leaving...");
	return false;
}



//// real-time name availability checking

function namecheckCallback(response) {
	var v = eval(response); // JSON-encoded: ['a','b']
	var code = v[0], last = v[1], meaning = v[2];
	var name = $('name');

	if (last != name.value) return;

	if (code == 0)
		$('loginbutton').value = 'log in';
	else
		$('loginbutton').value = 'create';

	collapse($('newuser_prompt'), code == 1);

	name.errorbox.innerHTML = meaning;
}

var nameCheckID;

function onNameChange(e) {
	var why;

	if (why = invalidName()) {
		collapse($('password_prompt', 'newuser_prompt'));
	} else {
		collapse($('password_prompt'), true);

		if (nameCheckID) clearTimeout(nameCheckID);
		nameCheckID = setTimeout(function() {
				xhrRequest("/common/namecheck.php", namecheckCallback, false, {l:$('name').value});
			}, 300);
	}

	return why;
}



//// other login features

function onEntryChange(e) {
	if (e.lastvalue != e.value) {
		e.errorbox.innerHTML = e.invalidCheck();
		collapse($('loginbutton'), !invalidLogin()); 
		e.lastvalue = e.value;
	}
}

addLoadEvent(function() {
	if ($('name')) {
		$('name').errorbox = $('name_errors');
		$('name').invalidCheck = onNameChange;

		$('password').errorbox = $('password_errors');
		$('password').invalidCheck = invalidPassword;

		$('repeat').errorbox = $('repeat_errors');
		$('repeat').invalidCheck = invalidRepeat;

		$('email').errorbox = $('email_errors');
		$('email').invalidCheck = invalidEmail;

		var elems = getElementsByClass('login_entry', 'input'), ii = elems.length;
		while (ii--) {
			addEvent(elems[ii], 'focus', function(e){e.infocus=1; grow(e, 98, 50)});
			addEvent(elems[ii], 'blur', function(e){e.infocus=null; grow(e, 50)});
			addEvent(elems[ii], 'keyup', onEntryChange);
			addEvent(elems[ii], 'change', onEntryChange);
		}

		$('name').select();
	}
})



//// nav buttons

addLoadEvent(function() {
	var elems = getElementsByClass('nav_element', 'a'), ii = elems.length;
	while (ii--) {
		addEvent(elems[ii], 'mouseover', function(e){grow(e, 120, 100)});
		addEvent(elems[ii], 'mouseout', function(e){grow(e, 100)});
		addEvent(elems[ii], 'mouseover', function(e){fade(e, [120,120,32], [80,32,32])});
		addEvent(elems[ii], 'mouseout', function(e){fade(e, [80,32,32])});
	}
})