fc.authShow = function(evt) {
	stopLink(evt);
	goTop();
	fc.hideReg();
	fc.showAuth();
	return false;
}
fc.authRegInited = false;
fc.authRegInit = function() {
	if (!fc.authRegInited) {
		var personal;
		if (personal = gebi("personalId")) {
			personal.innerHTML += '<div id="authid">\
	<div class="layer"><img class="bg" src="/pic/0.gif" width="338" height="259" alt="" /></div>\
	<div class="layer z400"><div>\
		<img onclick="fc.hideAuth();" class="close" src="/pic/close.gif" width="13" height="13" alt="" />\
		Вход или <a id="regLinkId2" class="bbd" href="/reg/">регистрация</a>\
		<form id="loginFormId" action="/login/" method="post">\
			<p id="loginErrorId">Неправильный логин или пароль</p>\
			<p>Логин<br/>\
			<input tabindex="1" class="text" type="text" name="login" maxlength="32" value="" /></p>\
			<p><a class="forgot" href="/forgot/">Забыли пароль?</a>Пароль<br/>\
			<input tabindex="2" class="text" type="password" name="pass" maxlength="64" value="" />\
			<!--input type="checkbox" name="remem" id="rememberMe" /> <label for="rememberMe">Запомнить меня</label><br/-->\
			<input tabindex="3" class="subm" type="submit" name="goauth" disabled="disabled" value="Войти" /></p>\
		</form>\
	</div></div>\
</div>\
<div id="regid" style="display:none;">\
	<div class="layer"><img class="bg2" src="/pic/0.gif" width="400" height="413" alt="" /></div>\
	<div class="layer z400"><div>\
		<img onclick="fc.hideReg();" class="close2" src="/pic/close.gif" width="13" height="13" alt="" />\
		<a id="authLinkId2" class="bbd" href="/login/">Вход</a> или регистрация\
		<form id="regFormId" method="post" action="/reg/">\
			<p id="regErrorId">Форма заполнена неверно</p>\
			<p>Желаемый ник<br/>\
			<input class="text" type="text" name="login" maxlength="32" />\
			Пароль<br/>\
			<input class="text" type="password" name="pass" maxlength="64" />\
			Повторите пароль, чтобы не забыть<br/>\
			<input class="text" type="password" name="repass" maxlength="64" />\
			Адрес электронной почты<br/>\
			<input class="text" type="text" name="email" maxlength="128" />\
			<input type="hidden" name="hidemail" value="1" />\
			<!--img class="captcha" src="pic/captcha.gif" width="120" height="46" alt="" /><br/>\
			Что написано на изображении выше?<br/-->\
			Введите &quot;' + (typeof captchaPhrase == "undefined" ? "чорт, не работает" : captchaPhrase) + '&quot; числом<br/>\
			<input class="text" type="text" name="captcha" maxlength="7" />\
			<input class="subm" type="submit" name="goreg" disabled="disabled" value="Зарегистрироваться" />\
		</p></form>\
	</div></div>\
</div>';
			gebi("authid").style.display = "none";
			this.authRegInited = true;
		}
	}
}
fc.showAuth = function() {
	this.authRegInit();
	var auth = gebi("authid");
	if (auth) auth.style.display = "";
	gebi("loginFormId").login.focus();
	return false;
}

fc.hideAuth = function() {
	var auth = gebi("authid");
	if (auth) auth.style.display = "none";
	return false;
}

fc.showReg = function() {
	var reg = gebi("regid");
	if (reg) reg.style.display = "";
	gebi("regFormId").login.focus();
	return false;
}

fc.hideReg = function() {
	var reg = gebi("regid");
	if (reg) reg.style.display = "none";
	return false;
}

// Login
fc.initLoginTimer = null;
fc.initLoginForm = function() {
	var form = gebi("loginFormId");
	var i, el;
	var fields = ["login", "pass"];
	for (i = 0; i < fields.length; i++) {
		el = form.elements[fields[i]];
		if (el) {
			addHandler(el, "keyup", function(evt) {
				evt = evt || window.event;
				var _el = evt.target ? evt.target : evt.srcElement;
				if (fc.initRegTimers[_el.name]) {
					clearTimeout(fc.initRegTimers[_el.name]);
					fc.initRegTimers[_el.name] = null;
				}
				fc.initRegTimers[_el.name] = setTimeout("fc.updateLoginForm()", 50);
			});
			addHandler(el, "change", function(evt) {fc.updateLoginForm();});
		}
	}
	fc.updateLoginForm();
	addHandler(form, "submit", function(evt) {
		fc.loginSubmit();
		stopLink(evt);
		return false;
	});
}
fc.updateLoginForm = function() {
	// What's FUCK! with RegExp in Gecko???
	var form = gebi("loginFormId");
	if (form) {
		var re = /^[\w\-\$\s@а-я]+$/ig;
		var login = false, pass;
		if (re.test(form.login.value)) login = true;
		/* Gecko RegExp Fix --> */ re.test(form.login.value);
		pass = form.pass.value.length != 0;
		form.goauth.disabled = !(pass && login);
	}
}
fc.loginSubmit = function() {
	var form = gebi("loginFormId");
	var el, params = "";
	for (var i = 0; i < form.elements.length; i++) {
		el = form.elements[i];
		params += el.name + "=" + encodeURIComponent(el.value);
		params += i != form.elements.length - 1 ? "&" : "";
	}
	setAjaxRequest("POST", "/login/ajax/", params, fc.loginHandler, fc.loginError, 0, 0);
}
fc.loginHandler = function() {
	var result = this.req.responseText;
	if (result.indexOf("success") != -1) {
		var lh = location.href;
		if (lh.indexOf("#") != -1) lh = lh.substring(0, lh.indexOf("#"))
		location.href = lh.indexOf("\/login\/") == -1 && lh.indexOf("\/forgot\/") == -1 ? lh : "/";
	} else {
		gebi("loginErrorId").innerHTML = "Неправильный логин или пароль";
		gebi("loginErrorId").style.display = "block";
	}
}
fc.loginError = function() {
	alert("AJAX submit error");
}

