/**
 * Custom password strength algorithm
 */

var led_meter_images = [];
for(i = 0; i <= 10; i++)
{
	led_meter_images[i] = new Image();
	led_meter_images[i].src = '/images/meter/led_meter_'+i+'.png';
}

function updateSecurityLevel(val, img)
{
	var score = Math.ceil(getPasswordStrength(val) / 10);
	if(score > 10) score = 10;
	if(score < 0) score = 0;
	$(img).src = led_meter_images[score].src;
}

function malert(val)
{
	$('test').innerHTML = "<pre>"+val+"</pre>";
}

/**
 * Password Strength Algorithm returns a 100-based number indicating strength. 0 = weakest, 100 = strongest
 * @author Beau D. Scott
 */
function getPasswordStrength(val)
{
	var score = 0; //score is 0-10 based
	var rules = [/[a-z]/g, /[A-Z]/g, /[\d]/g, /[^a-z\d]/gi]; // We should really check for mixed case, but not now.
	var max_subscore = [1,1,2,3]; // helps avoid repetition
	var possible_keys = [26,26,10,194]; // 256 regular characters.
	if(val.length)
	{
		for(var i = 0; i < rules.length; i++)
		{
			var subscore = 0;
			var re = val.match(rules[i]);
			if(re)
			{
				var max = 0;
				if(re.length > max_subscore[i])
					max = max_subscore[i] + ((re.length - max_subscore[i]) * (max_subscore[i] / re.length));
				else
					max = re.length;
				subscore = Math.pow(possible_keys[i], max);
			}
			if(!score)score = subscore;
			else score += (score * subscore);
		}
		score = Math.ceil((Math.log(score) * 4));
		if(score > 100) score = 100;
	}
	return score;
}
