﻿// JScript 文件

var kNoCanonicalCounterpart = 0;
var kCapitalLetter = 0;
var kSmallLetter = 1;
var kDigit = 2;
var kPunctuation = 3;
var kDebugTraceLevelAll = 80;
var kCanonicalizeLettersOnly = true;
var kCananicalizeEverything = false;
var gSimilarityMap = new CSimilarityMap();
var pwddis=CreateDis();
function CSimilarityMap()
{
	this.m_elements = "";
	this.m_canonicalCounterparts = "";
}
var gDictionary = new CDictionary();
function CDictionary()
{
	this.m_entries = new Array();
}
function CharacterSetChecks(type, fResult)
{
	this.type = type;
	this.fResult = fResult;
}
function checkStrength(oF, sP)
{
	if(ClientSideStrongPassword(sP,gSimilarityMap,gDictionary))
	{
		DispPwdStrength(3, 'cssStrong');
		document.getElementById("Password1_errMsg").innerHTML = "√";
		document.getElementById("Password1_errMsg").style.color = 'green';
		return true;
	}
	else if(ClientSideMediumPassword(sP,gSimilarityMap,gDictionary))
	{
		DispPwdStrength(2, 'cssMedium');				
		document.getElementById("Password1_errMsg").innerHTML = "√";
		document.getElementById("Password1_errMsg").style.color = 'green';
		return true;
	}
	else if(CheckSmiple(sP))
	{			
	    DispPwdStrength(2, 'cssMedium');
		document.getElementById("Password1_errMsg").innerHTML = "√";
		document.getElementById("Password1_errMsg").style.color = 'green';
		return true;
	}
	else if(CheckSmiple1(sP))
	{
	    DispPwdStrength(0, 'cssPWD');
		document.getElementById("Password1_errMsg").innerHTML = '密码由字母和数字组成,长度6-15';
		document.getElementById("Password1_errMsg").style.color = 'red';
		return false;
	}
	else
	{
	    DispPwdStrength(1, 'cssWeak');
		document.getElementById("Password1_errMsg").innerHTML = '密码太弱';
		document.getElementById("Password1_errMsg").style.color = 'red';
		return false;
	}
	
	/*else if(ClientSideWeakPassword(sP,gSimilarityMap,gDictionary))
	{
		DispPwdStrength(1, 'cssWeak');
		document.getElementById("Password1_errMsg").innerHTML = '密码太弱';
		document.getElementById("Password1_errMsg").style.color = 'red';
		return false;
	}
	else
	{
		DispPwdStrength(0, 'cssPWD');
		document.getElementById("Password1_errMsg").innerHTML = '';
		document.getElementById("Password1_errMsg").style.color = 'red';
		return false;
	}*/
}

function CreateDis(){
    var x="";
    var x1="";
    var i=0;
    var j=0;
    var n=0;
    for(i=0;i<10;i++){
        for(j=6;j<=16;j++){
            for(n=1;n<=j;n++){
                x+=i;
            }
            x+=",";
        }
    }
    var x2=""
    for(i=0;i<=4;i++){
        for(j=6;j<10;j++){
            x1="";
            x2="";
            for(n=i;n<=j;n++){
                x1=n+x1;
                x2+=n;
            }
            x+=x1
            x+=",";
            x+=x2
            x+=",";
        }
    }
    return x.split(",");
}

function CheckSmiple(txt){
    if(txt.length<6)
    {
        return false;
    }
    
   var i=0;
   for(i=0;i<pwddis.length-1;i++){
        if(txt==pwddis[i]){
            return false;
        }
   }
   
   return true;
}

function CheckSmiple1(txt){
    if(txt.length<6){
        return true;
    }
    {
        return false;
    }
}


