bootstrap.js 62.6 KB
Newer Older
XhmikosR's avatar
XhmikosR committed
1001
    if (this.isShown && this.options.keyboard) {
Mark Otto's avatar
grunt    
Mark Otto committed
1002
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1003
1004
1005
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1006
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1007
1008
1009
1010
1011
1012
1013
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1014
1015
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1016
1017
1018
      that.$element.trigger('hidden.bs.modal')
    })
  }
1019

XhmikosR's avatar
XhmikosR committed
1020
1021
1022
1023
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1024

XhmikosR's avatar
XhmikosR committed
1025
1026
1027
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1028

XhmikosR's avatar
XhmikosR committed
1029
1030
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1031

XhmikosR's avatar
XhmikosR committed
1032
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1033
1034
1035
1036
1037
1038
1039
        .prependTo(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))
1040

XhmikosR's avatar
XhmikosR committed
1041
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1042

XhmikosR's avatar
XhmikosR committed
1043
      this.$backdrop.addClass('in')
1044

XhmikosR's avatar
XhmikosR committed
1045
      if (!callback) return
1046

XhmikosR's avatar
XhmikosR committed
1047
1048
1049
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1050
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1051
        callback()
1052

XhmikosR's avatar
XhmikosR committed
1053
1054
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1055

XhmikosR's avatar
XhmikosR committed
1056
1057
1058
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1059
      }
XhmikosR's avatar
XhmikosR committed
1060
1061
1062
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1063
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1064
        callbackRemove()
1065

XhmikosR's avatar
XhmikosR committed
1066
1067
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1068
    }
XhmikosR's avatar
XhmikosR committed
1069
  }
1070

XhmikosR's avatar
XhmikosR committed
1071
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1072
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1073
  }
fat's avatar
build    
fat committed
1074

XhmikosR's avatar
XhmikosR committed
1075
1076
1077
1078
  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
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
1082
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1083

XhmikosR's avatar
XhmikosR committed
1084
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1085
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1086
1087
1088
1089
1090
1091
1092
    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
  }
1093
1094


XhmikosR's avatar
XhmikosR committed
1095
1096
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1097

XhmikosR's avatar
XhmikosR committed
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
  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)

      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)
    })
  }
1109

XhmikosR's avatar
XhmikosR committed
1110
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1111

XhmikosR's avatar
XhmikosR committed
1112
1113
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1114
1115


XhmikosR's avatar
XhmikosR committed
1116
1117
  // MODAL NO CONFLICT
  // =================
1118

XhmikosR's avatar
XhmikosR committed
1119
1120
1121
1122
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1123
1124


XhmikosR's avatar
XhmikosR committed
1125
1126
  // MODAL DATA-API
  // ==============
1127

XhmikosR's avatar
XhmikosR committed
1128
1129
1130
1131
1132
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1133

XhmikosR's avatar
XhmikosR committed
1134
    if ($this.is('a')) e.preventDefault()
1135

XhmikosR's avatar
XhmikosR committed
1136
1137
1138
1139
    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () {
        $this.is(':visible') && $this.trigger('focus')
Mark Otto's avatar
grunt    
Mark Otto committed
1140
      })
Mark Otto's avatar
Mark Otto committed
1141
    })
XhmikosR's avatar
XhmikosR committed
1142
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1143
  })
1144

XhmikosR's avatar
XhmikosR committed
1145
}(jQuery);
1146

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


XhmikosR's avatar
XhmikosR committed
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
+function ($) {
  'use strict';

  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================

  var Tooltip = function (element, options) {
    this.type       =
    this.options    =
    this.enabled    =
    this.timeout    =
    this.hoverState =
    this.$element   = null

    this.init('tooltip', element, options)
  }

Mark Otto's avatar
Mark Otto committed
1174
  Tooltip.VERSION  = '3.2.0'
XhmikosR's avatar
XhmikosR committed
1175

1176
1177
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
  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
    }
  }

  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)

    var triggers = this.options.trigger.split(' ')

    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'

        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))
      }
    }
1216

XhmikosR's avatar
XhmikosR committed
1217
1218
1219
1220
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1221

XhmikosR's avatar
XhmikosR committed
1222
1223
1224
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1225

XhmikosR's avatar
XhmikosR committed
1226
1227
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1228

