var passwordStrength = {
	// hacked from http://www.geekwisdom.com/dyn/passwdmeter
	calculate: function testPassword(passwd) {
		var intScore = 0
		var intVerdict = 1
		var strLog = ""
		
		if (!passwd.length) return [0,0]
		
		// disallowed symbols
		if (passwd.match(/@|&|<|-|=|'/)) return [0,5]
		// match at least one letter AND one number or a symbol
		if (!passwd.match(/([0-9|\W])([a-z])|([a-z])([0-9|\W])/i)) return [0,5]

		// 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 + 1)
			strLog = strLog + "1 point for at least one lower case char\n"
		}
		
		if (passwd.match(/[A-Z]/)) // [verified] at least one upper case letter
		{
			intScore = (intScore + 5)
			strLog = strLog + "5 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 + 5)
			strLog = strLog + "5 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 + 2)
			strLog = strLog + "2 combo points for upper and lower letters\n"
		}
		
		if (passwd.match(/([a-zA-Z])/) && passwd.match(/([0-9])/)) // [verified] both letters and numbers
		{
			intScore = (intScore + 2)
			strLog = strLog + "2 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 + 2)
			strLog = strLog + "2 combo points for letters, numbers and special chars\n"
		}	
		
		if (intScore < 25) {
			intVerdict = 2
		} else if (intScore > 24 && intScore < 35) {
			intVerdict = 3
		} else if (intScore > 34 && intScore < 45) {
			intVerdict = 4
		} else {
			intVerdict = 5
		}

		if (passwd.length < 8) return [intScore,1]
		if (intVerdict == 4) return [50,intVerdict]
		return[intScore,intVerdict]
	}		
}

$(function () {
	$("input.passwordStrength").keyup(function(){
		var el = $(this)
		var score = passwordStrength.calculate(el.val())
		
		// find el
		var elStrength = el.siblings("div.passwordStrengthContainer")
		if (!elStrength.length) elStrength = el.siblings().children("div.passwordStrengthContainer")			// messy
		if (!elStrength.length) elStrength = el.parent().siblings().children("div.passwordStrengthContainer")	// messy

		if (elStrength) {

			elStrength.siblings("ul.passwordStrengthLabel").find("li").css({ display: "none" }).eq(score[1]).css({ display: "inline" })		// change label
			
			// animate bar
			elStrength.removeClass().addClass("passwordStrengthContainer s" + score[1])
			elStrength.find("span").stop(true).animate({
				width: (el.val().length > 0) ? score[0] * 3 : 0	}, { duration: "fast" }
			)
		}
	}).keyup()
})