var Pattern = PatternInit('/src/maplos.js.html', function(){
	jQuery(function(){
		var PasswordReminder = (function(){
			initPasswordReminder = function(form){
				var self 		= this;
				self.form 	= form;
				self.button = Buttons(form).remind;
				self.input 	= Inputs(form).email;
				self.input.value('');
				form.submit(function(){
					self.button.wait();
					self.checkFill(function(){
						self.remind();
					});
					return false;
				})
			}
			initPasswordReminder.prototype = {
				remind: function(){
					var self = this;
					ServerAction({
						method: 'auth/remind',
						data: {
							email: self.input.value()
						},
						handler: {
							success: function(){
								self.form.html(Pattern('passwordReminder.success'))
							},
							timeout: function(){
								self.button.reset();
								self.input.error(Pattern('passwordReminder.errors.timeout'))
							},
							error: function(){
								self.button.reset();
								self.input.error(Pattern('passwordReminder.errors.noEmail'))
							}
						}
					});
				},
				checkFill: function(handler){
					var self = this;
					if (self.input.value().length > 0){
						handler();
					}else{
						self.button.reset();
						self.input.error(Pattern('passwordReminder.errors.fillField'));
					}
				}
			}
			jQuery('#sign-login form.reset-password').each(function(){
				new initPasswordReminder(jQuery(this));
			});
		})();
		var LoginForm = (function(){
			var initLoginForm = function(main){
				var self 		= this;
				self.main 	= main;
				self.form 	= self.main;
				self.inputs = Inputs(self.form);
				self.button = Buttons(self.form).login;
				each(self.inputs, function(){
					this.bind('focus', function(){
						this.reset();
					});
				});
				self.form.submit(function(){
					self.button.wait();
					self.fillCheck(function(){
						self.login(function(){
							PageReload(Env.get('redirect'));
						}, function(){
							self.inputs.login.error();
							self.inputs.password.error(Pattern('loginForm.errors.main'));
							self.button.reset();
						});
					}, function(){
						self.button.reset();
					})
					return false;
				});
			}
			initLoginForm.prototype = {
				login: function(success, error){
					var self = this;
					ServerAction({
						method: 'auth/login',
						data: {
							login: self.inputs.login.value(),
							password: self.inputs.password.value()
						},
						handler: {
							success: function(){
								success();
							}, 
							error: function(){
								error();
							}
						}
					});
				},
				fillCheck: function(success, error){
					var self 			= this;
					var allFilled = true
					each(self.inputs, function(){
						if (!this.value().length){
							allFilled = false;
							this.error(Pattern('loginForm.errors.fillField'));
						}
					});
					(allFilled) ? (success()) : (error());
				}
			}
			jQuery('#sign-login form.login').each(function(){
				new initLoginForm(jQuery(this));
			})
		})();
		var RegisterForm = (function(){
			var initRegisterForm = function(main){
				var self = this;
				self.main = main;
				self.form = main.find('form');
				self.inputs = Inputs(self.form);
				self.button = Buttons(self.form).register;
				each(self.inputs, function(key){
					this.bind('focus', function(){
						this.reset();
					});
					if (key=='invite'){
						this.success('');
					}else{
						this.input.val('');
					}
				});
				self.form.submit(function(){
					self.button.wait();
					self.localCheck(
						function(){
							self.submitForm(function(){
								PageReload(Env.get('redirect'));
							}, function(){
								self.button.reset();
							});
						},
						function(){
							self.button.reset();
						}
					);
					return false;
				});
			}
			initRegisterForm.prototype = {
				submitForm: function(success, error){
					var self = this;
					var data = {};
					each(['login', 'email', 'password'], function(){
						data[this+''] = self.inputs[this+''].value();
					});
					ServerAction({
						method: 'auth/register',
						'data': data,
						handler: {
							success: function(){
								success();
							},
							emailDuplicate: function(){
								self.inputs.email.error(self.pattern('errors.emailDuplicate'));
								error();
							},
							emailFormatError: function(){
								self.inputs.email.error(self.pattern('errors.emailFormatError'));
								error();
							},
							loginDuplicate: function(){
								self.inputs.login.error(self.pattern('errors.loginDuplicate'));
								error();
							},
							loginFormatError: function(){
								self.inputs.login.error(self.pattern('errors.loginFormatError'));
								error();
							}
						}
					});
				},
				pattern: function(path){
					return Pattern('registerForm.'+path);
				},
				checkFill: function(success, error){
					var self = this;
					var errors = false;
					each(self.inputs, function(){
						if (!this.value().length){
							this.error(self.pattern('errors.fillField'));
							errors = true;
						}
					});
					(errors) ? (error()): (success());
				},
				checkConfirm: function(success, error){
					var self = this;
					if (self.inputs.password.value() == self.inputs.confirm.value()){
						success();
					}else{
						self.inputs.confirm.input.val('');
						self.inputs.password.input.val('');
						self.inputs.confirm.error();
						self.inputs.password.error(self.pattern('errors.confirmPassword'));
						error();
					}
				},
				localCheck: function(success, error){
					var self = this;
					self.checkFill(
						function(){
							self.checkConfirm(function(){
								success();
							}, error);
						}, error);
				}
			}
			jQuery('#sign-register').each(function(){
				new initRegisterForm(jQuery(this));
			});
		})();
	})         
});
