var nScore=0,nLength=0,nAlphaUC=0,nAlphaLC=0,nNumber=0,nSymbol=0,nMidChar=0,nRequirements=0,nAlphasOnly=0,nNumbersOnly=0,nUnqChar=0,nRepChar=0,nRepInc=0,nConsecAlphaUC=0,nConsecAlphaLC=0,nConsecNumber=0,nConsecSymbol=0,nConsecCharType=0,nSeqAlpha=0,nSeqNumber=0,nSeqSymbol=0,nSeqChar=0,nReqChar=0,nMultConsecCharType=0,nMultRepChar=1,nMultConsecSymbol=1,nMultMidChar=2,nMultRequirements=2,nMultConsecAlphaUC=2,nMultConsecAlphaLC=2,nMultConsecNumber=2,nReqCharType=3,nMultAlphaUC=3,nMultAlphaLC=3,nMultSeqAlpha=
3,nMultSeqNumber=3,nMultSeqSymbol=3,nMultLength=4,nMultNumber=4,nMultSymbol=6,nTmpAlphaUC="",nTmpAlphaLC="",nTmpNumber="",nTmpSymbol="",sAlphas="abcdefghijklmnopqrstuvwxyz",sNumerics="01234567890",sSymbols=")!@#$%^&*()",defaultConfigurations={score:null,noneElem:null,tooShort:null,veryWeak:null,weak:null,medium:null,strong:null,veryStrong:null,progressBarElement:null},sComplexity=0,nMinPwdLen=8;
function initGlobalVariables(){nMultConsecCharType=nReqChar=nSeqChar=nSeqSymbol=nSeqNumber=nSeqAlpha=nConsecCharType=nConsecSymbol=nConsecNumber=nConsecAlphaLC=nConsecAlphaUC=nRepInc=nRepChar=nUnqChar=nNumbersOnly=nAlphasOnly=nRequirements=nMidChar=nSymbol=nNumber=nAlphaLC=nAlphaUC=nLength=nScore=0;nMultConsecSymbol=nMultRepChar=1;nMultConsecNumber=nMultConsecAlphaLC=nMultConsecAlphaUC=nMultRequirements=nMultMidChar=2;nMultSeqSymbol=nMultSeqNumber=nMultSeqAlpha=nMultAlphaLC=nMultAlphaUC=nReqCharType=
3;nTmpSymbol=nTmpNumber=nTmpAlphaLC=nTmpAlphaUC=""}String.prototype.strReverse=function(){for(var d="",a=0;a<this.length;a++)d=this.charAt(a)+d;return d};
function analyseEachCharacter(d,a,c,e){for(a=0;a<e;a++){c[a].match(/[A-Z]/g)?(""!==nTmpAlphaUC&&nTmpAlphaUC+1==a&&(nConsecAlphaUC++,nConsecCharType++),nTmpAlphaUC=a,nAlphaUC++):c[a].match(/[a-z]/g)?(""!==nTmpAlphaLC&&nTmpAlphaLC+1==a&&(nConsecAlphaLC++,nConsecCharType++),nTmpAlphaLC=a,nAlphaLC++):c[a].match(/[0-9]/g)?(0<a&&a<e-1&&nMidChar++,""!==nTmpNumber&&nTmpNumber+1==a&&(nConsecNumber++,nConsecCharType++),nTmpNumber=a,nNumber++):c[a].match(/[^a-zA-Z0-9_]/g)&&(0<a&&a<e-1&&nMidChar++,""!==nTmpSymbol&&
nTmpSymbol+1==a&&(nConsecSymbol++,nConsecCharType++),nTmpSymbol=a,nSymbol++);for(var f=!1,g=0;g<e;g++)c[a]==c[g]&&a!=g&&(f=!0,nRepInc+=Math.abs(e/(g-a)));f&&(nRepChar++,nRepInc=(nUnqChar=e-nRepChar)?Math.ceil(nRepInc/nUnqChar):Math.ceil(nRepInc))}for(c=0;23>c;c++)if(e=sAlphas.substring(c,parseInt(c+3)),a=e.strReverse(),-1!=d.toLowerCase().indexOf(e)||-1!=d.toLowerCase().indexOf(a))nSeqAlpha++,nSeqChar++;for(c=0;8>c;c++)if(e=sNumerics.substring(c,parseInt(c+3)),a=e.strReverse(),-1!=d.toLowerCase().indexOf(e)||
-1!=d.toLowerCase().indexOf(a))nSeqNumber++,nSeqChar++;for(c=0;8>c;c++)if(e=sSymbols.substring(c,parseInt(c+3)),a=e.strReverse(),-1!=d.toLowerCase().indexOf(e)||-1!=d.toLowerCase().indexOf(a))nSeqSymbol++,nSeqChar++}
function calculateScoreBasedOnGeneralPoint(d){0<nAlphaUC&&nAlphaUC<nLength&&(nScore=parseInt(nScore+2*(nLength-nAlphaUC)));0<nAlphaLC&&nAlphaLC<nLength&&(nScore=parseInt(nScore+2*(nLength-nAlphaLC)));0<nNumber&&nNumber<nLength&&(nScore=parseInt(nScore+nNumber*nMultNumber));0<nSymbol&&(nScore=parseInt(nScore+nSymbol*nMultSymbol));0<nMidChar&&(nScore=parseInt(nScore+nMidChar*nMultMidChar))}
function calculateScoreBasedOnPoorPractices(d){(0<nAlphaLC||0<nAlphaUC)&&0===nSymbol&&0===nNumber&&(nScore=parseInt(nScore-nLength),nAlphasOnly=nLength);0===nAlphaLC&&0===nAlphaUC&&0===nSymbol&&0<nNumber&&(nScore=parseInt(nScore-nLength),nNumbersOnly=nLength);0<nRepChar&&(nScore=parseInt(nScore-nRepInc));0<nConsecAlphaUC&&(nScore=parseInt(nScore-nConsecAlphaUC*nMultConsecAlphaUC));0<nConsecAlphaLC&&(nScore=parseInt(nScore-nConsecAlphaLC*nMultConsecAlphaLC));0<nConsecNumber&&(nScore=parseInt(nScore-
nConsecNumber*nMultConsecNumber));0<nSeqAlpha&&(nScore=parseInt(nScore-nSeqAlpha*nMultSeqAlpha));0<nSeqNumber&&(nScore=parseInt(nScore-nSeqNumber*nMultSeqNumber));0<nSeqSymbol&&(nScore=parseInt(nScore-nSeqSymbol*nMultSeqSymbol))}
function calculateScoreBasedOnRequirements(d){for(var a=[nLength,nAlphaUC,nAlphaLC,nNumber,nSymbol],c=["nLength","nAlphaUC","nAlphaLC","nNumber","nSymbol"],e=a.length,f=0;f<e;f++){$(c[f]).innerHTML=a[f];var g="nLength"==c[f]?parseInt(nMinPwdLen-1):0;a[f]==parseInt(g+1)?nReqChar++:a[f]>parseInt(g+1)&&nReqChar++}nRequirements=nReqChar;nRequirements>(d.length>=nMinPwdLen?3:4)&&(nScore=parseInt(nScore+2*nRequirements))}
function determineComplexity(){100<nScore?nScore=100:0>nScore&&(nScore=0);0<=nScore&&20>nScore?sComplexity=1:20<=nScore&&40>nScore?sComplexity=2:40<=nScore&&60>nScore?sComplexity=3:60<=nScore&&80>nScore?sComplexity=4:80<=nScore&&100>=nScore&&(sComplexity=5)}
function checkPassword(d,a){a=$.extend({},defaultConfigurations,a);if(null!=a&&null!=a.score||""!=a.score&&null!=a.noneElem||""!=a.noneElem&&null!=a.tooShort||""!=a.tooShort&&null!=a.veryWeak||""!=a.veryWeak&&null!=a.weak||""!=a.weak&&null!=a.medium||""!=a.medium&&null!=a.strong||""!=a.strong&&null!=a.veryStrong||""!=a.veryStrong&&null!=a.progressBarElement||""!=a.progressBarElement){var c=a.score,e=a.noneElem,f=a.tooShort,g=a.veryWeak,h=a.weak,k=a.medium,l=a.strong,m=a.veryStrong,b=a.progressBarElement;
initGlobalVariables();if(d){nLength=d.length;nScore=parseInt(nLength*nMultLength);var n=d.replace(/\s+/g,"").split(/\s*/);analyseEachCharacter(d,nLength,n,n.length);calculateScoreBasedOnGeneralPoint(d);calculateScoreBasedOnPoorPractices(d);calculateScoreBasedOnRequirements(d);$(e).hide();$(f).hide();$(g).hide();$(h).hide();$(k).hide();$(l).hide();$(m).hide();$(b).removeClass("pwdLevelNone pwdLevel1 pwdLevel2 pwdLevel3 pwdLevel4 pwdLevel5");$(b).children().removeClass("pwdLevelNone pwdLevel1 pwdLevel2 pwdLevel3 pwdLevel4 pwdLevel5");
determineComplexity();$(c).text(" ("+nScore+"%)");$(b).progressbar({value:nScore});$(b).removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all passwordMeter-progressbar");$(b).addClass("passwordMeter-progressbar");$(b).children().removeClass("ui-progressbar-value ui-widget-header ui-corner-left passwordMeter-progressbar-child");$(b).children().addClass("passwordMeter-progressbar-child");switch(sComplexity){case 5:$(m).show();$(b).addClass("pwdLevel5");$(b).children().addClass("pwdLevel5");
break;case 4:$(l).show();$(b).addClass("pwdLevel4");$(b).children().addClass("pwdLevel4");break;case 3:$(k).show();$(b).addClass("pwdLevel3");$(b).children().addClass("pwdLevel3");break;case 2:$(h).show();$(b).addClass("pwdLevel2");$(b).children().addClass("pwdLevel2");break;case 1:$(g).show();$(b).addClass("pwdLevel1");$(b).children().addClass("pwdLevel1");break;default:$(e).show(),$(b).addClass("pwdLevelNone"),$(b).children().addClass("pwdLevelNone")}$(b).show()}else $(c).text(" ("+nScore+"%)"),
$(e).show(),$(f).hide(),$(g).hide(),$(h).hide(),$(k).hide(),$(l).hide(),$(m).hide(),$(b).removeClass("pwdLevelNone pwdLevel1 pwdLevel2 pwdLevel3 pwdLevel4 pwdLevel5"),$(b).children().removeClass("pwdLevelNone pwdLevel1 pwdLevel2 pwdLevel3 pwdLevel4 pwdLevel5"),$(b).addClass("pwdLevelNone"),$(b).progressbar({value:nScore}),$(b).show(),$(b).removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all passwordMeter-progressbar"),$(b).addClass("passwordMeter-progressbar"),$(b).children().removeClass("ui-progressbar-value ui-widget-header ui-corner-left passwordMeter-progressbar-child"),
$(b).children().addClass("passwordMeter-progressbar-child")}};
