bootstrap.js 63.1 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
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1591
1592
1593
1594
      var $this    = $(this)
      var data     = $this.data('bs.tooltip')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
fat's avatar
fat committed
1595

XhmikosR's avatar
XhmikosR committed
1596
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1597
1598
1599
1600
1601
1602
      if (selector) {
        if (!data) $this.data('bs.tooltip', (data = {}))
        if (!data[selector]) data[selector] = new Tooltip(this, options)
      } else {
        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1603
1604
1605
      if (typeof option == 'string') data[option]()
    })
  }
1606

XhmikosR's avatar
XhmikosR committed
1607
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1608

XhmikosR's avatar
XhmikosR committed
1609
1610
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1611

1612

XhmikosR's avatar
XhmikosR committed
1613
1614
  // TOOLTIP NO CONFLICT
  // ===================
1615

XhmikosR's avatar
XhmikosR committed
1616
1617
1618
1619
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1620

XhmikosR's avatar
XhmikosR committed
1621
}(jQuery);
1622

1623
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1624
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1625
 * http://getbootstrap.com/javascript/#popovers
1626
 * ========================================================================
1627
 * Copyright 2011-2014 Twitter, Inc.
1628
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1629
 * ======================================================================== */
1630
1631


XhmikosR's avatar
XhmikosR committed
1632
1633
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1634

XhmikosR's avatar
XhmikosR committed
1635
1636
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1637

XhmikosR's avatar
XhmikosR committed
1638
1639
1640
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1641

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

Mark Otto's avatar
Mark Otto committed
1644
  Popover.VERSION  = '3.2.0'
1645

XhmikosR's avatar
XhmikosR committed
1646
1647
1648
1649
1650
1651
  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
1652
1653


XhmikosR's avatar
XhmikosR committed
1654
1655
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1656

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

XhmikosR's avatar
XhmikosR committed
1659
  Popover.prototype.constructor = Popover
1660

XhmikosR's avatar
XhmikosR committed
1661
1662
1663
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1664

XhmikosR's avatar
XhmikosR committed
1665
1666
1667
1668
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1669

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

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

XhmikosR's avatar
XhmikosR committed
1677
1678
1679
1680
    // 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()
  }
1681

XhmikosR's avatar
XhmikosR committed
1682
1683
1684
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1685

XhmikosR's avatar
XhmikosR committed
1686
1687
1688
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1689

XhmikosR's avatar
XhmikosR committed
1690
1691
1692
1693
1694
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1695

XhmikosR's avatar
XhmikosR committed
1696
1697
1698
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1699

XhmikosR's avatar
XhmikosR committed
1700
1701
1702
1703
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1704

1705

XhmikosR's avatar
XhmikosR committed
1706
1707
  // POPOVER PLUGIN DEFINITION
  // =========================
1708

XhmikosR's avatar
XhmikosR committed
1709
1710
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1711
1712
1713
1714
      var $this    = $(this)
      var data     = $this.data('bs.popover')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
Chris Rebert's avatar
Chris Rebert committed
1715

XhmikosR's avatar
XhmikosR committed
1716
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1717
1718
1719
1720
1721
1722
      if (selector) {
        if (!data) $this.data('bs.popover', (data = {}))
        if (!data[selector]) data[selector] = new Popover(this, options)
      } else {
        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1723
1724
1725
      if (typeof option == 'string') data[option]()
    })
  }
1726

XhmikosR's avatar
XhmikosR committed
1727
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1728

XhmikosR's avatar
XhmikosR committed
1729
1730
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1731

1732

XhmikosR's avatar
XhmikosR committed
1733
1734
  // POPOVER NO CONFLICT
  // ===================
1735

XhmikosR's avatar
XhmikosR committed
1736
1737
1738
1739
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1740

XhmikosR's avatar
XhmikosR committed
1741
}(jQuery);
1742

1743
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1744
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1745
 * http://getbootstrap.com/javascript/#scrollspy
1746
 * ========================================================================
1747
 * Copyright 2011-2014 Twitter, Inc.
1748
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1749
 * ======================================================================== */
1750
1751


