/* jQuery Password Strength Plugin (pstrength) - A jQuery plugin to provide accessibility functions
* Author: Tane Piper (digitalspaghetti@gmail.com)
* Website: http://digitalspaghetti.me.uk
* Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
* This code uses a modified version of Steve Moitozo's algorithm (http://www.geekwisdom.com/dyn/passwdmeter)
*
* === Changelog ===
* Version 1.2 (03/09/2007)
* Added more options for colors and common words
* Added common words checked to see if words like 'password' or 'qwerty' are being entered
* Added minimum characters required for password
* Re-worked scoring system to give better results
*
* Version 1.1 (20/08/2007)
* Changed code to be more jQuery-like
*
* Version 1.0 (20/07/2007)
* Initial version.
*/
(function($){
/** @name pstrength
* @var mixed options An object of options
* @returns object jQuery Returns the output to the screen
*/
$.fn.pstrength = function(options) {
var options = $.extend({}, $.fn.pstrength.defaults, options);
return this.each(function(){
var o = $.meta ? $.extend({}, options, $(this).data()) : options;
var infoarea = $(this).attr('id');
if (o.displayMin) {
$(this).after('
The minimum number of characters is ' + o.minchar + '
');
}
$(this).after('');
$(this).after('');
$(this).keyup(function(){
$.fn.pstrength.runPassword($(this).val(), infoarea, o);
});
});
};
$.fn.pstrength.defaults = {
verdects: ["Very Weak","Weak","Medium","Strong","Very Strong"],
colors: ["#f00","#c06", "#f60","#3c0","#3f0"],
scores: [10,15,30,40],
common: ["password","sex","god","123456","123","liverpool","letmein","qwerty","monkey"],
minchar: 6,
displayMin: true
};
$.fn.pstrength.runPassword = function (password, infoarea, options){
// Check password
nPerc = $.fn.pstrength.checkPassword(password, options);
// Get controls
var ctlBar = "#" + infoarea + "_bar";
var ctlText = "#" + infoarea + "_text";
// Color and text
if (nPerc == -200) {
strColor = '#f00';
strText = 'Unsafe Password Word!';
$(ctlBar).css({width: "0%"});
}
else if (nPerc < 0 && nPerc > -199) {
strColor = '#ccc';
strText = 'Too Short';
$(ctlBar).css({width: "1%"});
}
else if(nPerc <= options.scores[0])
{
strColor = options.colors[0];
strText = options.verdects[0];
$(ctlBar).css({width: "1%"});
}
else if (nPerc > options.scores[0] && nPerc <= options.scores[1])
{
strColor = options.colors[1];
strText = options.verdects[1];
$(ctlBar).css({width: "25%"});
}
else if (nPerc > options.scores[1] && nPerc <= options.scores[2])
{
strColor = options.colors[2];
strText = options.verdects[2];
$(ctlBar).css({width: "50%"});
}
else if (nPerc > options.scores[2] && nPerc <= options.scores[3])
{
strColor = options.colors[3];
strText = options.verdects[3];
$(ctlBar).css({width: "75%"});
}
else
{
strColor = options.colors[4];
strText = options.verdects[4];
$(ctlBar).css({width: "99%"});
}
$(ctlBar).css({backgroundColor: strColor});
$(ctlText).html("" + strText + "");
};
$.fn.pstrength.checkPassword = function(password, options)
{
var intScore = 0;
var strVerdict = options.verdects[0];
// PASSWORD LENGTH
if (password.length < options.minchar) // Password too short
{
intScore = (intScore - 100)
}
else if (password.length >= options.minchar && password.length <= (options.minchar + 2)) // Password Short
{
intScore = (intScore + 6)
}
else if (password.length >= (options.minchar + 3) && password.length <= (options.minchar + 4))// Password Medium
{
intScore = (intScore + 12)
}
else if (password.length >= (options.minchar + 5)) // Password Large
{
intScore = (intScore + 18)
}
if (password.match(/[a-z]/)) // [verified] at least one lower case letter
{
intScore = (intScore + 1)
}
if (password.match(/[A-Z]/)) // [verified] at least one upper case letter
{
intScore = (intScore + 5)
}
// NUMBERS
if (password.match(/\d+/)) // [verified] at least one number
{
intScore = (intScore + 5)
}
if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) // [verified] at least three numbers
{
intScore = (intScore + 7)
}
// SPECIAL CHAR
if (password.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)) // [verified] at least one special character
{
intScore = (intScore + 5)
}
// [verified] at least two special characters
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/))
{
intScore = (intScore + 7)
}
// COMBOS
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) // [verified] both upper and lower case
{
intScore = (intScore + 2)
}
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) // [verified] both letters and numbers
{
intScore = (intScore + 3)
}
// [verified] letters, numbers, and special characters
if (password.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/))
{
intScore = (intScore + 3)
}
for (var i=0; i < options.common.length; i++) {
if (password.toLowerCase() == options.common[i]) {
intScore = -200;
}
}
return intScore;
};
})(jQuery);