bootstrap.js 64.3 KB
Newer Older
1001

XhmikosR's avatar
XhmikosR committed
1002
1003
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
1004

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

XhmikosR's avatar
XhmikosR committed
1007
    this.$element.trigger(e)
1008

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

XhmikosR's avatar
XhmikosR committed
1011
    this.isShown = false
1012

XhmikosR's avatar
XhmikosR committed
1013
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
1014

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

XhmikosR's avatar
XhmikosR committed
1017
1018
1019
1020
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
1021

XhmikosR's avatar
XhmikosR committed
1022
1023
1024
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1025
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1026
1027
      this.hideModal()
  }
1028

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

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1053
1054
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1055
1056
1057
      that.$element.trigger('hidden.bs.modal')
    })
  }
1058

XhmikosR's avatar
XhmikosR committed
1059
1060
1061
1062
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1063

XhmikosR's avatar
XhmikosR committed
1064
1065
1066
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1067

XhmikosR's avatar
XhmikosR committed
1068
1069
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1070

XhmikosR's avatar
XhmikosR committed
1071
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1072
1073
1074
1075
1076
1077
1078
        .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))
1079

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

XhmikosR's avatar
XhmikosR committed
1082
      this.$backdrop.addClass('in')
1083

XhmikosR's avatar
XhmikosR committed
1084
      if (!callback) return
1085

XhmikosR's avatar
XhmikosR committed
1086
1087
1088
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1089
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1090
        callback()
1091

XhmikosR's avatar
XhmikosR committed
1092
1093
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1094

XhmikosR's avatar
XhmikosR committed
1095
1096
1097
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1098
      }
XhmikosR's avatar
XhmikosR committed
1099
1100
1101
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1102
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1103
        callbackRemove()
1104

XhmikosR's avatar
XhmikosR committed
1105
1106
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1107
    }
XhmikosR's avatar
XhmikosR committed
1108
  }
1109

XhmikosR's avatar
XhmikosR committed
1110
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1111
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1112
  }
fat's avatar
build    
fat committed
1113

XhmikosR's avatar
XhmikosR committed
1114
1115
1116
1117
  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
1118

XhmikosR's avatar
XhmikosR committed
1119
1120
1121
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1122

XhmikosR's avatar
XhmikosR committed
1123
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1124
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1125
1126
1127
1128
1129
1130
1131
    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
  }
1132
1133


XhmikosR's avatar
XhmikosR committed
1134
1135
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1136

XhmikosR's avatar
XhmikosR committed
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
  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)
    })
  }
1148

XhmikosR's avatar
XhmikosR committed
1149
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1150

XhmikosR's avatar
XhmikosR committed
1151
1152
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1153
1154


XhmikosR's avatar
XhmikosR committed
1155
1156
  // MODAL NO CONFLICT
  // =================
1157

XhmikosR's avatar
XhmikosR committed
1158
1159
1160
1161
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1162
1163


XhmikosR's avatar
XhmikosR committed
1164
1165
  // MODAL DATA-API
  // ==============
1166

XhmikosR's avatar
XhmikosR committed
1167
1168
1169
1170
1171
  $(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())
1172

XhmikosR's avatar
XhmikosR committed
1173
    if ($this.is('a')) e.preventDefault()
1174

XhmikosR's avatar
XhmikosR committed
1175
1176
1177
1178
    $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
1179
      })
Mark Otto's avatar
Mark Otto committed
1180
    })
XhmikosR's avatar
XhmikosR committed
1181
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1182
  })
1183

XhmikosR's avatar
XhmikosR committed
1184
}(jQuery);
1185

1186
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1187
 * Bootstrap: tooltip.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1188
 * http://getbootstrap.com/javascript/#tooltip
1189
 * Inspired by the original jQuery.tipsy by Jason Frame
1190
 * ========================================================================
1191
 * Copyright 2011-2014 Twitter, Inc.
1192
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1193
 * ======================================================================== */
