bootstrap.js 64.2 KB
Newer Older
Chris Rebert's avatar
Chris Rebert committed
1001
1002
      }
    }
1003

Chris Rebert's avatar
Chris Rebert committed
1004
1005
1006
1007
1008
1009
1010
    Modal.prototype.hideModal = function () {
      var that = this
      this.$element.hide()
      this.backdrop(function () {
        that.$element.trigger('hidden.bs.modal')
      })
    }
1011

Chris Rebert's avatar
Chris Rebert committed
1012
1013
1014
1015
    Modal.prototype.removeBackdrop = function () {
      this.$backdrop && this.$backdrop.remove()
      this.$backdrop = null
    }
1016

Chris Rebert's avatar
Chris Rebert committed
1017
1018
1019
    Modal.prototype.backdrop = function (callback) {
      var that = this
      var animate = this.$element.hasClass('fade') ? 'fade' : ''
1020

Chris Rebert's avatar
Chris Rebert committed
1021
1022
      if (this.isShown && this.options.backdrop) {
        var doAnimate = $.support.transition && animate
1023

Chris Rebert's avatar
Chris Rebert committed
1024
1025
        this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
          .appendTo(this.$body)
1026

Chris Rebert's avatar
Chris Rebert committed
1027
1028
1029
1030
1031
1032
        this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
          if (e.target !== e.currentTarget) return
          this.options.backdrop == 'static'
            ? this.$element[0].focus.call(this.$element[0])
            : this.hide.call(this)
        }, this))
1033

Chris Rebert's avatar
Chris Rebert committed
1034
        if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1035

Chris Rebert's avatar
Chris Rebert committed
1036
        this.$backdrop.addClass('in')
1037

Chris Rebert's avatar
Chris Rebert committed
1038
        if (!callback) return
1039

Chris Rebert's avatar
Chris Rebert committed
1040
1041
1042
1043
1044
        doAnimate ?
          this.$backdrop
            .one('bsTransitionEnd', callback)
            .emulateTransitionEnd(150) :
          callback()
1045

Chris Rebert's avatar
Chris Rebert committed
1046
1047
      } else if (!this.isShown && this.$backdrop) {
        this.$backdrop.removeClass('in')
1048

Chris Rebert's avatar
Chris Rebert committed
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
        var callbackRemove = function () {
          that.removeBackdrop()
          callback && callback()
        }
        $.support.transition && this.$element.hasClass('fade') ?
          this.$backdrop
            .one('bsTransitionEnd', callbackRemove)
            .emulateTransitionEnd(150) :
          callbackRemove()

      } else if (callback) {
        callback()
      }
fat's avatar
fat committed
1062
    }
1063

Chris Rebert's avatar
Chris Rebert committed
1064
1065
1066
1067
    Modal.prototype.checkScrollbar = function () {
      if (document.body.clientWidth >= window.innerWidth) return
      this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
    }
1068

Chris Rebert's avatar
Chris Rebert committed
1069
1070
1071
1072
    Modal.prototype.setScrollbar = function () {
      var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
      if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
    }
fat's avatar
build    
fat committed
1073

Chris Rebert's avatar
Chris Rebert committed
1074
1075
1076
    Modal.prototype.resetScrollbar = function () {
      this.$body.css('padding-right', '')
    }
fat's avatar
build    
fat committed
1077

Chris Rebert's avatar
Chris Rebert committed
1078
1079
1080
1081
1082
1083
1084
1085
    Modal.prototype.measureScrollbar = function () { // thx walsh
      var scrollDiv = document.createElement('div')
      scrollDiv.className = 'modal-scrollbar-measure'
      this.$body.append(scrollDiv)
      var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
      this.$body[0].removeChild(scrollDiv)
      return scrollbarWidth
    }
fat's avatar
build    
fat committed
1086

1087

Chris Rebert's avatar
Chris Rebert committed
1088
1089
    // MODAL PLUGIN DEFINITION
    // =======================
1090

Chris Rebert's avatar
Chris Rebert committed
1091
1092
1093
1094
1095
    function Plugin(option, _relatedTarget) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.modal')
        var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
fat's avatar
fat committed
1096

Chris Rebert's avatar
Chris Rebert committed
1097
1098
1099
1100
1101
        if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
        if (typeof option == 'string') data[option](_relatedTarget)
        else if (options.show) data.show(_relatedTarget)
      })
    }
1102

Chris Rebert's avatar
Chris Rebert committed
1103
    var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1104

Chris Rebert's avatar
Chris Rebert committed
1105
1106
    $.fn.modal             = Plugin
    $.fn.modal.Constructor = Modal
1107
1108


Chris Rebert's avatar
Chris Rebert committed
1109
1110
    // MODAL NO CONFLICT
    // =================
1111

Chris Rebert's avatar
Chris Rebert committed
1112
1113
1114
1115
    $.fn.modal.noConflict = function () {
      $.fn.modal = old
      return this
    }
1116
1117


Chris Rebert's avatar
Chris Rebert committed
1118
1119
    // MODAL DATA-API
    // ==============
1120

Chris Rebert's avatar
Chris Rebert committed
1121
1122
1123
    $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
      var $this   = $(this)
      var href    = $this.attr('href')
