Passed
Push — development ( d00063...059805 )
by Nils
06:01
created

includes/js/simplePassMeter/simplePassMeter.js   F

Complexity

Total Complexity 130
Complexity/F 4.19

Size

Lines of Code 1
Function Count 31

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 0
nc 566231040
dl 0
loc 1
rs 3.12
c 0
b 0
f 0
wmc 130
mnd 6
bc 108
fnc 31
bpm 3.4838
cpm 4.1935
noi 6

How to fix   Complexity   

Complexity

Complex classes like includes/js/simplePassMeter/simplePassMeter.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

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)}});return n};function audit(o){var d=$.fn.simplePassMeter.defaults;o.showOnFocus=!!o.showOnFocus;o.showOnValue=!!o.showOnValue;o.location=($.inArray(o.location,['t','r','b','l'])<0)?d.location:o.location;o.offset=(Number(o.offset))?Number(o.offset):d.offset;var c=o.container;c=(c)?$(c):null;o.container=(c&&c.length)?c:null;var rq=o.requirements;if(!rq){rq=d.requirements}else{for(var k in rq){if(!d.requirements[k]){if(typeof rq[k].value=='undefined'||typeof rq[k].message!='string'||(typeof rq[k].regex!='string'&&!$.isFunction(rq[k].callback))){rq[k]=null;continue}else{continue}}if(typeof rq[k].value=='undefined'){rq[k].value=d.requirements[k].value}if(typeof rq[k].message!='string'){rq[k].message=d.requirements[k].message}if(typeof rq[k].regex!='string'&&d.requirements[k].regex){rq[k].regex=d.requirements[k].regex}if(!$.isFunction(rq[k].callback)&&d.requirements[k].callback){rq[k].callback=d.requirements[k].callback}if(k=='minLength'){if(!Number(rq[k].value)||rq[k].value<1){rq[k].value=d.requirements[k].value}}}}if(rq['matchField']){$(rq['matchField'].value).bind('keyup.simplePassMeterMatch',function(){$(this).attr('active','true').unbind('keyup.simplePassMeterMatch')})}if(!o.ratings||!o.ratings.length){o.ratings=d.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=d.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 mId=n.attr('id')+'_simplePassMeter';var b=$("<div id='"+mId+"' class='simplePassMeter' aria-controlled>").append("<p><span class='simplePassMeterIcon'></span><span class='simplePassMeterText'></span></p>"+"<div class='simplePassMeterBar'><div class='simplePassMeterProgress'></div></div>").appendTo('body').css('padding-bottom','8px');n.attr('aria-controls',mId);if(o.container){o.container.append(b);b.css('position','relative')}else{b.css('position','absolute');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(){n.attr('active','true');testPass(n,b,o)});n.on('blur.simplePassMeter',function(){n.attr('active','true');testPass(n,b,o)});n.on('focus.simplePassMeter',function(){n.attr('active','true');testPass(n,b,o)});if(o.showOnFocus){b.hide();n.bind('focus.simplePassMeter',function(){b.show()}).bind('blur.simplePassMeter',function(){b.hide()})}if(o.showOnValue){n.bind('keyup.simplePassMeter',function(){if(this.value.length<1){b.hide()}else{b.show()}});n.trigger('keyup.simplePassMeter')}$.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)})}}});if(!o.container){$(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 m='';var re,rm;var rq=o.requirements;for(var k in rq){if(rq[k]&&rq[k].value){if(rq[k].regex&&rq[k].regex.length>0){re=new RegExp(rq[k].regex);if(!re.test(p)){if(m.length>0){m+='<br />'}m+=rq[k].message.replace('%V',rq[k].value)}}else if(rq[k].callback&&$.isFunction(rq[k].callback)){if(!rq[k].callback(p,rq[k].value)){if(m.length>0){m+='<br />'}m+=rq[k].message.replace('%V',rq[k].value)}}}}var s=0;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 letters="abcdefghijklmnopqrstuvwxyz";var strength={'testNumChars':function(p){return(p.length*4)},'testUpper':function(p){var m=p.match(/[A-Z]/g);if(m){return((m.length-1)*3)}return 0},'testLower':function(p){var m=p.match(/[a-z]/g);if(m){return((m.length-1)*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-1)*3)}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(letters.indexOf(ch[i])>-1){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}};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(o.defaultText)}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={'showOnFocus':false,'showOnValue':false,'location':'r','offset':3,'container':null,'defaultText':'Password Strength','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).val();if(v&&v.length&&p.indexOf(v)>-1){return false}return true},'message':'Your password cannot contain your username'},'matchField':{'value':null,'callback':function(p,v){v=$(v);var m=v.val();var d=(v.attr('active')&&(m&&m.length>0))?1:0;if(d&&m!=p){return false}return true},'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);