XhmikosR's avatar
XhmikosR committed
1229
1230
1231
1232
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1233
1234
      }
    }
1235

XhmikosR's avatar
XhmikosR committed
1236
1237
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1238

XhmikosR's avatar
XhmikosR committed
1239
1240
1241
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1242

XhmikosR's avatar
XhmikosR committed
1243
1244
1245
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1246

XhmikosR's avatar
XhmikosR committed
1247
1248
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1249

XhmikosR's avatar
XhmikosR committed
1250
1251
1252
  Tooltip.prototype.enter = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)
Mark Otto's avatar
Mark Otto committed
1253

XhmikosR's avatar
XhmikosR committed
1254
1255
1256
1257
1258
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1259
1260
1261
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1262
    }
1263

XhmikosR's avatar
XhmikosR committed
1264
    clearTimeout(self.timeout)
1265

XhmikosR's avatar
XhmikosR committed
1266
    self.hoverState = 'in'
1267

XhmikosR's avatar
XhmikosR committed
1268
    if (!self.options.delay || !self.options.delay.show) return self.show()
1269

XhmikosR's avatar
XhmikosR committed
1270
1271
1272
1273
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1274

XhmikosR's avatar
XhmikosR committed
1275
1276
1277
  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)
Mark Otto's avatar
Mark Otto committed
1278

XhmikosR's avatar
XhmikosR committed
1279
1280
1281
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1282
    }
1283

XhmikosR's avatar
XhmikosR committed
1284
    clearTimeout(self.timeout)
fat's avatar
fat committed
1285

XhmikosR's avatar
XhmikosR committed
1286
    self.hoverState = 'out'
1287

XhmikosR's avatar
XhmikosR committed
1288
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
1289

XhmikosR's avatar
XhmikosR committed
1290
1291
1292
1293
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1294

XhmikosR's avatar
XhmikosR committed
1295
1296
  Tooltip.prototype.show = function () {
    var e = $.Event('show.bs.' + this.type)
Chris Rebert's avatar
Chris Rebert committed
1297

XhmikosR's avatar
XhmikosR committed
1298
1299
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1300

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1301
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1302
1303
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1304

XhmikosR's avatar
XhmikosR committed
1305
      var $tip = this.tip()
fat's avatar
fat committed
1306

XhmikosR's avatar
XhmikosR committed
1307
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1308

XhmikosR's avatar
XhmikosR committed
1309
1310
1311
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1312

XhmikosR's avatar
XhmikosR committed
1313
      if (this.options.animation) $tip.addClass('fade')
1314

XhmikosR's avatar
XhmikosR committed
1315
1316
1317
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1318

XhmikosR's avatar
XhmikosR committed
1319
1320
1321
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1322

XhmikosR's avatar
XhmikosR committed
1323
1324
1325
1326
1327
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1328

XhmikosR's avatar
XhmikosR committed
1329
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1330

XhmikosR's avatar
XhmikosR committed
1331
1332
1333
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1334

XhmikosR's avatar
XhmikosR committed
1335
1336
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1337
1338
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1339

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1340
1341
1342
1343
        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
XhmikosR's avatar
XhmikosR committed
1344
                    placement
fat's avatar
fat committed
1345

1346
        $tip
XhmikosR's avatar
XhmikosR committed
1347
          .removeClass(orgPlacement)
1348
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1349
      }
1350

XhmikosR's avatar
XhmikosR committed
1351
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1352

XhmikosR's avatar
XhmikosR committed
1353
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1354

XhmikosR's avatar
XhmikosR committed
1355
1356
1357
1358
      var complete = function () {
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
      }
fat's avatar
fat committed
1359

XhmikosR's avatar
XhmikosR committed
1360
1361
1362
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1363
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1364
1365
1366
        complete()
    }
  }
fat's avatar
fat committed
1367

XhmikosR's avatar
XhmikosR committed
1368
1369
1370
1371
  Tooltip.prototype.applyPlacement = function (offset, placement) {
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight
fat's avatar
fat committed
1372

XhmikosR's avatar
XhmikosR committed
1373
1374
1375
    // manually read margins because getBoundingClientRect includes difference
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)
fat's avatar
fat committed
1376

XhmikosR's avatar
XhmikosR committed
1377
1378
1379
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1380

