bootstrap.js 57.2 KB
Newer Older
1001

fat's avatar
fat committed
1002
      this.$backdrop.addClass('in')
1003

fat's avatar
fat committed
1004
      if (!callback) return
1005

fat's avatar
fat committed
1006
      doAnimate ?
1007
1008
1009
        this.$backdrop
          .one($.support.transition.end, callback)
          .emulateTransitionEnd(150) :
fat's avatar
fat committed
1010
        callback()
1011

fat's avatar
fat committed
1012
1013
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
1014

Mark Otto's avatar
Mark Otto committed
1015
      $.support.transition && this.$element.hasClass('fade') ?
1016
1017
1018
        this.$backdrop
          .one($.support.transition.end, callback)
          .emulateTransitionEnd(150) :
fat's avatar
fat committed
1019
        callback()
1020

fat's avatar
fat committed
1021
1022
1023
    } else if (callback) {
      callback()
    }
1024
1025
1026
  }


fat's avatar
fat committed
1027
1028
  // MODAL PLUGIN DEFINITION
  // =======================
1029

1030
1031
  var old = $.fn.modal

Jacob Thornton's avatar
Jacob Thornton committed
1032
  $.fn.modal = function (option, _relatedTarget) {
1033
    return this.each(function () {
fat's avatar
fat committed
1034
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
1035
      var data    = $this.data('bs.modal')
fat's avatar
fat committed
1036
1037
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

Mark Otto's avatar
Mark Otto committed
1038
      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
Jacob Thornton's avatar
Jacob Thornton committed
1039
1040
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
1041
1042
1043
1044
1045
1046
    })
  }

  $.fn.modal.Constructor = Modal


fat's avatar
fat committed
1047
1048
  // MODAL NO CONFLICT
  // =================
1049
1050
1051
1052
1053
1054
1055

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


fat's avatar
fat committed
1056
1057
  // MODAL DATA-API
  // ==============
1058

Mark Otto's avatar
Mark Otto committed
1059
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
fat's avatar
fat committed
1060
1061
1062
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
Jacob Thornton's avatar
Jacob Thornton committed
1063
    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1064

1065
    e.preventDefault()
1066

1067
    $target
Jacob Thornton's avatar
Jacob Thornton committed
1068
      .modal(option, this)
1069
      .one('hide', function () {
1070
        $this.is(':visible') && $this.focus()
1071
      })
Jacob Thornton's avatar
Jacob Thornton committed
1072
  })
1073

Jacob Thornton's avatar
Jacob Thornton committed
1074
  $(document)
fat's avatar
fat committed
1075
    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
Jacob Thornton's avatar
Jacob Thornton committed
1076
    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
1077

Chris Rebert's avatar
Chris Rebert committed
1078
}(jQuery);
1079

1080
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1081
 * Bootstrap: tooltip.js v3.0.3
Mark Otto's avatar
Mark Otto committed
1082
 * http://getbootstrap.com/javascript/#tooltip
1083
 * Inspired by the original jQuery.tipsy by Jason Frame
1084
 * ========================================================================
1085
 * Copyright 2013 Twitter, Inc.
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
1098
 * ======================================================================== */
1099
1100


XhmikosR's avatar
XhmikosR committed
1101
+function ($) { 'use strict';
1102

1103
  // TOOLTIP PUBLIC CLASS DEFINITION
fat's avatar
fat committed
1104
  // ===============================
1105

1106
1107
1108
1109
1110
1111
1112
  var Tooltip = function (element, options) {
    this.type       =
    this.options    =
    this.enabled    =
    this.timeout    =
    this.hoverState =
    this.$element   = null
1113

1114
1115
    this.init('tooltip', element, options)
  }
1116

1117
  Tooltip.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
1118
1119
1120
1121
1122
1123
1124
1125
1126
    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
1127
  }
1128

