bootstrap.js 64 KB
Newer Older
XhmikosR's avatar
XhmikosR committed
1001
    this.$element.trigger(e)
1002

XhmikosR's avatar
XhmikosR committed
1003
    if (!this.isShown || e.isDefaultPrevented()) return
1004

XhmikosR's avatar
XhmikosR committed
1005
    this.isShown = false
1006

XhmikosR's avatar
XhmikosR committed
1007
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
1008

XhmikosR's avatar
XhmikosR committed
1009
    $(document).off('focusin.bs.modal')
Chris Rebert's avatar
Chris Rebert committed
1010

XhmikosR's avatar
XhmikosR committed
1011
1012
1013
1014
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
1015

XhmikosR's avatar
XhmikosR committed
1016
1017
1018
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1019
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1020
1021
      this.hideModal()
  }
1022

XhmikosR's avatar
XhmikosR committed
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
Mark Otto's avatar
grunt    
Mark Otto committed
1035
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1036
1037
1038
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1039
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1040
1041
1042
1043
1044
1045
1046
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1047
1048
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1049
1050
1051
      that.$element.trigger('hidden.bs.modal')
    })
  }
1052

XhmikosR's avatar
XhmikosR committed
1053
1054
1055
1056
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1057

XhmikosR's avatar
XhmikosR committed
1058
1059
1060
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1061

XhmikosR's avatar
XhmikosR committed
1062
1063
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1064

XhmikosR's avatar
XhmikosR committed
1065
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1066
1067
1068
1069
1070
1071
1072
        .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))
1073

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

XhmikosR's avatar
XhmikosR committed
1076
      this.$backdrop.addClass('in')
1077

XhmikosR's avatar
XhmikosR committed
1078
      if (!callback) return
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
1082
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1083
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1084
        callback()
1085

XhmikosR's avatar
XhmikosR committed
1086
1087
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1088

XhmikosR's avatar
XhmikosR committed
1089
1090
1091
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1092
      }
XhmikosR's avatar
XhmikosR committed
1093
1094
1095
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1096
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1097
        callbackRemove()
1098

XhmikosR's avatar
XhmikosR committed
1099
1100
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1101
    }
XhmikosR's avatar
XhmikosR committed
1102
  }
1103

XhmikosR's avatar
XhmikosR committed
1104
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1105
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1106
  }
fat's avatar
build    
fat committed
1107

XhmikosR's avatar
XhmikosR committed
1108
1109
1110
1111
  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
1112

XhmikosR's avatar
XhmikosR committed
1113
1114
1115
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1116

XhmikosR's avatar
XhmikosR committed
1117
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1118
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1119
1120
1121
1122
1123
1124
1125
    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
  }
1126
1127


XhmikosR's avatar
XhmikosR committed
1128
1129
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1130

XhmikosR's avatar
XhmikosR committed
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
  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)
    })
  }
1142

XhmikosR's avatar
XhmikosR committed
1143
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1144

XhmikosR's avatar
XhmikosR committed
1145
1146
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1147
1148


XhmikosR's avatar
XhmikosR committed
1149
1150
  // MODAL NO CONFLICT
  // =================
1151

XhmikosR's avatar
XhmikosR committed
1152
1153
1154
1155
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1156
1157


XhmikosR's avatar
XhmikosR committed
1158
1159
  // MODAL DATA-API
  // ==============
1160

XhmikosR's avatar
XhmikosR committed
1161
1162
1163
1164
1165
  $(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())
1166

XhmikosR's avatar
XhmikosR committed
1167
    if ($this.is('a')) e.preventDefault()
1168

XhmikosR's avatar
XhmikosR committed
1169
1170
1171
1172
    $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
1173
      })
Mark Otto's avatar
Mark Otto committed
1174
    })
XhmikosR's avatar
XhmikosR committed
1175
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1176
  })
1177

XhmikosR's avatar
XhmikosR committed
1178
}(jQuery);
1179

1180
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1181
 * Bootstrap: tooltip.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1182
 * http://getbootstrap.com/javascript/#tooltip
