bootstrap.js 51.7 KB
Newer Older
Chris Rebert's avatar
Chris Rebert committed
1001
}(jQuery);
1002

1003
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1004
 * Bootstrap: tooltip.js v3.1.0
Mark Otto's avatar
Mark Otto committed
1005
 * http://getbootstrap.com/javascript/#tooltip
1006
 * Inspired by the original jQuery.tipsy by Jason Frame
1007
 * ========================================================================
1008
 * Copyright 2013 Twitter, Inc.
1009
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1010
 * ======================================================================== */
1011
1012


XhmikosR's avatar
XhmikosR committed
1013
+function ($) { 'use strict';
1014

1015
  // TOOLTIP PUBLIC CLASS DEFINITION
fat's avatar
fat committed
1016
  // ===============================
1017

1018
1019
1020
1021
1022
1023
1024
  var Tooltip = function (element, options) {
    this.type       =
    this.options    =
    this.enabled    =
    this.timeout    =
    this.hoverState =
    this.$element   = null
1025

1026
1027
    this.init('tooltip', element, options)
  }
1028

1029
  Tooltip.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
1030
1031
1032
1033
1034
1035
1036
1037
1038
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false
1039
  }
1040

1041
1042
1043
1044
1045
  Tooltip.prototype.init = function (type, element, options) {
    this.enabled  = true
    this.type     = type
    this.$element = $(element)
    this.options  = this.getOptions(options)
1046

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

1049
1050
    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]
fat's avatar
fat committed
1051

1052
1053
1054
1055
1056
      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' : 'focus'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1057

Jacob Thornton's avatar
Jacob Thornton committed
1058
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1059
1060
1061
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }
    }
1062

1063
1064
1065
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
fat's avatar
fat committed
1066
  }
1067

1068
1069
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
1070
  }
1071

1072
1073
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1074

1075
1076
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
Mark Otto's avatar
Mark Otto committed
1077
1078
        show: options.delay,
        hide: options.delay
1079
1080
      }
    }
1081

1082
    return options
1083
  }
Jacob Thornton's avatar
Jacob Thornton committed
1084