Mark Otto's avatar
Mark Otto committed
1124
      var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
1125
      var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1126

Chris Rebert's avatar
Chris Rebert committed
1127
      if ($this.is('a')) e.preventDefault()
1128

Chris Rebert's avatar
Chris Rebert committed
1129
      $target.one('show.bs.modal', function (showEvent) {
Mark Otto's avatar
Mark Otto committed
1130
        if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
Chris Rebert's avatar
Chris Rebert committed
1131
1132
1133
        $target.one('hidden.bs.modal', function () {
          $this.is(':visible') && $this.trigger('focus')
        })
Mark Otto's avatar
grunt    
Mark Otto committed
1134
      })
Chris Rebert's avatar
Chris Rebert committed
1135
      Plugin.call($target, option, this)
Mark Otto's avatar
Mark Otto committed
1136
    })
Chris Rebert's avatar
Chris Rebert committed
1137

Jacob Thornton's avatar
Jacob Thornton committed
1138
  })
1139

Chris Rebert's avatar
Chris Rebert committed
1140
}();
1141

1142
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1143
 * Bootstrap: tooltip.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1144
 * http://getbootstrap.com/javascript/#tooltip
1145
 * Inspired by the original jQuery.tipsy by Jason Frame
1146
 * ========================================================================
1147
 * Copyright 2011-2014 Twitter, Inc.
1148
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1149
 * ======================================================================== */
1150
1151


