bootstrap.js 64.8 KB
Newer Older
XhmikosR's avatar
XhmikosR committed
1001
1002
1003
        that.$element.trigger('focus').trigger(e)
    })
  }
1004

XhmikosR's avatar
XhmikosR committed
1005
1006
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
1007

XhmikosR's avatar
XhmikosR committed
1008
    e = $.Event('hide.bs.modal')
fat's avatar
build    
fat committed
1009

XhmikosR's avatar
XhmikosR committed
1010
    this.$element.trigger(e)
1011

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

XhmikosR's avatar
XhmikosR committed
1014
    this.isShown = false
1015

XhmikosR's avatar
XhmikosR committed
1016
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1017
    if (this.options.backdrop) this.resize()
Chris Rebert's avatar
Chris Rebert committed
1018

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

XhmikosR's avatar
XhmikosR committed
1021
1022
1023
1024
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
1025

XhmikosR's avatar
XhmikosR committed
1026
1027
1028
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1029
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1030
1031
      this.hideModal()
  }
1032

XhmikosR's avatar
XhmikosR committed
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
  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
1045
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1046
1047
1048
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1049
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1050
1051
1052
    }
  }

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1053
1054
1055
1056
1057
1058
1059
1060
  Modal.prototype.resize = function () {
    if (this.isShown) {
      $(window).on('resize.bs.modal', $.proxy(this.setBackdropHeight, this))
    } else {
      $(window).off('resize.bs.modal')
    }
  }

XhmikosR's avatar
XhmikosR committed
1061
1062
1063
1064
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1065
1066
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1067
1068
1069
      that.$element.trigger('hidden.bs.modal')
    })
  }
1070

XhmikosR's avatar
XhmikosR committed
1071
1072
1073
1074
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1075

XhmikosR's avatar
XhmikosR committed
1076
1077
1078
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1082

XhmikosR's avatar
XhmikosR committed
1083
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1084
1085
1086
1087
1088
1089
1090
        .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))
1091

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

XhmikosR's avatar
XhmikosR committed
1094
      this.$backdrop.addClass('in')
1095

XhmikosR's avatar
XhmikosR committed
1096
      if (!callback) return
1097

XhmikosR's avatar
XhmikosR committed
1098
1099
1100
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1101
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1102
        callback()
1103

XhmikosR's avatar
XhmikosR committed
1104
1105
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1106

XhmikosR's avatar
XhmikosR committed
1107
1108
1109
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1110
      }
XhmikosR's avatar
XhmikosR committed
1111
1112
1113
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1114
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1115
        callbackRemove()
1116

XhmikosR's avatar
XhmikosR committed
1117
1118
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1119
    }
XhmikosR's avatar
XhmikosR committed
1120
  }
1121

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1122
1123
1124
1125
1126
1127
  Modal.prototype.setBackdropHeight = function () {
    this.$backdrop
      .css('height', 0)
      .css('height', this.$element[0].scrollHeight)
  }

XhmikosR's avatar
XhmikosR committed
1128
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1129
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1130
  }
fat's avatar
build    
fat committed
1131

XhmikosR's avatar
XhmikosR committed
1132
1133
1134
1135
  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
1136

XhmikosR's avatar
XhmikosR committed
1137
1138
1139
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1140

XhmikosR's avatar
XhmikosR committed
1141
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1142
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1143
1144
1145
1146
1147
1148
1149
    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
  }
1150
1151


XhmikosR's avatar
XhmikosR committed
1152
1153
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1154

XhmikosR's avatar
XhmikosR committed
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
  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)
    })
  }
1166

XhmikosR's avatar
XhmikosR committed
1167
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1168

XhmikosR's avatar
XhmikosR committed
1169
1170
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1171
1172


XhmikosR's avatar
XhmikosR committed
1173
1174
  // MODAL NO CONFLICT
  // =================
1175

XhmikosR's avatar
XhmikosR committed
1176
1177
1178
1179
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1180
1181


XhmikosR's avatar
XhmikosR committed
1182
1183
  // MODAL DATA-API
  // ==============
1184