Jacob Thornton's avatar
Jacob Thornton committed
1085
  Tooltip.prototype.getDelegateOptions = function () {
1086
    var options  = {}
Jacob Thornton's avatar
Jacob Thornton committed
1087
    var defaults = this.getDefaults()
1088

1089
1090
1091
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1092

Jacob Thornton's avatar
Jacob Thornton committed
1093
1094
1095
1096
    return options
  }

  Tooltip.prototype.enter = function (obj) {
1097
    var self = obj instanceof this.constructor ?
Jacob Thornton's avatar
Jacob Thornton committed
1098
      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1099

1100
    clearTimeout(self.timeout)
1101

1102
1103
    self.hoverState = 'in'

1104
    if (!self.options.delay || !self.options.delay.show) return self.show()
1105

1106
    self.timeout = setTimeout(function () {
1107
1108
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
1109
  }
1110

1111
1112
  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
Jacob Thornton's avatar
Jacob Thornton committed
1113
      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
1114

1115
    clearTimeout(self.timeout)
fat's avatar
fat committed
1116

1117
1118
    self.hoverState = 'out'

1119
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
1120

1121
    self.timeout = setTimeout(function () {
1122
1123
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
1124
  }
1125

1126
  Tooltip.prototype.show = function () {
Mark Otto's avatar
Mark Otto committed
1127
    var e = $.Event('show.bs.' + this.type)
1128

1129
1130
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
1131

1132
      if (e.isDefaultPrevented()) return
1133

1134
      var $tip = this.tip()
fat's avatar
fat committed
1135

1136
      this.setContent()
fat's avatar
fat committed
1137

1138
      if (this.options.animation) $tip.addClass('fade')
fat's avatar
fat committed
1139

1140
1141
1142
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1143

1144
1145
1146
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1147

1148
1149
1150
1151
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
1152

1153
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1154

1155
1156
1157
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1158

1159
1160
      if (autoPlace) {
        var $parent = this.$element.parent()
1161

1162
1163
1164
1165
1166
        var orgPlacement = placement
        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop
        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()
        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left
fat's avatar
fat committed
1167

1168
1169
1170
1171
1172
        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :
                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :
                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :
                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :
                    placement
fat's avatar
fat committed
1173

1174
1175
1176
1177
1178
        $tip
          .removeClass(orgPlacement)
          .addClass(placement)
      }

1179
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1180

fat's avatar
fat committed
1181
      this.applyPlacement(calculatedOffset, placement)
1182
      this.hoverState = null
1183
      this.$element.trigger('shown.bs.' + this.type)
fat's avatar
fat committed
1184
    }
1185
  }
fat's avatar
fat committed
1186

1187
  Tooltip.prototype.applyPlacement = function (offset, placement) {
1188
1189
1190
1191
    var replace
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight
fat's avatar
fat committed
1192

1193
    // manually read margins because getBoundingClientRect includes difference
fat's avatar
fat committed
1194
1195
1196
1197
1198
1199
1200
1201
1202
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)

    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0

    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1203

1204
1205
1206
    $tip
      .offset(offset)
      .addClass('in')
fat's avatar
fat committed
1207

fat's avatar
fat committed
1208
    // check to see if placing tip in new offset caused the tip to resize itself
1209
1210
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1211

1212
1213
    if (placement == 'top' && actualHeight != height) {
      replace = true
fat's avatar
fat committed
1214
      offset.top = offset.top + height - actualHeight
fat's avatar
fat committed
1215
1216
    }

fat's avatar
fat committed
1217
    if (/bottom|top/.test(placement)) {
1218
      var delta = 0
1219

fat's avatar
fat committed
1220
      if (offset.left < 0) {
1221
1222
        delta       = offset.left * -2
        offset.left = 0
fat's avatar
fat committed
1223

1224
        $tip.offset(offset)
1225

1226
1227
1228
        actualWidth  = $tip[0].offsetWidth
        actualHeight = $tip[0].offsetHeight
      }
1229

1230
1231
1232
1233
      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
    } else {
      this.replaceArrow(actualHeight - height, actualHeight, 'top')
    }
1234

1235
    if (replace) $tip.offset(offset)
1236
  }
1237

1238
  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
XhmikosR's avatar
XhmikosR committed
1239
    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
fat's avatar
fat committed
1240
  }
1241

1242
1243
1244
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1245

1246
1247
1248
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1249

1250
1251
1252
1253
  Tooltip.prototype.hide = function () {
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1254

1255
1256
1257
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
    }
Jacob Thornton's avatar
Jacob Thornton committed
1258

1259
    this.$element.trigger(e)
1260

1261
    if (e.isDefaultPrevented()) return
1262

1263
    $tip.removeClass('in')
1264

1265
1266
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
Jacob Thornton's avatar
Jacob Thornton committed
1267
        .one($.support.transition.end, complete)
1268
        .emulateTransitionEnd(150) :
Jacob Thornton's avatar
Jacob Thornton committed
1269
      complete()
1270

1271
    this.hoverState = null
1272
    this.$element.trigger('hidden.bs.' + this.type)
1273

1274
    return this
1275
1276
  }

1277
1278
1279
1280
  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', '')
1281
    }
1282
  }
1283

1284
1285
1286
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1287

1288
1289
1290
  Tooltip.prototype.getPosition = function () {
    var el = this.$element[0]
    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
Mark Otto's avatar
Mark Otto committed
1291
1292
      width: el.offsetWidth,
      height: el.offsetHeight
1293
1294
    }, this.$element.offset())
  }
1295

1296
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
fat's avatar
fat committed
1297
1298
1299
1300
1301
1302
    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   }
  }

1303
1304
1305
1306
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1307

1308
1309
    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1310

1311
    return title
1312
  }
1313

1314
1315
1316
  Tooltip.prototype.tip = function () {
    return this.$tip = this.$tip || $(this.options.template)
  }