Chris Rebert's avatar
Chris Rebert committed
1152
1153
1154
1155
1156
1157
+function () { 'use strict';

  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1158

Chris Rebert's avatar
Chris Rebert committed
1159
1160
    // TOOLTIP PUBLIC CLASS DEFINITION
    // ===============================
1161

Chris Rebert's avatar
Chris Rebert committed
1162
1163
1164
1165
1166
1167
1168
    var Tooltip = function (element, options) {
      this.type       =
      this.options    =
      this.enabled    =
      this.timeout    =
      this.hoverState =
      this.$element   = null
1169

Chris Rebert's avatar
Chris Rebert committed
1170
1171
      this.init('tooltip', element, options)
    }
1172

Chris Rebert's avatar
Chris Rebert committed
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
    Tooltip.VERSION  = '3.1.1'

    Tooltip.DEFAULTS = {
      animation: true,
      placement: 'top',
      selector: false,
      template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
      trigger: 'hover focus',
      title: '',
      delay: 0,
      html: false,
      container: false,
      viewport: {
        selector: 'body',
        padding: 0
1188
1189
      }
    }
1190

Chris Rebert's avatar
Chris Rebert committed
1191
1192
1193
1194
1195
1196
    Tooltip.prototype.init = function (type, element, options) {
      this.enabled   = true
      this.type      = type
      this.$element  = $(element)
      this.options   = this.getOptions(options)
      this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
Jacob Thornton's avatar
Jacob Thornton committed
1197

Chris Rebert's avatar
Chris Rebert committed
1198
      var triggers = this.options.trigger.split(' ')
1199

Chris Rebert's avatar
Chris Rebert committed
1200
1201
1202
1203
1204
1205
1206
1207
      for (var i = triggers.length; i--;) {
        var trigger = triggers[i]

        if (trigger == 'click') {
          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
        } else if (trigger != 'manual') {
          var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
          var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
fat's avatar
rebuild    
fat committed
1208

Chris Rebert's avatar
Chris Rebert committed
1209
1210
1211
1212
          this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
        }
      }
Jacob Thornton's avatar
Jacob Thornton committed
1213

Chris Rebert's avatar
Chris Rebert committed
1214
1215
1216
1217
      this.options.selector ?
        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        this.fixTitle()
    }
Mark Otto's avatar
Mark Otto committed
1218

Chris Rebert's avatar
Chris Rebert committed
1219
1220
    Tooltip.prototype.getDefaults = function () {
      return Tooltip.DEFAULTS
Mark Otto's avatar
Mark Otto committed
1221
    }
1222

Chris Rebert's avatar
Chris Rebert committed
1223
1224
    Tooltip.prototype.getOptions = function (options) {
      options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1225

Chris Rebert's avatar
Chris Rebert committed
1226
1227
1228
1229
1230
1231
      if (options.delay && typeof options.delay == 'number') {
        options.delay = {
          show: options.delay,
          hide: options.delay
        }
      }
1232

Chris Rebert's avatar
Chris Rebert committed
1233
1234
      return options
    }
1235

Chris Rebert's avatar
Chris Rebert committed
1236
1237
1238
    Tooltip.prototype.getDelegateOptions = function () {
      var options  = {}
      var defaults = this.getDefaults()
1239

Chris Rebert's avatar
Chris Rebert committed
1240
1241
1242
      this._options && $.each(this._options, function (key, value) {
        if (defaults[key] != value) options[key] = value
      })
Mark Otto's avatar
Mark Otto committed
1243

Chris Rebert's avatar
Chris Rebert committed
1244
      return options
Mark Otto's avatar
Mark Otto committed
1245
    }
1246

Chris Rebert's avatar
Chris Rebert committed
1247
1248
1249
    Tooltip.prototype.enter = function (obj) {
      var self = obj instanceof this.constructor ?
        obj : $(obj.currentTarget).data('bs.' + this.type)
fat's avatar
fat committed
1250

Chris Rebert's avatar
Chris Rebert committed
1251
1252
1253
1254
      if (!self) {
        self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        $(obj.currentTarget).data('bs.' + this.type, self)
      }
1255

Chris Rebert's avatar
Chris Rebert committed
1256
      clearTimeout(self.timeout)
1257

Chris Rebert's avatar
Chris Rebert committed
1258
      self.hoverState = 'in'
1259

Chris Rebert's avatar
Chris Rebert committed
1260
      if (!self.options.delay || !self.options.delay.show) return self.show()
1261

Chris Rebert's avatar
Chris Rebert committed
1262
1263
1264
1265
      self.timeout = setTimeout(function () {
        if (self.hoverState == 'in') self.show()
      }, self.options.delay.show)
    }
1266

Chris Rebert's avatar
Chris Rebert committed
1267
1268
1269
    Tooltip.prototype.leave = function (obj) {
      var self = obj instanceof this.constructor ?
        obj : $(obj.currentTarget).data('bs.' + this.type)
1270

Chris Rebert's avatar
Chris Rebert committed
1271
1272
1273
1274
1275
1276
      if (!self) {
        self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        $(obj.currentTarget).data('bs.' + this.type, self)
      }

      clearTimeout(self.timeout)
fat's avatar
fat committed
1277

Chris Rebert's avatar
Chris Rebert committed
1278
      self.hoverState = 'out'
1279

Chris Rebert's avatar
Chris Rebert committed
1280
      if (!self.options.delay || !self.options.delay.hide) return self.hide()
fat's avatar
fat committed
1281

Chris Rebert's avatar
Chris Rebert committed
1282
1283
1284
1285
      self.timeout = setTimeout(function () {
        if (self.hoverState == 'out') self.hide()
      }, self.options.delay.hide)
    }
fat's avatar
fat committed
1286

Chris Rebert's avatar
Chris Rebert committed
1287
1288
    Tooltip.prototype.show = function () {
      var e = $.Event('show.bs.' + this.type)
1289

Chris Rebert's avatar
Chris Rebert committed
1290
1291
      if (this.hasContent() && this.enabled) {
        this.$element.trigger(e)
1292

Chris Rebert's avatar
Chris Rebert committed
1293
1294
1295
        var inDom = $.contains(document.documentElement, this.$element[0])
        if (e.isDefaultPrevented() || !inDom) return
        var that = this
1296

Chris Rebert's avatar
Chris Rebert committed
1297
        var $tip = this.tip()
1298

Chris Rebert's avatar
Chris Rebert committed
1299
        var tipId = this.getUID(this.type)
fat's avatar
fat committed
1300

Chris Rebert's avatar
Chris Rebert committed
1301
1302
1303
        this.setContent()
        $tip.attr('id', tipId)
        this.$element.attr('aria-describedby', tipId)
1304

Chris Rebert's avatar
Chris Rebert committed
1305
1306
1307
1308
1309
1310
1311
1312
1313
        if (this.options.animation) $tip.addClass('fade')

        var placement = typeof this.options.placement == 'function' ?
          this.options.placement.call(this, $tip[0], this.$element[0]) :
          this.options.placement

        var autoToken = /\s?auto?\s?/i
        var autoPlace = autoToken.test(placement)
        if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
fat's avatar
fat committed
1314

1315
        $tip
Chris Rebert's avatar
Chris Rebert committed
1316
1317
          .detach()
          .css({ top: 0, left: 0, display: 'block' })
1318
          .addClass(placement)
Chris Rebert's avatar
Chris Rebert committed
1319
          .data('bs.' + this.type, this)
1320

Chris Rebert's avatar
Chris Rebert committed
1321
        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1322

Chris Rebert's avatar
Chris Rebert committed
1323
1324
1325
        var pos          = this.getPosition()
        var actualWidth  = $tip[0].offsetWidth
        var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1326

Chris Rebert's avatar
Chris Rebert committed
1327
1328
1329
1330
        if (autoPlace) {
          var orgPlacement = placement
          var $parent      = this.$element.parent()
          var parentDim    = this.getPosition($parent)
fat's avatar
fat committed
1331

Chris Rebert's avatar
Chris Rebert committed
1332
1333
1334
1335
1336
          placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :
                      placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :
                      placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :
                      placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :
                      placement
fat's avatar
fat committed
1337

Chris Rebert's avatar
Chris Rebert committed
1338
1339
1340
1341
          $tip
            .removeClass(orgPlacement)
            .addClass(placement)
        }
fat's avatar
fat committed
1342

Chris Rebert's avatar
Chris Rebert committed
1343
        var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
fat's avatar
fat committed
1344

Chris Rebert's avatar
Chris Rebert committed
1345
        this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1346

Chris Rebert's avatar
Chris Rebert committed
1347
1348
1349
1350
        var complete = function () {
          that.$element.trigger('shown.bs.' + that.type)
          that.hoverState = null
        }
fat's avatar
fat committed
1351

Chris Rebert's avatar
Chris Rebert committed
1352
1353
1354
1355
1356
        $.support.transition && this.$tip.hasClass('fade') ?
          $tip
            .one('bsTransitionEnd', complete)
            .emulateTransitionEnd(150) :
          complete()
1357
      }
Chris Rebert's avatar
Chris Rebert committed
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
    }

    Tooltip.prototype.applyPlacement = function (offset, placement) {
      var $tip   = this.tip()
      var width  = $tip[0].offsetWidth
      var height = $tip[0].offsetHeight

      // manually read margins because getBoundingClientRect includes difference
      var marginTop = parseInt($tip.css('margin-top'), 10)
      var marginLeft = parseInt($tip.css('margin-left'), 10)

      // we must check for NaN for ie 8/9
      if (isNaN(marginTop))  marginTop  = 0
      if (isNaN(marginLeft)) marginLeft = 0

      offset.top  = offset.top  + marginTop
      offset.left = offset.left + marginLeft

      // $.fn.offset doesn't round pixel values
      // so we use setOffset directly with our own function B-0
      $.offset.setOffset($tip[0], $.extend({
        using: function (props) {
          $tip.css({
            top: Math.round(props.top),
            left: Math.round(props.left)
          })
        }
      }, offset), 0)
1386

Chris Rebert's avatar
Chris Rebert committed
1387
      $tip.addClass('in')
fat's avatar
fat committed
1388

Chris Rebert's avatar
Chris Rebert committed
1389
1390
1391
      // check to see if placing tip in new offset caused the tip to resize itself
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1392

Chris Rebert's avatar
Chris Rebert committed
1393
1394
1395
      if (placement == 'top' && actualHeight != height) {
        offset.top = offset.top + height - actualHeight
      }
fat's avatar
fat committed
1396

Chris Rebert's avatar
Chris Rebert committed
1397
      var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
fat's avatar
fat committed
1398

Chris Rebert's avatar
Chris Rebert committed
1399
1400
      if (delta.left) offset.left += delta.left
      else offset.top += delta.top
1401

Chris Rebert's avatar
Chris Rebert committed
1402
1403
1404
      var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
      var arrowPosition       = delta.left ? 'left'        : 'top'
      var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
1405

Chris Rebert's avatar
Chris Rebert committed
1406
1407
1408
      $tip.offset(offset)
      this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
    }
1409

Chris Rebert's avatar
Chris Rebert committed
1410
1411
1412
    Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
      this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
    }