XhmikosR's avatar
XhmikosR committed
1185
1186
1187
1188
1189
  $(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())
1190

XhmikosR's avatar
XhmikosR committed
1191
    if ($this.is('a')) e.preventDefault()
1192

XhmikosR's avatar
XhmikosR committed
1193
1194
1195
1196
    $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
1197
      })
Mark Otto's avatar
Mark Otto committed
1198
    })
XhmikosR's avatar
XhmikosR committed
1199
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1200
  })
1201

XhmikosR's avatar
XhmikosR committed
1202
}(jQuery);
1203

1204
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1205
 * Bootstrap: tooltip.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1206
 * http://getbootstrap.com/javascript/#tooltip
1207
 * Inspired by the original jQuery.tipsy by Jason Frame
1208
 * ========================================================================
1209
 * Copyright 2011-2014 Twitter, Inc.
1210
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1211
 * ======================================================================== */
1212
1213


XhmikosR's avatar
XhmikosR committed
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
+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
1231
  Tooltip.VERSION  = '3.3.0'
XhmikosR's avatar
XhmikosR committed
1232

1233
1234
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
  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))
      }
    }
1273

XhmikosR's avatar
XhmikosR committed
1274
1275
1276
1277
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1278

XhmikosR's avatar
XhmikosR committed
1279
1280
1281
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1282

XhmikosR's avatar
XhmikosR committed
1283
1284
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1285

XhmikosR's avatar
XhmikosR committed
1286
1287
1288
1289
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1290
1291
      }
    }
1292

XhmikosR's avatar
XhmikosR committed
1293
1294
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1295

XhmikosR's avatar
XhmikosR committed
1296
1297
1298
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1299

XhmikosR's avatar
XhmikosR committed
1300
1301
1302
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1303

XhmikosR's avatar
XhmikosR committed
1304
1305
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1306

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

XhmikosR's avatar
XhmikosR committed
1311
1312
1313
1314
1315
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1316
1317
1318
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1319
    }
1320

XhmikosR's avatar
XhmikosR committed
1321
    clearTimeout(self.timeout)
1322

XhmikosR's avatar
XhmikosR committed
1323
    self.hoverState = 'in'
1324

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

XhmikosR's avatar
XhmikosR committed
1327
1328
1329
1330
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1331

XhmikosR's avatar
XhmikosR committed
1332
1333
1334
  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
1335

XhmikosR's avatar
XhmikosR committed
1336
1337
1338
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1339
    }
1340

XhmikosR's avatar
XhmikosR committed
1341
    clearTimeout(self.timeout)
fat's avatar
fat committed
1342

XhmikosR's avatar
XhmikosR committed
1343
    self.hoverState = 'out'
1344

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

XhmikosR's avatar
XhmikosR committed
1347
1348
1349
1350
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1351

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

XhmikosR's avatar
XhmikosR committed
1355
1356
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1357

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1358
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1359
1360
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1361

XhmikosR's avatar
XhmikosR committed
1362
      var $tip = this.tip()
fat's avatar
fat committed
1363

XhmikosR's avatar
XhmikosR committed
1364
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1365

XhmikosR's avatar
XhmikosR committed
1366
1367
1368
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1369

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

XhmikosR's avatar
XhmikosR committed
1372
1373
1374
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1375

XhmikosR's avatar
XhmikosR committed
1376
1377
1378
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1379

XhmikosR's avatar
XhmikosR committed
1380
1381
1382
1383
1384
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1385

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

XhmikosR's avatar
XhmikosR committed
1388
1389
1390
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1391

XhmikosR's avatar
XhmikosR committed
1392
1393
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1394
1395
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1396

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1397
1398
1399
1400
        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
1401
                    placement
fat's avatar
fat committed
1402

1403
        $tip
XhmikosR's avatar
XhmikosR committed
1404
          .removeClass(orgPlacement)
1405
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1406
      }
1407

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

XhmikosR's avatar
XhmikosR committed
1410
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1411

XhmikosR's avatar
XhmikosR committed
1412
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1413
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1414
1415
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1416
1417

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

