var LeakPasswordWord = "web|pwd|usr|tmp|data|root|test|info|mail|pass|admin|super|master|passwd|oracle|sybase|backup|server|access|account|webmail|password|informix|webmaster|postmaster|administrator|y7u8i9|7y8u9i|7890yuio|0987poiu|0p9o8i7u|q1w2e3|1q2w3e|4r3e2w1q|!q@w#e$r|q!w@e#r$|a1s2d3|1a2s3d|4f3d2s1a|!a@s#d$f|a!s@d#f$|z1x2c3|1z2x3c|4v3c2x1z|!z@x#c$v|z!x@c#v$|1qaz2wsx|!qaz@wsx|0okm9ijn|)okm(ijn|!@#$%|^&*()".split("|");

function CheckWeakPasswd(sPwd, iFlag) {
	var pwdLength = sPwd.length;
    if (pwdLength < 4) 
    	return true;

	var iCount = 0;
	var chval = 0;
	var ch0val = sPwd.charAt(0).charCodeAt();
	var ch1val = sPwd.charAt(1).charCodeAt();

	if (Math.abs(ch1val-ch0val) <= 1)
		iCount++;

    for (var i = 2; i < pwdLength; i++) {
        chval = sPwd.charAt(i).charCodeAt();
    	if (Math.abs(chval-ch0val) <= 1)
    		iCount++;
    	
    	if (ch0val != ch1val) {
	    	if (Math.abs(chval-ch1val) <= 1)
	    		iCount++;
	    }
    	
    	ch0val = ch1val;
    	ch1val = chval;
    }

    if (iCount >= pwdLength/2 && iFlag == 1)
		return true;

    if (iCount >= pwdLength-2 && iFlag <= 2)
		return true;
    
	wordLen = LeakPasswordWord.length;
	for (var n = 0; n < wordLen; n++) {
		tempPwd = LeakPasswordWord[n];
		if (sPwd.indexOf(tempPwd) != -1) {
			var iLen = tempPwd.length;
			var ch = sPwd.charAt(iLen);
			if (iFlag > 2 || ch < '0' || ch > '9')
				return false;

		   	var ch0val = ch.charCodeAt();
			var chval;
			for (var i = iLen+1; i < pwdLength; i++) {
				chval = sPwd.charAt(i).charCodeAt();
				
				if (Math.abs(chval-ch0val) > 1)
					return false;

				ch0val = chval;
			}
			
			return true;
		}
	}
    
    return false;
}

function CalculateBits(passWord) {
	var pwdLength = passWord.length;
    if (pwdLength <= 0)
        return 0;

	var SymbolChars = "`~!@#$%^&*()-_+=\|[{]};:'\",<.>/?";
	
	var totalNumber = 0x7f - 0x20;
	var lowerNumber = 26;
	var upperNumber = 26;
	var digitNumber = 10;
	var symbolNumber = SymbolChars.length;
	var otherNumber = totalNumber-(lowerNumber+upperNumber+symbolNumber+digitNumber);

    var fLower = false;
    var fUpper = false;
    var fDigit = false;
    var fSymbol = false;
    var fOther = false;
    var ch;

    for (var i = 0; i < pwdLength; i++) {
        ch = passWord.charAt(i);
			
        if ((ch >= 'a') && (ch <= 'z'))
            fLower = true;
        else if((ch >= 'A') && (ch <= 'Z'))
            fUpper = true;
        else if ((ch >= '0') && (ch <= '9'))
            fDigit = true;
        else if (SymbolChars.indexOf(ch) != -1)
            fSymbol = true;
        else
            fOther = true;
    }

    var flag = 0;
    var charset = 0;
    if (fLower) {
    	flag += 1;
        charset += lowerNumber;
    }
    if (fUpper) {
    	flag += 1;
        charset += upperNumber;
    }
    if (fDigit) {
    	flag += 1;
        charset += digitNumber;
    }
    if (fSymbol) {
    	flag += 1;
        charset += symbolNumber;
    }
    if (fOther) {
    	flag += 1;
        charset += otherNumber;
    }

	if (pwdLength >= 4) {
		if (CheckWeakPasswd(passWord, flag))
			return 1;
	}

    var bits = Math.log(charset)*(pwdLength/Math.log(2));
    
    return Math.floor(bits);
}

function EvalPwdStrength(sPwd) {
	var bits = CalculateBits(sPwd);
	var ret = 0;

	if (bits >= 65)
		ret = 3;
	else if (bits < 65 && bits >= 41)
		ret = 2;
	else if (bits < 41 && bits > 0)
		ret = 1;
	else
		ret = 0;
	
	return ret;
}