1413

Chris Rebert's avatar
Chris Rebert committed
1414
1415
1416
    Tooltip.prototype.setContent = function () {
      var $tip  = this.tip()
      var title = this.getTitle()
1417

Chris Rebert's avatar
Chris Rebert committed
1418
1419
1420
      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
      $tip.removeClass('fade in top bottom left right')
    }
1421

Chris Rebert's avatar
Chris Rebert committed
1422
1423
1424
1425
    Tooltip.prototype.hide = function () {
      var that = this
      var $tip = this.tip()
      var e    = $.Event('hide.bs.' + this.type)
1426

Chris Rebert's avatar
Chris Rebert committed
1427
      this.$element.removeAttr('aria-describedby')
1428

Chris Rebert's avatar
Chris Rebert committed
1429
1430
1431
1432
      function complete() {
        if (that.hoverState != 'in') $tip.detach()
        that.$element.trigger('hidden.bs.' + that.type)
      }
Jacob Thornton's avatar
Jacob Thornton committed
1433

Chris Rebert's avatar
Chris Rebert committed
1434
      this.$element.trigger(e)
1435

Chris Rebert's avatar
Chris Rebert committed
1436
      if (e.isDefaultPrevented()) return
1437

Chris Rebert's avatar
Chris Rebert committed
1438
      $tip.removeClass('in')
1439

Chris Rebert's avatar
Chris Rebert committed
1440
1441
1442
1443
1444
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
          .emulateTransitionEnd(150) :
        complete()
1445

Chris Rebert's avatar
Chris Rebert committed
1446
      this.hoverState = null
1447

Chris Rebert's avatar
Chris Rebert committed
1448
1449
      return this
    }
1450

Chris Rebert's avatar
Chris Rebert committed
1451
1452
1453
1454
1455
    Tooltip.prototype.fixTitle = function () {
      var $e = this.$element
      if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
      }
1456
    }
1457

Chris Rebert's avatar
Chris Rebert committed
1458
1459
1460
    Tooltip.prototype.hasContent = function () {
      return this.getTitle()
    }
1461

Chris Rebert's avatar
Chris Rebert committed
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
    Tooltip.prototype.getPosition = function ($element) {
      $element   = $element || this.$element
      var el     = $element[0]
      var isBody = el.tagName == 'BODY'
      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
        scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
        width:  isBody ? $(window).width()  : $element.outerWidth(),
        height: isBody ? $(window).height() : $element.outerHeight()
      }, isBody ? { top: 0, left: 0 } : $element.offset())
    }
1472

Chris Rebert's avatar
Chris Rebert committed
1473
1474
1475
1476
1477
    Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
      return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
             placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
             placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
          /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
1478

