assets/javascripts/bootstrap/button.js
author ymh <ymh.work@gmail.com>
Thu, 15 Jun 2017 12:17:09 +0200
changeset 114 af15590802a4
permissions -rw-r--r--
add a lot of files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
114
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/* ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * Bootstrap: button.js v3.3.5
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * http://getbootstrap.com/javascript/#buttons
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Copyright 2011-2015 Twitter, Inc.
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * ======================================================================== */
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
+function ($) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
  'use strict';
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  // BUTTON PUBLIC CLASS DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  // ==============================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  var Button = function (element, options) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    this.$element  = $(element)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    this.options   = $.extend({}, Button.DEFAULTS, options)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    this.isLoading = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  Button.VERSION  = '3.3.5'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  Button.DEFAULTS = {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    loadingText: 'loading...'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
  Button.prototype.setState = function (state) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    var d    = 'disabled'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    var $el  = this.$element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    var val  = $el.is('input') ? 'val' : 'html'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    var data = $el.data()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    state += 'Text'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    if (data.resetText == null) $el.data('resetText', $el[val]())
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    // push to event loop to allow forms to submit
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    setTimeout($.proxy(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
      $el[val](data[state] == null ? this.options[state] : data[state])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
      if (state == 'loadingText') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        this.isLoading = true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        $el.addClass(d).attr(d, d)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
      } else if (this.isLoading) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        this.isLoading = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        $el.removeClass(d).removeAttr(d)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    }, this), 0)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  Button.prototype.toggle = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    var changed = true
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    var $parent = this.$element.closest('[data-toggle="buttons"]')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    if ($parent.length) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
      var $input = this.$element.find('input')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
      if ($input.prop('type') == 'radio') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        if ($input.prop('checked')) changed = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $parent.find('.active').removeClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        this.$element.addClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
      } else if ($input.prop('type') == 'checkbox') {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        this.$element.toggleClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
      $input.prop('checked', this.$element.hasClass('active'))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
      if (changed) $input.trigger('change')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    } else {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
      this.$element.toggleClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
  // BUTTON PLUGIN DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  // ========================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  function Plugin(option) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    return this.each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
      var $this   = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
      var data    = $this.data('bs.button')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
      var options = typeof option == 'object' && option
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
      if (option == 'toggle') data.toggle()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
      else if (option) data.setState(option)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
  var old = $.fn.button
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
  $.fn.button             = Plugin
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  $.fn.button.Constructor = Button
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
  // BUTTON NO CONFLICT
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
  // ==================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
  $.fn.button.noConflict = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    $.fn.button = old
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    return this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
  // BUTTON DATA-API
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
  // ===============
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
  $(document)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
      var $btn = $(e.target)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
      Plugin.call($btn, 'toggle')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
}(jQuery);