
(function($){

var passwordStrength = new function()
{
    this.countRegexp = function(val, rex)
    {
        var match = val.match(rex);
        return match ? true : false;
    }

    this.getStrength = function(val, minLength)
    {
        var len = val.length;
        
        var level = "week";
        var strength = 0;
        switch (true)
        {
            case (len <= 6):
                level = "week";
                break;
            case (len > 6 && len <= 8):
                level = "normal";
                break;
            case (len > 8):
                level = "strong";
                break;
        }
        //password has Upper and Lower chars
        var lowersUppers = this.countRegexp(val,/([a-z 0-9].*[A-Z])|([A-Z].*[a-z 0-9])/g);
        // password has a symbol
        var symbol = this.countRegexp(val,/([!,@,#,$,%,^,&,*,?,_,~])/g);
        
        if (level == "week" || (level == "normal" && (!lowersUppers)) || level == "strong" && (!lowersUppers && !symbol)){
            strength = 0;
        } else if ((level == "normal" && lowersUppers) || (level == "strong" && (!symbol))){
            strength = 1;
        } else if (level == "strong" && lowersUppers && symbol){
            strength = 2;
        }
        return strength;
    }
    this.getStrengthLevel = function(val, minLength)
    {
        return this.getStrength(val, minLength);
    }
}

$.fn.password_strength = function(options)
{
    
    var settings = $.extend({
        'container' : null,
        'minLength' : 6
    }, options);

    return this.each(function()
    {
        $(this).keyup(function()
        {
            var val = $(this).val();
            
            $('#pwdWeak').hide();
            $('#pwdNormal').hide();
            $('#pwdStrong').hide();
            if (val.length > 0)
            {
                
                var level = passwordStrength.getStrengthLevel(val, settings.minLength);
               
                switch(level) {
                    case 0:
                        $('#pwdWeak').show();
                        break;
                     case 1:
                        $('#pwdNormal').show();
                        break;
                     case 2:
                        $('#pwdStrong').show();
                        break;
                }
            }
            else
            {
                $('#pwdWeak').hide();
                $('#pwdNormal').hide();
                $('#pwdStrong').hide();

            }
        });
    });
};

})(jQuery);