Chris Rebert's avatar
Chris Rebert committed
1479
    }
1480

Chris Rebert's avatar
Chris Rebert committed
1481
1482
1483
    Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
      var delta = { top: 0, left: 0 }
      if (!this.$viewport) return delta
1484

Chris Rebert's avatar
Chris Rebert committed
1485
1486
      var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
      var viewportDimensions = this.getPosition(this.$viewport)
1487

Chris Rebert's avatar
Chris Rebert committed
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
      if (/right|left/.test(placement)) {
        var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
        var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
        if (topEdgeOffset < viewportDimensions.top) { // top overflow
          delta.top = viewportDimensions.top - topEdgeOffset
        } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
          delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
        }
      } else {
        var leftEdgeOffset  = pos.left - viewportPadding
        var rightEdgeOffset = pos.left + viewportPadding + actualWidth
        if (leftEdgeOffset < viewportDimensions.left) { // left overflow
          delta.left = viewportDimensions.left - leftEdgeOffset
        } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
          delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
        }
1504
1505
      }

Chris Rebert's avatar
Chris Rebert committed
1506
1507
      return delta
    }
fat's avatar
fat committed
1508

Chris Rebert's avatar
Chris Rebert committed
1509
1510
1511
1512
    Tooltip.prototype.getTitle = function () {
      var title
      var $e = this.$element
      var o  = this.options
1513

Chris Rebert's avatar
Chris Rebert committed
1514
1515
      title = $e.attr('data-original-title')
        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1516

Chris Rebert's avatar
Chris Rebert committed
1517
1518
      return title
    }
1519

Chris Rebert's avatar
Chris Rebert committed
1520
1521
1522
1523
1524
    Tooltip.prototype.getUID = function (prefix) {
      do prefix += ~~(Math.random() * 1000000)
      while (document.getElementById(prefix))
      return prefix
    }
1525

Chris Rebert's avatar
Chris Rebert committed
1526
1527
1528
    Tooltip.prototype.tip = function () {
      return (this.$tip = this.$tip || $(this.options.template))
    }
1529

Chris Rebert's avatar
Chris Rebert committed
1530
1531
1532
    Tooltip.prototype.arrow = function () {
      return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
    }
1533

Chris Rebert's avatar
Chris Rebert committed
1534
1535
1536
1537
1538
1539
    Tooltip.prototype.validate = function () {
      if (!this.$element[0].parentNode) {
        this.hide()
        this.$element = null
        this.options  = null
      }
1540
    }
1541

Chris Rebert's avatar
Chris Rebert committed
1542
1543
1544
    Tooltip.prototype.enable = function () {
      this.enabled = true
    }
1545

Chris Rebert's avatar
Chris Rebert committed
1546
1547
1548
    Tooltip.prototype.disable = function () {
      this.enabled = false
    }
1549

Chris Rebert's avatar
Chris Rebert committed
1550
1551
1552
    Tooltip.prototype.toggleEnabled = function () {
      this.enabled = !this.enabled
    }
Mark Otto's avatar
Mark Otto committed
1553

Chris Rebert's avatar
Chris Rebert committed
1554
1555
1556
1557
1558
1559
1560
1561
    Tooltip.prototype.toggle = function (e) {
      var self = this
      if (e) {
        self = $(e.currentTarget).data('bs.' + this.type)
        if (!self) {
          self = new this.constructor(e.currentTarget, this.getDelegateOptions())
          $(e.currentTarget).data('bs.' + this.type, self)
        }
Mark Otto's avatar
Mark Otto committed
1562
      }
Chris Rebert's avatar
Chris Rebert committed
1563
1564

      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
Mark Otto's avatar
Mark Otto committed
1565
1566
    }

Chris Rebert's avatar
Chris Rebert committed
1567
1568
1569
1570
    Tooltip.prototype.destroy = function () {
      clearTimeout(this.timeout)
      this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
    }
1571

1572

Chris Rebert's avatar
Chris Rebert committed
1573
1574
    // TOOLTIP PLUGIN DEFINITION
    // =========================
1575

Chris Rebert's avatar
Chris Rebert committed
1576
1577
1578
1579
1580
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.tooltip')
        var options = typeof option == 'object' && option
1581

Chris Rebert's avatar
Chris Rebert committed
1582
1583
1584
1585
1586
        if (!data && option == 'destroy') return
        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
fat's avatar
fat committed
1587

Chris Rebert's avatar
Chris Rebert committed
1588
    var old = $.fn.tooltip
1589

Chris Rebert's avatar
Chris Rebert committed
1590
1591
    $.fn.tooltip             = Plugin
    $.fn.tooltip.Constructor = Tooltip
Mark Otto's avatar
Mark Otto committed
1592

1593

Chris Rebert's avatar
Chris Rebert committed
1594
1595
    // TOOLTIP NO CONFLICT
    // ===================
1596

Chris Rebert's avatar
Chris Rebert committed
1597
1598
1599
1600
    $.fn.tooltip.noConflict = function () {
      $.fn.tooltip = old
      return this
    }
1601

Chris Rebert's avatar
Chris Rebert committed
1602
  })
1603

Chris Rebert's avatar
Chris Rebert committed
1604
}();
1605