XhmikosR's avatar
XhmikosR committed
1420
1421
1422
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1423
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1424
1425
1426
        complete()
    }
  }
fat's avatar
fat committed
1427

XhmikosR's avatar
XhmikosR committed
1428
1429
1430
1431
  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
1432

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

XhmikosR's avatar
XhmikosR committed
1437
1438
1439
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1440

XhmikosR's avatar
XhmikosR committed
1441
1442
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1443

XhmikosR's avatar
XhmikosR committed
1444
1445
1446
1447
1448
1449
1450
1451
    // $.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)
        })
1452
      }
XhmikosR's avatar
XhmikosR committed
1453
    }, offset), 0)
1454

XhmikosR's avatar
XhmikosR committed
1455
    $tip.addClass('in')
fat's avatar
fat committed
1456

XhmikosR's avatar
XhmikosR committed
1457
1458
1459
    // 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
1460

XhmikosR's avatar
XhmikosR committed
1461
1462
1463
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1464

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

XhmikosR's avatar
XhmikosR committed
1467
1468
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1469

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

XhmikosR's avatar
XhmikosR committed
1474
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1475
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1476
  }
1477

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1478
1479
1480
1481
  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
1482
  }
1483

XhmikosR's avatar
XhmikosR committed
1484
1485
1486
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1487

XhmikosR's avatar
XhmikosR committed
1488
1489
1490
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1491

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1492
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1493
1494
1495
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1496

XhmikosR's avatar
XhmikosR committed
1497
1498
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1499
1500
1501
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1502
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1503
    }
Jacob Thornton's avatar
Jacob Thornton committed
1504

XhmikosR's avatar
XhmikosR committed
1505
    this.$element.trigger(e)
1506

XhmikosR's avatar
XhmikosR committed
1507
    if (e.isDefaultPrevented()) return
1508

XhmikosR's avatar
XhmikosR committed
1509
    $tip.removeClass('in')
1510

XhmikosR's avatar
XhmikosR committed
1511
1512
1513
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1514
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1515
      complete()
1516

XhmikosR's avatar
XhmikosR committed
1517
    this.hoverState = null
1518

XhmikosR's avatar
XhmikosR committed
1519
1520
    return this
  }
1521

XhmikosR's avatar
XhmikosR committed
1522
1523
1524
1525
  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', '')
1526
    }
XhmikosR's avatar
XhmikosR committed
1527
  }
1528

XhmikosR's avatar
XhmikosR committed
1529
1530
1531
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1532

XhmikosR's avatar
XhmikosR committed
1533
1534
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1535

XhmikosR's avatar
XhmikosR committed
1536
1537
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1538

Mark Otto's avatar
grunt    
Mark Otto committed
1539
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1540
1541
1542
1543
    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
1544
1545
    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
1546
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1547
1548

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

XhmikosR's avatar
XhmikosR committed
1551
1552
1553
1554
1555
  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   }
1556

XhmikosR's avatar
XhmikosR committed
1557
  }
1558

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

XhmikosR's avatar
XhmikosR committed
1563
1564
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1565

XhmikosR's avatar
XhmikosR committed
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
    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
1581
      }
Chris Rebert's avatar
Chris Rebert committed
1582
    }
fat's avatar
fat committed
1583

XhmikosR's avatar
XhmikosR committed
1584
1585
    return delta
  }
1586

XhmikosR's avatar
XhmikosR committed
1587
1588
1589
1590
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1591

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

XhmikosR's avatar
XhmikosR committed
1595
1596
    return title
  }
1597

XhmikosR's avatar
XhmikosR committed
1598
1599
1600
1601
1602
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1603

XhmikosR's avatar
XhmikosR committed
1604
1605
1606
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1607

XhmikosR's avatar
XhmikosR committed
1608
1609
1610
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1611

XhmikosR's avatar
XhmikosR committed
1612
1613
1614
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1615

XhmikosR's avatar
XhmikosR committed
1616
1617
1618
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1619

XhmikosR's avatar
XhmikosR committed
1620
1621
1622
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1623