1194
1195


XhmikosR's avatar
XhmikosR committed
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
+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
1213
  Tooltip.VERSION  = '3.3.0'
XhmikosR's avatar
XhmikosR committed
1214

1215
1216
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
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
1249
1250
1251
1252
1253
1254
  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))
      }
    }
1255

XhmikosR's avatar
XhmikosR committed
1256
1257
1258
1259
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1260

XhmikosR's avatar
XhmikosR committed
1261
1262
1263
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1264

XhmikosR's avatar
XhmikosR committed
1265
1266
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1267

XhmikosR's avatar
XhmikosR committed
1268
1269
1270
1271
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1272
1273
      }
    }
1274

XhmikosR's avatar
XhmikosR committed
1275
1276
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1277

XhmikosR's avatar
XhmikosR committed
1278
1279
1280
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1281

XhmikosR's avatar
XhmikosR committed
1282
1283
1284
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1285

XhmikosR's avatar
XhmikosR committed
1286
1287
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1288

XhmikosR's avatar
XhmikosR committed
1289
1290
1291
  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
1292

XhmikosR's avatar
XhmikosR committed
1293
1294
1295
1296
1297
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1298
1299
1300
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1301
    }
1302

XhmikosR's avatar
XhmikosR committed
1303
    clearTimeout(self.timeout)
1304

XhmikosR's avatar
XhmikosR committed
1305
    self.hoverState = 'in'
1306

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

XhmikosR's avatar
XhmikosR committed
1309
1310
1311
1312
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1313

XhmikosR's avatar
XhmikosR committed
1314
1315
1316
  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
1317

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

XhmikosR's avatar
XhmikosR committed
1323
    clearTimeout(self.timeout)
fat's avatar
fat committed
1324

XhmikosR's avatar
XhmikosR committed
1325
    self.hoverState = 'out'
1326

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

XhmikosR's avatar
XhmikosR committed
1329
1330
1331
1332
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1333

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

XhmikosR's avatar
XhmikosR committed
1337
1338
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1339

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1340
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1341
1342
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1343

XhmikosR's avatar
XhmikosR committed
1344
      var $tip = this.tip()
fat's avatar
fat committed
1345

XhmikosR's avatar
XhmikosR committed
1346
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1347

XhmikosR's avatar
XhmikosR committed
1348
1349
1350
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1351

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

XhmikosR's avatar
XhmikosR committed
1354
1355
1356
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1357

XhmikosR's avatar
XhmikosR committed
1358
1359
1360
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1361

XhmikosR's avatar
XhmikosR committed
1362
1363
1364
1365
1366
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1367

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

XhmikosR's avatar
XhmikosR committed
1370
1371
1372
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1373

XhmikosR's avatar
XhmikosR committed
1374
1375
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1376
1377
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1378

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1379
1380
1381
1382
        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
1383
                    placement
fat's avatar
fat committed
1384

1385
        $tip
XhmikosR's avatar
XhmikosR committed
1386
          .removeClass(orgPlacement)
1387
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1388
      }
1389

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

XhmikosR's avatar
XhmikosR committed
1392
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1393

XhmikosR's avatar
XhmikosR committed
1394
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1395
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1396
1397
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1398
1399

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

XhmikosR's avatar
XhmikosR committed
1402
1403
1404
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1405
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1406
1407
1408
        complete()
    }
  }
fat's avatar
fat committed
1409

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

XhmikosR's avatar
XhmikosR committed
1415
1416
1417
    // 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
1418

XhmikosR's avatar
XhmikosR committed
1419
1420
1421
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1422

XhmikosR's avatar
XhmikosR committed
1423
1424
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1425

XhmikosR's avatar
XhmikosR committed
1426
1427
1428
1429
1430
1431
1432
1433
    // $.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)
        })
1434
      }
XhmikosR's avatar
XhmikosR committed
1435
    }, offset), 0)
1436