1606
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1607
 * Bootstrap: popover.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1608
 * http://getbootstrap.com/javascript/#popovers
1609
 * ========================================================================
1610
 * Copyright 2011-2014 Twitter, Inc.
1611
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1612
 * ======================================================================== */
1613
1614


Chris Rebert's avatar
Chris Rebert committed
1615
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1616

Chris Rebert's avatar
Chris Rebert committed
1617
1618
1619
1620
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1621

Chris Rebert's avatar
Chris Rebert committed
1622
1623
    // POPOVER PUBLIC CLASS DEFINITION
    // ===============================
fat's avatar
fat committed
1624

Chris Rebert's avatar
Chris Rebert committed
1625
1626
1627
    var Popover = function (element, options) {
      this.init('popover', element, options)
    }
1628

Chris Rebert's avatar
Chris Rebert committed
1629
    if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
fat's avatar
fat committed
1630

Chris Rebert's avatar
Chris Rebert committed
1631
    Popover.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1632

Chris Rebert's avatar
Chris Rebert committed
1633
1634
1635
1636
1637
1638
    Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
      placement: 'right',
      trigger: 'click',
      content: '',
      template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
    })
1639

fat's avatar
fat committed
1640

Chris Rebert's avatar
Chris Rebert committed
1641
1642
    // NOTE: POPOVER EXTENDS tooltip.js
    // ================================
fat's avatar
fat committed
1643

Chris Rebert's avatar
Chris Rebert committed
1644
    Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1645

Chris Rebert's avatar
Chris Rebert committed
1646
    Popover.prototype.constructor = Popover
fat's avatar
fat committed
1647

Chris Rebert's avatar
Chris Rebert committed
1648
1649
1650
    Popover.prototype.getDefaults = function () {
      return Popover.DEFAULTS
    }
1651

Chris Rebert's avatar
Chris Rebert committed
1652
1653
1654
1655
    Popover.prototype.setContent = function () {
      var $tip    = this.tip()
      var title   = this.getTitle()
      var content = this.getContent()
1656

Chris Rebert's avatar
Chris Rebert committed
1657
1658
1659
1660
      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
      $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
        this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
      ](content)
1661

Chris Rebert's avatar
Chris Rebert committed
1662
      $tip.removeClass('fade top bottom left right in')
1663

Chris Rebert's avatar
Chris Rebert committed
1664
1665
1666
1667
      // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
      // this manually by checking the contents.
      if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
    }
1668

Chris Rebert's avatar
Chris Rebert committed
1669
1670
1671
    Popover.prototype.hasContent = function () {
      return this.getTitle() || this.getContent()
    }
1672

Chris Rebert's avatar
Chris Rebert committed
1673
1674
1675
    Popover.prototype.getContent = function () {
      var $e = this.$element
      var o  = this.options
1676

Chris Rebert's avatar
Chris Rebert committed
1677
1678
1679
1680
1681
      return $e.attr('data-content')
        || (typeof o.content == 'function' ?
              o.content.call($e[0]) :
              o.content)
    }
1682

Chris Rebert's avatar
Chris Rebert committed
1683
1684
1685
    Popover.prototype.arrow = function () {
      return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
    }
fat's avatar
fat committed
1686

Chris Rebert's avatar
Chris Rebert committed
1687
1688
1689
1690
    Popover.prototype.tip = function () {
      if (!this.$tip) this.$tip = $(this.options.template)
      return this.$tip
    }
1691

1692

Chris Rebert's avatar
Chris Rebert committed
1693
1694
    // POPOVER PLUGIN DEFINITION
    // =========================
1695

Chris Rebert's avatar
Chris Rebert committed
1696
1697
1698
1699
1700
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.popover')
        var options = typeof option == 'object' && option
1701

Chris Rebert's avatar
Chris Rebert committed
1702
1703
1704
1705
1706
1707
1708
        if (!data && option == 'destroy') return
        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }

    var old = $.fn.popover
1709

Chris Rebert's avatar
Chris Rebert committed
1710
1711
    $.fn.popover             = Plugin
    $.fn.popover.Constructor = Popover
Mark Otto's avatar
Mark Otto committed
1712

fat's avatar
fat committed
1713

Chris Rebert's avatar
Chris Rebert committed
1714
1715
    // POPOVER NO CONFLICT
    // ===================
1716

Chris Rebert's avatar
Chris Rebert committed
1717
1718
1719
1720
    $.fn.popover.noConflict = function () {
      $.fn.popover = old
      return this
    }
1721

Chris Rebert's avatar
Chris Rebert committed
1722
  })
1723

Chris Rebert's avatar
Chris Rebert committed
1724
}();
1725

1726
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1727
 * Bootstrap: scrollspy.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1728
 * http://getbootstrap.com/javascript/#scrollspy
1729
 * ========================================================================
1730
 * Copyright 2011-2014 Twitter, Inc.
1731
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1732
 * ======================================================================== */
1733
1734


Chris Rebert's avatar
Chris Rebert committed
1735
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1736

Chris Rebert's avatar
Chris Rebert committed
1737
1738
1739
1740
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1741

