// ############################################################################# \\
// ##                                                                          ## \\
// ##                            PASSWORD STRENGTH CHECKER                           ## \\
// ##                                 Version: 1.0                                   ## \\
// ##                                                                          ## \\
// ## You may use this product freely, under the GNU General Public License.  ## \\
// ##                                                                          ## \\
// ############################################################################# \\

function init()
{
    // These variables are all for the Password Generator. Please use them wiseley!
    var enablePasswdGen = false; // true or false to enable or disable.
    var specialCharCheck = false; // true to enable special characters. My advice is to turn it off with false.
    var passwdCheckerLevel = "easy"; // you may chose these values: "normal", "easy" and "difficult", other values result in "normal"
    
    // Start password generation
    if(enablePasswdGen == true)
    {
        createRandomPassword(specialCharCheck,passwdCheckerLevel);
    }

        // Load default functions
        defaultColors();
        passwdChecker();

}

// Start of main function, the password checker.
function passwdChecker() {
    
    // You may adjust these variables
    var forbiddenWords = new Array("test","admin","satan","god","password","money","sex","love","abc","def"); // Forbidden passwords
    var forbiddenMessage = " Dit woord is verboden om te kiezen als wachtwoord."; // Forbidden password message
    var spaceErrorMessage = "Er mogen geen spatie\'s in een wachtwoord zitten";
    var specialCharCheck = false; // true to enable special characters. My advice is to turn it off with false.
    var specialCharMessage = "Je mag geen speciale tekens gebruiken in je wachtwoord."; // Language specified.
    var colorArray = new Array("#336633","#339900","#33CC00","#33FF00","#99FFCC"); // Specify the colors. from weak to strong.
    var passwdCheckerLevel = "easy"; // you may chose these values: "normal", "easy" and "difficult", other values result in "normal"
    var setContinueLevel = 3; // When is a user able to continue... Default userlevel = 4. Lowest level = 0, highest = 5.
    
    // Beginning of declaration
    var securityLevel = 0; // Default security level.
    var safetyLength = 5;  // All values above 'safetyLength' will increase the security.

    var typeZero = "Geen wachtwoord ingevuld.";
    var typeOne = "Onveilig";
    var typeTwo = "Zwak";
    var typeThree = "Middelmatig";
    var typeFour = "Sterk";
    var typeFive = "Super sterk";

    // Unchangeable Variables
    var upperCaseRegExp = new RegExp("[^A-Z]");
    var lowercaseRegExp = new RegExp("[^a-z]");
    var typeSwitch = 0;
    var fieldName = document.getElementById("wachtwoord").value;
    var specialRegExp = new RegExp("[^A-Za-z0-9]");

    // Beginning of code
    //##################

    var inputField = fieldName.toLowerCase();
    
    //Security check on forbidden words.
    for(i = 0; i < forbiddenWords.length; i++)
    {

        if(inputField.match(forbiddenWords[i]) == forbiddenWords[i])
        {
            alert(forbiddenWords[i] + forbiddenMessage);
            fieldName = fieldName.substr(0,(fieldName.length - forbiddenWords[i].length));
            document.getElementById("wachtwoord").value = fieldName;
        }
    }

    // Check for length of the password.
    if(fieldName.length > safetyLength)
    {
        securityLevel = securityLevel + 5;
    }

    // If one value is inputted for the first time.
    if(fieldName.length > 0)
    {
        if(specialRegExp.test(fieldName.substring(0,1)) == false)
        {
            securityLevel++;
        }
        else
        {
            securityLevel--;
        }
    }
    
    // Check for spaces
    var spaceArray = fieldName.split(" ");    

    if(specialCharCheck == true)
    {
        if(spaceArray.length > 1)
        {
            alert(spaceErrorMessage);
            document.getElementById("wachtwoord").value = fieldName.substr(0,(fieldName.length-1));
        }
    }

    var charArray = fieldName.split("");

    // For loop for all values of password.
    for(i = 0; i < charArray.length; i++){

        // Check if one integer is inputted.
        if(!isNaN(charArray[i]))
        {
            securityLevel++;
        }

        // Check if one lowercase is inputted.
        if(lowercaseRegExp.test(charArray[i]) == false)
        {
            securityLevel++;
        }

        // Check if one uppercase is inputted.
        if(upperCaseRegExp.test(charArray[i]) == false)
        {
            securityLevel++;
        }

        // Check if two uppercase charachters are inputted after eachother.
        if(upperCaseRegExp.test(charArray[i]) == false && upperCaseRegExp.test(charArray[i+1]) == false )
        {
            securityLevel--;
        }

        // Check if two lowercase charachters are inputted after eachother.
        if(lowercaseRegExp.test(charArray[i]) == false && lowercaseRegExp.test(charArray[i+1]) == false )
        {
            securityLevel--;
        }
                
        // Check if two integers are inputted after eachother.
        if(!isNaN(charArray[i]) && !isNaN(charArray[i+1]) )
        {
            securityLevel--;
        }

        // Check is special charachters or spaces are inputted.
        if(specialCharCheck == false)
        {
            if(specialRegExp.test(charArray[i]) == true)
            {
            alert(specialCharMessage);

            document.getElementById("wachtwoord").value  = "";

                if(fieldName.length > 1)
                {
                    document.getElementById("wachtwoord").value = fieldName.substr(0,(fieldName.length-1));                
                }
            }
        }

        else{

        // Check if one special character is inputted.
        if(specialRegExp.test(charArray[i]) == true)
        {
            securityLevel++;
        }

        // Check if two special characters are inputted after eachother
        if(specialRegExp.test(charArray[i]) == true && specialRegExp.test(charArray[i+1]) == true )
        {
            securityLevel--;
        }

        }
        
    }
    
    // Check if two or multiple characters are in the password
    var charArray2 = inputField.split("");
    charArray2.sort();
    
    for(i=0; i < charArray2.length; i++)
    {
                
        if(charArray2[i] == charArray2[i+1])
        {
            securityLevel--;
        }
        
    }
    
    // passwdCheckerLevel Settings
    if(passwdCheckerLevel == "easy")
    {
        if(charArray.length > safetyLength)
        {
            securityLevel = securityLevel + 2;
        }
    }
    else if(passwdCheckerLevel == "difficult")
    {
        if(charArray.length > safetyLength)
        {
            securityLevel = securityLevel - 2;
        }
    }
    
    // Security bugfix if securityLevel reaches under 0
    if(securityLevel < 1 && charArray.length > 1)
    {
        securityLevel = 4;
    }
    
    // Security bugfix if securityLevel exceeds 25
    if(securityLevel > 25)
    {
        securityLevel = 25;
    }
    
    // Switch for outcome of the security level.
    switch(securityLevel)
    {
        case 0: typeSwitch = 0; break
        case 1: typeSwitch = 1; break
        case 2: typeSwitch = 1; break
        case 3: typeSwitch = 2; break
        case 4: typeSwitch = 2; break
        case 5: typeSwitch = 3; break
        case 6: typeSwitch = 3; break
        case 7: typeSwitch = 3; break
        case 8: typeSwitch = 3; break
        case 9: typeSwitch = 3; break
        case 10: typeSwitch = 4; break
        case 11: typeSwitch = 4; break
        case 12: typeSwitch = 4; break
        case 13: typeSwitch = 5; break
        case 14: typeSwitch = 5; break
        case 15: typeSwitch = 5; break
        case 16: typeSwitch = 5; break
        case 17: typeSwitch = 5; break
        case 18: typeSwitch = 5; break
        case 19: typeSwitch = 5; break
        case 20: typeSwitch = 5; break
        case 21: typeSwitch = 5; break
        case 22: typeSwitch = 5; break
        case 23: typeSwitch = 5; break
        case 24: typeSwitch = 5; break
        case 25: typeSwitch = 5; break
        default: typeSwitch = 0; break
    }

    switch(typeSwitch)
    {
        case 0: txtAnswer = typeZero; break
        case 1: txtAnswer = typeOne; break
        case 2: txtAnswer = typeTwo; break
        case 3: txtAnswer = typeThree; break
        case 4: txtAnswer = typeFour; break
        case 5: txtAnswer = typeFive; break
    }
    
    // Enable or Disable button
    if(typeSwitch < setContinueLevel)
    {
    document.getElementById("submitButton").disabled = true;
    }
    else
    {
    document.getElementById("submitButton").disabled = false;
    }
    
    // Alter value in textbox
    document.getElementById("passwdStatus").value  = txtAnswer;

    // Alternation of the color table.
    alternateColor(typeSwitch, colorArray);

}

