var commonPasswords = new Array('password', 'pass', '1234', '1246');

var numbers = "0123456789";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var punctuation = "!.@$£#*()%~<>{}[]";

function checkPassword(password) {

    
    var combinations = 0;

    if (contains(password, numbers) > 0) {
        combinations += 10;
    }

    if (contains(password, lowercase) > 0) {
        combinations += 26;
    }

    if (contains(password, uppercase) > 0) {
        combinations += 26;
    }

    if (contains(password, punctuation) > 0) {
        combinations += punctuation.length;
    }

    // work out the total combinations
    var totalCombinations = Math.pow(combinations, password.length);

    // if the password is a common password, then everthing changes...
    if (isCommonPassword(password)) {
        totalCombinations = 75000 // about the size of the dictionary
    }

    // work out how long it would take to crack this (@ 200 attempts per second)
    var timeInSeconds = (totalCombinations / 200) / 2;

    // this is how many days? (there are 86,400 seconds in a day.
    var timeInDays = timeInSeconds / 86400

    // how long we want it to last
    var lifetime = 365;

    // how close is the time to the projected time?
    var percentage = timeInDays / lifetime;

    var friendlyPercentage = cap(Math.round(percentage * 100), 100);
    if (totalCombinations != 75000 && friendlyPercentage < (password.length * 5)) {
        friendlyPercentage += password.length * 5;
    }

    var progressBar = document.getElementById("progressBar");
    var msg = document.getElementById('password_strength_msg');
    
    if(friendlyPercentage >= 100) friendlyPercentage = 98;
    progressBar.style.width = friendlyPercentage + "%";

    if (percentage > 1) {
        // strong password
        progressBar.style.backgroundColor = "#3bce08";
	msg.style.color = '#3bce08';
	msg.innerHTML = 'Strong';
        return;
    }

    if (percentage > 0.5) {
        // reasonable password
        progressBar.style.backgroundColor = "#ffd801";
	msg.style.color = '#ffd801';
	msg.innerHTML = 'Medium';
        return;
    }

    if (percentage > 0.10) {
        // weak password
        progressBar.style.backgroundColor = "orange";
	msg.style.color = 'orange';
	msg.innerHTML = 'weak';
	if(password == ""){
	    msg.style.color = '';
	    msg.innerHTML = 'not rated';
        }
	return;
    }

    // useless password!
    if (percentage <= 0.10) {
        // weak password
        progressBar.style.backgroundColor = "red";
	msg.style.color = 'red';
	msg.innerHTML = 'weak';
	if(password == ""){
	    msg.style.color = '';
	    msg.innerHTML = 'not rated';
	}
	return;
    }


}

function cap(number, max) {
    if (number > max) {
        return max;
    } else {
        return number;
    }
}

function isCommonPassword(password) {

    for (i = 0; i < commonPasswords.length; i++) {
        var commonPassword = commonPasswords[i];
        if (password == commonPassword) {
            return true;
        }
    }

    return false;

}

function contains(password, validChars) {

    count = 0;

    for (i = 0; i < password.length; i++) {
        var char = password.charAt(i);
        if (validChars.indexOf(char) > -1) {
            count++;
        }
    }

    return count;
}