1183
 * Inspired by the original jQuery.tipsy by Jason Frame
1184
 * ========================================================================
1185
 * Copyright 2011-2014 Twitter, Inc.
1186
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1187
 * ======================================================================== */
1188
1189


XhmikosR's avatar
XhmikosR committed
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
+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
1207
  Tooltip.VERSION  = '3.2.0'
XhmikosR's avatar
XhmikosR committed
1208

1209
1210
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
  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))
      }
    }
1249

XhmikosR's avatar
XhmikosR committed
1250
1251
1252
1253
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1254

XhmikosR's avatar
XhmikosR committed
1255
1256
1257
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1258

XhmikosR's avatar
XhmikosR committed
1259
1260
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1261

XhmikosR's avatar
XhmikosR committed
1262
1263
1264
1265
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1266
1267
      }
    }
1268

XhmikosR's avatar
XhmikosR committed
1269
1270
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1271

XhmikosR's avatar
XhmikosR committed
1272
1273
1274
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1275

XhmikosR's avatar
XhmikosR committed
1276
1277
1278
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1279

XhmikosR's avatar
XhmikosR committed
1280
1281
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1282

XhmikosR's avatar
XhmikosR committed
1283
1284
1285
  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
1286

XhmikosR's avatar
XhmikosR committed
1287
1288
1289
1290
1291
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1292
1293
1294
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1295
    }
1296

XhmikosR's avatar
XhmikosR committed
1297
    clearTimeout(self.timeout)
1298

XhmikosR's avatar
XhmikosR committed
1299
    self.hoverState = 'in'
1300

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

XhmikosR's avatar
XhmikosR committed
1303
1304
1305
1306
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1307

XhmikosR's avatar
XhmikosR committed
1308
1309
1310
  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
1311

XhmikosR's avatar
XhmikosR committed
1312
1313
1314
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1315
    }
1316

XhmikosR's avatar
XhmikosR committed
1317
    clearTimeout(self.timeout)
fat's avatar
fat committed
1318

XhmikosR's avatar
XhmikosR committed
1319
    self.hoverState = 'out'
1320

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

XhmikosR's avatar
XhmikosR committed
1323
1324
1325
1326
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1327

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

XhmikosR's avatar
XhmikosR committed
1331
1332
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1333

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1334
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1335
1336
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1337

XhmikosR's avatar
XhmikosR committed
1338
      var $tip = this.tip()
fat's avatar
fat committed
1339

XhmikosR's avatar
XhmikosR committed
1340
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1341

XhmikosR's avatar
XhmikosR committed
1342
1343
1344
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1345

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

XhmikosR's avatar
XhmikosR committed
1348
1349
1350
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1351

XhmikosR's avatar
XhmikosR committed
1352
1353
1354
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1355

XhmikosR's avatar
XhmikosR committed
1356
1357
1358
1359
1360
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1361

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

XhmikosR's avatar
XhmikosR committed
1364
1365
1366
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1367

XhmikosR's avatar
XhmikosR committed
1368
1369
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1370
1371
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1372

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1373
1374
1375
1376
        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
1377
                    placement
fat's avatar
fat committed
1378

1379
        $tip
XhmikosR's avatar
XhmikosR committed
1380
          .removeClass(orgPlacement)
1381
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1382
      }
1383

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

XhmikosR's avatar
XhmikosR committed
1386
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1387

XhmikosR's avatar
XhmikosR committed
1388
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1389
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1390
1391
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1392
1393

        if (prevHoverState == 'out') that.leave(that)
XhmikosR's avatar
XhmikosR committed
1394
      }
fat's avatar
fat committed
1395

XhmikosR's avatar
XhmikosR committed
1396
1397
1398
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1399
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1400
1401
1402
        complete()
    }
  }
fat's avatar
fat committed
1403

XhmikosR's avatar
XhmikosR committed
1404
1405
1406
1407
  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
1408

XhmikosR's avatar
XhmikosR committed
1409
1410
1411
    // 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