XhmikosR's avatar
XhmikosR committed
1624
1625
1626
1627
1628
1629
1630
1631
  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
1632
1633
    }

XhmikosR's avatar
XhmikosR committed
1634
1635
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1636

XhmikosR's avatar
XhmikosR committed
1637
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1638
    var that = this
XhmikosR's avatar
XhmikosR committed
1639
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1640
1641
1642
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1643
  }
1644
1645


XhmikosR's avatar
XhmikosR committed
1646
1647
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1648

XhmikosR's avatar
XhmikosR committed
1649
1650
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1651
1652
1653
1654
      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
1655

XhmikosR's avatar
XhmikosR committed
1656
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1657
1658
1659
1660
1661
1662
      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
1663
1664
1665
      if (typeof option == 'string') data[option]()
    })
  }
1666

XhmikosR's avatar
XhmikosR committed
1667
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1668

XhmikosR's avatar
XhmikosR committed
1669
1670
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1671

1672

XhmikosR's avatar
XhmikosR committed
1673
1674
  // TOOLTIP NO CONFLICT
  // ===================
1675

XhmikosR's avatar
XhmikosR committed
1676
1677
1678
1679
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1680

XhmikosR's avatar
XhmikosR committed
1681
}(jQuery);
1682

1683
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1684
 * Bootstrap: popover.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1685
 * http://getbootstrap.com/javascript/#popovers
1686
 * ========================================================================
1687
 * Copyright 2011-2014 Twitter, Inc.
1688
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1689
 * ======================================================================== */
1690
1691


XhmikosR's avatar
XhmikosR committed
1692
1693
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1694

XhmikosR's avatar
XhmikosR committed
1695
1696
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1697

XhmikosR's avatar
XhmikosR committed
1698
1699
1700
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1701

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

Mark Otto's avatar
Mark Otto committed
1704
  Popover.VERSION  = '3.3.0'
1705

XhmikosR's avatar
XhmikosR committed
1706
1707
1708
1709
1710
1711
  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
1712
1713


XhmikosR's avatar
XhmikosR committed
1714
1715
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1716

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

XhmikosR's avatar
XhmikosR committed
1719
  Popover.prototype.constructor = Popover
1720

XhmikosR's avatar
XhmikosR committed
1721
1722
1723
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1724

XhmikosR's avatar
XhmikosR committed
1725
1726
1727
1728
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1729

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

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

XhmikosR's avatar
XhmikosR committed
1737
1738
1739
1740
    // 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()
  }
1741

XhmikosR's avatar
XhmikosR committed
1742
1743
1744
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1745

XhmikosR's avatar
XhmikosR committed
1746
1747
1748
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1749

XhmikosR's avatar
XhmikosR committed
1750
1751
1752
1753
1754
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1755

XhmikosR's avatar
XhmikosR committed
1756
1757
1758
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1759

XhmikosR's avatar
XhmikosR committed
1760
1761
1762
1763
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1764

1765

XhmikosR's avatar
XhmikosR committed
1766
1767
  // POPOVER PLUGIN DEFINITION
  // =========================
1768

XhmikosR's avatar
XhmikosR committed
1769
1770
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1771
1772
1773
1774
      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
1775

XhmikosR's avatar
XhmikosR committed
1776
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1777
1778
1779
1780
1781
1782
      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
1783
1784
1785
      if (typeof option == 'string') data[option]()
    })
  }
1786

XhmikosR's avatar
XhmikosR committed
1787
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1788

XhmikosR's avatar
XhmikosR committed
1789
1790
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1791

1792

XhmikosR's avatar
XhmikosR committed
1793
1794
  // POPOVER NO CONFLICT
  // ===================
1795

XhmikosR's avatar
XhmikosR committed
1796
1797
1798
1799
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1800

XhmikosR's avatar
XhmikosR committed
1801
}(jQuery);
1802

1803
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1804
 * Bootstrap: scrollspy.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1805
 * http://getbootstrap.com/javascript/#scrollspy
1806
 * ========================================================================
1807
 * Copyright 2011-2014 Twitter, Inc.
1808
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1809
 * ======================================================================== */
