
/* first we create an array of all insecure words */
var words = [
   "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",
   "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 = STATIC_URL + "/sys/passwordSecurityCheck-0.gif";
insecure.src = STATIC_URL + "/sys/passwordSecurityCheck-1.gif";
standard.src = STATIC_URL + "/sys/passwordSecurityCheck-2.gif";
secure.src = STATIC_URL + "/sys/passwordSecurityCheck-3.gif";
highlysecure.src = STATIC_URL + "/sys/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] && words[i].length && indexOfWord >= 0) {
         if (words[i].length == input.length) {
            return passwordSecurityCheckChangePicture('passwordSecurityCheck', insecure);
         } else if (indexOfWord > 0) {
            points -= 10;
            break;
         } else if (indexOfWord == 0 && (input.length > words[i].length + 2)) {
            points -= 10;
            break;
         } else if (indexOfWord == 0) {
            points -= 30;
            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 > 8) points += 40;
   else if (input.length > 6) points += 30;
   else if (input.length > 5) points += 20;
   else if (input.length < 5) points -= 10;
   
   // contains numbers
   if (numberCount == 1) {
      points += 20;
   } else if (numberCount > 1) {
      points += 30;
   }
   
   // is password mixed case
   if (upperCount && !lowerCount) {
      points += 10;
   } else if (upperCount && lowerCount && firstUpperCase) {
      points += 30;
   } else if (upperCount && lowerCount) {
      points += 20;
   }
   
   // has password special chars
   if (miscCount == 1) 
      points += 20;
   else if (miscCount > 1)
      points += 30;

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