// ----------------------------------------------------------------------------
// CheckPass, jQuery plugin
// v 1.0
// ----------------------------------------------------------------------------
// Copyright (C) 2010 recens
// http://recens.ru/jquery/plugin_checkpass.html
// ----------------------------------------------------------------------------
(function($){
	$.fn.checkPass = function(o){
		var o = $.extend({
			max:15, // максимальная оценка
		    statusHTML:'<div><div class="password_status"></div><div class="password_rate"></div></div>', // html код надёжности пароля
		    animateColor:false, // делать плавный переход от цвета к цвету или нет
		    animateSpeed:'fast', // скорость анимации
			levels:[
					{max:4,color:'#FF8D84'},  // цвета и максимальные оценки
					{max:7,color:'#FEE972'},  // при которых
					{max:15,color:'#9DE92C'}  // работает данный цвет
				]}
			, o);
		return $(this).each(function(){
			var f = $(this);
			f.after(o.statusHTML); // добавляем html код
			var lineParent = f.next().children('.password_status');  // находим родительский элемент будущей линии
			lineParent.append('<div class="password_line"></div>'); // добавляем линию
			var line = lineParent.children('.password_line'); // назначаем ей переменную
			line.height(lineParent.height()).width(0); // и формируем размер
			var rateParent = f.next().children('.password_rate'); // находим элемент, в который будет вставляться оценка
			f.keyup(function(){ // при нажатии клавиши
				var text = f.val(), // получаем текст
				diff = [], // очищаем массив с символами
				types = {lowLetter:-0.5,upLetter:-0.2,number:0,symbol:-0.5}, // очищаем массив с счётчиком символов
				rate = countDiff = 0; // обнуляем переменные
				for (var i = 0;i < text.length;i++) { // проходим циклом по паролю
					var letter = text[i];
					if (!diff[letter]) { // если эта буква уникальна
						diff[letter] = true; // добавляем её в массив
						if (/[0-9]/.test(letter)) { // если символ - цифра
							countDiff += 0.2; // увеличиваем счётчик
						} else { // иначе
							countDiff += 0.5; // увеличиваем счётчик на большее количество
						}
					}
					if (/[a-z]/.test(letter)) types.lowLetter ++; // подсчитываем количество английских букв
					if (/[A-Z]/.test(letter)) types.upLetter ++; // букв в верхнем регистре
					if (/[0-9]/.test(letter)) types.number ++; // чисел
					if (/[\W_]/.test(letter)) types.symbol ++; // и прочих символов
				}
				rate += (types.lowLetter + types.upLetter + types.number / 2 + types.symbol * 2) / text.length + countDiff + text.length / 10; // суммируем всё воедино
				if (countDiff <= 1) rate = 1; // если в пароле испольуется только один символ любое количество раз - оценка пароля будет равна 1
				if (text == '') rate = 0; // пустое поле для ввода пароля - оценка пароля равна 0
				if (rate > o.max) rate = o.max; // оценка не может быть больше максимально возможной
				rate = Math.round(rate); // округляем оценку
				for (i in o.levels) { // перебираем возможные цвета оценок
					var level = o.levels[i];
					if (rate <= level.max) {  // если оценка меньше максимальной оценки уровня
						var w = parseInt(lineParent.width() * rate / o.max) + 'px'; // длина линии
						if (o.animateColor) { // если переход от цвета к цвету анимирован
							line.animate({backgroundColor:level.color, width:w}, o.animateSpeed); // анимируем
						} else {
							line.animate({width:w}, o.animateSpeed, function(){ // анимируем
								$(this).css({backgroundColor:level.color}); // а затем меняем цвет
							});
						}
						break;
  					}
				}
				rateParent.html(rate + ' / ' + o.max); // вставляем текстовую информацию о надёжности пароля
			});
			f.keyup(); // запускаем функцию на случай, если в форму изначально введены данные
           });
	}
})(jQuery);
/*  --------------- Примеры работы --------------- */
$(document).ready(function(){
	$('#ex1').checkPass(); // настройки по умолчанию
	$('#ex2').checkPass({statusHTML:'<div><div class="password_status"></div></div>',animateColor:true});
	$('#ex3').checkPass({max:10, levels:[
					{max:3,color:'#FF8D84'},
					{max:6,color:'#FEE972'},
					{max:10,color:'#9DE92C'}
				]});
	$('#ex4').checkPass({
				levels:[
					{max:3,color:'#CDEFFE'},
					{max:6,color:'#79D6FD'},
					{max:9,color:'#30BEFC'},
					{max:12,color:'#039BDC'},
					{max:15,color:'#026793'}
				],animateColor:true});
	$('#ex5').checkPass({statusHTML:'<div><div class="password_status hide"></div><div class="password_rate" style="float:left;margin-top:5px;"></div></div>'});
	$('#ex6').checkPass({
				levels:[
					{max:3,color:'#D1EF94'},
					{max:6,color:'#B7E657'},
					{max:9,color:'#8EC51D'},
					{max:12,color:'#678E15'},
					{max:15,color:'#5B7D13'}
				],animateColor:true,animateSpeed:'normal'});
});