1129
1130
1131
1132
1133
  Tooltip.prototype.init = function (type, element, options) {
    this.enabled  = true
    this.type     = type
    this.$element = $(element)
    this.options  = this.getOptions(options)
1134

1135
    var triggers = this.options.trigger.split(' ')
1136

1137
1138
    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]
fat's avatar
fat committed
1139

1140
1141
1142
1143
1144
      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'
1145

Jacob Thornton's avatar
Jacob Thornton committed
1146
        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1147
1148
1149
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }
    }
1150

1151
1152
1153
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
fat's avatar
fat committed
1154
  }
1155

1156
1157
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
1158
  }
1159

1160
1161
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1162

1163
1164
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
Mark Otto's avatar
Mark Otto committed
1165
1166
        show: options.delay,
        hide: options.delay
1167
1168
      }
    }
1169

1170
    return options
1171
  }
Jacob Thornton's avatar
Jacob Thornton committed
1172

Jacob Thornton's avatar
Jacob Thornton committed
1173
  Tooltip.prototype.getDelegateOptions = function () {
1174
    var options  = {}
Jacob Thornton's avatar
Jacob Thornton committed
1175
    var defaults = this.getDefaults()
1176

1177
1178
1179
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1180

Jacob Thornton's avatar
Jacob Thornton committed
1181
1182
1183
1184
    return options
  }

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

1188
    clearTimeout(self.timeout)
1189

1190
1191
    self.hoverState = 'in'

1192
    if (!self.options.delay || !self.options.delay.show) return self.show()
1193

1194
    self.timeout = setTimeout(function () {
1195
1196
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
1197
  }
1198

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

1203
    clearTimeout(self.timeout)
fat's avatar
fat committed
1204

1205
1206
    self.hoverState = 'out'

1207
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
1208

1209
    self.timeout = setTimeout(function () {
1210
1211
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
1212
  }
1213

1214
  Tooltip.prototype.show = function () {
Mark Otto's avatar
Mark Otto committed
1215
    var e = $.Event('show.bs.' + this.type)
1216

1217
1218
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
1219

1220
      if (e.isDefaultPrevented()) return
1221

1222
      var $tip = this.tip()
fat's avatar
fat committed
1223

1224
      this.setContent()
fat's avatar
fat committed
1225

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

1228
1229
1230
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1231

1232
1233
1234
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1235

1236
1237
1238
1239
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
1240

1241
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1242

1243
1244
1245
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1246

1247
1248
      if (autoPlace) {
        var $parent = this.$element.parent()
1249

1250
1251
1252
1253
1254
        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
1255

1256
1257
1258
1259
1260
        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
1261

1262
1263
1264
1265
1266
        $tip
          .removeClass(orgPlacement)
          .addClass(placement)
      }

1267
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1268

fat's avatar
fat committed
1269
      this.applyPlacement(calculatedOffset, placement)
1270
      this.$element.trigger('shown.bs.' + this.type)
fat's avatar
fat committed
1271
    }
1272
  }
fat's avatar
fat committed
1273

1274
  Tooltip.prototype.applyPlacement = function (offset, placement) {
1275
1276
1277
1278
    var replace
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight
fat's avatar
fat committed
1279

1280
    // manually read margins because getBoundingClientRect includes difference
fat's avatar
fat committed
1281
1282
1283
1284
1285
1286
1287
1288
1289
    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
1290

1291
1292
1293
    $tip
      .offset(offset)
      .addClass('in')
fat's avatar
fat committed
1294

fat's avatar
fat committed
1295
    // check to see if placing tip in new offset caused the tip to resize itself
1296
1297
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1298

1299
1300
    if (placement == 'top' && actualHeight != height) {
      replace = true
fat's avatar
fat committed
1301
      offset.top = offset.top + height - actualHeight
fat's avatar
fat committed
1302
1303
    }

fat's avatar
fat committed
1304
    if (/bottom|top/.test(placement)) {
1305
      var delta = 0
1306

fat's avatar
fat committed
1307
      if (offset.left < 0) {
1308
1309
        delta       = offset.left * -2
        offset.left = 0
fat's avatar
fat committed
1310

1311
        $tip.offset(offset)
1312

1313
1314
1315
        actualWidth  = $tip[0].offsetWidth
        actualHeight = $tip[0].offsetHeight
      }
1316

1317
1318
1319
1320
      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
    } else {
      this.replaceArrow(actualHeight - height, actualHeight, 'top')
    }
1321

1322
    if (replace) $tip.offset(offset)
1323
  }
1324

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

1329
1330
1331
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1332

1333
1334
1335
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1336

1337
1338
1339
1340
  Tooltip.prototype.hide = function () {
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1341

1342
1343
1344
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
    }
Jacob Thornton's avatar
Jacob Thornton committed
1345

1346
    this.$element.trigger(e)
1347

1348
    if (e.isDefaultPrevented()) return
1349

1350
    $tip.removeClass('in')
1351

1352
1353
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
Jacob Thornton's avatar
Jacob Thornton committed
1354
        .one($.support.transition.end, complete)
1355
        .emulateTransitionEnd(150) :
Jacob Thornton's avatar
Jacob Thornton committed
1356
      complete()
1357

1358
    this.$element.trigger('hidden.bs.' + this.type)
1359

1360
    return this
1361
1362
  }