1317

Mark Otto's avatar
Mark Otto committed
1318
  Tooltip.prototype.arrow = function () {
fat's avatar
fat committed
1319
    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
1320
  }
1321

1322
1323
1324
1325
1326
1327
1328
  Tooltip.prototype.validate = function () {
    if (!this.$element[0].parentNode) {
      this.hide()
      this.$element = null
      this.options  = null
    }
  }
1329

1330
1331
1332
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1333

1334
1335
1336
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
1337

1338
1339
1340
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Mark Otto's avatar
Mark Otto committed
1341

1342
  Tooltip.prototype.toggle = function (e) {
Jacob Thornton's avatar
Jacob Thornton committed
1343
    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
1344
1345
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1346

1347
1348
  Tooltip.prototype.destroy = function () {
    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
fat's avatar
fat committed
1349
  }
1350
1351


1352
1353
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1354

1355
  var old = $.fn.tooltip
1356

1357
  $.fn.tooltip = function (option) {
1358
    return this.each(function () {
1359
1360
1361
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1362

1363
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1364
1365
1366
1367
      if (typeof option == 'string') data[option]()
    })
  }

1368
  $.fn.tooltip.Constructor = Tooltip
1369

1370

1371
1372
  // TOOLTIP NO CONFLICT
  // ===================
1373

1374
1375
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
1376
1377
1378
    return this
  }

Chris Rebert's avatar
Chris Rebert committed
1379
}(jQuery);
1380

1381
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1382
 * Bootstrap: popover.js v3.1.0
Mark Otto's avatar
Mark Otto committed
1383
 * http://getbootstrap.com/javascript/#popovers
1384
 * ========================================================================
1385
 * Copyright 2013 Twitter, Inc.
1386
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1387
 * ======================================================================== */
1388
1389


XhmikosR's avatar
XhmikosR committed
1390
+function ($) { 'use strict';
1391

1392
  // POPOVER PUBLIC CLASS DEFINITION
1393
  // ===============================
fat's avatar
fat committed
1394

1395
1396
  var Popover = function (element, options) {
    this.init('popover', element, options)
1397
1398
  }

fat's avatar
fat committed
1399
1400
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')

Mark Otto's avatar
Mark Otto committed
1401
1402
1403
1404
1405
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1406
  })
1407

fat's avatar
fat committed
1408

1409
1410
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
fat's avatar
fat committed
1411

1412
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1413

1414
  Popover.prototype.constructor = Popover
fat's avatar
fat committed
1415

1416
1417
1418
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1419

1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()

    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)

    $tip.removeClass('fade top bottom left right in')

1430
1431
    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
Jacob Thornton's avatar
Jacob Thornton committed
1432
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1433
1434
  }

1435
1436
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
1437
1438
  }

1439
1440
1441
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1442

1443
1444
1445
1446
1447
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
1448

Mark Otto's avatar
Mark Otto committed
1449
  Popover.prototype.arrow = function () {
fat's avatar
fat committed
1450
1451
1452
    return this.$arrow = this.$arrow || this.tip().find('.arrow')
  }

1453
1454
1455
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
fat's avatar
fat committed
1456
  }
1457

1458

1459
1460
  // POPOVER PLUGIN DEFINITION
  // =========================
1461

1462
  var old = $.fn.popover
1463

1464
1465
1466
1467
1468
  $.fn.popover = function (option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
1469

1470
1471
1472
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
1473
1474
  }

1475
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1476

1477

1478
1479
  // POPOVER NO CONFLICT
  // ===================
1480

1481
1482
1483
1484
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1485

Chris Rebert's avatar
Chris Rebert committed
1486
}(jQuery);
1487

1488
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1489
 * Bootstrap: scrollspy.js v3.1.0
Mark Otto's avatar
Mark Otto committed
1490
 * http://getbootstrap.com/javascript/#scrollspy
1491
 * ========================================================================
1492
 * Copyright 2013 Twitter, Inc.
