
/* - jquery.simplePassMeter.js - */
// http://www.bdk.de/portal_javascripts/jquery.simplePassMeter.js?original=1
;(function($){$.fn.simplePassMeter=function(o){var n=this;if(n.length<1){return n}
o=(o)?o:{};o=audit($.extend({},$.fn.simplePassMeter.defaults,o));n.each(function(){if(this.tagName.toLowerCase()=='input'&&this.type=='password'){setup(this,o)}})}
var audit=function(o){if(!o.requirements){o.requirements=$.fn.simplePassMeter.defaults.requirements} else{for(var k in o.requirements){if(!$.fn.simplePassMeter.defaults.requirements[k]){if(typeof o.requirements[k].value=='undefined'||typeof o.requirements[k].message!='string'||(typeof o.requirements[k].regex!='string'&&!$.isFunction(o.requirements[k].callback))){o.requirements[k]=null} else{continue}}
if(typeof o.requirements[k].value=='undefined'){o.requirements[k].value=$.fn.simplePassMeter.defaults.requirements[k].value}
if(typeof o.requirements[k].message!='string'){o.requirements[k].message=$.fn.simplePassMeter.defaults.requirements[k].message}
if(typeof o.requirements[k].regex!='string'&&$.fn.simplePassMeter.defaults.requirements[k].regex){o.requirements[k].regex=$.fn.simplePassMeter.defaults.requirements[k].regex}
if(!$.isFunction(o.requirements[k].callback)&&$.fn.simplePassMeter.defaults.requirements[k].callback){o.requirements[k].callback=$.fn.simplePassMeter.defaults.requirements[k].callback}
if(k=='minLength'){if(!Number(o.requirements[k].value)||o.requirements[k].value<1){o.requirements[k].value=$.fn.simplePassMeter.defaults.requirements[k].value}}}}
if(!o.ratings||!o.ratings.length){o.ratings=$.fn.simplePassMeter.defaults.ratings} else{var ps=0;for(var i=0,l=o.ratings.length;i<l;++i){if((!Number(o.ratings[i].minScore)&&o.ratings[i].minScore!==0)||o.ratings[i].minScore<ps){o.ratings=$.fn.simplePassMeter.defaults.ratings;break}
ps=o.ratings[i].minScore;if(!o.ratings[i].className){o.ratings[i].className='good'}
if(!o.ratings[i].text){o.ratings[i].text='Good'}}}
return o}
function setup(n,o){n=$(n);if(n.attr('id').length<1){n.attr('id','simplePassMeter_'+(++$.fn.simplePassMeter.uid))}
n.addClass('simplePassMeterInput');var base=n.attr('id');$('body').append("<div id='"+base+"_simplePassMeter' class='simplePassMeter' aria-controlled>"+"<p><span class='simplePassMeterIcon'></span><span class='simplePassMeterText'></span></p>"+"<div class='simplePassMeterBar'><div class='simplePassMeterProgress'></div></div>"+"</div>");n.attr('aria-controls',base+'_simplePassMeter');var b=$('#'+base+'_simplePassMeter').css({'position':'absolute','padding-bottom':'8px'});reposition(n,b,o);var m=b.find('.simplePassMeterBar').css({'position':'absolute','bottom':'0.15em','left':'5px','height':'5px','width':'95%'});var mp=m.find('.simplePassMeterProgress').css({'height':'5px','width':'0%'});n.bind('keyup.simplePassMeter', function(){testPass(n,b,o)});$.each(o.requirements, function(key,req){if (/.+Field$/.test(key)){var f=$(req.value);if(f.length==1){f.bind('keyup.simplePassMeter', function(){testPass(n,b,o)})}}});$(window).resize(function(){reposition(n,b,o)});reset(b,o)}
function reposition(n,box,o){var t,b,r,l,ielr;t=b=l=r='auto';ielr=(document.all)?2:0;var pos=n.offset();var pl=pos.left;var pt=pos.top;if(o.location=='t'){l=pl+'px';t=(pt-box.height()-10-o.offset)+'px'} else if(o.location=='b'){l=pl+'px';t=(pt+n.height()+7+o.offset)+'px'} else if(o.location=='l'){r=($('body').width()-pl+o.offset)+'px';t=pt+'px'} else{l=(pl+n.width()+4+ielr+o.offset)+'px';t=pt+'px'}
box.css({'top':t,'right':r,'bottom':b,'left':l})}
function testPass(n,b,o){var p=n.val();if(p.length<1){reset(b,o);n.trigger('score.simplePassMeter',[0]);return}
var s=0;var m='';var re,rm;for(var k in o.requirements){if(o.requirements[k]&&o.requirements[k].value){if(o.requirements[k].regex&&o.requirements[k].regex.length>0){re=new RegExp(o.requirements[k].regex);if(!re.test(p)){if(m.length>0){m+='<br />'}
m+=o.requirements[k].message.replace('%V',o.requirements[k].value)}} else if(o.requirements[k].callback&&$.isFunction(o.requirements[k].callback)){if(!o.requirements[k].callback(p,o.requirements[k].value)){if(m.length>0){m+='<br />'}
m+=o.requirements[k].message.replace('%V',o.requirements[k].value)}}}}
var c;for(var t in strength){s+=strength[t](p)}
s=Math.min(Math.round(s),100);setMeterUI(b,s,o,(m.length>0)?m:null);n.trigger('score.simplePassMeter',[s])}
var strength={'testNumChars': function(p){return(p.length * 4)},'testUpper': function(p){var m=p.match(/[A-Z]/g);if(m){return((p.length-m.length) * 3)}
return 0},'testLower': function(p){var m=p.match(/[a-z]/g);if(m){return((p.length-m.length) * 3)}
return 0},'testLettersOnly': function(p){if (/^[a-zA-Z]$/.test(p)){return p.length *-1}
return 0},'testNumbers': function(p){var m=p.match(/[0-9]/g);if(m){return(m.length * 5)}
return 0},'testNumbersOnly': function(p){if (/^[0-9]$/.test(p)){return p.length *-1}
return 0},'testSpecial': function(p){var m=p.match(/[^a-zA-Z0-9]/g);if(m){return(m.length * 6.5)}
return 0},'testSequentialAndConsecutive': function(p){var m=[];var ch=p.split('');var hl='',hn='',hsl='',hsn='';var cn,ln,lli,cli;for(var i=0,l=ch.length;i<l;++i){cn=Number(ch[i]);if(cn){if(hl.length>0){m.push(hl)}
if(hsl.length>2){m.push(hsl)}
hl=hsl='';hn+=cn;if(hsn.length==0){hsn+=cn} else{ln=Number(hsn.substr(hsn.length-1));if(cn==(ln+1)||cn==(ln-1)){hsn+=cn}}} else{if(hn.length>0){m.push(hn)}
if(hsn.length>2){m.push(hsn)}
hn=hsn='';hl+=ch[i];if(hsl.length==0){hsl+=ch[i]} else{lli=letters.indexOf(hsn.substr(hsn.length-1));cli=letters.indexOf(ch[i]);if(cli==(lli+1)){hsl+=ch[i]}}}}
if(hn.length>0){m.push(hn)}
if(hl.length>0){m.push(hl)}
var c=0;for(var i=0,l=m.length;i<l;++i){c-=((m[i].length-1) * 2)}
return c},'testRepeat': function(p){var c=0;var m=p.match(/(.)\1+/g);if(m){for(var i=0,l=m.length;i<l;++i){c-=((m[i].length-1) * m[i].length)}}
return c}};var letters="abcdefghijklmnopqrstuvwxyz";
function reset(b,o){var c='';for(var i=0,l=o.ratings.length;i<l;++i){c+=o.ratings[i].className+' '}
b.removeClass(c).find('.simplePassMeterProgress').css('width','0%').end().find('.simplePassMeterText').text('Password Strength')}
function setMeterUI(b,pct,o,m){pct=(Number(pct))?pct:0;pct=Math.min(Math.max(pct,0),100);m=(typeof m=='string')?m:null;b.find('.simplePassMeterProgress').css('width',pct+'%');var c='';var r=0;for(var i=0,l=o.ratings.length;i<l;++i){c+=o.ratings[i].className+' ';if(pct>=o.ratings[i].minScore){r=i}}
b.removeClass(c);if(!m){b.addClass(o.ratings[r].className)} else{b.addClass(o.ratings[0].className)}
b.find('.simplePassMeterText').html(((m)?m:o.ratings[r].text))}
$.fn.simplePassMeter.uid=0;$.fn.simplePassMeter.defaults={'location':'r','offset':3,'requirements':{'minLength':{'value':8,'callback': function(p,v){p=''+p;if(p.length>=v){return true}
return false},'message':'Passwords need to be %V characters or more'},'noMatchField':{'value':null,'callback': function(p,v){v=$(v);if(v.length!=1||p.indexOf(v.val())<0){return true}
return false},'message':'Your password cannot contain your username'},'matchField':{'value':null,'callback': function(p,v){v=$(v);if(v.length==1&&v.val()==p){return true}
return false},'message':'The two passwords you entered don\'t match'},'letters':{'value':true,'regex':'[a-zA-Z]+','message':'You must have at least one letter'},'numbers':{'value':true,'regex':'[0-9]+','message':'You must have at least one number'},'lower':{'value':false,'regex':'[a-z]+','message':'You must have at least one lower case letter'},'upper':{'value':false,'regex':'[A-Z]+','message':'You must have at least one upper case letter'},'special':{'value':false,'regex':'[^a-zA-Z0-9]+','message':'You must have at least one special character'}},'ratings':[{'minScore':0,'className':'meterFail','text':'You need a stronger password'},{'minScore':25,'className':'meterWarn','text':'Your password is a bit weak'},{'minScore':50,'className':'meterGood','text':'Your password is good'},{'minScore':75,'className':'meterExcel','text':'Great password!'}]}})(jQuery);

