$.fn.PassStrength = function() {
   var $this = $(this);
   $this.after('<div id="PasswordBar" class="PasswordBar"><div id="PasswordMeter" class="PasswordMeter"></div></div>');
   $this.keyup( function() { 
       	var $maxWidth = $('#PasswordBar').width() ;
        var $width = updateMeter('#x_password',$maxWidth);
        $('#PasswordMeter').animate({width : $width },{duration: 200});
    });
calcStrength = function(password) {
	var intScore = 0;
	var len = password.length;
	intScore += len;
	
	if(len > 0 && len <= 4) {                    // length 4 or less
		intScore += password.length;
	}
	else if (len >= 5 && len <= 7) {	// length between 5 and 7
		intScore += 6;
	}
	else if (len >= 8 && len <= 15) {	// length between 8 and 15
		intScore += 12;
	}
	else if (len >= 16) {               // length 16 or more
		intScore += 18;
	}
	
	if (password.match(/[a-z]/)) {              // [verified] at least one lower case letter
		intScore += 1;
	}
	if (password.match(/[A-Z]/)) {              // [verified] at least one upper case letter
		intScore += 5;
	}
	if (password.match(/\d/)) {             	// [verified] at least one number
		intScore += 5;
	}
	if (password.match(/.*\d.*\d.*\d/)) {            // [verified] at least three numbers
		intScore += 5;
	}
	if (password.match(/[!,@,#,$,%,^,&,*,?,_,~]/)) {           // [verified] at least one special character
		intScore += 5;
	}
	if (password.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)) {
		intScore += 5;
	}
	
	if (password.match(/(?=.*[a-z])(?=.*[A-Z])/)) {        // [verified] both upper and lower case
		intScore += 2;
	}
	if (password.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)) { // [verified] both letters and numbers
		intScore += 2;
	}
	if (password.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)) {
		intScore += 2;
	}
	return intScore;
};
updateMeter = function(pass,maxWidth) {
	var score = 0;
    var p = $(pass).val();
	var nScore = calcStrength(p);
	var nRound = Math.round(nScore * 2);
	if (nRound > 100) {nRound = 100};
	var scoreWidth = (maxWidth / 100) * nRound;
	return scoreWidth ;
};
};


;(function ($) {

$.fn.maxlength = function (settings) {

    if (typeof settings == 'string') {
        settings = { feedback : settings };
    }

    settings = $.extend({}, $.fn.maxlength.defaults, settings);

    function length(el) {
    	var parts = el.value;
    	if ( settings.words )
    		parts = el.value.length ? parts.split(/\s+/) : { length : 0 };
    	return parts.length;
    }
    
    return this.each(function () {
        var field = this,
        	$field = $(field),
        	$form = $(field.form),
        	limit = settings.useInput ? $form.find('input[name=maxlength]').val() : $field.attr('maxlength'),
        	$charsLeft = $form.find(settings.feedback);

    	function limitCheck(event) {
        	var len = length(this),
        	    exceeded = len >= limit,
        		code = event.keyCode;

        	if ( !exceeded )
        		return;

            switch (code) {
                case 8:  // allow delete
                case 9:
                case 17:
                case 36: // and cursor keys
                case 35:
                case 37: 
                case 38:
                case 39:
                case 40:
                case 46:
                case 65:
                    return;

                default:
                    return settings.words && code != 32 && code != 13 && len == limit;
            }
        }


        var updateCount = function () {
            var len = length(field),
            	diff = limit - len;

            $charsLeft.html( diff || "0" );

            // truncation code
            if (settings.hardLimit && diff < 0) {
            	field.value = settings.words ? 
            	    // split by white space, capturing it in the result, then glue them back
            		field.value.split(/(\s+)/, (limit*2)-1).join('') :
            		field.value.substr(0, limit);

                updateCount();
            }
        };

        $field.keyup(updateCount).change(updateCount);
        if (settings.hardLimit) {
            $field.keydown(limitCheck);
        }

        updateCount();
    });
};

$.fn.maxlength.defaults = {
    useInput : false,
    hardLimit : true,
    feedback : '.charsLeft',
    words : false
};

})(jQuery);