1412

XhmikosR's avatar
XhmikosR committed
1413
1414
1415
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1416

XhmikosR's avatar
XhmikosR committed
1417
1418
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1419

XhmikosR's avatar
XhmikosR committed
1420
1421
1422
1423
1424
1425
1426
1427
    // $.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)
        })
1428
      }
XhmikosR's avatar
XhmikosR committed
1429
    }, offset), 0)
1430

XhmikosR's avatar
XhmikosR committed
1431
    $tip.addClass('in')
fat's avatar
fat committed
1432

XhmikosR's avatar
XhmikosR committed
1433
1434
1435
    // 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
1436

XhmikosR's avatar
XhmikosR committed
1437
1438
1439
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1440

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

XhmikosR's avatar
XhmikosR committed
1443
1444
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1445

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

XhmikosR's avatar
XhmikosR committed
1450
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1451
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1452
  }
1453

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1454
1455
1456
1457
  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
1458
  }
1459

XhmikosR's avatar
XhmikosR committed
1460
1461
1462
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1463

XhmikosR's avatar
XhmikosR committed
1464
1465
1466
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1467

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1468
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1469
1470
1471
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1472

XhmikosR's avatar
XhmikosR committed
1473
1474
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1475
1476
1477
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1478
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1479
    }
Jacob Thornton's avatar
Jacob Thornton committed
1480

XhmikosR's avatar
XhmikosR committed
1481
    this.$element.trigger(e)
1482

XhmikosR's avatar
XhmikosR committed
1483
    if (e.isDefaultPrevented()) return
1484

XhmikosR's avatar
XhmikosR committed
1485
    $tip.removeClass('in')
1486

XhmikosR's avatar
XhmikosR committed
1487
1488
1489
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1490
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1491
      complete()
1492

XhmikosR's avatar
XhmikosR committed
1493
    this.hoverState = null
1494

XhmikosR's avatar
XhmikosR committed
1495
1496
    return this
  }
1497

XhmikosR's avatar
XhmikosR committed
1498
1499
1500
1501
  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', '')
1502
    }
XhmikosR's avatar
XhmikosR committed
1503
  }
1504

XhmikosR's avatar
XhmikosR committed
1505
1506
1507
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1508

XhmikosR's avatar
XhmikosR committed
1509
1510
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1511

XhmikosR's avatar
XhmikosR committed
1512
1513
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1514

Mark Otto's avatar
grunt    
Mark Otto committed
1515
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1516
1517
1518
1519
    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
1520
1521
    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
1522
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1523
1524

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

XhmikosR's avatar
XhmikosR committed
1527
1528
1529
1530
1531
  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   }
1532

XhmikosR's avatar
XhmikosR committed
1533
  }
1534

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

XhmikosR's avatar
XhmikosR committed
1539
1540
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1541

XhmikosR's avatar
XhmikosR committed
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
    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
1557
      }
Chris Rebert's avatar
Chris Rebert committed
1558
    }
fat's avatar
fat committed
1559

XhmikosR's avatar
XhmikosR committed
1560
1561
    return delta
  }
1562

XhmikosR's avatar
XhmikosR committed
1563
1564
1565
1566
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1567

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

XhmikosR's avatar
XhmikosR committed
1571
1572
    return title
  }
1573

XhmikosR's avatar
XhmikosR committed
1574
1575
1576
1577
1578
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1579

XhmikosR's avatar
XhmikosR committed
1580
1581
1582
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1583

XhmikosR's avatar
XhmikosR committed
1584
1585
1586
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1587

XhmikosR's avatar
XhmikosR committed
1588
1589
1590
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1591

XhmikosR's avatar
XhmikosR committed
1592
1593
1594
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1595

XhmikosR's avatar
XhmikosR committed
1596
1597
1598
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1599

XhmikosR's avatar
XhmikosR committed
1600
1601
1602
1603
1604
1605
1606
1607
  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
1608
1609
    }

XhmikosR's avatar
XhmikosR committed
1610
1611
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1612