1363
1364
1365
1366
  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', '')
1367
    }
1368
  }
1369

1370
1371
1372
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1373

1374
1375
1376
  Tooltip.prototype.getPosition = function () {
    var el = this.$element[0]
    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
Mark Otto's avatar
Mark Otto committed
1377
1378
      width: el.offsetWidth,
      height: el.offsetHeight
1379
1380
    }, this.$element.offset())
  }
1381

1382
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
fat's avatar
fat committed
1383
1384
1385
1386
1387
1388
    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   }
  }

1389
1390
1391
1392
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1393

1394
1395
    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1396

1397
    return title
1398
  }
1399

1400
1401
1402
  Tooltip.prototype.tip = function () {
    return this.$tip = this.$tip || $(this.options.template)
  }
1403

Mark Otto's avatar
Mark Otto committed
1404
  Tooltip.prototype.arrow = function () {
fat's avatar
fat committed
1405
    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
1406
  }
1407

1408
1409
1410
1411
1412
1413
1414
  Tooltip.prototype.validate = function () {
    if (!this.$element[0].parentNode) {
      this.hide()
      this.$element = null
      this.options  = null
    }
  }
1415

1416
1417
1418
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1419

1420
1421
1422
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
1423

1424
1425
1426
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Mark Otto's avatar
Mark Otto committed
1427

1428
  Tooltip.prototype.toggle = function (e) {
Jacob Thornton's avatar
Jacob Thornton committed
1429
    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
1430
1431
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1432

1433
1434
  Tooltip.prototype.destroy = function () {
    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
fat's avatar
fat committed
1435
  }
1436
1437


1438
1439
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1440

1441
  var old = $.fn.tooltip
1442

1443
  $.fn.tooltip = function (option) {
1444
    return this.each(function () {
1445
1446
1447
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1448

1449
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1450
1451
1452
1453
      if (typeof option == 'string') data[option]()
    })
  }

1454
  $.fn.tooltip.Constructor = Tooltip
1455

1456

1457
1458
  // TOOLTIP NO CONFLICT
  // ===================
1459

1460
1461
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
1462
1463
1464
    return this
  }

Chris Rebert's avatar
Chris Rebert committed
1465
}(jQuery);
1466

1467
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1468
 * Bootstrap: popover.js v3.0.3
Mark Otto's avatar
Mark Otto committed
1469
 * http://getbootstrap.com/javascript/#popovers
1470
 * ========================================================================
1471
 * Copyright 2013 Twitter, Inc.
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
1484
 * ======================================================================== */
1485
1486


