(function($){
	var elements = new Array();
	var elements_button = new Array();
	var elements_count = 0;

	$.fn.passmeter = function(options) {

		var defaults = {
			target: false
		};
		var options = $.extend(defaults, options);

		var global_vars;
		var intScore = 0;
		var strVerdict = 20;

		return this.each(function() {

			var field = $(this);
			var target = $(options.target);

			// Register the element target
			elements[elements_count] = target;
			elements_button[elements_count] = field;
			elements_count++;

			field.keyup( function() {
				strVerdict=20;
				intScore=0;
				var passwd=$(this).val();
				if (passwd.length<5){
					intScore=(intScore+3);
				}else if (passwd.length>4 && passwd.length<8){
					intScore=(intScore+6);
				}else if (passwd.length>7 && passwd.length<16){
					intScore=(intScore+12);
				}else if (passwd.length>15){
					intScore=(intScore+18);
				}
				
				if (passwd.match(/[a-z]/)){
					intScore = (intScore+1);
				}
				if (passwd.match(/[A-Z]/)){
					intScore = (intScore+5);
				}
				if (passwd.match(/\d+/)){
					intScore = (intScore+5);
				}
				if (passwd.match(/(.*[0-9].*[0-9].*[0-9])/)){
					intScore = (intScore+5);
				}
				
				if (passwd.match(/.[!,@,#,$,%,^,&,*,?,_,~]/)){
					intScore = (intScore+5);
				}
				if (passwd.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){
					intScore = (intScore+5);
				}
				
				if (passwd.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){
					intScore = (intScore+2);
				}
				if (passwd.match(/([a-zA-Z])/) && passwd.match(/([0-9])/)){
					intScore = (intScore+2);
				}
				if (passwd.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/)){
					intScore = (intScore+2);
				}
				
				if(intScore < 16){
				   strVerdict = 20;
				}else if (intScore > 15 && intScore < 25){
				   strVerdict = 40;
				}else if (intScore > 24 && intScore < 35){
				   strVerdict = 60;
				}else if (intScore > 34 && intScore < 45){
				   strVerdict = 80;
				}else{
				   strVerdict = 100;
				}

				target.removeClass('pbar20');
				target.removeClass('pbar40');
				target.removeClass('pbar60');
				target.removeClass('pbar80');
				target.removeClass('pbar100');
				
				target.addClass('pbar'+strVerdict);
			});
		});
	};
})(jQuery);