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,id){ 
	// if (iN>4) iN=4;

	var message = new Array ();
	message[0] = "не известно";
	message[1] = "слабая";
	message[2] = "средняя";
	message[3] = "высокая";
	message[4] = "лучшая";

	document.getElementById(id).innerHTML = message[iN];
	// document.getElementById(id).className = sHL;
}


function EvalPwdStrength(oF,sP,id,min,max){
    if (sP.length < min )
    {
        document.getElementById(id).innerHTML = "Пароль должен быть не менее " + min + " символов";
    }
    else if (sP.length > max )
    {
        document.getElementById(id).innerHTML = "Пароль не может превышать " + max + " символов";
    }
    else if(ClientSideBestPassword(sP,gSimilarityMap)){
        DispPwdStrength(4,'password_strength_good',id);
    }
    else if(ClientSideStrongPassword(sP,gSimilarityMap)){
        DispPwdStrength(3,'password_strength_good',id);
    }
    else if(ClientSideMediumPassword(sP,gSimilarityMap)){
        DispPwdStrength(2,'password_strength_bad',id);
    }
    else if(ClientSideWeakPassword(sP,gSimilarityMap)){
        DispPwdStrength(1,'password_strength_bad',id);
    }
    else{
        DispPwdStrength(0,'password_strength_neutral',id);
    }
}