summaryrefslogtreecommitdiff
path: root/public/js/bootstrap-strength-meter.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/js/bootstrap-strength-meter.js')
-rwxr-xr-xpublic/js/bootstrap-strength-meter.js278
1 files changed, 278 insertions, 0 deletions
diff --git a/public/js/bootstrap-strength-meter.js b/public/js/bootstrap-strength-meter.js
new file mode 100755
index 0000000..8083dc4
--- /dev/null
+++ b/public/js/bootstrap-strength-meter.js
@@ -0,0 +1,278 @@
+/**
+ * bootstrap-strength-meter.js
+ * https://github.com/davidstutz/bootstrap-strength-meter
+ *
+ * Copyright 2013 David Stutz
+ */
+!function($) {
+
+ "use strict";// jshint ;_;
+
+ var StrengthMeter = {
+
+ progressBar: function(input, options) {
+
+ var defaults = {
+ container: input.parent(),
+ base: 80,
+ hierarchy: {
+ '0': 'progress-bar-danger',
+ '25': 'progress-bar-warning',
+ '50': 'progress-bar-success'
+ },
+ passwordScore: {
+ options: [],
+ append: true
+ }
+ };
+
+ var settings = $.extend(true, {}, defaults, options);
+
+ if (typeof options === 'object' && 'hierarchy' in options) {
+ settings.hierarchy = options.hierarchy;
+ }
+
+ var template = '<div class="progress"><div class="progress-bar" role="progressbar"></div></div>';
+ var progress;
+ var progressBar;
+ var passcheckTimeout;
+ var core = {
+
+ /**
+ * Initialize the plugin.
+ */
+ init: function() {
+ progress = settings.container.append($(template));
+ progressBar = $('.progress-bar', progress);
+
+ progressBar.attr('aria-valuemin', 0)
+ .attr('aria-valuemay', 100);
+
+ input.on('keyup', core.keyup)
+ .keyup();
+ },
+ queue: function(event){
+ var password = $(event.target).val();
+ var value = 0;
+
+ if (password.length > 0) {
+ var score = new Score(password);
+ value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append);
+ }
+
+ core.update(value);
+ },
+
+ /**
+ * Update progress bar.
+ *
+ * @param {string} value
+ */
+ update: function(value) {
+ var width = Math.floor((value/settings.base)*100);
+
+ if (width > 100) {
+ width = 100;
+ }
+
+ progressBar
+ .attr('area-valuenow', width)
+ .css('width', width + '%');
+
+ for (var value in settings.hierarchy) {
+ if (width > value) {
+ progressBar
+ .removeClass()
+ .addClass('progress-bar')
+ .addClass(settings.hierarchy[value]);
+ }
+ }
+ },
+
+ /**
+ * Event binding on password input.
+ *
+ * @param {Object} event
+ */
+ keyup: function(event) {
+ if(passcheckTimeout)clearTimeout(passcheckTimeout);
+ passcheckTimeout = setTimeout( function(){
+ core.queue(event);
+ },500);
+ }
+ };
+
+ core.init();
+ },
+ text: function(input, options) {
+
+ var defaults = {
+ container: input.parent(),
+ hierarchy: {
+ '0': ['text-danger', 'ridiculous'],
+ '10': ['text-danger', 'very weak'],
+ '20': ['text-warning', 'weak'],
+ '30': ['text-warning', 'good'],
+ '40': ['text-success', 'strong'],
+ '50': ['text-success', 'very strong']
+ },
+ passwordScore: {
+ options: [],
+ append: true
+ }
+ };
+
+ var settings = $.extend(true, {}, defaults, options);
+
+ if (typeof options === 'object' && 'hierarchy' in options) {
+ settings.hierarchy = options.hierarchy;
+ }
+
+ var core = {
+
+ /**
+ * Initialize the plugin.
+ */
+ init: function() {
+ input.on('keyup', core.keyup)
+ .keyup();
+ },
+
+ /**
+ * Update text element.
+ *
+ * @param {string} value
+ */
+ update: function(value) {
+ for (var border in settings.hierarchy) {
+ if (value >= border) {
+ var text = settings.hierarchy[border][1];
+ var color = settings.hierarchy[border][0];
+
+ settings.container.text(text)
+ .removeClass()
+ .addClass(color);
+ }
+ }
+ },
+
+ /**
+ * Event binding on input element.
+ *
+ * @param {Object} event
+ */
+ keyup: function(event) {
+ var password = $(event.target).val();
+ var value = 0;
+
+ if (password.length > 0) {
+ var score = new Score(password);
+ value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append);
+ }
+
+ core.update(value);
+ }
+ };
+
+ core.init();
+ },
+
+ tooltip: function(input, options) {
+
+ var defaults = {
+ hierarchy: {
+ '0': 'ridiculous',
+ '10': 'very weak',
+ '20': 'weak',
+ '30': 'good',
+ '40': 'strong',
+ '50': 'very strong'
+ },
+ tooltip: {
+ placement: 'right'
+ },
+ passwordScore: {
+ options: [],
+ append: true
+ }
+ };
+
+ var settings = $.extend(true, {}, defaults, options);
+
+ if (typeof options === 'object' && 'hierarchy' in options) {
+ settings.hierarchy = options.hierarchy;
+ }
+
+ var core = {
+
+ /**
+ * Initialize the plugin.
+ */
+ init: function() {
+ input.tooltip(settings.tooltip);
+
+ input.on('keyup', core.keyup)
+ .keyup();
+ },
+
+ /**
+ * Update tooltip.
+ *
+ * @param {string} value
+ */
+ update: function(value) {
+ for (var border in settings.hierarchy) {
+ if (value >= border) {
+ var text = settings.hierarchy[border];
+
+ input.attr('data-original-title', text)
+ .tooltip('show');
+ }
+ }
+ },
+
+ /**
+ * Event binding on input element.
+ *
+ * @param {Object} event
+ */
+ keyup: function(event) {
+ var password = $(event.target).val();
+ var value = 0;
+
+ if (password.length > 0) {
+ var score = new Score(password);
+ value = score.calculateEntropyScore(settings.passwordScore.options, settings.passwordScore.append);
+ }
+
+ core.update(value);
+ }
+ };
+
+ core.init();
+ }
+ };
+
+ $.fn.strengthMeter = function(type, options) {
+ type = (type === undefined) ? 'tooltip' : type;
+
+ if (!type in StrengthMeter) {
+ return;
+ }
+
+ var instance = this.data('strengthMeter');
+ var elem = this;
+
+ return elem.each(function() {
+ var strengthMeter;
+
+ if (instance) {
+ return;
+ }
+
+ strengthMeter = StrengthMeter[type](elem, options);
+ elem.data('strengthMeter', strengthMeter);
+ });
+ };
+
+}(window.jQuery);