/**
 * 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 <http://www.gnu.org/licenses/>.

 * @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
 * 
 */
(function($){$.fn.shortPass='Password too short';$.fn.badPass='Password weak';$.fn.goodPass='Password could be stronger';$.fn.strongPass='Good password';$.fn.samePassword='User ID and Password too similar';$.fn.resultStyle="";$.fn.passStrength=function(options){var defaults={shortPass:"shortPass",badPass:"badPass",goodPass:"goodPass",strongPass:"strongPass",baseStyle:"testresult",userid:"",messageloc:1};var opts=$.extend(defaults,options);return this.each(function(){var obj=$(this);$(obj).unbind().keyup(function()
{var results=$.fn.teststrength($(this).val(),$(opts.userid).val(),opts);if(opts.messageloc===1)
{$(this).next("."+opts.baseStyle).remove();$(this).after("<span class=\""+opts.baseStyle+"\"><span></span></span>");$(this).next("."+opts.baseStyle).addClass($(this).resultStyle).find("span").text(results);}
else
{$(this).prev("."+opts.baseStyle).remove();$(this).before("<span class=\""+opts.baseStyle+"\"><span></span></span>");$(this).prev("."+opts.baseStyle).addClass($(this).resultStyle).find("span").text(results);}});$.fn.teststrength=function(password,username,option){var score=0;if(password.length<6){this.resultStyle=option.shortPass;return $(this).shortPass;}
if(typeof username!='undefined'){var pwTested=password.toLowerCase();var userNameTested=username.toLowerCase();var userNameParts=userNameTested.split('.');var userNameNoPeriod=userNameParts[0]+userNameParts[1];var userNameReversed=userNameParts[1]+'.'+userNameParts[0];var userNameReversedNoPeriod=userNameParts[1]+userNameParts[0];if(pwTested==userNameTested||pwTested==userNameNoPeriod||pwTested==userNameReversed||pwTested==userNameReversedNoPeriod){this.resultStyle=option.badPass;return $(this).samePassword;}}
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;if(password.match(/(.*[0-9].*[0-9].*[0-9])/)){score+=5;}
if(password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){score+=5;}
if(password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){score+=10;}
if(password.match(/([a-zA-Z])/)&&password.match(/([0-9])/)){score+=15;}
if(password.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&password.match(/([0-9])/)){score+=15;}
if(password.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&password.match(/([a-zA-Z])/)){score+=15;}
if(password.match(/^\w+$/)||password.match(/^\d+$/)){score-=10;}
if(score<0){score=0;}
if(score>100){score=100;}
if(score<34){this.resultStyle=option.badPass;return $(this).badPass;}
if(score<68){this.resultStyle=option.goodPass;return $(this).goodPass;}
this.resultStyle=option.strongPass;return $(this).strongPass;};});};})(jQuery);$.fn.checkRepetition=function(pLen,str){var res="";for(var i=0;i<str.length;i++)
{var repeated=true;for(var j=0;j<pLen&&(j+i+pLen)<str.length;j++){repeated=repeated&&(str.charAt(j+i)==str.charAt(j+i+pLen));}
if(j<pLen){repeated=false;}
if(repeated){i+=pLen-1;repeated=false;}
else{res+=str.charAt(i);}}
return res;};