Chris Rebert's avatar
Chris Rebert committed
1742
1743
    // SCROLLSPY CLASS DEFINITION
    // ==========================
1744

Chris Rebert's avatar
Chris Rebert committed
1745
1746
    function ScrollSpy(element, options) {
      var process  = $.proxy(this.process, this)
1747

Chris Rebert's avatar
Chris Rebert committed
1748
1749
1750
1751
1752
1753
1754
1755
      this.$body          = $('body')
      this.$scrollElement = $(element).is('body') ? $(window) : $(element)
      this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
      this.selector       = (this.options.target || '') + ' .nav li > a'
      this.offsets        = []
      this.targets        = []
      this.activeTarget   = null
      this.scrollHeight   = 0
1756

Chris Rebert's avatar
Chris Rebert committed
1757
1758
1759
1760
      this.$scrollElement.on('scroll.bs.scrollspy', process)
      this.refresh()
      this.process()
    }
1761

Chris Rebert's avatar
Chris Rebert committed
1762
    ScrollSpy.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1763

Chris Rebert's avatar
Chris Rebert committed
1764
1765
1766
    ScrollSpy.DEFAULTS = {
      offset: 10
    }
1767

Chris Rebert's avatar
Chris Rebert committed
1768
1769
1770
    ScrollSpy.prototype.getScrollHeight = function () {
      return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1771

Chris Rebert's avatar
Chris Rebert committed
1772
1773
1774
    ScrollSpy.prototype.refresh = function () {
      var offsetMethod = 'offset'
      var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1775

Chris Rebert's avatar
Chris Rebert committed
1776
1777
1778
1779
      if (!$.isWindow(this.$scrollElement[0])) {
        offsetMethod = 'position'
        offsetBase   = this.$scrollElement.scrollTop()
      }
Mark Otto's avatar
grunt    
Mark Otto committed
1780

Chris Rebert's avatar
Chris Rebert committed
1781
1782
1783
      this.offsets = []
      this.targets = []
      this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1784

Chris Rebert's avatar
Chris Rebert committed
1785
      var self     = this
XhmikosR's avatar
XhmikosR committed
1786

Chris Rebert's avatar
Chris Rebert committed
1787
1788
1789
1790
1791
1792
      this.$body
        .find(this.selector)
        .map(function () {
          var $el   = $(this)
          var href  = $el.data('target') || $el.attr('href')
          var $href = /^#./.test(href) && $(href)
1793

Chris Rebert's avatar
Chris Rebert committed
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
          return ($href
            && $href.length
            && $href.is(':visible')
            && [[$href[offsetMethod]().top + offsetBase, href]]) || null
        })
        .sort(function (a, b) { return a[0] - b[0] })
        .each(function () {
          self.offsets.push(this[0])
          self.targets.push(this[1])
        })
Mark Otto's avatar
grunt    
Mark Otto committed
1804
1805
    }

Chris Rebert's avatar
Chris Rebert committed
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
    ScrollSpy.prototype.process = function () {
      var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
      var scrollHeight = this.getScrollHeight()
      var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
      var offsets      = this.offsets
      var targets      = this.targets
      var activeTarget = this.activeTarget
      var i

      if (this.scrollHeight != scrollHeight) {
        this.refresh()
      }
1818

Chris Rebert's avatar
Chris Rebert committed
1819
1820
1821
      if (scrollTop >= maxScroll) {
        return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
      }
1822

Chris Rebert's avatar
Chris Rebert committed
1823
1824
1825
      if (activeTarget && scrollTop <= offsets[0]) {
        return activeTarget != (i = targets[0]) && this.activate(i)
      }
1826

Chris Rebert's avatar
Chris Rebert committed
1827
1828
1829
1830
1831
1832
1833
      for (i = offsets.length; i--;) {
        activeTarget != targets[i]
          && scrollTop >= offsets[i]
          && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
          && this.activate(targets[i])
      }
    }
1834

Chris Rebert's avatar
Chris Rebert committed
1835
1836
    ScrollSpy.prototype.activate = function (target) {
      this.activeTarget = target
1837

Chris Rebert's avatar
Chris Rebert committed
1838
1839
1840
      $(this.selector)
        .parentsUntil(this.options.target, '.active')
        .removeClass('active')
1841

Chris Rebert's avatar
Chris Rebert committed
1842
1843
1844
      var selector = this.selector +
          '[data-target="' + target + '"],' +
          this.selector + '[href="' + target + '"]'
1845

Chris Rebert's avatar
Chris Rebert committed
1846
1847
      var active = $(selector)
        .parents('li')
1848
        .addClass('active')
1849

Chris Rebert's avatar
Chris Rebert committed
1850
1851
1852
1853
1854
      if (active.parent('.dropdown-menu').length) {
        active = active
          .closest('li.dropdown')
          .addClass('active')
      }
1855

Chris Rebert's avatar
Chris Rebert committed
1856
1857
      active.trigger('activate.bs.scrollspy')
    }
1858

1859

Chris Rebert's avatar
Chris Rebert committed
1860
1861
    // SCROLLSPY PLUGIN DEFINITION
    // ===========================
1862

Chris Rebert's avatar
Chris Rebert committed
1863
1864
1865
1866
1867
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.scrollspy')
        var options = typeof option == 'object' && option
1868

Chris Rebert's avatar
Chris Rebert committed
1869
1870
1871
1872
        if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
Mark Otto's avatar
Mark Otto committed
1873

Chris Rebert's avatar
Chris Rebert committed
1874
    var old = $.fn.scrollspy
1875

Chris Rebert's avatar
Chris Rebert committed
1876
1877
    $.fn.scrollspy             = Plugin
    $.fn.scrollspy.Constructor = ScrollSpy
1878

1879

Chris Rebert's avatar
Chris Rebert committed
1880
1881
    // SCROLLSPY NO CONFLICT
    // =====================
1882

Chris Rebert's avatar
Chris Rebert committed
1883
1884
1885
1886
    $.fn.scrollspy.noConflict = function () {
      $.fn.scrollspy = old
      return this
    }
1887
1888


Chris Rebert's avatar
Chris Rebert committed
1889
1890
1891
1892
1893
1894
1895
1896
    // SCROLLSPY DATA-API
    // ==================

    $(window).on('load.bs.scrollspy.data-api', function () {
      $('[data-spy="scroll"]').each(function () {
        var $spy = $(this)
        Plugin.call($spy, $spy.data())
      })
1897
    })
Chris Rebert's avatar
Chris Rebert committed
1898

1899
  })