XhmikosR's avatar
XhmikosR committed
1381
1382
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1383

XhmikosR's avatar
XhmikosR committed
1384
1385
1386
1387
1388
1389
1390
1391
    // $.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)
        })
1392
      }
XhmikosR's avatar
XhmikosR committed
1393
    }, offset), 0)
1394

XhmikosR's avatar
XhmikosR committed
1395
    $tip.addClass('in')
fat's avatar
fat committed
1396

XhmikosR's avatar
XhmikosR committed
1397
1398
1399
    // 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
1400

XhmikosR's avatar
XhmikosR committed
1401
1402
1403
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1404

XhmikosR's avatar
XhmikosR committed
1405
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
fat's avatar
fat committed
1406

XhmikosR's avatar
XhmikosR committed
1407
1408
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1409

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1410
1411
1412
    var isVertical          = /top|bottom/.test(placement)
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1413

XhmikosR's avatar
XhmikosR committed
1414
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1415
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1416
  }
1417

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1418
1419
1420
1421
  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
    this.arrow()
      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isHorizontal ? 'top' : 'left', '')
XhmikosR's avatar
XhmikosR committed
1422
  }
1423

XhmikosR's avatar
XhmikosR committed
1424
1425
1426
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1427

XhmikosR's avatar
XhmikosR committed
1428
1429
1430
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1431

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1432
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1433
1434
1435
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1436

XhmikosR's avatar
XhmikosR committed
1437
1438
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1439
1440
1441
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1442
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1443
    }
Jacob Thornton's avatar
Jacob Thornton committed
1444

XhmikosR's avatar
XhmikosR committed
1445
    this.$element.trigger(e)
1446

XhmikosR's avatar
XhmikosR committed
1447
    if (e.isDefaultPrevented()) return
1448

XhmikosR's avatar
XhmikosR committed
1449
    $tip.removeClass('in')
1450

XhmikosR's avatar
XhmikosR committed
1451
1452
1453
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1454
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1455
      complete()
1456

XhmikosR's avatar
XhmikosR committed
1457
    this.hoverState = null
1458

XhmikosR's avatar
XhmikosR committed
1459
1460
    return this
  }
1461

XhmikosR's avatar
XhmikosR committed
1462
1463
1464
1465
  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', '')
1466
    }
XhmikosR's avatar
XhmikosR committed
1467
  }
1468

XhmikosR's avatar
XhmikosR committed
1469
1470
1471
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1472

XhmikosR's avatar
XhmikosR committed
1473
1474
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1475

XhmikosR's avatar
XhmikosR committed
1476
1477
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1478

Mark Otto's avatar
grunt    
Mark Otto committed
1479
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1480
1481
1482
1483
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1484
1485
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1486
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1487
1488

    return $.extend({}, elRect, scroll, outerDims, elOffset)
XhmikosR's avatar
XhmikosR committed
1489
  }
1490

XhmikosR's avatar
XhmikosR committed
1491
1492
1493
1494
1495
  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   }
1496

XhmikosR's avatar
XhmikosR committed
1497
  }
1498

XhmikosR's avatar
XhmikosR committed
1499
1500
1501
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
    var delta = { top: 0, left: 0 }
    if (!this.$viewport) return delta
1502

XhmikosR's avatar
XhmikosR committed
1503
1504
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1505

XhmikosR's avatar
XhmikosR committed
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
    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
1521
      }
Chris Rebert's avatar
Chris Rebert committed
1522
    }
fat's avatar
fat committed
1523

XhmikosR's avatar
XhmikosR committed
1524
1525
    return delta
  }
1526

XhmikosR's avatar
XhmikosR committed
1527
1528
1529
1530
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1531

XhmikosR's avatar
XhmikosR committed
1532
1533
    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1534

XhmikosR's avatar
XhmikosR committed
1535
1536
    return title
  }
1537

XhmikosR's avatar
XhmikosR committed
1538
1539
1540
1541
1542
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1543

XhmikosR's avatar
XhmikosR committed
1544
1545
1546
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1547

XhmikosR's avatar
XhmikosR committed
1548
1549
1550
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1551

XhmikosR's avatar
XhmikosR committed
1552
1553
1554
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1555

XhmikosR's avatar
XhmikosR committed
1556
1557
1558
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1559

