/*! * @copyright © Kartik Visweswaran, Krajee.com, 2015 * @version 1.1.1 * A dynamic strength meter for password input validation with various configurable options. * Inspired from [password meter](http://passwordmeter.com) created by Jeff Todnem. * For more JQuery plugins visit http://plugins.krajee.com * For more Yii related demos visit http://demos.krajee.com */!function(e){"use strict";String.prototype.strReverse=function(){for(var e="",t=0;t=e?0>=e?0:Math.ceil(e/20):5},s=function(e,t){if(r(e))return 0;var n,s,a,l,i,o,c=0,u=0,d=0,v=0,g=0,p=0,h=0,f=0,m=0,b=0,C=0,$=0,k=0,y=0,w=0,T=0,S=0,x=t.midChar,M=t.consecAlphaUC,A=t.consecAlphaLC,I=t.consecNumber,L=t.seqAlpha,V=t.seqNumber,D=t.seqSymbol,q=t.length,O=t.number,N=t.symbol,R=-1,j=-1,B="",U="",E="abcdefghijklmnopqrstuvwxyz",W="01234567890",z=")!@#$%^&*()",G=e.length*q,H=e.length,P="",Q=e.replace(/\s+/g,"").split(/\s*/),F=Q.length;for(l=0;F>l;l++){if(P=Q[l],P.toUpperCase()!==P){-1!==R&&R+1===l&&(m++,k++),R=l,c++;break}for(P.toLowerCase()!==P?(-1!==j&&j+1===l&&(b++,k++),j=l,u++):P.match(/[0-9]/g)?(l>0&&F-1>l&&g++,""!==B&&B+1===l&&(C++,k++),B=l,d++):P.match(/[^\w]/g)&&(l>0&&F-1>l&&g++,""!==U&&U+1===l&&($++,k++),U=l,v++),o=!1,i=0;F>i;i++)Q[l]===Q[i]&&l!==i&&(o=!0,f+=Math.abs(F/(i-l)));o&&(h++,p=F-h,f=Math.ceil(p?f/p:f))}for(n=0;23>n;n++)s=E.substring(n,n+3),a=s.strReverse(),(-1!==e.toLowerCase().indexOf(s)||-1!==e.toLowerCase().indexOf(a))&&(y++,S++);for(n=0;8>n;n++)s=W.substring(n,n+3),a=s.strReverse(),(-1!==e.toLowerCase().indexOf(s)||-1!==e.toLowerCase().indexOf(a))&&(w++,S++);for(n=0;8>n;n++)s=z.substring(n,n+3),a=s.strReverse(),(-1!==e.toLowerCase().indexOf(s)||-1!==e.toLowerCase().indexOf(a))&&(T++,S++);return c>0&&H>c&&(G+=2*(H-c)),u>0&&H>u&&(G+=2*(H-u)),d>0&&H>d&&(G+=d*O),v>0&&(G+=v*N),g>0&&(G+=g*x),(u>0||c>0)&&0===v&&0===d&&(G-=H),0===u&&0===c&&0===v&&d>0&&(G-=H),h>0&&(G-=f),m>0&&(G-=m*M),b>0&&(G-=b*A),C>0&&(G-=C*I),y>0&&(G-=y*L),w>0&&(G-=w*V),T>0&&(G-=T*D),G=0>=G?H>=q?1:0:Math.min(G,100)},a=function(n,a){var l,i=this;e.each(a,function(e,t){i[e]=t}),i.$element=e(n),i.verdicts=i.generateVerdicts(),i.setDefault("toggleClass","kv-toggle"),i.setDefault("meterClass","kv-meter"),i.setDefault("scoreBarClass","kv-scorebar"),i.setDefault("scoreClass","kv-score"),i.setDefault("verdictClass","kv-verdict"),i.setDefault("containerClass","kv-password"),r(i.$element.attr("id"))&&i.$element.attr("id",t()),i.initialValue=r(i.$element.val())?"":i.$element.val(),l=s(i.initialValue,i.rules),i.$container=i.createContainer(),i.$elToggle=i.$container.find(".kv-toggle"),i.$elScorebar=i.$container.find(".kv-scorebar"),i.$elScore=i.$container.find(".kv-score"),i.$elVerdict=i.$container.find(".kv-verdict"),i.$elScoreInput=e(document.createElement("input")).attr("type","hidden").val(l),i.$container.append(i.$elScoreInput),i.paint(l),i.listen()};a.prototype={constructor:a,setDefault:function(e,t){var n=this;r(n[e])&&(n[e]=t)},setType:function(e){var t=this,r=t.$element,n=r.clone(!0);n.attr("type",e).insertAfter(r),r.remove(),t.$element=n},generateVerdicts:function(){var e,t=this,r=[];for(e=0;6>e;e++)r[e]='
'+t.verdictTitles[e]+"
";return r},listen:function(){var e=this;e.$element.on("keyup",function(t){e.change(t,this.value)}),e.$element.closest("form").on("reset",function(){e.reset()}),e.$elToggle.on("change",function(){e.toggle()})},paint:function(e){var t=this,r=n(e),s=t.verdicts[r];t.$elScore.attr("class",t.scoreClass+" "+t.scoreClass+"-"+r),t.$elScorebar.css("background-position",0-4*e+"px"),t.$elScore.html(e+"%"),t.$elVerdict.html(s)},change:function(e,t){var r=this,n=s(t,r.rules);r.$elScoreInput.val(n),r.paint(n),r.$element.trigger("strength.change")},refresh:function(){var e=this,t=s(e.$element.val(),e.rules);e.$elScoreInput.val(t),e.paint(t)},reset:function(){var e=this,t=s(e.initialValue,e.rules);e.$elScoreInput.val(t),e.paint(t),e.setType("password"),e.$element.trigger("strength.reset")},toggle:function(){var e=this,t=e.$elToggle.is(":checked")?"text":"password";e.setType(t),e.$element.trigger("strength.toggle")},score:function(){return this.$elScoreInput.val()},verdict:function(){var e=this.$elScoreInput.val();return n(e)},createContainer:function(){var t=this,r=t.mainTemplate;r=r.replace("{input}",t.renderInput()),r=r.replace("{meter}",t.renderMeter());var n=e(document.createElement("div")).attr({"class":t.containerClass}).html(r);t.$element.before(n);var s=n.find(".kv-temporary-input"),a=t.$element.detach();return s.before(a),s.remove(),n},renderToggle:function(){var e=this;if(e.toggleMask){var t=e.$element.attr("disabled")?' disabled="true"':"",r=e.$element.attr("readonly")?' readonly="true"':"";return'"}return""},renderInput:function(){var e=this,t=e.inputTemplate;return e.$element.removeClass(e.inputClass).addClass(e.inputClass),t=t.replace("{input}",'
'),t=t.replace("{toggle}",e.renderToggle())},renderMeter:function(){var e=this,t=e.meterTemplate;if(e.showMeter){t=t.replace("{scorebar}",'
'),t=t.replace("{score}",'
'),t=t.replace("{verdict}",'
');var r=e.$element.attr("disabled")?e.meterClass+" kv-disabled":e.meterClass;return'
'+t+"
"}return""}},e.fn.strength=function(t){var r=Array.apply(null,arguments),n=null;return r.shift(),this.each(function(){var s=e(this),l=s.data("strength"),i="object"==typeof t&&t;l||(l=new a(this,e.extend({},e.fn.strength.defaults,i,e(this).data())),s.data("strength",l)),"string"==typeof t&&(n=l[t].apply(l,r))}),n||"score"===t||"verdict"===t||(n=this),n},e.fn.strength.defaults={showMeter:!0,toggleMask:!0,inputTemplate:'
\n{input}\n{toggle}\n
',meterTemplate:'
{scorebar}\n{score}
\n{verdict}',mainTemplate:'\n\n\n
{input}{meter}
',meterClass:"kv-meter",scoreBarClass:"kv-scorebar",scoreClass:"kv-score",verdictClass:"kv-verdict",containerClass:"kv-password",inputClass:"form-control",toggleClass:"kv-toggle",toggleTitle:"Show/Hide Password",verdictTitles:{0:"Too Short",1:"Very Weak",2:"Weak",3:"Good",4:"Strong",5:"Very Strong"},verdictClasses:{0:"label label-default",1:"label label-danger",2:"label label-warning",3:"label label-info",4:"label label-primary",5:"label label-success"},rules:{midChar:2,consecAlphaUC:2,consecAlphaLC:2,consecNumber:2,seqAlpha:3,seqNumber:3,seqSymbol:3,length:4,number:4,symbol:6}},e.fn.strength.Constructor=a,e(function(){var t=e("input.strength[type=password]");t.length>0&&t.strength()})}(window.jQuery);