$(function() {
	var defaultUserInputs = [];

	$('.js-password-strength').each(function(i, input) {
		var $input = $(input);
		var $form = $input.closest('form');
		var $blackInputs = $form.find('input:text,input:password').not('.js-confirmation');

		var meterHtml = function() {
			var result = '';

			result += '<div class="password-strength-meter">';
			result += window.i18n['password-strength'] + ': ';

			result += '<span class="password-strength strength-0">';
			result += window.i18n['password-strength-0'];
			result += '</span>';

			result += '</div>';

			return result;
		};

		$input.parent().append(meterHtml());

		var changeMeter = function(score, input) {
			var $input = $(input);
			var $strength = $input.parent().find('span.password-strength');

			if (!$strength.length)
				return;

			$strength.removeAttr('class');
			$strength.empty();
			$strength.addClass('password-strength');
			$strength.addClass('strength-' + score);
			$strength.text(window.i18n['password-strength-' + score]);
		};

		var updateMeter = function() {
			var password = $input.val();
			var userInputs = [].concat(defaultUserInputs);

			$blackInputs.each(function(i, blackInput) {
				var $blackInput = $(blackInput);
				if ($blackInput.attr('id') == $input.attr('id'))
					return;
				var val = $blackInput.val();
				if (val.length)
					userInputs.push(val);
			});

			var strength = zxcvbn(password, userInputs);
			changeMeter(strength.score, $input);
		};

		$input.on('change keyup', updateMeter);
		$blackInputs.on('change', updateMeter);

		if ($form.hasClass('js-required-safe-password')) {
			$form.submit(function(e){
				var $psi = $(this).find('.password-strength.strength-0,.password-strength.strength-1');
				if ($psi.length > 0) {
					$psi.parent().find('.js-password-strength').focus();
					alert(window.i18n['password-strength-failure-to-submit']);
					e.preventDefault();
					return false;
				}
			});
		}
	});
});