XhmikosR's avatar
XhmikosR committed
1560
1561
1562
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1563

XhmikosR's avatar
XhmikosR committed
1564
1565
1566
1567
1568
1569
1570
1571
  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
1572
1573
    }

XhmikosR's avatar
XhmikosR committed
1574
1575
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1576

XhmikosR's avatar
XhmikosR committed
1577
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1578
    var that = this
XhmikosR's avatar
XhmikosR committed
1579
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1580
1581
1582
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1583
  }
1584
1585


XhmikosR's avatar
XhmikosR committed
1586
1587
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1588

XhmikosR's avatar
XhmikosR committed
1589
1590
1591
1592
1593
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1594

XhmikosR's avatar
XhmikosR committed
1595
1596
1597
1598
1599
      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1600

XhmikosR's avatar
XhmikosR committed
1601
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1602

XhmikosR's avatar
XhmikosR committed
1603
1604
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1605

1606

XhmikosR's avatar
XhmikosR committed
1607
1608
  // TOOLTIP NO CONFLICT
  // ===================
1609

XhmikosR's avatar
XhmikosR committed
1610
1611
1612
1613
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1614

XhmikosR's avatar
XhmikosR committed
1615
}(jQuery);
1616

1617
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1618
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1619
 * http://getbootstrap.com/javascript/#popovers
1620
 * ========================================================================
1621
 * Copyright 2011-2014 Twitter, Inc.
1622
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1623
 * ======================================================================== */
1624
1625


XhmikosR's avatar
XhmikosR committed
1626
1627
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1628

XhmikosR's avatar
XhmikosR committed
1629
1630
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1631

XhmikosR's avatar
XhmikosR committed
1632
1633
1634
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1635

XhmikosR's avatar
XhmikosR committed
1636
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1637

Mark Otto's avatar
Mark Otto committed
1638
  Popover.VERSION  = '3.2.0'
1639

XhmikosR's avatar
XhmikosR committed
1640
1641
1642
1643
1644
1645
  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>'
  })
fat's avatar
fat committed
1646
1647


XhmikosR's avatar
XhmikosR committed
1648
1649
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1650

XhmikosR's avatar
XhmikosR committed
1651
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
fat's avatar
fat committed
1652

XhmikosR's avatar
XhmikosR committed
1653
  Popover.prototype.constructor = Popover
1654

XhmikosR's avatar
XhmikosR committed
1655
1656
1657
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1658

XhmikosR's avatar
XhmikosR committed
1659
1660
1661
1662
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1663

XhmikosR's avatar
XhmikosR committed
1664
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
Mark Otto's avatar
grunt    
Mark Otto committed
1665
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
XhmikosR's avatar
XhmikosR committed
1666
1667
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
    ](content)
1668

XhmikosR's avatar
XhmikosR committed
1669
    $tip.removeClass('fade top bottom left right in')
1670

XhmikosR's avatar
XhmikosR committed
1671
1672
1673
1674
    // 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()
  }
1675

XhmikosR's avatar
XhmikosR committed
1676
1677
1678
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1679

XhmikosR's avatar
XhmikosR committed
1680
1681
1682
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1683

XhmikosR's avatar
XhmikosR committed
1684
1685
1686
1687
1688
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1689

XhmikosR's avatar
XhmikosR committed
1690
1691
1692
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1693

XhmikosR's avatar
XhmikosR committed
1694
1695
1696
1697
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1698

1699

XhmikosR's avatar
XhmikosR committed
1700
1701
  // POPOVER PLUGIN DEFINITION
  // =========================
1702

XhmikosR's avatar
XhmikosR committed
1703
1704
1705
1706
1707
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
Chris Rebert's avatar
Chris Rebert committed
1708

XhmikosR's avatar
XhmikosR committed
1709
1710
1711
1712
1713
      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1714

XhmikosR's avatar
XhmikosR committed
1715
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1716

XhmikosR's avatar
XhmikosR committed
1717
1718
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1719

1720

XhmikosR's avatar
XhmikosR committed
1721
1722
  // POPOVER NO CONFLICT
  // ===================
1723

XhmikosR's avatar
XhmikosR committed
1724
1725
1726
1727
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1728

XhmikosR's avatar
XhmikosR committed
1729
}(jQuery);
1730

