// ############################################################################# \\ 
// ##                                                                          ## \\ 
// ##                            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 = true; // 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 = "normal"; // 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 = " is a forbidden word and cannot be used as password."; // Forbidden password message 
    var spaceErrorMessage = "You are not allowed to use spaces in passwords"; 
    var specialCharCheck = false; // true to enable special characters. My advice is to turn it off with false. 
    var specialCharMessage = "You are not allowed to use special characters and spaces."; // Language specified. 
    var colorArray = new Array("#FF0000","#FF8040","#FFCC00","#80FF80","#00FF00"); // Specify the colors. from weak to strong. 
    var passwdCheckerLevel = "normal"; // you may chose these values: "normal", "easy" and "difficult", other values result in "normal" 
    var setContinueLevel = 4; // 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 = "no input"; 
    var typeOne = "very weak"; 
    var typeTwo = "weak"; 
    var typeThree = "mediocre"; 
    var typeFour = "strong"; 
    var typeFive = "very strong"; 

    // Unchangeable Variables 
    var upperCaseRegExp = new RegExp("[^A-Z]"); 
    var lowercaseRegExp = new RegExp("[^a-z]"); 
    var typeSwitch = 0; 
    var fieldName = document.getElementById("passwdBox").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("passwdBox").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("passwdBox").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("passwdBox").value  = ""; 

                if(fieldName.length > 1) 
                { 
                    document.getElementById("passwdBox").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 each other 
        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('passwdBox').value = passwordString; 
} 

window.onload = init; 