1493
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1494
 * ======================================================================== */
1495
1496


XhmikosR's avatar
XhmikosR committed
1497
+function ($) { 'use strict';
1498

1499
1500
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1501

1502
1503
1504
  function ScrollSpy(element, options) {
    var href
    var process  = $.proxy(this.process, this)
1505

fat's avatar
fat committed
1506
    this.$element       = $(element).is('body') ? $(window) : $(element)
1507
    this.$body          = $('body')
fat's avatar
fat committed
1508
    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
1509
1510
1511
1512
1513
1514
1515
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target
      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      || '') + ' .nav li > a'
    this.offsets        = $([])
    this.targets        = $([])
    this.activeTarget   = null
1516

1517
1518
1519
    this.refresh()
    this.process()
  }
1520

1521
1522
1523
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1524

1525
  ScrollSpy.prototype.refresh = function () {
fat's avatar
fat committed
1526
1527
    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'

1528
1529
    this.offsets = $([])
    this.targets = $([])
1530

1531
1532
1533
1534
1535
1536
    var self     = this
    var $targets = this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
1537
        var $href = /^#./.test(href) && $(href)
1538

1539
1540
        return ($href
          && $href.length
fat's avatar
fat committed
1541
          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
1542
1543
1544
1545
1546
1547
1548
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }
1549

1550
1551
1552
1553
1554
1555
1556
1557
  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
    var maxScroll    = scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i
1558

1559
1560
1561
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets.last()[0]) && this.activate(i)
    }
1562

1563
1564
1565
1566
1567
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate( targets[i] )
1568
    }
1569
1570
  }

1571
1572
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1573

1574
1575
1576
    $(this.selector)
      .parents('.active')
      .removeClass('active')
1577

1578
1579
1580
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1581

1582
1583
1584
    var active = $(selector)
      .parents('li')
      .addClass('active')
1585

1586
    if (active.parent('.dropdown-menu').length) {
1587
1588
1589
      active = active
        .closest('li.dropdown')
        .addClass('active')
1590
    }
1591

1592
    active.trigger('activate.bs.scrollspy')
1593
  }
1594
1595


1596
1597
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1598

1599
  var old = $.fn.scrollspy
1600

1601
1602
1603
1604
1605
  $.fn.scrollspy = function (option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option
1606

1607
1608
1609
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
1610
1611
  }

1612
  $.fn.scrollspy.Constructor = ScrollSpy
1613
1614


1615
1616
1617
1618
1619
1620
  // SCROLLSPY NO CONFLICT
  // =====================

  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
1621
1622
1623
  }


1624
1625
  // SCROLLSPY DATA-API
  // ==================
1626

1627
1628
1629
1630
1631
1632
  $(window).on('load', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      $spy.scrollspy($spy.data())
    })
  })
1633

Chris Rebert's avatar
Chris Rebert committed
1634
}(jQuery);
1635

1636
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1637
 * Bootstrap: tab.js v3.1.0
Mark Otto's avatar
Mark Otto committed
1638
 * http://getbootstrap.com/javascript/#tabs
1639
 * ========================================================================
1640
 * Copyright 2013 Twitter, Inc.
1641
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1642
 * ======================================================================== */
1643

1644

XhmikosR's avatar
XhmikosR committed
1645
+function ($) { 'use strict';
1646
1647
1648
1649
1650
1651

  // TAB CLASS DEFINITION
  // ====================

  var Tab = function (element) {
    this.element = $(element)
1652
  }
1653

1654
1655
1656
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
Chris Rebert's avatar
Chris Rebert committed
1657
    var selector = $this.data('target')
1658
1659
1660
1661

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1662
    }
1663

1664
    if ($this.parent('li').hasClass('active')) return
1665

1666
1667
1668
1669
    var previous = $ul.find('.active:last a')[0]
    var e        = $.Event('show.bs.tab', {
      relatedTarget: previous
    })
1670

1671
    $this.trigger(e)
1672

1673
    if (e.isDefaultPrevented()) return
1674

