var kNoCanonicalCounterpart = 0;
var kCapitalLetter = 0;
var kSmallLetter = 1;
var kDigit = 2;
var kPunctuation = 3;
var kAlpha =  4;
var kCanonicalizeLettersOnly = true;
var kCananicalizeEverything = false;
var gSimilarityMap = new CSimilarityMap();


function CSimilarityMap(){
        this.m_elements = "";
        this.m_canonicalCounterparts = "";
}

function isctype(character, type){
var fResult = false;
        switch(type){
                case kCapitalLetter:
                if((character >= 'A') && (character <= 'Z')){
                        fResult = true;
                }
                break;
                case kSmallLetter:
                if ((character >= 'a') && (character <= 'z')){
                        fResult = true;
                }
                break;
                case kDigit:
                if ((character >= '0') && (character <= '9')){
                        fResult = true;
                }
                break;
                case kPunctuation:
                if ("!@#$%^&*()_+-='\";:[{]}\|.>,</?`~".indexOf(character) >= 0){
                        fResult = true;
                }
                break;
                case kAlpha:
                if (isctype(character, kCapitalLetter) || isctype(character, kSmallLetter)){
                        fResult = true;
                }
                break;
                default:
                break;
        }
        return fResult;
}

function CharacterSetChecks(type, fResult){
        this.type = type;
        this.fResult = fResult;
}

function IsLongEnough(strWord, nAtLeastThisLong){
        if ((strWord == null) || isNaN(nAtLeastThisLong)){
                return false;
        }
        else if (strWord.length < nAtLeastThisLong){
                return false;
        }
        return true;
}

function SpansEnoughCharacterSets(strWord, nAtLeastThisMany){
        var nCharSets = 0;
        var characterSetChecks = new Array(
        new CharacterSetChecks(kCapitalLetter, false),
        new CharacterSetChecks(kSmallLetter, false),
        new CharacterSetChecks(kDigit, false),
        new CharacterSetChecks(kPunctuation, false)
        );
        if ((strWord == null) || isNaN(nAtLeastThisMany)){
                return false;
        }
        for(var index = 0; index < strWord.length; index++){
                for(var nCharSet = 0; nCharSet < characterSetChecks.length;nCharSet++){
                        if (!characterSetChecks[nCharSet].fResult && isctype(strWord.charAt(index), characterSetChecks[nCharSet].type)){
                                characterSetChecks[nCharSet].fResult = true;
                                break;
                        }
                }
        }
        for(var nCharSet = 0; nCharSet < characterSetChecks.length;nCharSet++){
                if (characterSetChecks[nCharSet].fResult){
                        nCharSets++;
                }
        }
        if (nCharSets < nAtLeastThisMany){
                return false;
        }
        return true;
}

function ClientSideStrongPassword(){
        return (IsLongEnough(ClientSideStrongPassword.arguments[0], "8") && SpansEnoughCharacterSets(ClientSideStrongPassword.arguments[0], "3"));
}

function ClientSideBestPassword(){
        return (IsLongEnough(ClientSideBestPassword.arguments[0], "14") && SpansEnoughCharacterSets(ClientSideBestPassword.arguments[0], "3"));
}

function ClientSideMediumPassword(){
        return (IsLongEnough(ClientSideMediumPassword.arguments[0], "8") && SpansEnoughCharacterSets(ClientSideMediumPassword.arguments[0], "2"));
}

function ClientSideWeakPassword(){
        return (IsLongEnough(ClientSideWeakPassword.arguments[0], "1") || (!(IsLongEnough(ClientSideWeakPassword.arguments[0], "0"))));
}


function DispPwdStrength(iN,sHL){
        if (iN>4) iN=4;

        var message = new Array ();
        message[0] = "Не известен";
        message[1] = "Слабый";
        message[2] = "Средний";
        message[3] = "Высокий";
        message[4] = "Лучший";

        document.getElementById("password_strength").innerHTML = message[iN];
        document.getElementById("password_strength").className = sHL;
}


function EvalPwdStrength(sP){
        if(ClientSideBestPassword(sP,gSimilarityMap)){
                DispPwdStrength(4,'password_strength_good');
        }
        else if(ClientSideStrongPassword(sP,gSimilarityMap)){
                DispPwdStrength(3,'password_strength_good');
        }
        else if(ClientSideMediumPassword(sP,gSimilarityMap)){
                DispPwdStrength(2,'password_strength_bad');
        }
        else if(ClientSideWeakPassword(sP,gSimilarityMap)){
                DispPwdStrength(1,'password_strength_bad');
        }
        else{
                DispPwdStrength(0,'password_strength_neutral');
        }
}