XhmikosR's avatar
XhmikosR committed
1613
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1614
    var that = this
XhmikosR's avatar
XhmikosR committed
1615
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1616
1617
1618
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1619
  }
1620
1621


XhmikosR's avatar
XhmikosR committed
1622
1623
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1624

XhmikosR's avatar
XhmikosR committed
1625
1626
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1627
1628
1629
1630
      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
1631

XhmikosR's avatar
XhmikosR committed
1632
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1633
1634
1635
1636
1637
1638
      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
1639
1640
1641
      if (typeof option == 'string') data[option]()
    })
  }
1642

XhmikosR's avatar
XhmikosR committed
1643
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1644

XhmikosR's avatar
XhmikosR committed
1645
1646
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1647

1648

XhmikosR's avatar
XhmikosR committed
1649
1650
  // TOOLTIP NO CONFLICT
  // ===================
1651

XhmikosR's avatar
XhmikosR committed
1652
1653
1654
1655
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1656

XhmikosR's avatar
XhmikosR committed
1657
}(jQuery);
1658

1659
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1660
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1661
 * http://getbootstrap.com/javascript/#popovers
1662
 * ========================================================================
1663
 * Copyright 2011-2014 Twitter, Inc.
1664
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1665
 * ======================================================================== */
1666
1667


XhmikosR's avatar
XhmikosR committed
1668
1669
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1670

XhmikosR's avatar
XhmikosR committed
1671
1672
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1673

XhmikosR's avatar
XhmikosR committed
1674
1675
1676
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1677

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

Mark Otto's avatar
Mark Otto committed
1680
  Popover.VERSION  = '3.2.0'
1681

XhmikosR's avatar
XhmikosR committed
1682
1683
1684
1685
1686
1687
  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
1688
1689


XhmikosR's avatar
XhmikosR committed
1690
1691
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1692

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

XhmikosR's avatar
XhmikosR committed
1695
  Popover.prototype.constructor = Popover
1696

XhmikosR's avatar
XhmikosR committed
1697
1698
1699
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1700

XhmikosR's avatar
XhmikosR committed
1701
1702
1703
1704
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1705

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

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

XhmikosR's avatar
XhmikosR committed
1713
1714
1715
1716
    // 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()
  }
1717

XhmikosR's avatar
XhmikosR committed
1718
1719
1720
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1721

XhmikosR's avatar
XhmikosR committed
1722
1723
1724
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1725

XhmikosR's avatar
XhmikosR committed
1726
1727
1728
1729
1730
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1731

XhmikosR's avatar
XhmikosR committed
1732
1733
1734
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1735

XhmikosR's avatar
XhmikosR committed
1736
1737
1738
1739
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1740

1741

XhmikosR's avatar
XhmikosR committed
1742
1743
  // POPOVER PLUGIN DEFINITION
  // =========================
1744

XhmikosR's avatar
XhmikosR committed
1745
1746
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1747
1748
1749
1750
      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
1751

XhmikosR's avatar
XhmikosR committed
1752
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1753
1754
1755
1756
1757
1758
      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
1759
1760
1761
      if (typeof option == 'string') data[option]()
    })
  }
1762

XhmikosR's avatar
XhmikosR committed
1763
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1764

XhmikosR's avatar
XhmikosR committed
1765
1766
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1767

1768

XhmikosR's avatar
XhmikosR committed
1769
1770
  // POPOVER NO CONFLICT
  // ===================
1771

XhmikosR's avatar
XhmikosR committed
1772
1773
1774
1775
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1776

XhmikosR's avatar
XhmikosR committed
1777
}(jQuery);
1778

1779
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1780
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1781
 * http://getbootstrap.com/javascript/#scrollspy
1782
 * ========================================================================
1783
 * Copyright 2011-2014 Twitter, Inc.
1784
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1785
 * ======================================================================== */
1786
1787