XhmikosR's avatar
XhmikosR committed
1487
+function ($) { 'use strict';
1488

1489
  // POPOVER PUBLIC CLASS DEFINITION
1490
  // ===============================
fat's avatar
fat committed
1491

1492
1493
  var Popover = function (element, options) {
    this.init('popover', element, options)
1494
1495
  }

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

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

fat's avatar
fat committed
1505

1506
1507
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
fat's avatar
fat committed
1508

1509
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1510

1511
  Popover.prototype.constructor = Popover
fat's avatar
fat committed
1512

1513
1514
1515
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1516

1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
  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')

1527
1528
    // 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
1529
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1530
1531
  }

1532
1533
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
1534
1535
  }

1536
1537
1538
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1539

1540
1541
1542
1543
1544
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
1545

Mark Otto's avatar
Mark Otto committed
1546
  Popover.prototype.arrow = function () {
fat's avatar
fat committed
1547
1548
1549
    return this.$arrow = this.$arrow || this.tip().find('.arrow')
  }

1550
1551
1552
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
fat's avatar
fat committed
1553
  }
1554

1555

1556
1557
  // POPOVER PLUGIN DEFINITION
  // =========================
1558

1559
  var old = $.fn.popover
1560

1561
1562
1563
1564
1565
  $.fn.popover = function (option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
1566

1567
1568
1569
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
1570
1571
  }

1572
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1573

1574

1575
1576
  // POPOVER NO CONFLICT
  // ===================
1577

1578
1579
1580
1581
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1582

Chris Rebert's avatar
Chris Rebert committed
1583
}(jQuery);
1584

1585
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1586
 * Bootstrap: scrollspy.js v3.0.3
Mark Otto's avatar
Mark Otto committed
1587
 * http://getbootstrap.com/javascript/#scrollspy
1588
 * ========================================================================
1589
 * Copyright 2013 Twitter, Inc.
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ======================================================================== */
1603
1604


XhmikosR's avatar
XhmikosR committed
1605
+function ($) { 'use strict';
1606

1607
1608
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1609

1610
1611
1612
  function ScrollSpy(element, options) {
    var href
    var process  = $.proxy(this.process, this)
1613

fat's avatar
fat committed
1614
    this.$element       = $(element).is('body') ? $(window) : $(element)
1615
    this.$body          = $('body')
fat's avatar
fat committed
1616
    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
1617
1618
1619
1620
1621
1622
1623
    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
1624

1625
1626
1627
    this.refresh()
    this.process()
  }
1628

1629
1630
1631
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1632

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

1636
1637
    this.offsets = $([])
    this.targets = $([])
1638

1639
1640
1641
1642
1643
1644
1645
    var self     = this
    var $targets = this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#\w/.test(href) && $(href)
1646

1647
1648
        return ($href
          && $href.length
fat's avatar
fat committed
1649
          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
1650
1651
1652
1653
1654
1655
1656
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }
1657

1658
1659
1660
1661
1662
1663
1664
1665
  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
1666

1667
1668
1669
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets.last()[0]) && this.activate(i)
    }
1670

1671
1672
1673
1674
1675
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate( targets[i] )
1676
    }
1677
1678
  }

1679
1680
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1681

1682
1683
1684
    $(this.selector)
      .parents('.active')
      .removeClass('active')
1685

1686
1687
1688
    var selector = this.selector
      + '[data-target="' + target + '"],'
      + this.selector + '[href="' + target + '"]'
1689

1690
1691
1692
    var active = $(selector)
      .parents('li')
      .addClass('active')
1693

1694
1695
1696
1697
    if (active.parent('.dropdown-menu').length)  {
      active = active
        .closest('li.dropdown')
        .addClass('active')
1698
    }
1699

1700
    active.trigger('activate.bs.scrollspy')
1701
  }
1702
1703


1704
1705
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1706

1707
  var old = $.fn.scrollspy
1708

1709
1710
1711
1712
1713
  $.fn.scrollspy = function (option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option
1714

1715
1716
1717
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
1718
1719
  }

1720
  $.fn.scrollspy.Constructor = ScrollSpy
1721
1722


1723
1724
1725
1726
1727
1728
  // SCROLLSPY NO CONFLICT
  // =====================

  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