// Registration
fc.initRegTimers = [];
fc.regFields = {};
fc.initRegForm = function() {
	var i, el;
	var form = gebi("regFormId");
	var fields = ["login", "pass", "repass", "email", "age", "captcha"];
	for (i = 0; i < fields.length; i++) {
		el = form.elements[fields[i]];
		if (el) {
			addHandler(el, "keyup", function(evt) {
				evt = evt || window.event;
				var _el = evt.target ? evt.target : evt.srcElement;
				if (fc.initRegTimers[_el.name]) {
					clearTimeout(fc.initRegTimers[_el.name]);
					fc.initRegTimers[_el.name] = null;
				}
				fc.initRegTimers[_el.name] = setTimeout("fc.updateRegForm('"+_el.name+"')", 500);
			});
			addHandler(el, "change", function(evt) {
				evt = evt || window.event;
				var _el = evt.target ? evt.target : evt.srcElement;
				fc.updateRegForm(_el.name);
			});
			//fc.updateRegForm(el.name);
			fc.regFields[el.name] = el.name == "age" ? true : false;
		}
	}
	fc.regFieldsCheck();
	addHandler(form, "submit", function(evt) {
		fc.regSubmit();
		stopLink(evt);
		return false;
	});
}
fc.updateRegForm = function(name) {
	var re, i, form, el, val;
	form = gebi("regFormId"); el = form.elements[name]; val = el.value;
	fc.regFields[name] = false;
	switch(name) {
		case "login" :
			re = /^[\w\-\$\s@а-я]+$/ig;
			if (re.test(val)) {
				/* Gecko RegExp Fix --> */ re.test(val);
				var rand = Math.random();
				setAjaxRequest("GET", 
					"/reg/checklogin/?reglogin=" + val + "&rang=" + rand,
					"reglogin=" + val + "&rang=" + rand, 
					function() {
						if (parseInt(this.req.responseText)) {
							fc.regFields[name] = true;
							fixClassName(el, "correct", "nocorrect");
						} else fixClassName(el, "nocorrect", "correct");
						fc.regFieldsCheck();
					},
					function() {
						alert("Strange error...");
					},
					0, 0
				);
			} else fixClassName(el, "nocorrect", "correct");
		break;
		case "pass" :
			if (val.length == 0) fixClassName(el, "nocorrect", "correct");
			else {fixClassName(el, "correct", "nocorrect"); fc.regFields[name] = true;}
		break;
		case "repass" :
			if (val && val == form.pass.value) {fixClassName(el, "correct", "nocorrect"); fc.regFields[name] = true;}
			else fixClassName(el, "nocorrect", "correct");
		break;
		case "email" :
			re = /^([\w\-\.]+)@([\w\-]+)(\.)([\w]+)/ig;
			if (re.test(val)) {
				/* Gecko RegExp Fix --> */ re.test(val);
				fixClassName(el, "correct", "nocorrect");
				fc.regFields[name] = true;
			} else fixClassName(el, "nocorrect", "correct");
		break;
		case "age" :
			re = /^([\d]{2,2})$/ig;
			if (val.length == 0) {
				fixClassName(el, false, "nocorrect");
				fixClassName(el, false, "correct");
				fc.regFields[name] = true;
			} else if (re.test(val)) {
				/* Gecko RegExp Fix --> */ re.test(val);
				fixClassName(el, "correct", "nocorrect");
				fc.regFields[name] = true;
			} else fixClassName(el, "nocorrect", "correct");
		break;
		case "captcha" :
			re = /^[\d]+$/ig;
			if (re.test(val)) {
				/* Gecko RegExp Fix --> */ re.test(val);
				setAjaxRequest("GET", "/check_captcha/?digit=" + val, "digit=" + val, 
					function() {
						if (parseInt(this.req.responseText)) {
							fc.regFields[name] = true;
							fixClassName(el, "correct", "nocorrect");
						} else fixClassName(el, "nocorrect", "correct");
						fc.regFieldsCheck();
					},
					function() {
						alert("Strange error...");
					},
					0, 0
				);
			} else fixClassName(el, "nocorrect", "correct");
		break;
	}
	fc.regFieldsCheck();
}
fc.regFieldsCheck = function() {
	form = gebi("regFormId");
	var disabled = false;
	for (i in fc.regFields) {
		if (!fc.regFields[i]) {disabled = true; break;}
	}
	form.goreg.disabled = disabled;
}
fc.regSubmit = function() {
	var form = gebi("regFormId");
	var el, params = "";
	for (var i = 0; i < form.elements.length; i++) {
		el = form.elements[i];
		params += el.name + "=" + encodeURIComponent(el.value);
		params += i != form.elements.length - 1 ? "&" : "";
	}
	setAjaxRequest("POST", "/reg/ajax/", params, fc.regHandler, fc.regError, 0, 0);
}
fc.regHandler = function() {
	var result = this.req.responseText;
	if (result.indexOf("success") != -1) {
		var lh = location.href;
		if (lh.indexOf("#") != -1) lh = lh.substring(0, lh.indexOf("#"))
		location.href = lh.indexOf("\/reg\/") == -1 ? lh : "/";
	} else gebi("regErrorId").style.display = "block";
}
fc.regError = function() {
	alert("AJAX submit error");
}