PasswordMeter.prototype=({version:"1.0.1",COMPLEXITY:{VERYWEAK:0,WEAK:1,GOOD:2,STRONG:3,VERYSTRONG:4},STATUS:{FAILED:0,PASSED:1,EXCEEDED:2},strReverse:function(str)
{var newstring="";for(var s=0;s<str.length;s++)
{newstring=str.charAt(s)+newstring;}
return newstring;},int2str:function(aNumber)
{if(aNumber==0)
{return"0";}
else
{return parseInt(aNumber,10);}},float2str:function(aNumber)
{if(aNumber==0)
{return"0.00";}
else
{return parseFloat(aNumber.toFixed(2));}},determineStatus:function(aNumber)
{if(aNumber==0)
{return this.STATUS.PASSED;}
else if(aNumber>0)
{return this.STATUS.EXCEEDED;}
else
{return this.STATUS.FAILED;}},determineBinaryStatus:function(aNumber)
{if(aNumber==0)
{return this.STATUS.PASSED;}
else
{return this.STATUS.FAILED;}}});function PasswordMeter()
{this.Score={count:0,adjusted:0,beforeRedundancy:0};this.Complexity={limits:[20,40,60,80,100],value:this.COMPLEXITY.VERYWEAK};this.PasswordLength={count:0,minimum:5,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0.5,bonus:10,penalty:-20};this.RecommendedPasswordLength={count:0,minimum:8,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:1.2,bonus:10,penalty:-10};this.BasicRequirements={count:0,minimum:3,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:1,bonus:10,penalty:-10};this.Redundancy={value:1,permitted:2,formula:"TBD",status:this.STATUS.FAILED,rating:0};this.UppercaseLetters={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.LowercaseLetters={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.Numerics={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.Symbols={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.MiddleSymbols={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.MiddleNumerics={count:0,minimum:1,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:10,penalty:-5};this.SequentialLetters={data:"abcdefghijklmnopqrstuvwxyz",length:3,count:0,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:-1,bonus:0,penalty:-5};this.SequentialNumerics={data:"0123456789",length:3,count:0,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:-1,bonus:0,penalty:-5};this.KeyboardPatterns={data:["qwertzuiop","asdfghjkl","yxcvbnm","!\"§$%&/()=","1234567890","qaywsxedcrfvtgbzhnujmik,ol.pö-üä+#","qwertyuiop","asdfghjkl","zyxcvbnm","!@#$%^&*()_","1234567890","qazwsxedcrfvtgbyhnujmik,ol.p;/[']\\"],length:4,count:0,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:-1,bonus:0,penalty:-10};this.RepeatedSequences={length:3,count:0,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:0,penalty:-5};this.MirroredSequences={length:3,count:0,formula:"TBD",status:this.STATUS.FAILED,rating:0,factor:0,bonus:0,penalty:-5};this.checkPassword=function(password)
{if(!password)
{password="";}
var nTmpAlphaUC=-1;var nTmpAlphaLC=-1;var nTmpNumber=-1;var nTmpSymbol=-1;this.PasswordLength.count=password.length;this.RecommendedPasswordLength.count=password.length;var passwordArray=password.split("");for(var a=0;a<passwordArray.length;a++)
{if(passwordArray[a].match(/[A-Z]/g))
{if(nTmpAlphaUC!=-1)
{if((nTmpAlphaUC+1)==a)
{this.nConsecutiveUppercaseLetters++;this.nConsecutiveLetters++;}}
nTmpAlphaUC=a;this.UppercaseLetters.count++;}
else if(passwordArray[a].match(/[a-z]/g))
{if(nTmpAlphaLC!=-1)
{if((nTmpAlphaLC+1)==a)
{this.nConsecutiveLowercaseLetters++;this.nConsecutiveLetters++;}}
nTmpAlphaLC=a;this.LowercaseLetters.count++;}
else if(passwordArray[a].match(/[0-9]/g))
{if(a>0&&a<(passwordArray.length-1))
{this.MiddleNumerics.count++;}
if(nTmpNumber!=-1)
{if((nTmpNumber+1)==a)
{this.nConsecutiveNumbers++;this.nConsecutiveLetters++;}}
nTmpNumber=a;this.Numerics.count++;}
else if(passwordArray[a].match(new RegExp(/[^a-zA-Z0-9]/g)))
{if(a>0&&a<(passwordArray.length-1))
{this.MiddleSymbols.count++;}
if(nTmpSymbol!=-1)
{if((nTmpSymbol+1)==a)
{this.nConsecutiveSymbols++;this.nConsecutiveLetters++;}}
nTmpSymbol=a;this.Symbols.count++;}}
if(passwordArray.length>1)
{var uniqueCharacters=new Array();for(var a=0;a<passwordArray.length;a++)
{var found=false;for(var b=a+1;b<passwordArray.length;b++)
{if(passwordArray[a]==passwordArray[b])
{found=true;}}
if(found==false)
{uniqueCharacters.push(passwordArray[a]);}}
this.Redundancy.value=passwordArray.length/uniqueCharacters.length;}
var lowercasedPassword=password.toLowerCase();if(this.PasswordLength.count>=this.SequentialLetters.length)
{for(var s=0;s<this.SequentialLetters.data.length-this.SequentialLetters.length;s++)
{var sFwd=this.SequentialLetters.data.substring(s,s+this.SequentialLetters.length);var sRev=this.strReverse(sFwd);if(lowercasedPassword.indexOf(sFwd)!=-1)
{this.SequentialLetters.count++;}
if(lowercasedPassword.indexOf(sRev)!=-1)
{this.SequentialLetters.count++;}}}
if(this.PasswordLength.count>=this.SequentialNumerics.length)
{for(var s=0;s<this.SequentialNumerics.data.length-this.SequentialNumerics.length;s++)
{var sFwd=this.SequentialNumerics.data.substring(s,s+this.SequentialNumerics.length);var sRev=this.strReverse(sFwd);if(lowercasedPassword.indexOf(sFwd)!=-1)
{this.SequentialNumerics.count++;}
if(lowercasedPassword.indexOf(sRev)!=-1)
{this.SequentialNumerics.count++;}}}
var patternsMatched=new Array();if(this.PasswordLength.count>=this.KeyboardPatterns.length)
{for(p in this.KeyboardPatterns.data)
{var pattern=this.KeyboardPatterns.data[p];for(var s=0;s<pattern.length-this.KeyboardPatterns.length;s++)
{var sFwd=pattern.substring(s,s+this.KeyboardPatterns.length);var sRev=this.strReverse(sFwd);if(lowercasedPassword.indexOf(sFwd)!=-1)
{if(patternsMatched[sFwd]==undefined)
{this.KeyboardPatterns.count++;patternsMatched[sFwd]=sFwd;}}
if(lowercasedPassword.indexOf(sRev)!=-1)
{if(patternsMatched[sRev]==undefined)
{this.KeyboardPatterns.count++;patternsMatched[sRev]=sRev;}}}}}
if(this.PasswordLength.count>this.RepeatedSequences.length)
{for(var s=0;s<lowercasedPassword.length-this.RepeatedSequences.length;s++)
{var sFwd=lowercasedPassword.substring(s,s+this.RepeatedSequences.length);var result=lowercasedPassword.indexOf(sFwd,s+this.RepeatedSequences.length);if(result!=-1)
{this.RepeatedSequences.count++;}}}
if(this.PasswordLength.count>this.MirroredSequences.length)
{for(var s=0;s<lowercasedPassword.length-this.MirroredSequences.length;s++)
{var sFwd=lowercasedPassword.substring(s,s+this.MirroredSequences.length);var sRev=this.strReverse(sFwd);var result=lowercasedPassword.indexOf(sRev,s+this.MirroredSequences.length);if(result!=-1)
{this.MirroredSequences.count++;}}}
this.Score.count=this.PasswordLength.count*this.PasswordLength.factor;if(this.PasswordLength.count<this.PasswordLength.minimum)
{this.PasswordLength.rating=this.PasswordLength.penalty;}
else if(this.PasswordLength.count>=this.PasswordLength.minimum)
{this.PasswordLength.rating=this.PasswordLength.bonus+
(this.PasswordLength.count-this.PasswordLength.minimum)*this.PasswordLength.factor;}
this.Score.count+=this.PasswordLength.rating;if(this.PasswordLength.count>=this.RecommendedPasswordLength.minimum)
{this.RecommendedPasswordLength.rating=this.RecommendedPasswordLength.bonus+
(this.PasswordLength.count-this.RecommendedPasswordLength.minimum)*this.RecommendedPasswordLength.factor;}
else
{this.RecommendedPasswordLength.rating=this.RecommendedPasswordLength.penalty;}
this.Score.count+=this.RecommendedPasswordLength.rating;if(this.LowercaseLetters.count>0)
{this.LowercaseLetters.rating=this.LowercaseLetters.bonus+(this.LowercaseLetters.count*this.LowercaseLetters.factor);}
else
{this.LowercaseLetters.rating=this.LowercaseLetters.penalty;}
this.Score.count+=this.LowercaseLetters.rating;if(this.UppercaseLetters.count>0)
{this.UppercaseLetters.rating=this.UppercaseLetters.bonus+(this.UppercaseLetters.count*this.UppercaseLetters.factor);}
else
{this.UppercaseLetters.rating=this.UppercaseLetters.penalty;}
this.Score.count+=this.UppercaseLetters.rating;if(this.Numerics.count>0)
{this.Numerics.rating=this.Numerics.bonus+(this.Numerics.count*this.Numerics.factor);}
else
{this.Numerics.rating=this.Numerics.penalty;}
this.Score.count+=this.Numerics.rating;if(this.Symbols.count>0)
{this.Symbols.rating=this.Symbols.bonus+(this.Symbols.count*this.Symbols.factor);}
else
{this.Symbols.rating=this.Symbols.penalty;}
this.Score.count+=this.Symbols.rating;if(this.MiddleSymbols.count>0)
{this.MiddleSymbols.rating=this.MiddleSymbols.bonus+(this.MiddleSymbols.count*this.MiddleSymbols.factor);}
else
{this.MiddleSymbols.rating=this.MiddleSymbols.penalty;}
this.Score.count+=this.MiddleSymbols.rating;if(this.MiddleNumerics.count>0)
{this.MiddleNumerics.rating=this.MiddleNumerics.bonus+(this.MiddleNumerics.count*this.MiddleNumerics.factor);}
else
{this.MiddleNumerics.rating=this.MiddleNumerics.penalty;}
this.Score.count+=this.MiddleNumerics.rating;if(this.SequentialLetters.count==0)
{this.SequentialLetters.rating=this.SequentialLetters.bonus;}
else
{this.SequentialLetters.rating=this.SequentialLetters.penalty+(this.SequentialLetters.count*this.SequentialLetters.factor);}
this.Score.count+=this.SequentialLetters.rating;if(this.SequentialNumerics.count==0)
{this.SequentialNumerics.rating=this.SequentialNumerics.bonus;}
else
{this.SequentialNumerics.rating=this.SequentialNumerics.penalty+(this.SequentialNumerics.count*this.SequentialNumerics.factor);}
this.Score.count+=this.SequentialNumerics.rating;if(this.KeyboardPatterns.count==0)
{this.KeyboardPatterns.rating=this.KeyboardPatterns.bonus;}
else
{this.KeyboardPatterns.rating=this.KeyboardPatterns.penalty+(this.KeyboardPatterns.count*this.KeyboardPatterns.factor);}
this.Score.count+=this.KeyboardPatterns.rating;if(this.RepeatedSequences.count==0)
{this.RepeatedSequences.rating=this.RepeatedSequences.bonus;}
else
{this.RepeatedSequences.rating=this.RepeatedSequences.penalty+(this.RepeatedSequences.count*this.RepeatedSequences.factor);}
this.Score.count+=this.RepeatedSequences.rating;if(this.MirroredSequences.count==0)
{this.MirroredSequences.rating=this.MirroredSequences.bonus;}
else
{this.MirroredSequences.rating=this.MirroredSequences.penalty+(this.MirroredSequences.count*this.MirroredSequences.factor);}
this.Score.count+=this.MirroredSequences.rating;this.BasicRequirements.count=0;this.PasswordLength.status=this.determineStatus(this.PasswordLength.count-this.PasswordLength.minimum);if(this.PasswordLength.status!=this.STATUS.FAILED)
{this.BasicRequirements.count++;}
this.UppercaseLetters.status=this.determineStatus(this.UppercaseLetters.count-this.UppercaseLetters.minimum);if(this.UppercaseLetters.status!=this.STATUS.FAILED)
{this.BasicRequirements.count++;}
this.LowercaseLetters.status=this.determineStatus(this.LowercaseLetters.count-this.LowercaseLetters.minimum);if(this.LowercaseLetters.status!=this.STATUS.FAILED)
{this.BasicRequirements.count++;}
this.Numerics.status=this.determineStatus(this.Numerics.count-this.Numerics.minimum);if(this.Numerics.status!=this.STATUS.FAILED)
{this.BasicRequirements.count++;}
this.Symbols.status=this.determineStatus(this.Symbols.count-this.Symbols.minimum);if(this.Symbols.status!=this.STATUS.FAILED)
{this.BasicRequirements.count++;}
this.BasicRequirements.status=this.determineStatus(this.BasicRequirements.count-this.BasicRequirements.minimum);if(this.BasicRequirements.status!=this.STATUS.FAILED)
{this.BasicRequirements.rating=this.BasicRequirements.bonus+
(this.BasicRequirements.factor*this.BasicRequirements.count);}
else
{this.BasicRequirements.rating=this.BasicRequirements.penalty;}
this.Score.count+=this.BasicRequirements.rating;this.RecommendedPasswordLength.status=this.determineStatus(this.PasswordLength.count-this.RecommendedPasswordLength.minimum);this.MiddleNumerics.status=this.determineStatus(this.MiddleNumerics.count-this.MiddleNumerics.minimum);this.MiddleSymbols.status=this.determineStatus(this.MiddleSymbols.count-this.MiddleSymbols.minimum);this.SequentialLetters.status=this.determineBinaryStatus(this.SequentialLetters.count);this.SequentialNumerics.status=this.determineBinaryStatus(this.SequentialNumerics.count);this.KeyboardPatterns.status=this.determineBinaryStatus(this.KeyboardPatterns.count);this.RepeatedSequences.status=this.determineBinaryStatus(this.RepeatedSequences.count);this.MirroredSequences.status=this.determineBinaryStatus(this.MirroredSequences.count);this.Score.beforeRedundancy=this.Score.count;if(this.PasswordLength.status!=this.STATUS.FAILED)
{if(this.Redundancy.value<=this.Redundancy.permitted)
{}
else
{if(this.Score.count>0)
{var value=(this.Redundancy.value-this.Redundancy.permitted)+1;this.Score.count=this.Score.count*(1/value);}}}
else
{if(this.Score.count>0)
{this.Score.count=this.Score.count*(1/this.Redundancy.value);}}
if(this.Score.count>100)
{this.Score.adjusted=100;}
else if(this.Score.count<0)
{this.Score.adjusted=0;}
else
{this.Score.adjusted=this.Score.count;}
for(var i=0;i<this.Complexity.limits.length;i++)
{if(this.Score.adjusted<=this.Complexity.limits[i])
{this.Complexity.value=i;break;}}
return this.Complexity.value;};};PasswordMeter.prototype.COMPLEXITY_STR=['Very Weak','Weak','Good','Strong','Very Strong'];var FS_UI_PasswordMeter=new Class({initialize:function(input){this.input=$(input);this.meter=new Element('span',{'id':this.input.get('id')+'-pm','class':'password-meter'});this.pm=new PasswordMeter();this.pm.PasswordLength.minimum=6;this.meter.inject(this.input,'after');this.input.addEvents({'keyup':this.update.bindWithEvent(this),'focus':function(e){this.meter.addClass('password-meter-focus');}.bindWithEvent(this),'blur':function(e){this.meter.removeClass('password-meter-focus');}.bindWithEvent(this)});this.update();},hexval:function(d){var h=d.toString(16);if(h.length<2)h='0'+h;return h;},getColour:function(percent)
{var r=(percent<50)?255:255-Math.round(((percent-50)/50.0)*255.0);var g=(percent<50)?Math.round(percent/50.0*255.0):255;return'#'+this.hexval(r)+this.hexval(g)+'00';},update:function(){this.pm.checkPassword(this.input.value);if(this.pm.PasswordLength.status!=this.pm.STATUS.FAILED){this.meter.set({'html':this.pm.COMPLEXITY_STR[this.pm.Complexity.value]+' ('+Math.round(this.pm.Score.adjusted)+'%)','styles':{'background-color':this.getColour(this.pm.Score.adjusted)}});}
else{this.meter.set({'html':'Too Short','styles':{'background-color':'#f00'}});}}});var pm=null;window.addEvent('domready',function(){var pb=$('user_password');if(pb)
{pb.addEvent('focus',function(){if(pm)return;pm=new FS_UI_PasswordMeter(pb);});}});