XhmikosR's avatar
XhmikosR committed
1752
1753
+function ($) {
  'use strict';
1754

XhmikosR's avatar
XhmikosR committed
1755
1756
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1757

XhmikosR's avatar
XhmikosR committed
1758
1759
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1760

XhmikosR's avatar
XhmikosR committed
1761
1762
1763
1764
1765
1766
1767
1768
    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
1769

XhmikosR's avatar
XhmikosR committed
1770
1771
1772
1773
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1774

Mark Otto's avatar
Mark Otto committed
1775
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1776

XhmikosR's avatar
XhmikosR committed
1777
1778
1779
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1780

XhmikosR's avatar
XhmikosR committed
1781
1782
1783
  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
1784

XhmikosR's avatar
XhmikosR committed
1785
1786
1787
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1788

XhmikosR's avatar
XhmikosR committed
1789
1790
1791
1792
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1793

XhmikosR's avatar
XhmikosR committed
1794
1795
1796
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1797

XhmikosR's avatar
XhmikosR committed
1798
    var self     = this
XhmikosR's avatar
XhmikosR committed
1799

XhmikosR's avatar
XhmikosR committed
1800
1801
1802
1803
1804
1805
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1806

XhmikosR's avatar
XhmikosR committed
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
        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
1830
1831
    }

XhmikosR's avatar
XhmikosR committed
1832
1833
1834
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1835

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1836
1837
1838
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1839
    }
1840

XhmikosR's avatar
XhmikosR committed
1841
1842
1843
1844
1845
1846
1847
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1848

XhmikosR's avatar
XhmikosR committed
1849
1850
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1851

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1852
    this.clear()
1853

XhmikosR's avatar
XhmikosR committed
1854
1855
1856
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1857

XhmikosR's avatar
XhmikosR committed
1858
1859
1860
    var active = $(selector)
      .parents('li')
      .addClass('active')
1861

XhmikosR's avatar
XhmikosR committed
1862
1863
1864
1865
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1866
    }
1867

XhmikosR's avatar
XhmikosR committed
1868
1869
    active.trigger('activate.bs.scrollspy')
  }
1870

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1871
1872
1873
1874
1875
1876
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1877

XhmikosR's avatar
XhmikosR committed
1878
1879
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1880

XhmikosR's avatar
XhmikosR committed
1881
1882
1883
1884
1885
  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
1886

XhmikosR's avatar
XhmikosR committed
1887
1888
1889
1890
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1891

XhmikosR's avatar
XhmikosR committed
1892
  var old = $.fn.scrollspy
1893

XhmikosR's avatar
XhmikosR committed
1894
1895
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1896

1897

XhmikosR's avatar
XhmikosR committed
1898
1899
  // SCROLLSPY NO CONFLICT
  // =====================
1900

XhmikosR's avatar
XhmikosR committed
1901
1902
1903
1904
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1905

Chris Rebert's avatar
Chris Rebert committed
1906

XhmikosR's avatar
XhmikosR committed
1907
1908
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1909

XhmikosR's avatar
XhmikosR committed
1910
1911
1912
1913
1914
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1915
  })
1916

XhmikosR's avatar
XhmikosR committed
1917
}(jQuery);
1918

1919
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1920
 * Bootstrap: tab.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1921
 * http://getbootstrap.com/javascript/#tabs
1922
 * ========================================================================
1923
 * Copyright 2011-2014 Twitter, Inc.
1924
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1925
 * ======================================================================== */
1926

1927

XhmikosR's avatar
XhmikosR committed
1928
1929
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1930

XhmikosR's avatar
XhmikosR committed
1931
1932
  // TAB CLASS DEFINITION
  // ====================
1933

XhmikosR's avatar
XhmikosR committed
1934
1935
1936
  var Tab = function (element) {
    this.element = $(element)
  }
1937

Mark Otto's avatar
Mark Otto committed
1938
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1939

1940
1941
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1942
1943
1944
1945
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1946

XhmikosR's avatar
XhmikosR committed
1947
1948
1949
1950
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1951

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1954
1955
1956
1957
1958
1959
    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
1960
    })
1961

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1962
1963
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
1964

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

XhmikosR's avatar
XhmikosR committed
1967
    var $target = $(selector)
1968

XhmikosR's avatar
XhmikosR committed
1969
1970
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1971
1972
1973
1974
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
1975
1976
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1977
        relatedTarget: $previous[0]
1978
      })
XhmikosR's avatar
XhmikosR committed
1979
1980
    })
  }
1981

XhmikosR's avatar
XhmikosR committed
1982
1983
1984
1985
  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
1986
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
1987

XhmikosR's avatar
XhmikosR committed
1988
1989
1990
1991
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
1992
1993
1994
1995
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
1996

Mark Otto's avatar
grunt    
Mark Otto committed
1997
1998
1999
2000
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
For faster browsing, not all history is shown. View entire blame