
/* first we create an array of all insecure words */
var words = new Array(
   "0000",
   "0815",
   "1111",
   "111111",
   "123",
   "1234",
   "12345",
   "123456",
   "1234567",
   "12345678",
   "123456789",
   "1234567890",
   "6666",
   "albert",
   "alexander",
   "andrea",
   "andreas",
   "angelika",
   "anna",
   "asdf",
   "asdfg",
   "asdfgh",
   "astrid",
   "banane",
   "barbara",
   "benjamin",
   "berlin",
   "bettina",
   "bier",
   "birgit",
   "blabla",
   "blog",
   "butterfly",
   "carmen",
   "caroline",
   "charlie",
   "chris",
   "christian",
   "christina",
   "claudi",
   "claudia",
   "corinna",
   "dagobert",
   "daniel",
   "denise",
   "dominik",
   "donald",
   "fabian",
   "felix",
   "ficken",
   "florian",
   "franzi",
   "freedom",
   "freiheit",
   "freitag",
   "fritz",
   "frosch",
   "fuckyou",
   "fussball",
   "garfield",
   "geheim",
   "gerald",
   "hallo",
   "hamburg",
   "Handy",
   "hannah",
   "hannes",
   "hans",
   "ich",
   "internet",
   "irgendwas",
   "jasmin",
   "jennifer",
   "jenny",
   "jesus",
   "johann",
   "johannes",
   "julia",
   "julian",
   "katharina",
   "kathi",
   "katze",
   "katzen",
   "keines",
   "kennwort",
   "kerstin",
   "killer",
   "kristina",
   "lala",
   "lalala",
   "liebe",
   "lisa",
   "login",
   "london",
   "lucky",
   "marcel",
   "marco",
   "maria",
   "marion",
   "markus",
   "martin",
   "martina",
   "master",
   "matrix",
   "matthias",
   "mausi",
   "mausmaus",
   "melanie",
   "mercedes",
   "merlin",
   "michael",
   "michaela",
   "michi",
   "miriam",
   "monika",
   "montag",
   "moritz",
   "nadine",
   "natalie",
   "nicole",
   "nirvana",
   "oliver",
   "online",
   "password",
   "passwort",
   "paul",
   "peter",
   "power",
   "qwert",
   "qwertz",
   "renate",
   "robert",
   "roland",
   "sabine",
   "sabrina",
   "sandra",
   "sarah",
   "sascha",
   "schatz",
   "schnucki",
   "sebastian",
   "servus",
   "simon",
   "snoopy",
   "sommer",
   "sonja",
   "sonne",
   "sonnenblume",
   "sonnenschein",
   "sophie",
   "start",
   "stefan",
   "stefanie",
   "steffi",
   "stern",
   "sterne",
   "student",
   "sunshine",
   "susanne",
   "tamara",
   "tanja",
   "test",
   "test12",
   "test123",
   "thomas",
   "tiger",
   "titten",
   "tobias",
   "tomate",
   "tomtom",
   "twoday",
   "vanessa",
   "verena",
   "vienna",
   "walter",
   "wasser",
   "werner",
   "xxxx");

var empty = new Image;
var insecure = new Image;
var standard = new Image;
var secure = new Image;
var highlysecure = new Image;

empty.src = "http://www.consultingblog.at/static/passwordSecurityCheck-0.gif";
insecure.src = "http://www.consultingblog.at/static/passwordSecurityCheck-1.gif";
standard.src = "http://www.consultingblog.at/static/passwordSecurityCheck-2.gif";
secure.src = "http://www.consultingblog.at/static/passwordSecurityCheck-3.gif";
highlysecure.src = "http://www.consultingblog.at/static/passwordSecurityCheck-4.gif";

function passwordSecurityCheckChangePicture(PicName, PicObject) {
   window.document.images[PicName].src = PicObject.src;
}

function passwordSecurityCheckPassword(passwordObj) {
   // make passwordSecurityCheckDiv block visible
   var divObj = document.getElementById("passwordSecurityCheckDiv");
   if (divObj && divObj.style.display == "none") {
      divObj.style.display = "block";
   }

   var points = 0;
   var input = passwordObj.value;
   var lowerCount = 0, 
      upperCount = 0,
      firstUpperCase = 0,
      numberCount = 0,
      miscCount = 0;

   // return if password is empty
   if (!input.length) return passwordSecurityCheckChangePicture('passwordSecurityCheck', empty);

   // check if password is a insecure word
   var inputLowerCase = input.toLowerCase();
   for (var i=words.length-1; i >= 0; i--) {
      var indexOfWord = inputLowerCase.indexOf(words[i]);
      if (words[i].length && indexOfWord >= 0) {
         if (words[i].length == input.length) {
            return passwordSecurityCheckChangePicture('passwordSecurityCheck', standard);
         } else if (indexOfWord > 0) {
            points -= 10;
            break;
         } else {
            points -= 20;
            break;
         }
      }
   }
   
   // count different types of characters
   for (var i=0; i < input.length; i++) {
      var code = input.charCodeAt(i);
      // lower case chars
      if (code >= 97 && code <= 122) {
         lowerCount++;
      // upper case chars
      } else if (code >= 65 && code <= 90) {
         upperCount++;
         if (i && !firstUpperCase) firstUpperCase = i;
      // numbers
      } else if (code >= 48 && code <= 57) {
         numberCount++;
      // everything else
      } else {
         miscCount++;
      }
   }
   
   // check length
   if (input.length < 5) points -= 20;
   if (input.length > 6) points += 10;
   if (input.length > 8) points += 20;
   
   // has password numbers
   if (numberCount == 1) {
      points += 20;
   } else if (numberCount > 1) {
      points += 30;
   }
   
   // is password mixed case
   if (upperCount && !lowerCount) {
      points += 10;
   } else if (upperCount && firstUpperCase) {
      points += 30;
   } else if (upperCount) {
      points += 20;
   }
   
   // has password special chars
   if (miscCount) points += 20;

   // print picture
   if (points < 25) return passwordSecurityCheckChangePicture('passwordSecurityCheck', insecure);
   if (points < 50) return passwordSecurityCheckChangePicture('passwordSecurityCheck', standard);
   if (points < 75) return passwordSecurityCheckChangePicture('passwordSecurityCheck', secure);
   return passwordSecurityCheckChangePicture('passwordSecurityCheck', highlysecure);
}
