assets/javascripts/bootstrap/tab.js
changeset 114 af15590802a4
equal deleted inserted replaced
113:d4ec02c51c91 114:af15590802a4
       
     1 /* ========================================================================
       
     2  * Bootstrap: tab.js v3.3.5
       
     3  * http://getbootstrap.com/javascript/#tabs
       
     4  * ========================================================================
       
     5  * Copyright 2011-2015 Twitter, Inc.
       
     6  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
       
     7  * ======================================================================== */
       
     8 
       
     9 
       
    10 +function ($) {
       
    11   'use strict';
       
    12 
       
    13   // TAB CLASS DEFINITION
       
    14   // ====================
       
    15 
       
    16   var Tab = function (element) {
       
    17     // jscs:disable requireDollarBeforejQueryAssignment
       
    18     this.element = $(element)
       
    19     // jscs:enable requireDollarBeforejQueryAssignment
       
    20   }
       
    21 
       
    22   Tab.VERSION = '3.3.5'
       
    23 
       
    24   Tab.TRANSITION_DURATION = 150
       
    25 
       
    26   Tab.prototype.show = function () {
       
    27     var $this    = this.element
       
    28     var $ul      = $this.closest('ul:not(.dropdown-menu)')
       
    29     var selector = $this.data('target')
       
    30 
       
    31     if (!selector) {
       
    32       selector = $this.attr('href')
       
    33       selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
       
    34     }
       
    35 
       
    36     if ($this.parent('li').hasClass('active')) return
       
    37 
       
    38     var $previous = $ul.find('.active:last a')
       
    39     var hideEvent = $.Event('hide.bs.tab', {
       
    40       relatedTarget: $this[0]
       
    41     })
       
    42     var showEvent = $.Event('show.bs.tab', {
       
    43       relatedTarget: $previous[0]
       
    44     })
       
    45 
       
    46     $previous.trigger(hideEvent)
       
    47     $this.trigger(showEvent)
       
    48 
       
    49     if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
       
    50 
       
    51     var $target = $(selector)
       
    52 
       
    53     this.activate($this.closest('li'), $ul)
       
    54     this.activate($target, $target.parent(), function () {
       
    55       $previous.trigger({
       
    56         type: 'hidden.bs.tab',
       
    57         relatedTarget: $this[0]
       
    58       })
       
    59       $this.trigger({
       
    60         type: 'shown.bs.tab',
       
    61         relatedTarget: $previous[0]
       
    62       })
       
    63     })
       
    64   }
       
    65 
       
    66   Tab.prototype.activate = function (element, container, callback) {
       
    67     var $active    = container.find('> .active')
       
    68     var transition = callback
       
    69       && $.support.transition
       
    70       && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
       
    71 
       
    72     function next() {
       
    73       $active
       
    74         .removeClass('active')
       
    75         .find('> .dropdown-menu > .active')
       
    76           .removeClass('active')
       
    77         .end()
       
    78         .find('[data-toggle="tab"]')
       
    79           .attr('aria-expanded', false)
       
    80 
       
    81       element
       
    82         .addClass('active')
       
    83         .find('[data-toggle="tab"]')
       
    84           .attr('aria-expanded', true)
       
    85 
       
    86       if (transition) {
       
    87         element[0].offsetWidth // reflow for transition
       
    88         element.addClass('in')
       
    89       } else {
       
    90         element.removeClass('fade')
       
    91       }
       
    92 
       
    93       if (element.parent('.dropdown-menu').length) {
       
    94         element
       
    95           .closest('li.dropdown')
       
    96             .addClass('active')
       
    97           .end()
       
    98           .find('[data-toggle="tab"]')
       
    99             .attr('aria-expanded', true)
       
   100       }
       
   101 
       
   102       callback && callback()
       
   103     }
       
   104 
       
   105     $active.length && transition ?
       
   106       $active
       
   107         .one('bsTransitionEnd', next)
       
   108         .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
       
   109       next()
       
   110 
       
   111     $active.removeClass('in')
       
   112   }
       
   113 
       
   114 
       
   115   // TAB PLUGIN DEFINITION
       
   116   // =====================
       
   117 
       
   118   function Plugin(option) {
       
   119     return this.each(function () {
       
   120       var $this = $(this)
       
   121       var data  = $this.data('bs.tab')
       
   122 
       
   123       if (!data) $this.data('bs.tab', (data = new Tab(this)))
       
   124       if (typeof option == 'string') data[option]()
       
   125     })
       
   126   }
       
   127 
       
   128   var old = $.fn.tab
       
   129 
       
   130   $.fn.tab             = Plugin
       
   131   $.fn.tab.Constructor = Tab
       
   132 
       
   133 
       
   134   // TAB NO CONFLICT
       
   135   // ===============
       
   136 
       
   137   $.fn.tab.noConflict = function () {
       
   138     $.fn.tab = old
       
   139     return this
       
   140   }
       
   141 
       
   142 
       
   143   // TAB DATA-API
       
   144   // ============
       
   145 
       
   146   var clickHandler = function (e) {
       
   147     e.preventDefault()
       
   148     Plugin.call($(this), 'show')
       
   149   }
       
   150 
       
   151   $(document)
       
   152     .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
       
   153     .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
       
   154 
       
   155 }(jQuery);