/* 
Password Strength Factors and Weightings

password length:
level 0 (3 point): less than 4 characters
level 1 (6 points): between 5 and 7 characters
level 2 (12 points): between 8 and 15 characters
level 3 (18 points): 16 or more characters

letters:
level 0 (0 points): no letters
level 1 (5 points): all letters are lower case
level 2 (7 points): letters are mixed case

numbers:
level 0 (0 points): no numbers exist
level 1 (5 points): one number exists
level 1 (7 points): 3 or more numbers exists

special characters:
level 0 (0 points): no special characters
level 1 (5 points): one special character exists
level 2 (10 points): more than one special character exists

combinatons:
level 0 (1 points): letters and numbers exist
level 1 (1 points): mixed case letters
level 1 (2 points): letters, numbers and special characters exist
level 1 (2 points): mixed case letters, numbers and special characters exist

NOTE: Because I suck at regex the code below is incomplete and does not accurately assess the strength of passwords according to the above factors and weightings
	  
NOTE: Instead of putting out all the logging information, the score, and the verdict it would be nicer to stretcha graphic as a method of presenting a visual strength guage.
*/

function testPassword (passwd) {
	var intScore   = 0
	var strVerdict = "weak"
	var strLog     = ""
	
	// PASSWORD LENGTH
	if (passwd.length<5) {                        // length 4 or less
		intScore = (intScore+3);
		strLog   = strLog + "3 points for length (" + passwd.length + ")\n";
	} else if (passwd.length>4 && passwd.length<8) {// length between 5 and 7
		intScore = (intScore+6);
		strLog   = strLog + "6 points for length (" + passwd.length + ")\n";
	} else if (passwd.length>7 && passwd.length<16) {// length between 8 and 15
		intScore = (intScore+12);
		strLog   = strLog + "12 points for length (" + passwd.length + ")\n";
	} else if (passwd.length>15) {                   // length 16 or more
		intScore = (intScore+18);
		strLog   = strLog + "18 point for length (" + passwd.length + ")\n";
	}
	
	
	// LETTERS (Not exactly implemented as dictacted above because of my limited understanding of Regex)
	if (passwd.match(/[a-z]/)){                              // [verified] at least one lower case letter
		intScore = (intScore+2)
		strLog   = strLog + "2 point for at least one lower case char\n"
	}
	
	if (passwd.match(/[A-Z]/)) {			                   // [verified] at least one upper case letter
		intScore = (intScore+8)
		strLog   = strLog + "8 points for at least one upper case char\n"
	}
	
	// NUMBERS
	if (passwd.match(/\d+/))  {                               // [verified] at least one number
		intScore = (intScore+5)
		strLog   = strLog + "5 points for at least one number\n"
	}
	
	if (passwd.match(/(.*[0-9].*[0-9].*[0-9])/)) {            // [verified] at least three numbers
		intScore = (intScore+5)
		strLog   = strLog + "5 points for at least three numbers\n"
	}
	
	
	// SPECIAL CHAR
	if (passwd.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) {           // [verified] at least one special character
		intScore = (intScore+10)
		strLog   = strLog + "10 points for at least one special char\n"
	}
	
															 // [verified] at least two special characters
	if (passwd.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {
		intScore = (intScore+5)
		strLog   = strLog + "5 points for at least two special chars\n"
	}

	
	// COMBOS
	if (passwd.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {       // [verified] both upper and lower case
		intScore = (intScore+3)
		strLog   = strLog + "3 combo points for upper and lower letters\n"
	}

	if (passwd.match(/(\d.*\D)|(\D.*\d)/)) {                    // [FAILED] both letters and numbers, almost works because an additional character is required
		intScore = (intScore+3)
		strLog   = strLog + "3 combo points for letters and numbers\n"
	}

															  // [verified] letters, numbers, and special characters
	if (passwd.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/)) {
		intScore = (intScore+5)
		strLog   = strLog + "5 combo points for letters, numbers and special chars\n"
	}

	/* 5 LEVELS
	if(intScore < 16) {
	   strVerdict = "very weak"
	} else if (intScore > 15 && intScore < 25) {
	   strVerdict = "weak"
	} else if (intScore > 24 && intScore < 35) {
	   strVerdict = "medium"
	} else if (intScore > 34 && intScore < 45) {
	   strVerdict = "strong"
	} else {
	   strVerdict = "stronger"
	}
	*/

	if(intScore < 16) {
	   strVerdict = "WEAK";
	   strengthLevel = 1;
	} else if (intScore > 15 && intScore < 25) {
	   strVerdict = "MEDIUM";
   	   strengthLevel = 2;
	} else if (intScore > 24 && intScore < 35) {
	   strVerdict = "STRONG";
  	   strengthLevel = 3;
	} else if (intScore > 34 && intScore < 45) {
	   strVerdict = "STRONGER";
   	   strengthLevel = 4;
	} else {
	   strVerdict = "STRONGER";
   	   strengthLevel = 4;
	}
	
	
	document.getElementById("PasswordStrength").style.width = 42.5 * strengthLevel;
	document.getElementById("PasswordStrength").innerHTML = strVerdict;
}