1729
1730
1731
  }


1732
1733
  // SCROLLSPY DATA-API
  // ==================
1734

1735
1736
1737
1738
1739
1740
  $(window).on('load', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      $spy.scrollspy($spy.data())
    })
  })
1741

Chris Rebert's avatar
Chris Rebert committed
1742
}(jQuery);
1743

1744
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1745
 * Bootstrap: tab.js v3.0.3
Mark Otto's avatar
Mark Otto committed
1746
 * http://getbootstrap.com/javascript/#tabs
1747
 * ========================================================================
1748
 * Copyright 2013 Twitter, Inc.
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ======================================================================== */
1762

1763

XhmikosR's avatar
XhmikosR committed
1764
+function ($) { 'use strict';
1765
1766
1767
1768
1769
1770

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

  var Tab = function (element) {
    this.element = $(element)
1771
  }
1772

1773
1774
1775
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
Chris Rebert's avatar
Chris Rebert committed
1776
    var selector = $this.data('target')
1777
1778
1779
1780

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

1783
    if ($this.parent('li').hasClass('active')) return
1784

1785
1786
1787
1788
    var previous = $ul.find('.active:last a')[0]
    var e        = $.Event('show.bs.tab', {
      relatedTarget: previous
    })
1789

1790
    $this.trigger(e)
1791

1792
    if (e.isDefaultPrevented()) return
1793

1794
    var $target = $(selector)
1795

1796
1797
1798
    this.activate($this.parent('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $this.trigger({
Mark Otto's avatar
Mark Otto committed
1799
1800
        type: 'shown.bs.tab',
        relatedTarget: previous
1801
1802
      })
    })
1803
  }
1804

1805
1806
1807
1808
1809
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && $active.hasClass('fade')
1810

1811
1812
1813
1814
1815
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
        .removeClass('active')
1816

1817
      element.addClass('active')
1818

1819
1820
1821
1822
1823
1824
      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
      }
1825

1826
1827
1828
      if (element.parent('.dropdown-menu')) {
        element.closest('li.dropdown').addClass('active')
      }
fat's avatar
fat committed
1829

1830
1831
      callback && callback()
    }
fat's avatar
fat committed
1832

1833
1834
1835
1836
1837
1838
1839
    transition ?
      $active
        .one($.support.transition.end, next)
        .emulateTransitionEnd(150) :
      next()

    $active.removeClass('in')
1840
1841
1842
  }


1843
1844
  // TAB PLUGIN DEFINITION
  // =====================
1845

1846
  var old = $.fn.tab
1847

1848
  $.fn.tab = function ( option ) {
1849
    return this.each(function () {
1850
1851
      var $this = $(this)
      var data  = $this.data('bs.tab')
fat's avatar
fat committed
1852

1853
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
1854
1855
1856
1857
      if (typeof option == 'string') data[option]()
    })
  }

1858
  $.fn.tab.Constructor = Tab
1859
1860


1861
1862
  // TAB NO CONFLICT
  // ===============
1863

1864
1865
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
1866
1867
1868
    return this
  }

1869
1870
1871
1872
1873
1874
1875
1876
1877

  // 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
1878
}(jQuery);
1879

1880
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1881
 * Bootstrap: affix.js v3.0.3
Mark Otto's avatar
Mark Otto committed
1882
 * http://getbootstrap.com/javascript/#affix
1883
 * ========================================================================
1884
 * Copyright 2013 Twitter, Inc.
Mark Otto's avatar
Mark Otto committed
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
1897
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
1898
1899


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

1902
1903
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
1904

1905
1906
1907
1908
1909
  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
1910

1911
1912
1913
    this.$element = $(element)
    this.affixed  =
    this.unpin    = null
fat's avatar
fat committed
1914

1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
    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() })
1956
    }
Mark Otto's avatar
Mark Otto committed
1957
1958
  }

1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973

  // 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]()
    })
1974
1975
  }

1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
  $.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

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