// Password strength meter v2.0
// Matthew R. Miller - 2007
// www.codeandcoffee.com
// Based off of code from:
//  http://www.intelligent-web.co.uk
//  http://www.geekwisdom.com/dyn/passwdmeter

/*
	Password Strength Algorithm:
	
	Password Length:
		5 Points: Less than 4 characters
		10 Points: 5 to 7 characters
		25 Points: 8 or more
		
	Letters:
		0 Points: No letters
		10 Points: Letters are all lower case
		20 Points: Letters are upper case and lower case

	Numbers:
		0 Points: No numbers
		10 Points: 1 number
		20 Points: 3 or more numbers
		
	Characters:
		0 Points: No characters
		10 Points: 1 character
		25 Points: More than 1 character

	Bonus:
		2 Points: Letters and numbers
		3 Points: Letters, numbers, and characters
		5 Points: Mixed case letters, numbers, and characters
		
	Password Text Range:
	
		>= 90: Very Secure
		>= 80: Secure
		>= 70: Very Strong
		>= 60: Strong
		>= 50: Average
		>= 25: Weak
		>= 0: Very Weak
		
*/


// Settings
// -- Toggle to true or false, if you want to change what is checked in the password
var m_strUpperCase = "ABCDEFGHJKLMNPQRSTUVWXYZ";
var m_strLowerCase = "";
var m_strNumber = "0123456789";
var m_strCharacters = ""

// Check password
function checkPassword(strPassword) {

	// Reset combination count
	var desc = new Array();
	desc[0] = "Very Weak";
	desc[1] = "Weak";
	desc[2] = "Better";
	desc[3] = "Medium";
	desc[4] = "Strong";
	desc[5] = "Strongest";

	var nScore = 1;

	//if password bigger than 6 give 1 point
	if (strPassword.length > 6) nScore++;
	//if password has both lower and uppercase characters give 1 point      
	if ((strPassword.match(/[a-z]/)) && (strPassword.match(/[A-Z]/))) nScore++;
	//if password has at least one number give 1 point
	if (strPassword.match(/\d+/)) nScore++;
	//if password has at least one special caracther give 1 point
	if (strPassword.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,(,)]/)) nScore++;
	//if password bigger than 12 give another 1 point
	if (strPassword.length > 12) nScore++;
	
	return nScore;
}
 
// Runs password through check and then updates GUI 
function runPassword(strPassword, strFieldID) {

    // Get controls
    var ctlBar = document.getElementById(strFieldID + "_bar");
    var ctlText = document.getElementById(strFieldID + "_text");

    ctlBar.style.display = 'block';

    if (!ctlBar || !ctlText)
        return;
        
    if (strPassword.length < 1) {
        ctlText.innerHTML = "";
        ctlBar.style.backgroundColor = "";
        ctlBar.style.display = "none";
        return;
    }
        
	// Check password
	var nScore = checkPassword(strPassword);
	
    // Set new width
    ctlBar.style.width = (nScore * 20) + "px";
    ctlBar.style.height = '4px';
    ctlBar.style.display = 'block';
    ctlBar.style.float = 'left';

 	if (nScore >= 5)
 	{
 		var strText = "Very Strong";
 		var strColor = "#0ca908";
	}
	// -- Strong
 	else if (nScore >= 4)
 	{
 		var strText = "Strong";
 		var strColor = "#0ca908";
	}
	// -- Average
 	else if (nScore >= 3)
 	{
 		var strText = "Average";
 		var strColor = "#ff5555";
	}
	// -- Weak
 	else if (nScore >= 2)
 	{
 		var strText = "Weak";
 		var strColor = "#ff5555";
	}
	// -- Very Weak
 	else
 	{
 		var strText = "Very Weak";
 		var strColor = "#ff5555";
	}
	ctlBar.style.backgroundColor = strColor;
	ctlText.innerHTML = "<span style='color: " + strColor + ";'>" + strText + " - " + nScore + "</span>";
}

function generateStrongPassword(ctrlIDToDisplayPassword, ctrlIDToDisplayStrength) {
    var ctrl = document.getElementById(ctrlIDToDisplayPassword);
    var chars = "123456789ABCDEFGHJKLMNPQRSTUV";
    var string_length = 5;
    var randomstring = '';
    while (checkPassword(randomstring) < 3 || randomstring.length < string_length) {
        var rnumExtra = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnumExtra, rnumExtra + 1);
    }
    ctrl.value = randomstring;
    runPassword(randomstring, ctrlIDToDisplayStrength);
}
 
 
 
 
 



