/*!
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @link www.scorpix.ru
 * @version 0.1.1
 * @date 2010-06-05
 * @requires jQuery
 * @requires jCommon
 */

/**
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @link www.scorpix.ru
 * @version 0.1.7
 * @date 2010-06-05
 * @requires jQuery
 * @requires jCommon.popupBlock, jCommon.measurer
 */
$(function() {

	function loginForm(rootEl) {
		rootEl = $(rootEl);

		var
			formEl = rootEl.find('.login'),
			hiddenFormEl = rootEl.find('.remind'),
			preloaderEl = rootEl.find('.preloader'),
			usernameEl = formEl.find('input[name=j_username]'),
			passwordEl = formEl.find('input[name=j_password]'),
			remindEl = formEl.find('input[name=_spring_security_remember_me]'),

			isSubmited = false,
			action = formEl.attr('action');

		formEl.submit(onSubmit);
		formEl.find('.button_panel').click(function() {
			formEl.submit();
		});
		formEl.find('.button_panel input').click(function(e) {
			e.stopPropagation();
		});
		formEl.find('.switcher .pseudo_link').click(function() {
			formEl.addClass('hidden');
			hiddenFormEl.removeClass('hidden')
				.find('input:first').focus();
		});

		function onSubmit() {
			if (isSubmited) return true;

			var params = {
				j_username: $.trim(usernameEl.val()),
				j_password: $.trim(passwordEl.val())
			};

			if (remindEl.attr('checked')) {
				params['_spring_security_remember_me'] = remindEl.val();
			}

			if ('' == params.j_username || '' == params.j_password) {
				vibration(rootEl, null, onComplete);
				return false;
			}

			var onComplete = function() {
				usernameEl.val('');
				passwordEl.val('');
				remindEl.attr('checked', false);
			};

			preloaderEl.removeClass('hidden');
			$.ajax({
				type: 'POST',
				url: action,
				dataType: 'text',
				data: params,
				success: function(data) {
					preloaderEl.addClass('hidden');

					if (-1 == data.indexOf(action)) {
						isSubmited = true;
						formEl.submit();
					} else {
						vibration(rootEl, null, onComplete);
					}
				},
				error: function() {
					preloaderEl.addClass('hidden');
					vibration(rootEl, null, onComplete);
				}
			});

			return false;
		}
	}

	function remindForm(rootEl) {
		rootEl = $(rootEl);

		var
			formEl = rootEl.find('.remind'),
			hiddenFormEl = rootEl.find('.login'),
			emailEl = formEl.find('input[name=email]');

		formEl.submit(onSubmit);
		formEl.find('.button_panel').click(function() {
			formEl.submit();
		});
		formEl.find('.button_panel input').click(function(e) {
			e.stopPropagation();
		});
		formEl.find('.switcher .pseudo_link').click(function() {
			formEl.addClass('hidden');
			hiddenFormEl.removeClass('hidden')
				.find('input:first').focus();
		});

		function emailCheck(value) {
			var validRegExp = /^\s*[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\s*$/i;
			return -1 != value.search(validRegExp);
		}

		function onSubmit() {
			var emailVal = $.trim(emailEl.val());

			if ('' == emailVal || !emailCheck(emailVal)) {
				vibration(rootEl, null, function() {
					emailEl.val('');
				});
				return false;
			}
		}
	}

	/**
	 * Механизм для вибраций, как в Маке.
	 * @param {String|Element|jQuery} el Элемент, который вибрирует.
	 * @param {Object} [options]
	 * @option {Number} counter = 6 Количество скачков.
	 * @option {Number} move = 10 На сколько перемещать при вибрации. По умолчанию - 10 пикселей.
	 * @param {Object} [onCompete] Функция, выполняемая после анимации.
	 */
	function vibration(el, options, onComplete) {

		el = $(el);
		options = $.extend({}, {
			counter: 6,
			move: 10,
			timeStep: 50
		}, options || {});

		var
			finishLeft,
			startLeft;

		animate();

		function animate() {

			if (!options.counter) {
				onComplete && onComplete();

				return;
			}

			var blockLeft = parseInt(el.css('left'));

			if (undefined === startLeft) {
				startLeft = blockLeft;
				finishLeft = startLeft + options.move;
			}

			el.css('left', startLeft == blockLeft ? finishLeft : startLeft);
			options.counter--;

			setTimeout(animate, options.timeStep);
		}
	}

	var
		linkEl = $('#main_links .signin a'),
		rootEl = $('#signin_panel:first');

	if (rootEl.length && linkEl.length) {

		loginForm(rootEl);
		remindForm(rootEl);
		$c.popupBlock(rootEl, {
			link: linkEl,
			close: rootEl.find('.close'),
			beforeShow: beforeShow,
			afterShow: function() {
				rootEl.find('form').not('.hidden').find('input:first').focus();
			}
		});

		$c.measurer.bind(beforeShow);
	}

	function beforeShow() {
		var linkOffset = linkEl.offset();

		rootEl.css({
			left: Math.round(linkOffset.left),
			top: Math.round(linkOffset.top)
		});
	}
});
