;(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);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);}
setMeterUI(b,s,o,(m.length>0)?m:null);}
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);