XhmikosR's avatar
XhmikosR committed
1437
    $tip.addClass('in')
fat's avatar
fat committed
1438

XhmikosR's avatar
XhmikosR committed
1439
1440
1441
    // 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
1442

XhmikosR's avatar
XhmikosR committed
1443
1444
1445
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1446

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

XhmikosR's avatar
XhmikosR committed
1449
1450
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1451

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

XhmikosR's avatar
XhmikosR committed
1456
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1457
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1458
  }
1459

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1460
1461
1462
1463
  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
1464
  }
1465

XhmikosR's avatar
XhmikosR committed
1466
1467
1468
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1469

XhmikosR's avatar
XhmikosR committed
1470
1471
1472
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1473

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1474
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1475
1476
1477
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1478

XhmikosR's avatar
XhmikosR committed
1479
1480
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1481
1482
1483
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1484
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1485
    }
Jacob Thornton's avatar
Jacob Thornton committed
1486

XhmikosR's avatar
XhmikosR committed
1487
    this.$element.trigger(e)
1488

XhmikosR's avatar
XhmikosR committed
1489
    if (e.isDefaultPrevented()) return
1490

XhmikosR's avatar
XhmikosR committed
1491
    $tip.removeClass('in')
1492

XhmikosR's avatar
XhmikosR committed
1493
1494
1495
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1496
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1497
      complete()
1498

XhmikosR's avatar
XhmikosR committed
1499
    this.hoverState = null
1500

XhmikosR's avatar
XhmikosR committed
1501
1502
    return this
  }
1503

XhmikosR's avatar
XhmikosR committed
1504
1505
1506
1507
  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', '')
1508
    }
XhmikosR's avatar
XhmikosR committed
1509
  }
1510

XhmikosR's avatar
XhmikosR committed
1511
1512
1513
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1514

XhmikosR's avatar
XhmikosR committed
1515
1516
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1517

XhmikosR's avatar
XhmikosR committed
1518
1519
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1520

Mark Otto's avatar
grunt    
Mark Otto committed
1521
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1522
1523
1524
1525
    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
1526
1527
    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
1528
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1529
1530

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

XhmikosR's avatar
XhmikosR committed
1533
1534
1535
1536
1537
  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   }
1538

XhmikosR's avatar
XhmikosR committed
1539
  }
1540

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

XhmikosR's avatar
XhmikosR committed
1545
1546
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1547

XhmikosR's avatar
XhmikosR committed
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
    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
1563
      }
Chris Rebert's avatar
Chris Rebert committed
1564
    }
fat's avatar
fat committed
1565

XhmikosR's avatar
XhmikosR committed
1566
1567
    return delta
  }
1568

XhmikosR's avatar
XhmikosR committed
1569
1570
1571
1572
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1573

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

XhmikosR's avatar
XhmikosR committed
1577
1578
    return title
  }
1579

XhmikosR's avatar
XhmikosR committed
1580
1581
1582
1583
1584
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1585

XhmikosR's avatar
XhmikosR committed
1586
1587
1588
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1589

XhmikosR's avatar
XhmikosR committed
1590
1591
1592
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1593

XhmikosR's avatar
XhmikosR committed
1594
1595
1596
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1597

XhmikosR's avatar
XhmikosR committed
1598
1599
1600
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1601

XhmikosR's avatar
XhmikosR committed
1602
1603
1604
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1605

XhmikosR's avatar
XhmikosR committed
1606
1607
1608
1609
1610
1611
1612
1613
  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
1614
1615
    }

XhmikosR's avatar
XhmikosR committed
1616
1617
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1618

XhmikosR's avatar
XhmikosR committed
1619
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1620
    var that = this
XhmikosR's avatar
XhmikosR committed
1621
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1622
1623
1624
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1625
  }
1626
1627


XhmikosR's avatar
XhmikosR committed
1628
1629
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1630

XhmikosR's avatar
XhmikosR committed
1631
1632
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1633
1634
1635
1636
      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
