| /* ======================================================================== | |
| * Bootstrap: button.js v3.3.6 | |
| * http://getbootstrap.com/javascript/#buttons | |
| * ======================================================================== | |
| * Copyright 2011-2015 Twitter, Inc. | |
| * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
| * ======================================================================== */ | |
| +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 = '3.3.6' | |
| Button.DEFAULTS = { | |
| loadingText: 'loading...' | |
| } | |
| Button.prototype.setState = function (state) { | |
| var d = 'disabled' | |
| var $el = this.$element | |
| var val = $el.is('input') ? 'val' : 'html' | |
| var data = $el.data() | |
| state += 'Text' | |
| if (data.resetText == null) $el.data('resetText', $el[val]()) | |
| // push to event loop to allow forms to submit | |
| 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')) changed = false | |
| $parent.find('.active').removeClass('active') | |
| this.$element.addClass('active') | |
| } else if ($input.prop('type') == 'checkbox') { | |
| if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false | |
| this.$element.toggleClass('active') | |
| } | |
| $input.prop('checked', this.$element.hasClass('active')) | |
| if (changed) $input.trigger('change') | |
| } else { | |
| this.$element.attr('aria-pressed', !this.$element.hasClass('active')) | |
| 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') | |
| if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) 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); |