UNPKG

fortify-js

Version:

A password strength indicator.

1 lines 3.16 kB
!function(){function r(e){if(!e)return{score:0,feedback:"nothing"};var t,i=0,r={};e.split("").forEach(function(e){r[e]=(r[e]||0)+1,i+=5/r[e]});var n={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)},s=0;for(var a in n)s+=!0===n[a]?1:0;return t=0===(i+=10*(s-1))?"nothing":80<i?"strong":60<i&&i<=80?"good":30<i&&i<=60?"okay":"weak",{number:parseInt(i),feedback:t}}function n(e){var t,i=e.target.self;t&&clearTimeout(t),t=setTimeout(function(){var e,t=r(i.field.value);i.settings.feedback&&(i.innerBar.className="fortify fortify-"+t.feedback,i.innerBar.textContent=(e=t.feedback).charAt(0).toUpperCase()+e.slice(1),i.settings.progressBar&&(i.innerBar.style.width=t.number+"%")),i.settings.callback&&i.settings.callback(t.number,t.feedback)},i.settings.keyTimeout)}function s(e){var t,i=e.target.self;t&&clearTimeout(t),t=setTimeout(function(){var e=r(i.field.value);if(i.settings.feedback){if(!i.confirmField.value)return i.confirmInnerBar.className="fortify fortify-nothing",void(i.confirmInnerBar.textContent="");if(!i.field.value)return i.confirmInnerBar.className="fortify fortify-weak",void(i.confirmInnerBar.textContent="There is nothing in the password field");i.field.value===i.confirmField.value?e.number<=60?(i.confirmInnerBar.className="fortify fortify-"+e.feedback,i.confirmInnerBar.textContent="Password matches, but it is not particularly good"):(i.confirmInnerBar.className="fortify fortify-"+e.feedback,i.confirmInnerBar.textContent="Password matches"):(i.confirmInnerBar.className="fortify fortify-weak",i.confirmInnerBar.textContent="The passwords do not match")}},i.settings.keyTimeout)}function a(e){var t=e.target.self;t.settings.allowSubmission||(r(t.field.value).number<=60||t.field.value!=t.confirmField.value)&&e.preventDefault()}this.Fortify=function(e,t,i){this.field=e,this.confirmField=t,this.form=this.field.form,this.settings=function(e,t){for(property in t)t.hasOwnProperty(property)&&(e[property]=t[property]);return e}({allowSubmission:!0,callback:null,feedback:!0,keyTimeout:150,progressBar:!0},i),this.bar=document.createElement("div"),this.innerBar=document.createElement("div"),this.confirmBar=document.createElement("div"),this.confirmInnerBar=document.createElement("div"),this.bar.className="fortify-bar",this.innerBar.className="fortify fortify-nothing",this.confirmBar.className="fortify-bar",this.confirmInnerBar.className="fortify fortify-nothing",this.bar.appendChild(this.innerBar),this.field.parentNode.insertBefore(this.bar,this.field.nextSibling),this.confirmBar.appendChild(this.confirmInnerBar),this.confirmField.parentNode.insertBefore(this.confirmBar,this.confirmField.nextSibling),(((this.field.self=this).confirmField.self=this).form.self=this).field.addEventListener("keypress",n),this.field.addEventListener("keyup",n),this.field.addEventListener("keydown",n),this.field.addEventListener("keypress",s),this.field.addEventListener("keyup",s),this.field.addEventListener("keydown",s),this.confirmField.addEventListener("keypress",s),this.confirmField.addEventListener("keyup",s),this.confirmField.addEventListener("keydown",s),this.form.addEventListener("submit",a)}}();