/*
Функция для проверки сложности пароля
На вводе получает идентификатор текстового поля и идентификатор контейнера для информации.
Помимо этого, можно задать функцию минимум и максимум для длины пароля. На основе этой информации будет
высчитан порог сложности. Этот аргумент - массив из двух элементов.
*/
function PasswordComplexity(passwordboxid, containerdivid, minmax, showtext)
{
	//Главные элементы
	var passwordbox = document.getElementById(passwordboxid);
	var container   = document.getElementById(containerdivid);
	
	//Вновь созданные элементы
	var indicator   = document.createElement("div");
	var indicator_i = document.createElement("div");
	var text_ind    = document.createElement("div");
	
	//Устанавливаем параметры индикатора
	container.appendChild(indicator);
	indicator.className = "pc-indicator";
	indicator.style.width = passwordbox.clientWidth - 30;
	
	//Устанавливаем параметры внутреннего индикатора
	indicator.appendChild(indicator_i);
	indicator_i.className = "pc-indicator-inline";
	
	//Устанавливаем параметры текстого индикатора
	if (showtext == null && showtext != false)
	container.appendChild(text_ind);
	text_ind.className = "pc-indicator-text";
	text_ind.innerHTML = "Низкая сложность";
	
	//Устанавливаем параметры контейнера
	container.className = "pc-container";
	
	//Проверяем вводные данные
	if (minmax == null)
	minmax = Array(0, 25);
	
	//Вычисляем данные сложности
	var current_complexity = 0;
	
	//Значения для определения сложности
	var numeric = "0123456789";
	var lower = "abcdefghijklmopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
	var upper = "ABCDEFGHIJKLMOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
	var signs = "~`!@#$%^&*+-=_|\\/()[]{}<>,.;:?\"\'";
	
	//Факторы сложности
	var has_only_numeric = false;
	var has_numeric = false;
	var has_lower = false;
	var has_upper = false;
	var has_signs = false;
		
	//Устанавливаем обработчик
	passwordbox.onkeyup = function()
	{
		//Если что-нибудь введено
		if (passwordbox.value.length != 0)
		{
			//Показываем индикатор
			container.style.display = "block";
		}
		else
		{
			//В противном случае, скрываем
			container.style.display = "none";
		}
		
		//Вычисляем комплексность
		current_complexity = (passwordbox.value.length / minmax[1]).toString().substr(0,4);
		
		//Проверяем наличие определенной группы символов
		for(i = 0; i < passwordbox.value.length; i++)
		{			
    		has_numeric |= numeric.indexOf(passwordbox.value.charAt(i)) >= 0;
    		has_lower   |= lower.indexOf(passwordbox.value.charAt(i)) >= 0;
    		has_upper   |= upper.indexOf(passwordbox.value.charAt(i)) >= 0;
    		has_signs   |= signs.indexOf(passwordbox.value.charAt(i)) >= 0;
    		
    		if (has_numeric)
    		has_only_numeric++;
		}
		
		
		
		//Вычисляем самое частое состояние - пароль состоит из одних лишь цифр
		if (has_only_numeric == passwordbox.value.length && has_lower == false && has_upper == false && has_signs == false)
		{
			current_complexity = 0.40;
			text_ind.innerHTML = "<span style=\"critical\">Лёгкий пароль</span>";
			indicator_i.style.width = "25%";
			indicator_i.className = "pc-indicator-inline pc-i-critical";
			has_only_numeric = 0;
			has_numeric = false;
			has_lower= false;
			has_upper = false;
			has_signs = false;
			return;
		}
		
		//Сбрасываем
		has_only_numeric = 0;
		
		//Изменяем комплексность в соответствии с паролем
		if (has_lower == true || has_upper == true)
		{
			current_complexity = parseFloat(current_complexity) + 0.10;
		}
		
		if (has_lower == true && has_upper == true)
		{
			current_complexity = parseFloat(current_complexity) + 0.15;
		}
		
		if (has_signs == true)
		{
			current_complexity = parseFloat(current_complexity) + 0.15;
		}
		
		//Сбрасываем
		has_numeric = false;
		has_lower= false;
		has_upper = false;
		has_signs = false;
		
		//Если комплексность достаточна, то пароль оптимален
		if (current_complexity >= 1)
		{
			text_ind.innerHTML = "<span class=\"pc-green\">Оптимальный</span>";
			indicator_i.style.width = "97%";
			indicator_i.className = "pc-indicator-inline pc-i-green";
			return;
		}
		
		//Если длина введенного пароля меньше порога
		if (passwordbox.value.length < minmax[0])
		{
			//Выводим критическое сообщение
			text_ind.innerHTML = "<span class=\"pc-critical\">Слишком короткий</span>";
			indicator_i.style.width = "25%";
			indicator_i.className = "pc-indicator-inline pc-i-critical";
			return;
		}
		
		//Если длина пароля больше порога
		if (passwordbox.value.length > minmax[1])
		{
			text_ind.innerHTML = "<span class=\"pc-green\">Оптимальный</span>";
			indicator_i.style.width = "97%";
			indicator_i.className = "pc-indicator-inline pc-i-green";
			return;
		}
		
		
		//Выводим состояние в индикаторе
		indicator_i.style.width = (current_complexity * 100) + "px";
		indicator_i.className = "pc-indicator-inline pc-i-yellow";
		
		//Выводим состояние в текстовый элемент
		text_ind.innerHTML = "<span style=\"pc-yellow\">Средней сложности</span>";
	}
}

//Пример использования

PasswordComplexity("PASSWORD","PASSWORD_COMPLEX", Array(5,25));