function alternateColor(securityLevel, colorArray)
{

    // Set default colors.
    defaultColors();

    tableArray = new Array("bg1","bg2","bg3","bg4","bg5");

    for(i = 0; i < securityLevel; i++)
    {

        document.getElementById(tableArray[i]).style.background = colorArray[i];

    }
}

function defaultColors()
{
    // Set the default colors of the table.
    document.getElementById("bg1").style.background = '#CCCCCC';
    document.getElementById("bg2").style.background = '#CCCCCC';
    document.getElementById("bg3").style.background = '#CCCCCC';
    document.getElementById("bg4").style.background = '#CCCCCC';
    document.getElementById("bg5").style.background = '#CCCCCC';
}

// Create a random password
function createRandomPassword(specialCharCheck,passwdCheckerLevel)
{
    var charArray = new Array("0123456789","ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz");

    if(specialCharCheck == true)
    {
        charArray[3] = "_%^&$#@!()/*+-";
    }

    var stringLength = 4;
    var randomstring = "";
    var numReset = 0;

    for (var i = 0; i < (charArray.length * stringLength); i++)
    {
        var rnum = Math.floor(Math.random() * charArray[numReset].length);

        randomstring += charArray[numReset].substring(rnum,rnum+1);

        if(numReset == (charArray.length-1)){
            numReset = 0;
        }
        numReset++;
    }
    
    if(passwdCheckerLevel == "difficult")
    {
        passwordString = randomstring.substr(0,12);
    }
    else if(passwdCheckerLevel == "easy")
    {
        passwordString = randomstring.substr(0,8);
    }
    else
    {
        passwordString = randomstring.substr(0,10);
    }
    
    document.getElementById('wachtwoord').value = passwordString;
}

window.onload = init; 
