+function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element); this.options = $.extend({}, Button.DEFAULTS, options); this.$isLoading = false; }; Button.VERSION = '1.0.0'; Button.DEFAULTS = { loadingText: 'Loading...' }; Button.prototype.constructor = Button; Button.prototype.setState = function (state) { var d = 'disabled'; var $el = this.$element; var val = $el.is('input') ? 'val' : 'html'; var data = $el.data(); state = state + 'Text'; if (data.resetText === null) $el.data('resetText', $el[val]()); setTimeout($.proxy(function () { $el[val](data[state] === null ? this.options[state] : data[state]); if (state === 'loadingText') { this.$isLoading = true; $el.addClass(d) .attr(d, d); } else if (this.$isLoading) { this.$isLoading = false; $el.removeClass(d) .removeAttr(d); } }, this), 0); }; Button.prototype.toggle = function () { var changed = true; var $parent = this.$element.closest('[data-toggle="buttons"]'); if ($parent.length) { var $input = this.$element.find('input'); if ($input.prop('type') === 'radio') { if ($input.prop('checked') && this.$element.hasClass('active')) { changed = false; } else { $parent.find('.active').removeClass('active'); } } if (changed) { $input.prop('checked', !this.$element.hasClass('active')) .trigger('change'); } } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')); } if (changed) this.$element.toggleClass('active'); }; // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data('bs.button'); var options = typeof option === 'object' && option; if (!data) $this.data('bs.button', (data = new Button(this, options))); if (option === 'toggle') { data.toggle(); } else if (option) { data.setState(option); } }); } var old = $.fn.button; $.fn.button = Plugin; $.fn.button.Constructor = Button; // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old; return this; }; // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target); if (!$btn.hasClass('btn')) { $btn = $btn.closest('.btn'); } Plugin.call($btn, 'toggle'); e.preventDefault(); }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn') .toggleClass('focus', /^focus(in)?$/.test(e.type)); }); }(jQuery);