1637

XhmikosR's avatar
XhmikosR committed
1638
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1639
1640
1641
1642
1643
1644
      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
1645
1646
1647
      if (typeof option == 'string') data[option]()
    })
  }
1648

XhmikosR's avatar
XhmikosR committed
1649
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1650

XhmikosR's avatar
XhmikosR committed
1651
1652
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1653

1654

XhmikosR's avatar
XhmikosR committed
1655
1656
  // TOOLTIP NO CONFLICT
  // ===================
1657

XhmikosR's avatar
XhmikosR committed
1658
1659
1660
1661
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1662

XhmikosR's avatar
XhmikosR committed
1663
}(jQuery);
1664

1665
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1666
 * Bootstrap: popover.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1667
 * http://getbootstrap.com/javascript/#popovers
1668
 * ========================================================================
1669
 * Copyright 2011-2014 Twitter, Inc.
1670
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1671
 * ======================================================================== */
1672
1673


XhmikosR's avatar
XhmikosR committed
1674
1675
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1676

XhmikosR's avatar
XhmikosR committed
1677
1678
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1679

XhmikosR's avatar
XhmikosR committed
1680
1681
1682
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1683

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

Mark Otto's avatar
Mark Otto committed
1686
  Popover.VERSION  = '3.3.0'
1687

XhmikosR's avatar
XhmikosR committed
1688
1689
1690
1691
1692
1693
  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
1694
1695


XhmikosR's avatar
XhmikosR committed
1696
1697
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1698

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

XhmikosR's avatar
XhmikosR committed
1701
  Popover.prototype.constructor = Popover
1702

XhmikosR's avatar
XhmikosR committed
1703
1704
1705
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1706

XhmikosR's avatar
XhmikosR committed
1707
1708
1709
1710
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1711

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

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

XhmikosR's avatar
XhmikosR committed
1719
1720
1721
1722
    // 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()
  }
1723

XhmikosR's avatar
XhmikosR committed
1724
1725
1726
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1727

XhmikosR's avatar
XhmikosR committed
1728
1729
1730
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1731

XhmikosR's avatar
XhmikosR committed
1732
1733
1734
1735
1736
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1737

XhmikosR's avatar
XhmikosR committed
1738
1739
1740
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1741

XhmikosR's avatar
XhmikosR committed
1742
1743
1744
1745
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1746

1747

XhmikosR's avatar
XhmikosR committed
1748
1749
  // POPOVER PLUGIN DEFINITION
  // =========================
1750

XhmikosR's avatar
XhmikosR committed
1751
1752
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1753
1754
1755
1756
      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
1757

XhmikosR's avatar
XhmikosR committed
1758
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1759
1760
1761
1762
1763
1764
      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
1765
1766
1767
      if (typeof option == 'string') data[option]()
    })
  }
1768

XhmikosR's avatar
XhmikosR committed
1769
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1770

XhmikosR's avatar
XhmikosR committed
1771
1772
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1773

1774

XhmikosR's avatar
XhmikosR committed
1775
1776
  // POPOVER NO CONFLICT
  // ===================
1777

XhmikosR's avatar
XhmikosR committed
1778
1779
1780
1781
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1782

XhmikosR's avatar
XhmikosR committed
1783
}(jQuery);
1784

1785
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1786
 * Bootstrap: scrollspy.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1787
 * http://getbootstrap.com/javascript/#scrollspy
1788
 * ========================================================================
1789
 * Copyright 2011-2014 Twitter, Inc.
1790
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1791
 * ======================================================================== */
1792
1793