1900

Chris Rebert's avatar
Chris Rebert committed
1901
}();
1902

1903
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1904
 * Bootstrap: tab.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1905
 * http://getbootstrap.com/javascript/#tabs
1906
 * ========================================================================
1907
 * Copyright 2011-2014 Twitter, Inc.
1908
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1909
 * ======================================================================== */
1910

1911

Chris Rebert's avatar
Chris Rebert committed
1912
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1913

Chris Rebert's avatar
Chris Rebert committed
1914
1915
1916
1917
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1918

Chris Rebert's avatar
Chris Rebert committed
1919
1920
    // TAB CLASS DEFINITION
    // ====================
1921

Chris Rebert's avatar
Chris Rebert committed
1922
1923
1924
    var Tab = function (element) {
      this.element = $(element)
    }
1925

Chris Rebert's avatar
Chris Rebert committed
1926
    Tab.VERSION = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1927

Chris Rebert's avatar
Chris Rebert committed
1928
1929
1930
1931
    Tab.prototype.show = function () {
      var $this    = this.element
      var $ul      = $this.closest('ul:not(.dropdown-menu)')
      var selector = $this.data('target')
1932

Chris Rebert's avatar
Chris Rebert committed
1933
1934
      if (!selector) {
        selector = $this.attr('href')
Mark Otto's avatar
Mark Otto committed
1935
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
1936
      }
1937

Chris Rebert's avatar
Chris Rebert committed
1938
      if ($this.parent('li').hasClass('active')) return
1939

Chris Rebert's avatar
Chris Rebert committed
1940
1941
1942
1943
      var previous = $ul.find('.active:last a')[0]
      var e        = $.Event('show.bs.tab', {
        relatedTarget: previous
      })
1944

Chris Rebert's avatar
Chris Rebert committed
1945
      $this.trigger(e)
1946

Chris Rebert's avatar
Chris Rebert committed
1947
      if (e.isDefaultPrevented()) return
1948

Chris Rebert's avatar
Chris Rebert committed
1949
      var $target = $(selector)
1950

Chris Rebert's avatar
Chris Rebert committed
1951
1952
1953
1954
1955
1956
      this.activate($this.closest('li'), $ul)
      this.activate($target, $target.parent(), function () {
        $this.trigger({
          type: 'shown.bs.tab',
          relatedTarget: previous
        })
1957
      })
Chris Rebert's avatar
Chris Rebert committed
1958
    }
1959

Chris Rebert's avatar
Chris Rebert committed
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
    Tab.prototype.activate = function (element, container, callback) {
      var $active    = container.find('> .active')
      var transition = callback
        && $.support.transition
        && $active.hasClass('fade')

      function next() {
        $active
          .removeClass('active')
          .find('> .dropdown-menu > .active')
          .removeClass('active')

        element.addClass('active')

        if (transition) {
          element[0].offsetWidth // reflow for transition
          element.addClass('in')
        } else {
          element.removeClass('fade')
        }
1980

Chris Rebert's avatar
Chris Rebert committed
1981
1982
1983
        if (element.parent('.dropdown-menu')) {
          element.closest('li.dropdown').addClass('active')
        }
1984

Chris Rebert's avatar
Chris Rebert committed
1985
        callback && callback()
1986
      }
1987

Chris Rebert's avatar
Chris Rebert committed
1988
1989
1990
1991
1992
      transition ?
        $active
          .one('bsTransitionEnd', next)
          .emulateTransitionEnd(150) :
        next()
fat's avatar
fat committed
1993

Chris Rebert's avatar
Chris Rebert committed
1994
      $active.removeClass('in')
1995
    }
fat's avatar
fat committed
1996

1997

Chris Rebert's avatar
Chris Rebert committed
1998
1999
    // TAB PLUGIN DEFINITION
    // =====================
2000

For faster browsing, not all history is shown. View entire blame