1810
1811


XhmikosR's avatar
XhmikosR committed
1812
1813
+function ($) {
  'use strict';
1814

XhmikosR's avatar
XhmikosR committed
1815
1816
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1817

XhmikosR's avatar
XhmikosR committed
1818
1819
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1820

XhmikosR's avatar
XhmikosR committed
1821
1822
1823
1824
1825
1826
1827
1828
    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
1829

XhmikosR's avatar
XhmikosR committed
1830
1831
1832
1833
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1834

Mark Otto's avatar
Mark Otto committed
1835
  ScrollSpy.VERSION  = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1836

XhmikosR's avatar
XhmikosR committed
1837
1838
1839
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1840

XhmikosR's avatar
XhmikosR committed
1841
1842
1843
  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
1844

XhmikosR's avatar
XhmikosR committed
1845
1846
1847
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1848

XhmikosR's avatar
XhmikosR committed
1849
1850
1851
1852
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1853

XhmikosR's avatar
XhmikosR committed
1854
1855
1856
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1857

XhmikosR's avatar
XhmikosR committed
1858
    var self     = this
XhmikosR's avatar
XhmikosR committed
1859

XhmikosR's avatar
XhmikosR committed
1860
1861
1862
1863
1864
1865
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1866

XhmikosR's avatar
XhmikosR committed
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
        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
1890
1891
    }

XhmikosR's avatar
XhmikosR committed
1892
1893
1894
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1895

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1896
1897
1898
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1899
    }
1900

XhmikosR's avatar
XhmikosR committed
1901
1902
1903
1904
1905
1906
1907
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1908

XhmikosR's avatar
XhmikosR committed
1909
1910
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1911

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1912
    this.clear()
1913

XhmikosR's avatar
XhmikosR committed
1914
1915
1916
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1917

XhmikosR's avatar
XhmikosR committed
1918
1919
1920
    var active = $(selector)
      .parents('li')
      .addClass('active')
1921

XhmikosR's avatar
XhmikosR committed
1922
1923
1924
1925
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1926
    }
1927

XhmikosR's avatar
XhmikosR committed
1928
1929
    active.trigger('activate.bs.scrollspy')
  }
1930

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1931
1932
1933
1934
1935
1936
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1937

XhmikosR's avatar
XhmikosR committed
1938
1939
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1940

XhmikosR's avatar
XhmikosR committed
1941
1942
1943
1944
1945
  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
1946

XhmikosR's avatar
XhmikosR committed
1947
1948
1949
1950
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1951

XhmikosR's avatar
XhmikosR committed
1952
  var old = $.fn.scrollspy
1953

XhmikosR's avatar
XhmikosR committed
1954
1955
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1956

1957

XhmikosR's avatar
XhmikosR committed
1958
1959
  // SCROLLSPY NO CONFLICT
  // =====================
1960

XhmikosR's avatar
XhmikosR committed
1961
1962
1963
1964
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1965

Chris Rebert's avatar
Chris Rebert committed
1966

XhmikosR's avatar
XhmikosR committed
1967
1968
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1969

XhmikosR's avatar
XhmikosR committed
1970
1971
1972
1973
1974
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1975
  })
1976

XhmikosR's avatar
XhmikosR committed
1977
}(jQuery);
1978

1979
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1980
 * Bootstrap: tab.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1981
 * http://getbootstrap.com/javascript/#tabs
1982
 * ========================================================================
1983
 * Copyright 2011-2014 Twitter, Inc.
1984
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1985
 * ======================================================================== */
1986

1987

XhmikosR's avatar
XhmikosR committed
1988
1989
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1990

XhmikosR's avatar
XhmikosR committed
1991
1992
  // TAB CLASS DEFINITION
  // ====================
1993

XhmikosR's avatar
XhmikosR committed
1994
1995
1996
  var Tab = function (element) {
    this.element = $(element)
  }
1997

Mark Otto's avatar
Mark Otto committed
1998
  Tab.VERSION = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1999

2000
  Tab.TRANSITION_DURATION = 150
For faster browsing, not all history is shown. View entire blame