function ClientSideStrongPassword()
{
	return (IsLongEnough(ClientSideStrongPassword.arguments[0], "6") &&
	SpansEnoughCharacterSets(ClientSideStrongPassword.arguments[0], "3") &&
	(!(IsCloseVariationOfAWordInDictionary(ClientSideStrongPassword.arguments[0], "0.6", ClientSideStrongPassword.arguments[1], ClientSideStrongPassword.arguments[2]))));
}
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, kDebugTraceLevelAll))
			{
				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 isctype(character, type, nDebugLevel)
{
	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 IsCloseVariationOfAWordInDictionary(strWord, threshold, similarityMap, dictionary)
{
	var strCanonicalizedWord = "";
	var nMinimumMeaningfulMatchLength = 0;

	if((strWord == null) || isNaN(threshold) || (similarityMap == null) || (dictionary == null))
	{
		return true;
	}
	strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap, kCananicalizeEverything);
	nMinimumMeaningfulMatchLength = Math.floor((threshold) * strCanonicalizedWord.length);
	for (var nSubStringLength = strCanonicalizedWord.length; nSubStringLength >= nMinimumMeaningfulMatchLength; nSubStringLength--)
	{
		for(var nSubStringStart = 0; (nSubStringStart + nMinimumMeaningfulMatchLength) < strCanonicalizedWord.length; nSubStringStart++)
		{
			var strSubWord = strCanonicalizedWord.substr(nSubStringStart, nSubStringLength);

			if (dictionary.Lookup(strSubWord))
			{
				return true;
			}
		}
	}
	return false;
}
function CanonicalizeWord(strWord, similarityMap, fLettersOnly)
{
	var canonicalCounterpart = kNoCanonicalCounterpart;
	var strCanonicalizedWord = "";
	var nStringLength = 0;
	if ((strWord != null) && (strWord.length > 0))
	{
		strCanonicalizedWord = strWord;
		strCanonicalizedWord = strCanonicalizedWord.toLowerCase();

		if (similarityMap.GetCount() > 0)
		{
			nStringLength = strCanonicalizedWord.length;

			for(var index = 0; index < nStringLength; index++)
			{
				if (fLettersOnly && !isctype(strCanonicalizedWord.charAt(index), kSmallLetter, kDebugTraceLevelSuperDetail))
				{
					continue;
				}

				canonicalCounterpart = similarityMap.Lookup(strCanonicalizedWord.charAt(index));
				if (canonicalCounterpart != kNoCanonicalCounterpart)
				{
					strCanonicalizedWord = strCanonicalizedWord.substring(0, index) + canonicalCounterpart +
					strCanonicalizedWord.substring(index + 1, nStringLength);
				}
			}
		}
	}
	return strCanonicalizedWord;
}
CSimilarityMap.prototype.GetCount = SimilarityMap_GetCount;	
function SimilarityMap_GetCount()
{
	return this.m_elements.length;
}
CSimilarityMap.prototype.Lookup = SimilarityMap_Lookup;
function SimilarityMap_Lookup(element)
{
	var canonicalCounterpart = kNoCanonicalCounterpart;
	var index = this.m_elements.indexOf(element);
	if (index >= 0)
	{
		canonicalCounterpart = this.m_canonicalCounterparts.charAt(index);
	}
	return canonicalCounterpart;
}
function ClientSideMediumPassword()
{
	return (IsLongEnough(ClientSideMediumPassword.arguments[0], "6") &&
	SpansEnoughCharacterSets(ClientSideMediumPassword.arguments[0], "2") &&
	(!(FoundInDictionary(ClientSideMediumPassword.arguments[0], ClientSideMediumPassword.arguments[1], ClientSideMediumPassword.arguments[2]))));
}
function FoundInDictionary(strWord, similarityMap, dictionary)
{
	var strCanonicalizedWord = "";

	if((strWord == null) || (similarityMap == null) || (dictionary == null))
	{
		return true;
	}
	strCanonicalizedWord = CanonicalizeWord(strWord, similarityMap, kCanonicalizeLettersOnly);

	if (dictionary.Lookup(strCanonicalizedWord))
	{
		return true;
	}

	return false;
}
function CanonicalizeWord(strWord, similarityMap, fLettersOnly)
{
	var canonicalCounterpart = kNoCanonicalCounterpart;
	var strCanonicalizedWord = "";
	var nStringLength = 0;
	if ((strWord != null) && (strWord.length > 0))
	{
		strCanonicalizedWord = strWord;
		strCanonicalizedWord = strCanonicalizedWord.toLowerCase();

		if (similarityMap.GetCount() > 0)
		{
			nStringLength = strCanonicalizedWord.length;

			for(var index = 0; index < nStringLength; index++)
			{
				if (fLettersOnly && !isctype(strCanonicalizedWord.charAt(index), kSmallLetter, kDebugTraceLevelSuperDetail))
				{
					continue;
				}

				canonicalCounterpart = similarityMap.Lookup(strCanonicalizedWord.charAt(index));
				if (canonicalCounterpart != kNoCanonicalCounterpart)
				{
					strCanonicalizedWord = strCanonicalizedWord.substring(0, index) + canonicalCounterpart + strCanonicalizedWord.substring(index + 1, nStringLength);
				}
			}
		}
	}
	return strCanonicalizedWord;
}
CDictionary.prototype.Lookup = Dictionary_Lookup;
function Dictionary_Lookup(strWord)
{
	for (var index = 0; index < this.m_entries.length; index++)
	{
		if (this.m_entries[index].Lookup(strWord))
		{
			return true;
		}
	}
}
function ClientSideWeakPassword()
{
	return (IsLongEnough(ClientSideWeakPassword.arguments[0], "6") || (!(IsLongEnough(ClientSideWeakPassword.arguments[0], "0"))));
}		
function DispPwdStrength(iN, sHL)
{
	if(iN>3)
	{ iN=3;}
	for(var i=0;i<4;i++)
	{ 
		var sHCR='cssPWD';
		if(i<=iN)
		{
			sHCR=sHL;
		}
		if(i>0){ document.getElementById('idSM'+i).className = sHCR;}
		document.getElementById('idSMT'+i).style.display=((i==iN)?'':'none');
	}
}