1731
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1732
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1733
 * http://getbootstrap.com/javascript/#scrollspy
1734
 * ========================================================================
1735
 * Copyright 2011-2014 Twitter, Inc.
1736
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1737
 * ======================================================================== */
1738
1739


XhmikosR's avatar
XhmikosR committed
1740
1741
+function ($) {
  'use strict';
1742

XhmikosR's avatar
XhmikosR committed
1743
1744
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1745

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

XhmikosR's avatar
XhmikosR committed
1749
1750
1751
1752
1753
1754
1755
1756
    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
1757

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

Mark Otto's avatar
Mark Otto committed
1763
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1764

XhmikosR's avatar
XhmikosR committed
1765
1766
1767
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1768

XhmikosR's avatar
XhmikosR committed
1769
1770
1771
  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
1772

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

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

XhmikosR's avatar
XhmikosR committed
1782
1783
1784
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1785

XhmikosR's avatar
XhmikosR committed
1786
    var self     = this
XhmikosR's avatar
XhmikosR committed
1787

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

XhmikosR's avatar
XhmikosR committed
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
        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])
      })
  }

  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()
Mark Otto's avatar
grunt    
Mark Otto committed
1818
1819
    }

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

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

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

XhmikosR's avatar
XhmikosR committed
1836
1837
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1838

XhmikosR's avatar
XhmikosR committed
1839
1840
1841
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
1842

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

XhmikosR's avatar
XhmikosR committed
1847
1848
1849
    var active = $(selector)
      .parents('li')
      .addClass('active')
1850

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

XhmikosR's avatar
XhmikosR committed
1857
1858
    active.trigger('activate.bs.scrollspy')
  }
1859
1860


XhmikosR's avatar
XhmikosR committed
1861
1862
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1863

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

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

XhmikosR's avatar
XhmikosR committed
1875
  var old = $.fn.scrollspy
1876

XhmikosR's avatar
XhmikosR committed
1877
1878
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1879

1880

XhmikosR's avatar
XhmikosR committed
1881
1882
  // SCROLLSPY NO CONFLICT
  // =====================
1883

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

Chris Rebert's avatar
Chris Rebert committed
1889

XhmikosR's avatar
XhmikosR committed
1890
1891
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1892

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

XhmikosR's avatar
XhmikosR committed
1900
}(jQuery);
1901

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

1910

XhmikosR's avatar
XhmikosR committed
1911
1912
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1913

XhmikosR's avatar
XhmikosR committed
1914
1915
  // TAB CLASS DEFINITION
  // ====================
1916

XhmikosR's avatar
XhmikosR committed
1917
1918
1919
  var Tab = function (element) {
    this.element = $(element)
  }
1920

Mark Otto's avatar
Mark Otto committed
1921
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1922

1923
1924
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1925
1926
1927
1928
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1929

XhmikosR's avatar
XhmikosR committed
1930
1931
1932
1933
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1934

XhmikosR's avatar
XhmikosR committed
1935
    if ($this.parent('li').hasClass('active')) return
1936

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1937
1938
1939
1940
1941
1942
    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
XhmikosR's avatar
XhmikosR committed
1943
    })
1944

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1945
1946
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
1947

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1948
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
1949

XhmikosR's avatar
XhmikosR committed
1950
    var $target = $(selector)
1951

XhmikosR's avatar
XhmikosR committed
1952
1953
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1954
1955
1956
1957
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
1958
1959
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1960
        relatedTarget: $previous[0]
1961
      })
XhmikosR's avatar
XhmikosR committed
1962
1963
    })
  }
1964

XhmikosR's avatar
XhmikosR committed
1965
1966
1967
1968
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
Mark Otto's avatar
grunt    
Mark Otto committed
1969
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
1970

XhmikosR's avatar
XhmikosR committed
1971
1972
1973
1974
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
1975
1976
1977
1978
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
1979

Mark Otto's avatar
grunt    
Mark Otto committed
1980
1981
1982
1983
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
1984
1985
1986
1987
1988
1989

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

XhmikosR's avatar
XhmikosR committed
1992
      if (element.parent('.dropdown-menu')) {
Mark Otto's avatar
grunt    
Mark Otto committed
1993
1994
1995
1996
1997
1998
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
1999
      }
fat's avatar
fat committed
2000

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