﻿function InitAuthComponent(options) {
	
	if (typeof(options) == 'undefined') {
		var options = new Object;
	}
	var opts = new Object;
	opts.messageInvalidEmail = options.messageInvalidEmail || "Проверьте правильность ввода адреса электронной почты";
	opts.messageEmptyFields = options.messageEmptyFields || "Пожалуйста, заполните все необходимые поля";
	opts.messageAccessDenied = options.messageAccessDenied || "Неправильный адрес электронной почты или пароль";
	opts.messagePasswordMismatch = options.messagePasswordMismatch || "Указанные пароли не совпадают";
	opts.messageAlreadyExists = options.messageAlreadyExists || "Пользователь с таким адресом эл. почты уже зарегистрирован! <a href='#'>Напомнить пароль.</a>";
	opts.messageAccountCreated = options.messageAccountCreated || "Учетная запись успешно создана";
	opts.messagePasswordSent = options.messagePasswordSent || "Мы выслали Вам новый пароль по адресу <b>%</b>. Используйте его для входа!";
	opts.messageInvalidUser = options.messageInvalidUser || "Пользователь с таким адресом эл. почты не зарегистрирован!";
	opts.handler = options.handler || "/ajax_auth/auth.html";

	var login = $("#id_login_dialog");
	var auth = $("#id_auth_dialog");
	var forgot = $("#id_forgot_dialog");

	// Generate dom
	// Login
	login.append('<div class="top_enter"><h1>Вход на сайт</h1><div class="close"><a href="#" id="id_login_close"><img src="/i/close.gif" alt="" /></a></div>\
			</div>\
		<div class="text_enter">\
		<div class="text_enter_forma">\
			<div class="error_enter"><div class="error_enter_2">\
				Пользователь с таким адресом эл. почты не зарегистрирован! <a href="#">Зарегистрироваться?</a>\
			</div></div>\
		<div class="enter_forma">\
	<table cellspacing="0" cellpadding="0">\
	<tr>\
		<td class="name_form_enter"><span>Эл. почта:</span></td>\
		<td><input type="text" name="email" value="" /></td>\
	</tr>\
	<tr>\
		<td class="name_form_enter"><span>Пароль:</span></td>\
		<td><input type="password" name="" value="" /></td>\
	</tr>\
	</table>\
	</div></div>\
	<div class="password_enter">\
	<div class="left_pass">\
	<ul>\
		<li><a href="#">напомнить пароль</a></li>\
		<li><a href="#">регистрация</a></li>\
	</ul>\
	</div>\
	<div class="right_pass"><input type="button" name="" value="Войти" /></div>\
		<div class="clear"></div></div>\
	</div>\
		<div class="bottom_enter"></div>');
	// Register
	auth.append('<div class="top_enter"><h1>Регистрация на сайте</h1><div class="close"><a href="#" id="id_auth_close"><img src="/i/close.gif" alt="" /></a></div>\
			</div>\
		<div class="text_enter">\
		<div class="text_enter_forma">\
			<div class="error_enter"><div class="error_enter_2">\
				Пользователь с таким адресом эл. почты уже зарегистрирован! <a href="#">Напомнить пароль.</a>\
			</div></div>\
		<div class="enter_forma">\
	<table cellspacing="0" cellpadding="0">\
	<tr>\
		<td class="name_form_enter"><span>Эл. почта:</span></td>\
		<td><input type="text" name="email" value="" /></td>\
	</tr>\
	<tr>\
		<td class="name_form_enter"><span>Пароль:</span></td>\
		<td><input type="password" name="password1" value="" /></td>\
	</tr>\
	<tr>\
		<td class="name_form_enter"><span>Повторите пароль:</span></td>\
		<td><input type="password" name="password2" value="" /></td>\
	</tr>\
	</table>\
	</div></div>\
	<div class="password_enter">\
	<div class="right_pass"><input type="button" name="" value="Зарегистрироваться" /></div>\
		<div class="clear"></div></div>\
	</div>\
		<div class="bottom_enter"></div>');
	// Forgot password
	forgot.append('<div class="top_enter"><h1>Забыли пароль?</h1><div class="close"><a href="#" id="id_forgot_close"><img src="/i/close.gif" alt="" /></a></div>\
			\
		</div>\
	    <div class="text_enter">\
		<div class="text_enter_forma">\
			<div class="error_enter"><div class="error_enter_2">\
				Укажите эл. почту — мы вышлем Вам <b>новый</b> пароль для входа\
			</div></div>\
		<div class="enter_forma">\
	<table cellspacing="0" cellpadding="0">\
	<tr>\
		<td class="name_form_enter"><span>Эл. почта:</span></td>\
		<td><input type="text" name="" value="" /></td>\
	</tr>\
	</table>\
	</div></div>\
	<div class="password_enter">\
	<div class="right_pass"><input type="button" name="" value="Получить новый пароль" /></div>\
		<div class="clear"></div></div>\
	</div>\
		<div class="bottom_enter"></div>');
	
	// Error output container
	var login_error = login.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
	var auth_error = auth.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
	var forgot_error = forgot.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
	var fader = $("#fader");
	auth_error.hide();
	login_error.hide();	
	
	// Link click to open login dialog
	$("#id_login_link").click(function(e) {
		e.preventDefault();
		fader.css("display", "block").fadeTo(0, 0.5);
		login.css("display", "block");
		login.find("div.enter_forma > table > tbody > tr:last > td:last > :password").val("");
	});
	
	// Link click to open reg dialog
	$("#id_register_link").click(function(e) {
		e.preventDefault();
		fader.css("display", "block").fadeTo(0, 0.5);
		auth.css("display", "block");
	});
	
	/*** LOGIN ***/
	login.hide();
	
	$("#id_login_close").click(function(e) {
		e.preventDefault();
		login.hide();
		fader.hide();
	});
	
	// Login submit
	login.find("div.right_pass > :button").click(function(e) {
	
		// Retrieving input data
		var mail = login.find("div.enter_forma > table > tbody > tr:first > td:last > :text");
		var pass = login.find("div.enter_forma > table > tbody > tr:last > td:last > :password");
				
		// Validating data
		login_error.html("");
		var valid = true;
		m1 = mail.closest("td").prev("td").find("span");
		m2 = pass.closest("td").prev("td").find("span");
		if (mail.val() == '') {
			m1.addClass("invalid");
			login_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else  {
			m1.removeClass("invalid");
		}

		if (pass.val() == '')  {
			m2.addClass("invalid");
			login_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else {
			m2.removeClass("invalid");
		}
		
		var pattern = new RegExp("^[a-zA-Z0-9_.]+@[a-zA-Z0-9.\-]+$")
		if (valid && !pattern.test(mail.val())) {
			m1.addClass("invalid");
			login_error.html(opts.messageInvalidEmail).css("display", "block");
			valid = false;
		} else {
			m1.removeClass("invalid");
		}
		
		if (!valid) {
			return;
		}
		
		// Sending request
		$.get(opts.handler, {action: 'login', email: mail.val(), password: pass.val()}, function(data) {
			if (data.length > 0) {
				pieces = data.split(":", 2);
				if (pieces[0] == 'OK') {
					location.href = (pieces[1]=='none') ? location.href : pieces[1] ;
				} 
				if (pieces[0] == 'ERROR') {
					if (pieces[1] == 'accessDenied') {
						login_error.html(opts.messageAccessDenied).css("display", "block");;
					}
				}
			}
		});
	});
	
	login.find("input").keyup(function(e) {
		if (e.keyCode == 13) {
			login.find("div.right_pass > :button").click();
		}
		return true;
	});
	
	// Login - remember password
	login.find("div.text_enter > div.password_enter > div.left_pass > ul > li:first").click(function(e) {
		e.preventDefault();
		login.hide();
		forgot.css("display", "block");
		forgot.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(login.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val());
	});
	
	// Login - register
	login.find("div.text_enter > div.password_enter > div.left_pass > ul > li:last").click(function(e) {
		e.preventDefault();
		login.hide();
		auth.css("display", "block");
		auth.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(login.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val());
	});
	
	/*** Auth ***/
	auth.hide();
	
	$("#id_auth_close").click(function(e) {
		e.preventDefault();
		auth.hide();
		fader.hide();
	});
	
	auth.find("div.right_pass > :button").click(function(e) {
	
		// Retrieving input
		var mail = auth.find("div.enter_forma > table > tbody > tr:first > td:last > :text");
		var pass1 = auth.find("div.enter_forma > table > tbody > tr:eq(1) > td:last > :password");
		var pass2 = auth.find("div.enter_forma > table > tbody > tr:last > td:last > :password");

		// Validating data
		valid = true;
		auth_error.html("");
		m = mail.closest("td").prev("td").find("span");
		if (mail.val() == '') {
			m.addClass("invalid");
			auth_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else {
			m.removeClass("invalid");
		}
		
		m = pass1.closest("td").prev("td").find("span");
		if (pass1.val() == '') {
			m.addClass("invalid");
			auth_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else {
			m.removeClass("invalid");
		}
		
		m2 = pass2.closest("td").prev("td").find("span");
		if (pass2.val() == '') {
			m2.addClass("invalid");
			auth_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else {
			m2.removeClass("invalid");
		}
		
		if (pass1.val() != pass2.val()) {
			m.addClass("invalid");
			m2.addClass("invalid");
			auth_error.html(auth_error.html() + "<br>" + opts.messagePasswordMismatch).css("display", "block");
			valid = false;
		} else if (valid) {
			m.removeClass("invalid");
			m2.removeClass("invalid");
		}
		
		m = mail.closest("td").prev("td").find("span");
		var pattern = new RegExp("^[a-zA-Z0-9_.]+@[a-zA-Z0-9.\-]+$")
		if (!pattern.test(mail.val())) {
			m.addClass("invalid");
			auth_error.html(auth_error.html() + "<br>" + opts.messageInvalidEmail).css("display", "block");
			valid = false;
		} else {
			m.removeClass("invalid");
		}
		
		if (!valid) {
			return;
		}
		
		// Sending request
		$.get(opts.handler, {action: 'register', email: mail.val(), password1: pass1.val(), password2: pass2.val()}, function(data) {
			if (data.length > 0) {
				pieces = data.split(":", 2);
				if (pieces[0] == 'OK') {
					auth_error.html(opts.messageAccountCreated).css("display", "block");
					setTimeout(function() {location.href = pieces[1];}, 2000);
				} 
				if (pieces[0] == 'ERROR') {
					if (pieces[1] == 'alreadyExists') {
						auth_error.html(opts.messageAlreadyExists).css("display", "block");
					}
				}
			}
		});
	});
	
	auth.find("input").keyup(function(e) {
		if (e.keyCode == 13) {
			auth.find("div.right_pass > :button").click();
		}
		return true;
	});
	
	
	/*** FORGOT ***/
	forgot.hide();
		
	$("#id_forgot_close").click(function(e) {
		e.preventDefault();
		forgot.hide();
		fader.hide();
	});
	
	forgot.find("div.right_pass > :button").click(function(e) {
		// Retrieving input
		var mail = forgot.find("div.enter_forma > table > tbody > tr:first > td:last > :text");

		// Validating data
		valid = true;
		m = mail.closest("td").prev("td").find("span");
		if (mail.val() == '') {
			m.addClass("invalid");
			forgot_error.html(opts.messageEmptyFields).css("display", "block");
			valid = false;
		} else {
			m.removeClass("invalid");
		}
		
		var pattern = new RegExp("^[a-zA-Z0-9_.]+@[a-zA-Z0-9.\-]+$")
		if (valid) {
			if (!pattern.test(mail.val())) {
				m.addClass("invalid");
				forgot_error.html(opts.messageInvalidEmail).css("display", "block");
				valid = false;
			} else {
				m.removeClass("invalid");
			}
		}
		
		if (!valid) {
			return;
		}
		
		// Sending request
		$.get(opts.handler, {action: 'forgot', email: mail.val()}, function(data) {
			if (data.length > 0) {
				pieces = data.split(":", 2);
				if (pieces[0] == 'OK') {
					forgot.hide();
					login.css("display", "block");
					login_error.html(opts.messagePasswordSent.replace("%", mail.val())).css("display", "block");
					login.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(mail.val());
				} 
				if (pieces[0] == 'ERROR') {
					if (pieces[1] == 'invalidUser') {
						forgot_error.html(opts.messageInvalidUser).css("display", "block");
					}
				}
			}
		});
	});
	
	forgot.find("input").keyup(function(e) {
		if (e.keyCode == 13) {
			forgot.find("div.right_pass > :button").click();
		}
		return true;
	});
}