1675
    var $target = $(selector)
1676

1677
1678
1679
    this.activate($this.parent('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $this.trigger({
Mark Otto's avatar
Mark Otto committed
1680
1681
        type: 'shown.bs.tab',
        relatedTarget: previous
1682
1683
      })
    })
1684
  }
1685

1686
1687
1688
1689
1690
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && $active.hasClass('fade')
1691

1692
1693
1694
1695
1696
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
        .removeClass('active')
1697

1698
      element.addClass('active')
1699

1700
1701
1702
1703
1704
1705
      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
      }
1706

1707
1708
1709
      if (element.parent('.dropdown-menu')) {
        element.closest('li.dropdown').addClass('active')
      }
fat's avatar
fat committed
1710

1711
1712
      callback && callback()
    }
fat's avatar
fat committed
1713

1714
1715
1716
1717
1718
1719
1720
    transition ?
      $active
        .one($.support.transition.end, next)
        .emulateTransitionEnd(150) :
      next()

    $active.removeClass('in')
1721
1722
1723
  }


1724
1725
  // TAB PLUGIN DEFINITION
  // =====================
1726

1727
  var old = $.fn.tab
1728

1729
  $.fn.tab = function ( option ) {
1730
    return this.each(function () {
1731
1732
      var $this = $(this)
      var data  = $this.data('bs.tab')
fat's avatar
fat committed
1733

1734
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
1735
1736
1737
1738
      if (typeof option == 'string') data[option]()
    })
  }

1739
  $.fn.tab.Constructor = Tab
1740
1741


1742
1743
  // TAB NO CONFLICT
  // ===============
1744

1745
1746
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
1747
1748
1749
    return this
  }

1750
1751
1752
1753
1754
1755
1756
1757
1758

  // TAB DATA-API
  // ============

  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
    e.preventDefault()
    $(this).tab('show')
  })

Chris Rebert's avatar
Chris Rebert committed
1759
}(jQuery);
1760

1761
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1762
 * Bootstrap: affix.js v3.1.0
Mark Otto's avatar
Mark Otto committed
1763
 * http://getbootstrap.com/javascript/#affix
1764
 * ========================================================================
1765
 * Copyright 2013 Twitter, Inc.
1766
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1767
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
1768
1769


XhmikosR's avatar
XhmikosR committed
1770
+function ($) { 'use strict';
Mark Otto's avatar
Mark Otto committed
1771

1772
1773
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
1774

1775
1776
1777
1778
1779
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
    this.$window = $(window)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
fat's avatar
fat committed
1780

1781
1782
1783
    this.$element = $(element)
    this.affixed  =
    this.unpin    = null
fat's avatar
fat committed
1784

1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
    this.checkPosition()
  }

  Affix.RESET = 'affix affix-top affix-bottom'

  Affix.DEFAULTS = {
    offset: 0
  }

  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }

  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var scrollHeight = $(document).height()
    var scrollTop    = this.$window.scrollTop()
    var position     = this.$element.offset()
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom

    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top()
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()

    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :
                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false

    if (this.affixed === affix) return
    if (this.unpin) this.$element.css('top', '')

    this.affixed = affix
    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null

    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))

    if (affix == 'bottom') {
      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })
1826
    }
Mark Otto's avatar
Mark Otto committed
1827
1828
  }

1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843

  // AFFIX PLUGIN DEFINITION
  // =======================

  var old = $.fn.affix

  $.fn.affix = function (option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
1844
1845
  }

1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
  $.fn.affix.Constructor = Affix


  // AFFIX NO CONFLICT
  // =================

  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }


  // AFFIX DATA-API
  // ==============

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()

      data.offset = data.offset || {}

      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
      if (data.offsetTop)    data.offset.top    = data.offsetTop

      $spy.affix(data)
    })
Mark Otto's avatar
Mark Otto committed
1873
1874
  })

Chris Rebert's avatar
Chris Rebert committed
1875
}(jQuery);
For faster browsing, not all history is shown. View entire blame