XhmikosR's avatar
XhmikosR committed
1788
1789
+function ($) {
  'use strict';
1790

XhmikosR's avatar
XhmikosR committed
1791
1792
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1793

XhmikosR's avatar
XhmikosR committed
1794
1795
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1796

XhmikosR's avatar
XhmikosR committed
1797
1798
1799
1800
1801
1802
1803
1804
    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
1805

XhmikosR's avatar
XhmikosR committed
1806
1807
1808
1809
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1810

Mark Otto's avatar
Mark Otto committed
1811
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1812

XhmikosR's avatar
XhmikosR committed
1813
1814
1815
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1816

XhmikosR's avatar
XhmikosR committed
1817
1818
1819
  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
1820

XhmikosR's avatar
XhmikosR committed
1821
1822
1823
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1824

XhmikosR's avatar
XhmikosR committed
1825
1826
1827
1828
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1829

XhmikosR's avatar
XhmikosR committed
1830
1831
1832
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1833

XhmikosR's avatar
XhmikosR committed
1834
    var self     = this
XhmikosR's avatar
XhmikosR committed
1835

XhmikosR's avatar
XhmikosR committed
1836
1837
1838
1839
1840
1841
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1842

XhmikosR's avatar
XhmikosR committed
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
        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
1866
1867
    }

XhmikosR's avatar
XhmikosR committed
1868
1869
1870
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1871

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1872
1873
1874
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1875
    }
1876

XhmikosR's avatar
XhmikosR committed
1877
1878
1879
1880
1881
1882
1883
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1884

XhmikosR's avatar
XhmikosR committed
1885
1886
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1887

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1888
    this.clear()
1889

XhmikosR's avatar
XhmikosR committed
1890
1891
1892
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1893

XhmikosR's avatar
XhmikosR committed
1894
1895
1896
    var active = $(selector)
      .parents('li')
      .addClass('active')
1897

XhmikosR's avatar
XhmikosR committed
1898
1899
1900
1901
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1902
    }
1903

XhmikosR's avatar
XhmikosR committed
1904
1905
    active.trigger('activate.bs.scrollspy')
  }
1906

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1907
1908
1909
1910
1911
1912
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1913

XhmikosR's avatar
XhmikosR committed
1914
1915
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1916

XhmikosR's avatar
XhmikosR committed
1917
1918
1919
1920
1921
  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
1922

XhmikosR's avatar
XhmikosR committed
1923
1924
1925
1926
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1927

XhmikosR's avatar
XhmikosR committed
1928
  var old = $.fn.scrollspy
1929

XhmikosR's avatar
XhmikosR committed
1930
1931
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1932

1933

XhmikosR's avatar
XhmikosR committed
1934
1935
  // SCROLLSPY NO CONFLICT
  // =====================
1936

XhmikosR's avatar
XhmikosR committed
1937
1938
1939
1940
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1941

Chris Rebert's avatar
Chris Rebert committed
1942

XhmikosR's avatar
XhmikosR committed
1943
1944
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1945

XhmikosR's avatar
XhmikosR committed
1946
1947
1948
1949
1950
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1951
  })
1952

XhmikosR's avatar
XhmikosR committed
1953
}(jQuery);
1954

1955
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1956
 * Bootstrap: tab.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1957
 * http://getbootstrap.com/javascript/#tabs
1958
 * ========================================================================
1959
 * Copyright 2011-2014 Twitter, Inc.
1960
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1961
 * ======================================================================== */
1962

1963

XhmikosR's avatar
XhmikosR committed
1964
1965
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1966

XhmikosR's avatar
XhmikosR committed
1967
1968
  // TAB CLASS DEFINITION
  // ====================
1969

XhmikosR's avatar
XhmikosR committed
1970
1971
1972
  var Tab = function (element) {
    this.element = $(element)
  }
1973

Mark Otto's avatar
Mark Otto committed
1974
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1975

1976
1977
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1978
1979
1980
1981
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1982

XhmikosR's avatar
XhmikosR committed
1983
1984
1985
1986
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1987

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1990
1991
1992
1993
1994
1995
    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
1996
    })
1997

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1998
1999
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
2000

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