/**
 * Plugin for authorization, registration and password recovery
 *
 * @author Elena Levadnaya
 * @since sprint11
 */

(function($){

	/**
	 * Authorization block
	 */
	var authBlock;

	/**
	 * Registration block
	 */
	var registerBlock;

	/**
	 * Password recovery block
	 */
	var passwdBlock;

	var form_invalid_msg = 'Форма заполнена неверно';
	var server_error_msg = 'Ошибка сервера, попробуйте еще раз';

	/**
	 * Show block
	 */
	var showBlock = function(block, showCaptcha){
		$.popup.showMask();
		$.popup.showActivity();
		$.popup(block.clone(true, true).show());
		$('#popup-wrap input[type="text"]:first').focus();
		formBindTabPress();
		if(showCaptcha) {
			//Recaptcha.destroy();
			var captchaBlockId = 'captcha_' + block.attr('id');
			var captchaBlock = $('#' + captchaBlockId, block);
			captchaBlock.removeAttr('id');
			Recaptcha.create(recaptchaPublicKey, captchaBlockId);
			captchaBlock.attr('id', captchaBlockId);
		}
		$.popup.hideActivity();
		return false;
	};

	/**
	 * Bind tab press to form
	 */
	function formBindTabPress() {
		var form = $('#popup-wrap form .b-body:visible');
		var checkClass = false;
		var inputs = form.find('input[type=text],input[type=password],input[type=checkbox],select,.btn-a a,.btn-b a');
		var size = inputs.size()-1;
		var currentElementFocus = 0;
		form.unbind('keydown');

		form.bind('keydown', function(e) {
			if(e.which == 9) {
				currentElementFocus = inputs.index($(':focus'));
				if(currentElementFocus<size) {
					if(inputs.eq(currentElementFocus+1).is(':visible')) {
						inputs.eq(currentElementFocus+1).focus();
					} else {
						inputs.eq(currentElementFocus+2).focus();
					}
				} else {
					inputs.eq(0).focus();
				}
				e.preventDefault();
			}
		})
	}


	/**
	 * Submit authorization form
	 */
	var sendAuthForm = function() {
		var login = $('#popup-wrap input[name="login"]').val();
		var passwd = $('#popup-wrap input[name="password"]').val();
		var remember_me = ($('#popup-wrap input[name="is_remember_me"]').prop('checked') ? 1 : 0);
		var error_block = $('#popup-wrap #errorMessage');

		error_block.text('').hide();
		$('.authAfterRegisterMessage').html('').hide();

		var loginValid = loginCheck(login);
		if (!loginValid.valid) {
			error_block.text(loginValid.msg).show();
			return false;
		}

		$.ajax({
			url: '/irr/atlantis/controllers/login.php?' + Math.random(),
			type: "POST",
			data: ({
				login: login,
				password: passwd,
				rememberMe: remember_me
			}),
			dataType: 'json',
			success: successAuth,
			failure: function() {
				error_block.text(server_error_msg).show();
			}
		});
		return false;
	};


	/**
	 * Auth was success
	 * @param res
	 */
	function successAuth(res) {
		var error_block = $('#popup-wrap #errorMessage');
		if(res.success) {
			document.location = '/userarea/?detect=1';
		} else {
			if(res.errors.reason){
				error_block.text(res.errors.reason).show();
			} else{
				error_block.text('Введен неверный логин или пароль').show();
			}
		}
	}


	/**
	 * Submit registration form
	 */
	var sendRegisterForm = function() {
		$('.errorMessage').hide();
		var $form = $(this).parents('form');
		var $rows = $('.rows', $form);
		var n = $rows.length;
		$rows.removeClass('error');
		$('.errorTxt', $form).html('').hide();

		var searchRow = function(fieldName) {
			for (var i = 0; i < n; i ++) {
				if ($('input[name="' + fieldName + '"]', $rows.eq(i)).length) {
					return $rows.eq(i);
				}
			}
			return null;
		};

		var $row = null;

		//check fields
		var checkFields = [
			{'func_name': loginCheck, 'params' : 'login'},
			{'func_name': emailCheck, 'params' : 'email'},
			{'func_name': passwordCheck, 'params' : 'password'},
			{'func_name': passwordConfirmCheck, 'params' : ['passwordConfirm', 'password']}
		];
		var isValid = true;
		var err_param;
		for (var i = 0; i < checkFields.length; i ++) {
			if(checkFields[i].params instanceof Array ) {
				isValid = checkFields[i].func_name(
					$('input[name="' + checkFields[i].params[0] + '"]', $form).val(),
					$('input[name="' + checkFields[i].params[1] + '"]', $form).val()
				);
				err_param = checkFields[i].params[0];
			} else {
				isValid = checkFields[i].func_name($('input[name="' + checkFields[i].params + '"]', $form).val());
				err_param = checkFields[i].params;
			}
			if(!isValid.valid) {
				$form.find('.registrationErrorInfo').html(form_invalid_msg).slideDown();
				$row = searchRow(err_param);
				if($row) {
					$row.addClass('error');
					$('.errorTxt', $row).html(isValid.msg).show();
				}
				$('input[name="' + err_param + '"]', $form).focus();
				return false;
			}
		}

		//i_agree checkbox
		if(!($('input[name="iagree"]', $form).prop('checked'))) {
			$form.find('.registrationErrorInfo').html(form_invalid_msg).slideDown();
			$row = searchRow('iagree');
			if($row) {
				$row.addClass('error');
				$('.errorTxt', $row).html('Вы должны согласится с нашими условиями').show();
			}
			$('input[name="iagree"]', $form).focus();
			return false;
		}

		var data = {};
		var name = '';
		var value = '';
		$('input, select', $form).each(function() {
			name = $(this).attr('name');
			if($(this).is(':checkbox')) {
				data[name] = $(this).attr('checked') ? 'on' : '';
			} else {
				value = $(this).val();
				data[name] = value;
			}
		});
		data.action = 'registerUser';

		$.ajax({
			url: "/irr/ajax/recaptcha.php",
			type: "POST",
			dataType: 'json',
			data: {
				recaptcha_challenge_field: $('#recaptcha_challenge_field', $form).val(),
				recaptcha_response_field: $('#recaptcha_response_field', $form).val()
			},
			success: function(res) {
				if (res.error != '') {
					$('#recaptcha_instructions_image', $form).text("Your captcha is incorrect.");
					$form.find('.registrationErrorInfo').html(form_invalid_msg).slideDown();
					$row = searchRow('capture');
					if($row) {
						$row.addClass('error');
						$('.errorTxt', $row).html('Укажите корректный код антиспама').show();
					}
					Recaptcha.reload();
				} else {

					$.ajax({
						url: '/irr/ajax/register_user.php',
						type: "POST",
						data: data,
						dataType: 'json',
						success: function(response) {
							if (response.result) {
								var login = $form.find('input[name="login"]').val();
								$('#a_login').click();
								if ($('.authAfterRegisterMessage').length == 0) {
									var timerPopupShow = setInterval(function() {
										if ($('.authAfterRegisterMessage').length != 0) {
											$('.authAfterRegisterMessage').html(response.msg).show();
											$('input.login').val(login);
											$('#popup-wrap .login').focus();
											formBindTabPress();
											clearInterval(timerPopupShow);
										}
									}, 500)
								} else {
									$('.authAfterRegisterMessage').html(response.msg).show();
									$('input.login').val(login);
									$('#popup-wrap .login').focus();
									formBindTabPress();
								}

							} else {
								$form.find('.registrationErrorInfo').html(response.msg).slideDown();
							}
						},
						failure: function() {
							$form.find('.registrationErrorInfo').html(server_error_msg).show();
						}
					});
				}
			}
		});
		return false;
	};

	/**
	 * Recover password by email
	 */
	var recoverPasswordByEmail = function() {
		$('.errorMessage').hide();
		var $form = $(this).parents('form');
		var $rows = $('.rows', $form);
		$rows.removeClass('error');
		$('.errorTxt', $form).html('').hide();
		var n = $rows.length;

		var searchRow = function(fieldName) {
			for (var i = 0; i < n; i ++) {
				if ($('input[name="' + fieldName + '"]', $rows.eq(i)).length) {
					return $rows.eq(i);
				}
			}
			return null;
		};

		//check email
		var isValid = emailCheck($('input[name="email"]', $form).val());
		if(!isValid.valid) {
			$form.find('.riminderEmailStep1ErrorInfo').html(form_invalid_msg).slideDown();
			var $row = searchRow('email');
			if($row) {
				$row.addClass('error');
				$('.errorTxt', $row).html(isValid.msg).show();
			}
			$('input[name="email"]', $form).focus();
			return false;
		}

		$.ajax({
			url: "/irr/ajax/recaptcha.php",
			type: "POST",
			dataType: 'json',
			data: {
				recaptcha_challenge_field: $('#recaptcha_challenge_field', $form).val(),
				recaptcha_response_field: $('#recaptcha_response_field', $form).val()
			},
			success: function(res) {
				if (res.error != '') {
					$('#recaptcha_instructions_image', $form).text("Your captcha is incorrect.");
					$form.find('.riminderEmailStep1ErrorInfo').html(form_invalid_msg).slideDown();
					$row = searchRow('capture');
					if($row) {
						$row.addClass('error');
						$('.errorTxt', $row).html('Укажите корректный код антиспама').show();
					}
					Recaptcha.reload();
				} else {

					$.ajax({
						url: '/irr/ajax/restore_password.php?' + Math.random(),
						type: "POST",
						data: {
							user_email: $('input[name="email"]', $form).val()
						},
						dataType: 'json',

						success: function(response) {
							if (response.success) {
								$('#a_login').click();
								if ($('.authAfterRegisterMessage').length == 0) {
									var timerPopupShow = setInterval(function() {
										if ($('.authAfterRegisterMessage').length != 0) {
											$('.authAfterRegisterMessage').html(response.msg).show();
											$('#popup-wrap .login').focus();
											formBindTabPress();
											clearInterval(timerPopupShow);
										}
									}, 500)
								} else {
									$('.authAfterRegisterMessage').html(response.msg).show();
									$('#popup-wrap .login').focus();
									formBindTabPress();
								}
							} else {
								$form.find('.riminderEmailStep1ErrorInfo').html(response.msg).slideDown();
							}
						},
						failure: function() {
							$form.find('.riminderEmailStep1ErrorInfo').html(server_error_msg).show();
						}
					});
				}
			}
		});
		return false;
	};

	/**
	 *Close popup
	 */
	var closePopup = function(){
		$.popup.close();
		return false;
	};

	/**
	 * Plugin creator
	 */
	$.fn.authorizationRegistration = function() {
		authBlock = $('#popupAuthorization');
		registerBlock = $('#popupRegistration');
		passwdBlock = $('#reminder_step_1');

		return this.each(function() {

			$('#a_login').click(function() {
				showBlock.apply(this, [authBlock]);
				return false;
			});
			$('#a_register').click(function() {
				showBlock.apply(this, [registerBlock, true]);
				return false;
			});

			$('.showAuthPopup').live('click', function() {
				showBlock.apply(this, [authBlock]);
				return false;
			});
			$('.showRegistrationPopup').live('click', function() {
				showBlock.apply(this, [registerBlock, true]);
				return false;
			});
			$('.showReminderPopup').live('click', function() {
				showBlock.apply(this, [passwdBlock, true]);
				return false;
			});

			$('#popup-wrap .loginFormSubmit').live('click', sendAuthForm);
			$('#popup-wrap .registerPopupBtn').live('click', sendRegisterForm);
			$('#popup-wrap .btn_email_reminder_step_1').live('click', recoverPasswordByEmail);

			//handle submit form
			$('#popup-wrap form').live('submit', function() {
				if($(this).find('.button-style.btn-a a') && (!$(':focus').parent().hasClass('btn-b'))) {
					$(this).find('.button-style.btn-a a').click();
					return false;
				}
			});

			$('#popup-wrap .ico-closeGreen,.closeAuthPopups').live('click', closePopup);
		});
	};
})(jQuery);
