/**
* password_strength_plugin.js
* Copyright (c) 2009 myPocket technologies (www.mypocket-technologies.com)
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* View the GNU General Public License .
* @author Darren Mason (djmason9@gmail.com)
* @date 3/13/2009
* @projectDescription Password Strength Meter is a jQuery plug-in provide you smart algorithm to detect a password strength. Based on Firas Kassem orginal plugin - http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/
* @version 1.0.1
*
* @requires jquery.js (tested with 1.3.2)
* @param shortPass: "shortPass", //optional
* @param badPass: "badPass", //optional
* @param goodPass: "goodPass", //optional
* @param strongPass: "strongPass", //optional
* @param baseStyle: "testresult", //optional
* @param userid: "", //required override
* @param messageloc: 1 //before == 0 or after == 1
*
*/
(function($){
$.fn.shortPass = 'Too short';
$.fn.badPass = 'Weak';
$.fn.goodPass = 'Good';
$.fn.strongPass = 'Strong';
$.fn.samePassword = 'Username and Password identical.';
$.fn.resultStyle = "";
$.fn.passStrength = function(options) {
var defaults = {
shortPassMsg: "Too short", //optional
badPassMsg: "Weak", //optional
goodPassMsg: "Good", //optional
strongPassMsg: "strongPass", //optional
samePassMsg: "Username and Password identical", //optional
shortPass: "shortPass", //optional
badPass: "badPass", //optional
goodPass: "goodPass", //optional
strongPass: "strongPass", //optional
baseStyle: "testresult", //optional
userid: "", //required override
messageloc: "" //required override
};
var opts = $.extend(defaults, options);
return this.each(function() {
var obj = $(this);
$(obj).unbind().keyup(function()
{
var username = $(opts.userid).val();
username = username.substring(0, username.indexOf("@")).toLowerCase();
var results = $.fn.teststrength($(this).val(),username,opts);
$(opts.messageloc + " > span").remove();
$(opts.messageloc).removeClass(opts.baseStyle);
$(opts.messageloc).removeClass(opts.shortPass);
$(opts.messageloc).removeClass(opts.badPass);
$(opts.messageloc).removeClass(opts.goodPass);
$(opts.messageloc).removeClass(opts.strongPass);
$(opts.messageloc).addClass(opts.baseStyle);
$(opts.messageloc).addClass($(this).resultStyle);
$(opts.messageloc).append("" + results + "");
});
//FUNCTIONS
$.fn.teststrength = function(password,username,option){
var score = 0;
var categories = 0;
//password < 5
if (password.length < 10 ) { this.resultStyle = option.shortPass;return option.shortPassMsg; }
if (password.match(/[0-9]/)){ categories++; }
if (password.match(/[a-z]/)){ categories++; }
if (password.match(/[A-Z]/)){ categories++; }
if (password.match(/[!,@,#,$,%,^,&,*,?,_,~]/)){ categories++; }
if (categories < 3) { this.resultStyle = option.badPass;return option.badPassMsg; }
//password == user name
if (password.toLowerCase().indexOf(username.toLowerCase()) != -1) { this.resultStyle = option.badPass;return option.samePassMsg; }
//password length
score += password.length * 4;
score += ( $.fn.checkRepetition(1,password).length - password.length ) * 1;
score += ( $.fn.checkRepetition(2,password).length - password.length ) * 1;
score += ( $.fn.checkRepetition(3,password).length - password.length ) * 1;
score += ( $.fn.checkRepetition(4,password).length - password.length ) * 1;
//password has 3 numbers
if (password.match(/(.*[0-9].*[0-9].*[0-9])/)){ score += 5;}
//password has 2 symbols
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){ score += 5 ;}
//password has Upper and Lower chars
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){ score += 10;}
//password has number and chars
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)){ score += 15;}
//
//password has number and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)){ score += 15;}
//password has char and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)){score += 15;}
//password is just a numbers or chars
if (password.match(/^\w+$/) || password.match(/^\d+$/) ){ score -= 10;}
//verifying 0 < score < 100
if ( score < 0 ){score = 0;}
if ( score > 100 ){ score = 100;}
if (score < 68 ){ this.resultStyle = option.goodPass;return option.goodPassMsg;}
this.resultStyle= option.strongPass;
return option.strongPassMsg;
};
});
};
})(jQuery);
$.fn.checkRepetition = function(pLen,str) {
var res = "";
for (var i=0; i