XhmikosR's avatar
XhmikosR committed
1794
1795
+function ($) {
  'use strict';
1796

XhmikosR's avatar
XhmikosR committed
1797
1798
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1799

XhmikosR's avatar
XhmikosR committed
1800
1801
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1802

XhmikosR's avatar
XhmikosR committed
1803
1804
1805
1806
1807
1808
1809
1810
    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
1811

XhmikosR's avatar
XhmikosR committed
1812
1813
1814
1815
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1816

Mark Otto's avatar
Mark Otto committed
1817
  ScrollSpy.VERSION  = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1818

XhmikosR's avatar
XhmikosR committed
1819
1820
1821
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1822

XhmikosR's avatar
XhmikosR committed
1823
1824
1825
  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
1826

XhmikosR's avatar
XhmikosR committed
1827
1828
1829
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1830

XhmikosR's avatar
XhmikosR committed
1831
1832
1833
1834
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1835

XhmikosR's avatar
XhmikosR committed
1836
1837
1838
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1839

XhmikosR's avatar
XhmikosR committed
1840
    var self     = this
XhmikosR's avatar
XhmikosR committed
1841

XhmikosR's avatar
XhmikosR committed
1842
1843
1844
1845
1846
1847
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1848

XhmikosR's avatar
XhmikosR committed
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
        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
1872
1873
    }

XhmikosR's avatar
XhmikosR committed
1874
1875
1876
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1877

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1878
1879
1880
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1881
    }
1882

XhmikosR's avatar
XhmikosR committed
1883
1884
1885
1886
1887
1888
1889
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1890

XhmikosR's avatar
XhmikosR committed
1891
1892
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1893

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1894
    this.clear()
1895

XhmikosR's avatar
XhmikosR committed
1896
1897
1898
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1899

XhmikosR's avatar
XhmikosR committed
1900
1901
1902
    var active = $(selector)
      .parents('li')
      .addClass('active')
1903

XhmikosR's avatar
XhmikosR committed
1904
1905
1906
1907
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1908
    }
1909

XhmikosR's avatar
XhmikosR committed
1910
1911
    active.trigger('activate.bs.scrollspy')
  }
1912

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1913
1914
1915
1916
1917
1918
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1919

XhmikosR's avatar
XhmikosR committed
1920
1921
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1922

XhmikosR's avatar
XhmikosR committed
1923
1924
1925
1926
1927
  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
1928

XhmikosR's avatar
XhmikosR committed
1929
1930
1931
1932
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1933

XhmikosR's avatar
XhmikosR committed
1934
  var old = $.fn.scrollspy
1935

XhmikosR's avatar
XhmikosR committed
1936
1937
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1938

1939

XhmikosR's avatar
XhmikosR committed
1940
1941
  // SCROLLSPY NO CONFLICT
  // =====================
1942

XhmikosR's avatar
XhmikosR committed
1943
1944
1945
1946
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1947

Chris Rebert's avatar
Chris Rebert committed
1948

XhmikosR's avatar
XhmikosR committed
1949
1950
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1951

XhmikosR's avatar
XhmikosR committed
1952
1953
1954
1955
1956
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1957
  })
1958

XhmikosR's avatar
XhmikosR committed
1959
}(jQuery);
1960

1961
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1962
 * Bootstrap: tab.js v3.3.0
Mark Otto's avatar
Mark Otto committed
1963
 * http://getbootstrap.com/javascript/#tabs
1964
 * ========================================================================
1965
 * Copyright 2011-2014 Twitter, Inc.
1966
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1967
 * ======================================================================== */
1968

1969

XhmikosR's avatar
XhmikosR committed
1970
1971
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1972

XhmikosR's avatar
XhmikosR committed
1973
1974
  // TAB CLASS DEFINITION
  // ====================
1975

XhmikosR's avatar
XhmikosR committed
1976
1977
1978
  var Tab = function (element) {
    this.element = $(element)
  }
1979

Mark Otto's avatar
Mark Otto committed
1980
  Tab.VERSION = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1981

1982
1983
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1984
1985
1986
1987
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1988

XhmikosR's avatar
XhmikosR committed
1989
1990
1991
1992
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1993

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1996
1997
1998
1999
2000
    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
For faster browsing, not all history is shown. View entire blame