bootstrap.js 64.2 KB
Newer Older
1
/*!
Mark Otto's avatar
Mark Otto committed
2
 * Bootstrap v3.1.1 (http://getbootstrap.com)
3
 * Copyright 2011-2014 Twitter, Inc.
Mark Otto's avatar
Mark Otto committed
4
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
Chris Rebert's avatar
Chris Rebert committed
5
 */
6

7
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
8

9
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
10
 * Bootstrap: transition.js v3.1.1
Mark Otto's avatar
Mark Otto committed
11
 * http://getbootstrap.com/javascript/#transitions
12
 * ========================================================================
13
 * Copyright 2011-2014 Twitter, Inc.
14
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
 * ======================================================================== */
16
17


Chris Rebert's avatar
Chris Rebert committed
18
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
19

Chris Rebert's avatar
Chris Rebert committed
20
21
22
23
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
24

Chris Rebert's avatar
Chris Rebert committed
25
26
    // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
    // ============================================================
27

Chris Rebert's avatar
Chris Rebert committed
28
29
    function transitionEnd() {
      var el = document.createElement('bootstrap')
30

Chris Rebert's avatar
Chris Rebert committed
31
32
33
34
35
36
      var transEndEventNames = {
        WebkitTransition : 'webkitTransitionEnd',
        MozTransition    : 'transitionend',
        OTransition      : 'oTransitionEnd otransitionend',
        transition       : 'transitionend'
      }
37

Chris Rebert's avatar
Chris Rebert committed
38
39
40
41
      for (var name in transEndEventNames) {
        if (el.style[name] !== undefined) {
          return { end: transEndEventNames[name] }
        }
42
      }
Chris Rebert's avatar
Chris Rebert committed
43
44
45
46
47
48
49
50
51
52
53
54

      return false // explicit for ie8 (  ._.)
    }

    // http://blog.alexmaccaw.com/css-transitions
    $.fn.emulateTransitionEnd = function (duration) {
      var called = false
      var $el = this
      $(this).one('bsTransitionEnd', function () { called = true })
      var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
      setTimeout(callback, duration)
      return this
55
    }
56

Chris Rebert's avatar
Chris Rebert committed
57
58
    $(function () {
      $.support.transition = transitionEnd()
59

Chris Rebert's avatar
Chris Rebert committed
60
61
62
63
64
65
66
67
68
69
      if (!$.support.transition) return

      $.event.special.bsTransitionEnd = {
        bindType: $.support.transition.end,
        delegateType: $.support.transition.end,
        handle: function (e) {
          if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
        }
      }
    })
70

fat's avatar
fat committed
71
  })
72

Chris Rebert's avatar
Chris Rebert committed
73
}();
74

75
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
76
 * Bootstrap: alert.js v3.1.1
Mark Otto's avatar
Mark Otto committed
77
 * http://getbootstrap.com/javascript/#alerts
78
 * ========================================================================
79
 * Copyright 2011-2014 Twitter, Inc.
80
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
81
 * ======================================================================== */
82
83


Chris Rebert's avatar
Chris Rebert committed
84
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
85

Chris Rebert's avatar
Chris Rebert committed
86
87
88
89
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
90

Chris Rebert's avatar
Chris Rebert committed
91
92
    // ALERT CLASS DEFINITION
    // ======================
93

Chris Rebert's avatar
Chris Rebert committed
94
95
96
97
    var dismiss = '[data-dismiss="alert"]'
    var Alert   = function (el) {
      $(el).on('click', dismiss, this.close)
    }
98

Chris Rebert's avatar
Chris Rebert committed
99
    Alert.VERSION = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
100

Chris Rebert's avatar
Chris Rebert committed
101
102
103
    Alert.prototype.close = function (e) {
      var $this    = $(this)
      var selector = $this.attr('data-target')
104

Chris Rebert's avatar
Chris Rebert committed
105
106
107
108
      if (!selector) {
        selector = $this.attr('href')
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
      }
109

Chris Rebert's avatar
Chris Rebert committed
110
      var $parent = $(selector)
111

Chris Rebert's avatar
Chris Rebert committed
112
      if (e) e.preventDefault()
113

Chris Rebert's avatar
Chris Rebert committed
114
115
116
      if (!$parent.length) {
        $parent = $this.hasClass('alert') ? $this : $this.parent()
      }
117

Chris Rebert's avatar
Chris Rebert committed
118
      $parent.trigger(e = $.Event('close.bs.alert'))
119

Chris Rebert's avatar
Chris Rebert committed
120
121
122
      if (e.isDefaultPrevented()) return

      $parent.removeClass('in')
123

Chris Rebert's avatar
Chris Rebert committed
124
125
126
127
      function removeElement() {
        // detach from parent, fire event then clean up data
        $parent.detach().trigger('closed.bs.alert').remove()
      }
128

Chris Rebert's avatar
Chris Rebert committed
129
130
131
132
133
      $.support.transition && $parent.hasClass('fade') ?
        $parent
          .one('bsTransitionEnd', removeElement)
          .emulateTransitionEnd(150) :
        removeElement()
134
135
136
    }


Chris Rebert's avatar
Chris Rebert committed
137
138
    // ALERT PLUGIN DEFINITION
    // =======================
139

Chris Rebert's avatar
Chris Rebert committed
140
141
142
143
    function Plugin(option) {
      return this.each(function () {
        var $this = $(this)
        var data  = $this.data('bs.alert')
144

Chris Rebert's avatar
Chris Rebert committed
145
146
147
148
        if (!data) $this.data('bs.alert', (data = new Alert(this)))
        if (typeof option == 'string') data[option].call($this)
      })
    }
fat's avatar
fat committed
149

Chris Rebert's avatar
Chris Rebert committed
150
    var old = $.fn.alert
151

Chris Rebert's avatar
Chris Rebert committed
152
153
    $.fn.alert             = Plugin
    $.fn.alert.Constructor = Alert
Mark Otto's avatar
Mark Otto committed
154

155

Chris Rebert's avatar
Chris Rebert committed
156
157
    // ALERT NO CONFLICT
    // =================
158

Chris Rebert's avatar
Chris Rebert committed
159
160
161
162
    $.fn.alert.noConflict = function () {
      $.fn.alert = old
      return this
    }
163
164


Chris Rebert's avatar
Chris Rebert committed
165
166
    // ALERT DATA-API
    // ==============
167

Chris Rebert's avatar
Chris Rebert committed
168
    $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
169

Chris Rebert's avatar
Chris Rebert committed
170
  })
171

Chris Rebert's avatar
Chris Rebert committed
172
}();
173

174
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
175
 * Bootstrap: button.js v3.1.1
Mark Otto's avatar
Mark Otto committed
176
 * http://getbootstrap.com/javascript/#buttons
177
 * ========================================================================
178
 * Copyright 2011-2014 Twitter, Inc.
179
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
180
 * ======================================================================== */
181
182


Chris Rebert's avatar
Chris Rebert committed
183
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
184

Chris Rebert's avatar
Chris Rebert committed
185
186
187
188
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
189

Chris Rebert's avatar
Chris Rebert committed
190
191
    // BUTTON PUBLIC CLASS DEFINITION
    // ==============================
192

Chris Rebert's avatar
Chris Rebert committed
193
194
195
196
197
    var Button = function (element, options) {
      this.$element  = $(element)
      this.options   = $.extend({}, Button.DEFAULTS, options)
      this.isLoading = false
    }
fat's avatar
fat committed
198

Chris Rebert's avatar
Chris Rebert committed
199
    Button.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
200

Chris Rebert's avatar
Chris Rebert committed
201
202
203
    Button.DEFAULTS = {
      loadingText: 'loading...'
    }
204

Chris Rebert's avatar
Chris Rebert committed
205
206
207
208
209
    Button.prototype.setState = function (state) {
      var d    = 'disabled'
      var $el  = this.$element
      var val  = $el.is('input') ? 'val' : 'html'
      var data = $el.data()
210

Chris Rebert's avatar
Chris Rebert committed
211
      state = state + 'Text'
fat's avatar
fat committed
212

Chris Rebert's avatar
Chris Rebert committed
213
      if (data.resetText == null) $el.data('resetText', $el[val]())
214

Chris Rebert's avatar
Chris Rebert committed
215
      $el[val](data[state] == null ? this.options[state] : data[state])
216

Chris Rebert's avatar
Chris Rebert committed
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
      // push to event loop to allow forms to submit
      setTimeout($.proxy(function () {
        if (state == 'loadingText') {
          this.isLoading = true
          $el.addClass(d).attr(d, d)
        } else if (this.isLoading) {
          this.isLoading = false
          $el.removeClass(d).removeAttr(d)
        }
      }, this), 0)
    }

    Button.prototype.toggle = function () {
      var changed = true
      var $parent = this.$element.closest('[data-toggle="buttons"]')

      if ($parent.length) {
        var $input = this.$element.find('input')
        if ($input.prop('type') == 'radio') {
          if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
          else $parent.find('.active').removeClass('active')
        }
        if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
240
      }
Chris Rebert's avatar
Chris Rebert committed
241
242

      if (changed) this.$element.toggleClass('active')
fat's avatar
fat committed
243
    }
244
245


Chris Rebert's avatar
Chris Rebert committed
246
247
    // BUTTON PLUGIN DEFINITION
    // ========================
248

Chris Rebert's avatar
Chris Rebert committed
249
250
251
252
253
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.button')
        var options = typeof option == 'object' && option
254

Chris Rebert's avatar
Chris Rebert committed
255
        if (!data) $this.data('bs.button', (data = new Button(this, options)))
fat's avatar
fat committed
256

Chris Rebert's avatar
Chris Rebert committed
257
258
259
260
        if (option == 'toggle') data.toggle()
        else if (option) data.setState(option)
      })
    }
fat's avatar
fat committed
261

Chris Rebert's avatar
Chris Rebert committed
262
    var old = $.fn.button
263

Chris Rebert's avatar
Chris Rebert committed
264
265
    $.fn.button             = Plugin
    $.fn.button.Constructor = Button
Mark Otto's avatar
Mark Otto committed
266

267

Chris Rebert's avatar
Chris Rebert committed
268
269
    // BUTTON NO CONFLICT
    // ==================
270

Chris Rebert's avatar
Chris Rebert committed
271
272
273
274
    $.fn.button.noConflict = function () {
      $.fn.button = old
      return this
    }
275
276


Chris Rebert's avatar
Chris Rebert committed
277
278
    // BUTTON DATA-API
    // ===============
279

Chris Rebert's avatar
Chris Rebert committed
280
281
282
283
284
285
    $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target)
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
      Plugin.call($btn, 'toggle')
      e.preventDefault()
    })
286
287
288

  })

Chris Rebert's avatar
Chris Rebert committed
289
}();
290

291
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
292
 * Bootstrap: carousel.js v3.1.1
Mark Otto's avatar
Mark Otto committed
293
 * http://getbootstrap.com/javascript/#carousel
294
 * ========================================================================
295
 * Copyright 2011-2014 Twitter, Inc.
296
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
297
 * ======================================================================== */
298
299


Chris Rebert's avatar
Chris Rebert committed
300
+function () { 'use strict';
301

Chris Rebert's avatar
Chris Rebert committed
302
303
304
305
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
306

Chris Rebert's avatar
Chris Rebert committed
307
308
    // CAROUSEL CLASS DEFINITION
    // =========================
fat's avatar
fat committed
309

Chris Rebert's avatar
Chris Rebert committed
310
311
312
313
314
315
316
317
318
    var Carousel = function (element, options) {
      this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
      this.$indicators = this.$element.find('.carousel-indicators')
      this.options     = options
      this.paused      =
      this.sliding     =
      this.interval    =
      this.$active     =
      this.$items      = null
319

Chris Rebert's avatar
Chris Rebert committed
320
321
322
323
      this.options.pause == 'hover' && this.$element
        .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
    }
Mark Otto's avatar
grunt    
Mark Otto committed
324

Chris Rebert's avatar
Chris Rebert committed
325
    Carousel.VERSION  = '3.1.1'
326

Chris Rebert's avatar
Chris Rebert committed
327
328
329
330
    Carousel.DEFAULTS = {
      interval: 5000,
      pause: 'hover',
      wrap: true
Mark Otto's avatar
Mark Otto committed
331
332
    }

Chris Rebert's avatar
Chris Rebert committed
333
334
335
336
337
338
    Carousel.prototype.keydown = function (e) {
      switch (e.which) {
        case 37: this.prev(); break
        case 39: this.next(); break
        default: return
      }
339

Chris Rebert's avatar
Chris Rebert committed
340
341
      e.preventDefault()
    }
fat's avatar
fat committed
342

Chris Rebert's avatar
Chris Rebert committed
343
344
    Carousel.prototype.cycle = function (e) {
      e || (this.paused = false)
345

Chris Rebert's avatar
Chris Rebert committed
346
      this.interval && clearInterval(this.interval)
347

Chris Rebert's avatar
Chris Rebert committed
348
349
350
      this.options.interval
        && !this.paused
        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
351

Chris Rebert's avatar
Chris Rebert committed
352
353
      return this
    }
354

Chris Rebert's avatar
Chris Rebert committed
355
356
357
358
    Carousel.prototype.getItemIndex = function (item) {
      this.$items = item.parent().children('.item')
      return this.$items.index(item || this.$active)
    }
359

Chris Rebert's avatar
Chris Rebert committed
360
361
362
    Carousel.prototype.to = function (pos) {
      var that        = this
      var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
fat's avatar
fat committed
363

Chris Rebert's avatar
Chris Rebert committed
364
      if (pos > (this.$items.length - 1) || pos < 0) return
365

Chris Rebert's avatar
Chris Rebert committed
366
367
      if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
      if (activeIndex == pos) return this.pause().cycle()
fat's avatar
fat committed
368

Chris Rebert's avatar
Chris Rebert committed
369
      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
370
371
    }

Chris Rebert's avatar
Chris Rebert committed
372
373
    Carousel.prototype.pause = function (e) {
      e || (this.paused = true)
374

Chris Rebert's avatar
Chris Rebert committed
375
376
377
378
      if (this.$element.find('.next, .prev').length && $.support.transition) {
        this.$element.trigger($.support.transition.end)
        this.cycle(true)
      }
379

Chris Rebert's avatar
Chris Rebert committed
380
      this.interval = clearInterval(this.interval)
381

Chris Rebert's avatar
Chris Rebert committed
382
383
      return this
    }
384

Chris Rebert's avatar
Chris Rebert committed
385
386
387
388
    Carousel.prototype.next = function () {
      if (this.sliding) return
      return this.slide('next')
    }
Jacob Thornton's avatar
Jacob Thornton committed
389

Chris Rebert's avatar
Chris Rebert committed
390
391
392
    Carousel.prototype.prev = function () {
      if (this.sliding) return
      return this.slide('prev')
Jacob Thornton's avatar
Jacob Thornton committed
393
394
    }

Chris Rebert's avatar
Chris Rebert committed
395
396
397
398
399
400
401
402
403
404
405
406
    Carousel.prototype.slide = function (type, next) {
      var $active   = this.$element.find('.item.active')
      var $next     = next || $active[type]()
      var isCycling = this.interval
      var direction = type == 'next' ? 'left' : 'right'
      var fallback  = type == 'next' ? 'first' : 'last'
      var that      = this

      if (!$next.length) {
        if (!this.options.wrap) return
        $next = this.$element.find('.item')[fallback]()
      }
fat's avatar
fat committed
407

Chris Rebert's avatar
Chris Rebert committed
408
      if ($next.hasClass('active')) return (this.sliding = false)
409

Chris Rebert's avatar
Chris Rebert committed
410
411
412
413
414
415
416
      var relatedTarget = $next[0]
      var slideEvent = $.Event('slide.bs.carousel', {
        relatedTarget: relatedTarget,
        direction: direction
      })
      this.$element.trigger(slideEvent)
      if (slideEvent.isDefaultPrevented()) return
fat's avatar
fat committed
417

Chris Rebert's avatar
Chris Rebert committed
418
      this.sliding = true
419

Chris Rebert's avatar
Chris Rebert committed
420
      isCycling && this.pause()
421

Chris Rebert's avatar
Chris Rebert committed
422
423
424
425
426
      if (this.$indicators.length) {
        this.$indicators.find('.active').removeClass('active')
        var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        $nextIndicator && $nextIndicator.addClass('active')
      }
427

Chris Rebert's avatar
Chris Rebert committed
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
      var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
      if ($.support.transition && this.$element.hasClass('slide')) {
        $next.addClass(type)
        $next[0].offsetWidth // force reflow
        $active.addClass(direction)
        $next.addClass(direction)
        $active
          .one('bsTransitionEnd', function () {
            $next.removeClass([type, direction].join(' ')).addClass('active')
            $active.removeClass(['active', direction].join(' '))
            that.sliding = false
            setTimeout(function () {
              that.$element.trigger(slidEvent)
            }, 0)
          })
          .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
      } else {
        $active.removeClass('active')
        $next.addClass('active')
        this.sliding = false
        this.$element.trigger(slidEvent)
      }

      isCycling && this.cycle()
452

Chris Rebert's avatar
Chris Rebert committed
453
454
      return this
    }
Mark Otto's avatar
Mark Otto committed
455

456

Chris Rebert's avatar
Chris Rebert committed
457
458
    // CAROUSEL PLUGIN DEFINITION
    // ==========================
459

Chris Rebert's avatar
Chris Rebert committed
460
461
462
463
464
465
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.carousel')
        var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        var action  = typeof option == 'string' ? option : options.slide
466

Chris Rebert's avatar
Chris Rebert committed
467
468
469
470
471
472
        if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        if (typeof option == 'number') data.to(option)
        else if (action) data[action]()
        else if (options.interval) data.pause().cycle()
      })
    }
473

Chris Rebert's avatar
Chris Rebert committed
474
    var old = $.fn.carousel
fat's avatar
fat committed
475

Chris Rebert's avatar
Chris Rebert committed
476
477
    $.fn.carousel             = Plugin
    $.fn.carousel.Constructor = Carousel
478

479

Chris Rebert's avatar
Chris Rebert committed
480
481
    // CAROUSEL NO CONFLICT
    // ====================
482

Chris Rebert's avatar
Chris Rebert committed
483
484
485
    $.fn.carousel.noConflict = function () {
      $.fn.carousel = old
      return this
486
487
    }

488

Chris Rebert's avatar
Chris Rebert committed
489
490
491
492
493
494
    // CAROUSEL DATA-API
    // =================

    $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
      var href
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
495
      var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
      var options = $.extend({}, $target.data(), $this.data())
      var slideIndex = $this.attr('data-slide-to')
      if (slideIndex) options.interval = false

      Plugin.call($target, options)

      if (slideIndex) {
        $target.data('bs.carousel').to(slideIndex)
      }

      e.preventDefault()
    })

    $(window).on('load', function () {
      $('[data-ride="carousel"]').each(function () {
        var $carousel = $(this)
        Plugin.call($carousel, $carousel.data())
      })
fat's avatar
fat committed
514
    })
Chris Rebert's avatar
Chris Rebert committed
515

fat's avatar
fat committed
516
517
  })

Chris Rebert's avatar
Chris Rebert committed
518
}();
519

520
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
521
 * Bootstrap: collapse.js v3.1.1
Mark Otto's avatar
Mark Otto committed
522
 * http://getbootstrap.com/javascript/#collapse
523
 * ========================================================================
524
 * Copyright 2011-2014 Twitter, Inc.
525
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
526
 * ======================================================================== */
527
528


Chris Rebert's avatar
Chris Rebert committed
529
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
530

Chris Rebert's avatar
Chris Rebert committed
531
532
533
534
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
535

Chris Rebert's avatar
Chris Rebert committed
536
537
    // COLLAPSE PUBLIC CLASS DEFINITION
    // ================================
538

Chris Rebert's avatar
Chris Rebert committed
539
540
541
542
    var Collapse = function (element, options) {
      this.$element      = $(element)
      this.options       = $.extend({}, Collapse.DEFAULTS, options)
      this.transitioning = null
543

Chris Rebert's avatar
Chris Rebert committed
544
545
546
      if (this.options.parent) this.$parent = $(this.options.parent)
      if (this.options.toggle) this.toggle()
    }
547

Chris Rebert's avatar
Chris Rebert committed
548
    Collapse.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
549

Chris Rebert's avatar
Chris Rebert committed
550
551
552
    Collapse.DEFAULTS = {
      toggle: true
    }
553

Chris Rebert's avatar
Chris Rebert committed
554
555
556
557
    Collapse.prototype.dimension = function () {
      var hasWidth = this.$element.hasClass('width')
      return hasWidth ? 'width' : 'height'
    }
558

Chris Rebert's avatar
Chris Rebert committed
559
560
    Collapse.prototype.show = function () {
      if (this.transitioning || this.$element.hasClass('in')) return
561

Chris Rebert's avatar
Chris Rebert committed
562
563
564
      var startEvent = $.Event('show.bs.collapse')
      this.$element.trigger(startEvent)
      if (startEvent.isDefaultPrevented()) return
fat's avatar
fat committed
565

Chris Rebert's avatar
Chris Rebert committed
566
      var actives = this.$parent && this.$parent.find('> .panel > .in')
567

Chris Rebert's avatar
Chris Rebert committed
568
569
570
571
572
573
      if (actives && actives.length) {
        var hasData = actives.data('bs.collapse')
        if (hasData && hasData.transitioning) return
        Plugin.call(actives, 'hide')
        hasData || actives.data('bs.collapse', null)
      }
574

Chris Rebert's avatar
Chris Rebert committed
575
      var dimension = this.dimension()
576

Chris Rebert's avatar
Chris Rebert committed
577
578
579
      this.$element
        .removeClass('collapse')
        .addClass('collapsing')[dimension](0)
580

Chris Rebert's avatar
Chris Rebert committed
581
      this.transitioning = 1
582

Chris Rebert's avatar
Chris Rebert committed
583
      var complete = function () {
Mark Otto's avatar
Mark Otto committed
584
        this.$element
Chris Rebert's avatar
Chris Rebert committed
585
586
587
588
589
          .removeClass('collapsing')
          .addClass('collapse in')[dimension]('')
        this.transitioning = 0
        this.$element
          .trigger('shown.bs.collapse')
Mark Otto's avatar
Mark Otto committed
590
      }
591

Chris Rebert's avatar
Chris Rebert committed
592
      if (!$.support.transition) return complete.call(this)
593

Chris Rebert's avatar
Chris Rebert committed
594
      var scrollSize = $.camelCase(['scroll', dimension].join('-'))
595

Chris Rebert's avatar
Chris Rebert committed
596
597
598
599
      this.$element
        .one('bsTransitionEnd', $.proxy(complete, this))
        .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
    }
600

Chris Rebert's avatar
Chris Rebert committed
601
602
    Collapse.prototype.hide = function () {
      if (this.transitioning || !this.$element.hasClass('in')) return
fat's avatar
fat committed
603

Chris Rebert's avatar
Chris Rebert committed
604
605
606
      var startEvent = $.Event('hide.bs.collapse')
      this.$element.trigger(startEvent)
      if (startEvent.isDefaultPrevented()) return
fat's avatar
fat committed
607

Chris Rebert's avatar
Chris Rebert committed
608
      var dimension = this.dimension()
609

Chris Rebert's avatar
Chris Rebert committed
610
      this.$element[dimension](this.$element[dimension]())[0].offsetHeight
611

Chris Rebert's avatar
Chris Rebert committed
612
613
614
615
      this.$element
        .addClass('collapsing')
        .removeClass('collapse')
        .removeClass('in')
616

Chris Rebert's avatar
Chris Rebert committed
617
      this.transitioning = 1
618

Chris Rebert's avatar
Chris Rebert committed
619
620
      var complete = function () {
        this.transitioning = 0
Mark Otto's avatar
Mark Otto committed
621
        this.$element
Chris Rebert's avatar
Chris Rebert committed
622
623
624
          .trigger('hidden.bs.collapse')
          .removeClass('collapsing')
          .addClass('collapse')
Mark Otto's avatar
Mark Otto committed
625
      }
626

Chris Rebert's avatar
Chris Rebert committed
627
      if (!$.support.transition) return complete.call(this)
628

Chris Rebert's avatar
Chris Rebert committed
629
630
631
632
633
      this.$element
        [dimension](0)
        .one('bsTransitionEnd', $.proxy(complete, this))
        .emulateTransitionEnd(350)
    }
634

Chris Rebert's avatar
Chris Rebert committed
635
636
637
    Collapse.prototype.toggle = function () {
      this[this.$element.hasClass('in') ? 'hide' : 'show']()
    }
638
639


Chris Rebert's avatar
Chris Rebert committed
640
641
    // COLLAPSE PLUGIN DEFINITION
    // ==========================
642

Chris Rebert's avatar
Chris Rebert committed
643
644
645
646
647
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.collapse')
        var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
648

Chris Rebert's avatar
Chris Rebert committed
649
650
651
652
653
        if (!data && options.toggle && option == 'show') option = !option
        if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
654

Chris Rebert's avatar
Chris Rebert committed
655
    var old = $.fn.collapse
Mark Otto's avatar
Mark Otto committed
656

Chris Rebert's avatar
Chris Rebert committed
657
658
    $.fn.collapse             = Plugin
    $.fn.collapse.Constructor = Collapse
659
660


Chris Rebert's avatar
Chris Rebert committed
661
662
    // COLLAPSE NO CONFLICT
    // ====================
663

Chris Rebert's avatar
Chris Rebert committed
664
665
666
667
    $.fn.collapse.noConflict = function () {
      $.fn.collapse = old
      return this
    }
668
669


Chris Rebert's avatar
Chris Rebert committed
670
671
    // COLLAPSE DATA-API
    // =================
672

Chris Rebert's avatar
Chris Rebert committed
673
674
675
676
677
    $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
      var href
      var $this   = $(this)
      var target  = $this.attr('data-target')
          || e.preventDefault()
Mark Otto's avatar
Mark Otto committed
678
          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
679
680
681
682
683
684
685
686
687
688
      var $target = $(target)
      var data    = $target.data('bs.collapse')
      var option  = data ? 'toggle' : $this.data()
      var parent  = $this.attr('data-parent')
      var $parent = parent && $(parent)

      if (!data || !data.transitioning) {
        if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
        $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
      }
689

Chris Rebert's avatar
Chris Rebert committed
690
691
      Plugin.call($target, option)
    })
fat's avatar
fat committed
692

693
694
  })

Chris Rebert's avatar
Chris Rebert committed
695
}();
696

697
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
698
 * Bootstrap: dropdown.js v3.1.1
Mark Otto's avatar
Mark Otto committed
699
 * http://getbootstrap.com/javascript/#dropdowns
700
 * ========================================================================
701
 * Copyright 2011-2014 Twitter, Inc.
702
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
703
 * ======================================================================== */
704
705


Chris Rebert's avatar
Chris Rebert committed
706
707
708
709
710
711
+function () { 'use strict';

  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
Mark Otto's avatar
grunt    
Mark Otto committed
712

Chris Rebert's avatar
Chris Rebert committed
713
714
    // DROPDOWN CLASS DEFINITION
    // =========================
715

Chris Rebert's avatar
Chris Rebert committed
716
717
718
719
720
    var backdrop = '.dropdown-backdrop'
    var toggle   = '[data-toggle="dropdown"]'
    var Dropdown = function (element) {
      $(element).on('click.bs.dropdown', this.toggle)
    }
721

Chris Rebert's avatar
Chris Rebert committed
722
    Dropdown.VERSION = '3.1.1'
723

Chris Rebert's avatar
Chris Rebert committed
724
725
    Dropdown.prototype.toggle = function (e) {
      var $this = $(this)
Mark Otto's avatar
grunt    
Mark Otto committed
726

Chris Rebert's avatar
Chris Rebert committed
727
      if ($this.is('.disabled, :disabled')) return
728

Chris Rebert's avatar
Chris Rebert committed
729
730
      var $parent  = getParent($this)
      var isActive = $parent.hasClass('open')
731

Chris Rebert's avatar
Chris Rebert committed
732
      clearMenus()
733

Chris Rebert's avatar
Chris Rebert committed
734
735
736
737
738
      if (!isActive) {
        if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
          // if mobile we use a backdrop because click events don't delegate
          $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
        }
fat's avatar
fat committed
739

Chris Rebert's avatar
Chris Rebert committed
740
741
        var relatedTarget = { relatedTarget: this }
        $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
742

Chris Rebert's avatar
Chris Rebert committed
743
        if (e.isDefaultPrevented()) return
744

Chris Rebert's avatar
Chris Rebert committed
745
        $this.trigger('focus')
746

Chris Rebert's avatar
Chris Rebert committed
747
748
749
750
        $parent
          .toggleClass('open')
          .trigger('shown.bs.dropdown', relatedTarget)
      }
Mark Otto's avatar
Mark Otto committed
751

Chris Rebert's avatar
Chris Rebert committed
752
      return false
fat's avatar
rebuild    
fat committed
753
    }
754

Chris Rebert's avatar
Chris Rebert committed
755
756
    Dropdown.prototype.keydown = function (e) {
      if (!/(38|40|27)/.test(e.keyCode)) return
757

Chris Rebert's avatar
Chris Rebert committed
758
      var $this = $(this)
759

Chris Rebert's avatar
Chris Rebert committed
760
761
      e.preventDefault()
      e.stopPropagation()
762

Chris Rebert's avatar
Chris Rebert committed
763
      if ($this.is('.disabled, :disabled')) return
764

Chris Rebert's avatar
Chris Rebert committed
765
766
      var $parent  = getParent($this)
      var isActive = $parent.hasClass('open')
767

Chris Rebert's avatar
Chris Rebert committed
768
769
770
771
      if (!isActive || (isActive && e.keyCode == 27)) {
        if (e.which == 27) $parent.find(toggle).trigger('focus')
        return $this.trigger('click')
      }
772

Chris Rebert's avatar
Chris Rebert committed
773
774
      var desc = ' li:not(.divider):visible a'
      var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
775

Chris Rebert's avatar
Chris Rebert committed
776
      if (!$items.length) return
777

Chris Rebert's avatar
Chris Rebert committed
778
      var index = $items.index($items.filter(':focus'))
779

Chris Rebert's avatar
Chris Rebert committed
780
781
782
      if (e.keyCode == 38 && index > 0)                 index--                        // up
      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
      if (!~index)                                      index = 0
783

Chris Rebert's avatar
Chris Rebert committed
784
785
      $items.eq(index).trigger('focus')
    }
786

Chris Rebert's avatar
Chris Rebert committed
787
788
789
790
791
792
793
794
795
796
797
798
    function clearMenus(e) {
      if (e && e.which === 3) return
      $(backdrop).remove()
      $(toggle).each(function () {
        var $parent = getParent($(this))
        var relatedTarget = { relatedTarget: this }
        if (!$parent.hasClass('open')) return
        $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
        if (e.isDefaultPrevented()) return
        $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
      })
    }
799

Chris Rebert's avatar
Chris Rebert committed
800
801
802
803
804
    function getParent($this) {
      var selector = $this.attr('data-target')

      if (!selector) {
        selector = $this.attr('href')
Mark Otto's avatar
Mark Otto committed
805
        selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
806
      }
807

Chris Rebert's avatar
Chris Rebert committed
808
      var $parent = selector && $(selector)
809

Chris Rebert's avatar
Chris Rebert committed
810
      return $parent && $parent.length ? $parent : $this.parent()
811
812
    }

813

Chris Rebert's avatar
Chris Rebert committed
814
815
    // DROPDOWN PLUGIN DEFINITION
    // ==========================
816

Chris Rebert's avatar
Chris Rebert committed
817
818
819
820
    function Plugin(option) {
      return this.each(function () {
        var $this = $(this)
        var data  = $this.data('bs.dropdown')
821

Chris Rebert's avatar
Chris Rebert committed
822
823
824
825
        if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
        if (typeof option == 'string') data[option].call($this)
      })
    }
826

Chris Rebert's avatar
Chris Rebert committed
827
    var old = $.fn.dropdown
828

Chris Rebert's avatar
Chris Rebert committed
829
830
    $.fn.dropdown             = Plugin
    $.fn.dropdown.Constructor = Dropdown
Mark Otto's avatar
Mark Otto committed
831

832

Chris Rebert's avatar
Chris Rebert committed
833
834
    // DROPDOWN NO CONFLICT
    // ====================
835

Chris Rebert's avatar
Chris Rebert committed
836
837
838
839
    $.fn.dropdown.noConflict = function () {
      $.fn.dropdown = old
      return this
    }
840
841


Chris Rebert's avatar
Chris Rebert committed
842
843
    // APPLY TO STANDARD DROPDOWN ELEMENTS
    // ===================================
844

Chris Rebert's avatar
Chris Rebert committed
845
846
847
848
849
    $(document)
      .on('click.bs.dropdown.data-api', clearMenus)
      .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
      .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
      .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
850

Chris Rebert's avatar
Chris Rebert committed
851
  })
852

Chris Rebert's avatar
Chris Rebert committed
853
}();
854

855
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
856
 * Bootstrap: modal.js v3.1.1
Mark Otto's avatar
Mark Otto committed
857
 * http://getbootstrap.com/javascript/#modals
858
 * ========================================================================
859
 * Copyright 2011-2014 Twitter, Inc.
860
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
861
 * ======================================================================== */
862
863


Chris Rebert's avatar
Chris Rebert committed
864
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
865

Chris Rebert's avatar
Chris Rebert committed
866
867
868
869
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
870

Chris Rebert's avatar
Chris Rebert committed
871
872
    // MODAL CLASS DEFINITION
    // ======================
873

Chris Rebert's avatar
Chris Rebert committed
874
875
876
877
878
879
880
    var Modal = function (element, options) {
      this.options        = options
      this.$body          = $(document.body)
      this.$element       = $(element)
      this.$backdrop      =
      this.isShown        = null
      this.scrollbarWidth = 0
881

Chris Rebert's avatar
Chris Rebert committed
882
883
884
885
886
887
888
      if (this.options.remote) {
        this.$element
          .find('.modal-content')
          .load(this.options.remote, $.proxy(function () {
            this.$element.trigger('loaded.bs.modal')
          }, this))
      }
889
    }
890

Chris Rebert's avatar
Chris Rebert committed
891
    Modal.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
892

Chris Rebert's avatar
Chris Rebert committed
893
894
895
896
897
    Modal.DEFAULTS = {
      backdrop: true,
      keyboard: true,
      show: true
    }
898

Chris Rebert's avatar
Chris Rebert committed
899
900
901
    Modal.prototype.toggle = function (_relatedTarget) {
      return this.isShown ? this.hide() : this.show(_relatedTarget)
    }
902

Chris Rebert's avatar
Chris Rebert committed
903
904
905
    Modal.prototype.show = function (_relatedTarget) {
      var that = this
      var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
906

Chris Rebert's avatar
Chris Rebert committed
907
      this.$element.trigger(e)
908

Chris Rebert's avatar
Chris Rebert committed
909
      if (this.isShown || e.isDefaultPrevented()) return
910

Chris Rebert's avatar
Chris Rebert committed
911
      this.isShown = true
912

Chris Rebert's avatar
Chris Rebert committed
913
914
      this.checkScrollbar()
      this.$body.addClass('modal-open')
fat's avatar
build    
fat committed
915

Chris Rebert's avatar
Chris Rebert committed
916
917
      this.setScrollbar()
      this.escape()
918

Chris Rebert's avatar
Chris Rebert committed
919
      this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
fat's avatar
rebuild    
fat committed
920

Chris Rebert's avatar
Chris Rebert committed
921
922
      this.backdrop(function () {
        var transition = $.support.transition && that.$element.hasClass('fade')
923

Chris Rebert's avatar
Chris Rebert committed
924
925
926
        if (!that.$element.parent().length) {
          that.$element.appendTo(that.$body) // don't move modals dom position
        }
927

Chris Rebert's avatar
Chris Rebert committed
928
929
930
        that.$element
          .show()
          .scrollTop(0)
931

Chris Rebert's avatar
Chris Rebert committed
932
933
934
        if (transition) {
          that.$element[0].offsetWidth // force reflow
        }
935

Chris Rebert's avatar
Chris Rebert committed
936
937
938
        that.$element
          .addClass('in')
          .attr('aria-hidden', false)
939

Chris Rebert's avatar
Chris Rebert committed
940
        that.enforceFocus()
Jacob Thornton's avatar
Jacob Thornton committed
941

Chris Rebert's avatar
Chris Rebert committed
942
        var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
943

Chris Rebert's avatar
Chris Rebert committed
944
945
946
947
948
949
950
951
952
        transition ?
          that.$element.find('.modal-dialog') // wait for modal to slide in
            .one('bsTransitionEnd', function () {
              that.$element.trigger('focus').trigger(e)
            })
            .emulateTransitionEnd(300) :
          that.$element.trigger('focus').trigger(e)
      })
    }
953

Chris Rebert's avatar
Chris Rebert committed
954
955
    Modal.prototype.hide = function (e) {
      if (e) e.preventDefault()
956

Chris Rebert's avatar
Chris Rebert committed
957
      e = $.Event('hide.bs.modal')
958

Chris Rebert's avatar
Chris Rebert committed
959
      this.$element.trigger(e)
960

Chris Rebert's avatar
Chris Rebert committed
961
      if (!this.isShown || e.isDefaultPrevented()) return
962

Chris Rebert's avatar
Chris Rebert committed
963
      this.isShown = false
fat's avatar
build    
fat committed
964

Chris Rebert's avatar
Chris Rebert committed
965
      this.$body.removeClass('modal-open')
966

Chris Rebert's avatar
Chris Rebert committed
967
968
      this.resetScrollbar()
      this.escape()
969

Chris Rebert's avatar
Chris Rebert committed
970
      $(document).off('focusin.bs.modal')
971

972
      this.$element
Chris Rebert's avatar
Chris Rebert committed
973
974
975
        .removeClass('in')
        .attr('aria-hidden', true)
        .off('click.dismiss.bs.modal')
976

Chris Rebert's avatar
Chris Rebert committed
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
      $.support.transition && this.$element.hasClass('fade') ?
        this.$element
          .one('bsTransitionEnd', $.proxy(this.hideModal, this))
          .emulateTransitionEnd(300) :
        this.hideModal()
    }

    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) {
        this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
          e.which == 27 && this.hide()
        }, this))
      } else if (!this.isShown) {
        this.$element.off('keyup.dismiss.bs.modal')
      }
    }
1003

Chris Rebert's avatar
Chris Rebert committed
1004
1005
1006
1007
1008
1009
1010
    Modal.prototype.hideModal = function () {
      var that = this
      this.$element.hide()
      this.backdrop(function () {
        that.$element.trigger('hidden.bs.modal')
      })
    }
1011

Chris Rebert's avatar
Chris Rebert committed
1012
1013
1014
1015
    Modal.prototype.removeBackdrop = function () {
      this.$backdrop && this.$backdrop.remove()
      this.$backdrop = null
    }
1016

Chris Rebert's avatar
Chris Rebert committed
1017
1018
1019
    Modal.prototype.backdrop = function (callback) {
      var that = this
      var animate = this.$element.hasClass('fade') ? 'fade' : ''
1020

Chris Rebert's avatar
Chris Rebert committed
1021
1022
      if (this.isShown && this.options.backdrop) {
        var doAnimate = $.support.transition && animate
1023

Chris Rebert's avatar
Chris Rebert committed
1024
1025
        this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
          .appendTo(this.$body)
1026

Chris Rebert's avatar
Chris Rebert committed
1027
1028
1029
1030
1031
1032
        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))
1033

Chris Rebert's avatar
Chris Rebert committed
1034
        if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1035

Chris Rebert's avatar
Chris Rebert committed
1036
        this.$backdrop.addClass('in')
1037

Chris Rebert's avatar
Chris Rebert committed
1038
        if (!callback) return
1039

Chris Rebert's avatar
Chris Rebert committed
1040
1041
1042
1043
1044
        doAnimate ?
          this.$backdrop
            .one('bsTransitionEnd', callback)
            .emulateTransitionEnd(150) :
          callback()
1045

Chris Rebert's avatar
Chris Rebert committed
1046
1047
      } else if (!this.isShown && this.$backdrop) {
        this.$backdrop.removeClass('in')
1048

Chris Rebert's avatar
Chris Rebert committed
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
        var callbackRemove = function () {
          that.removeBackdrop()
          callback && callback()
        }
        $.support.transition && this.$element.hasClass('fade') ?
          this.$backdrop
            .one('bsTransitionEnd', callbackRemove)
            .emulateTransitionEnd(150) :
          callbackRemove()

      } else if (callback) {
        callback()
      }
fat's avatar
fat committed
1062
    }
1063

Chris Rebert's avatar
Chris Rebert committed
1064
1065
1066
1067
    Modal.prototype.checkScrollbar = function () {
      if (document.body.clientWidth >= window.innerWidth) return
      this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
    }
1068

Chris Rebert's avatar
Chris Rebert committed
1069
1070
1071
1072
    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
1073

Chris Rebert's avatar
Chris Rebert committed
1074
1075
1076
    Modal.prototype.resetScrollbar = function () {
      this.$body.css('padding-right', '')
    }
fat's avatar
build    
fat committed
1077

Chris Rebert's avatar
Chris Rebert committed
1078
1079
1080
1081
1082
1083
1084
1085
    Modal.prototype.measureScrollbar = function () { // thx walsh
      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
    }
fat's avatar
build    
fat committed
1086

1087

Chris Rebert's avatar
Chris Rebert committed
1088
1089
    // MODAL PLUGIN DEFINITION
    // =======================
1090

Chris Rebert's avatar
Chris Rebert committed
1091
1092
1093
1094
1095
    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)
fat's avatar
fat committed
1096

Chris Rebert's avatar
Chris Rebert committed
1097
1098
1099
1100
1101
        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)
      })
    }
1102

Chris Rebert's avatar
Chris Rebert committed
1103
    var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1104

Chris Rebert's avatar
Chris Rebert committed
1105
1106
    $.fn.modal             = Plugin
    $.fn.modal.Constructor = Modal
1107
1108


Chris Rebert's avatar
Chris Rebert committed
1109
1110
    // MODAL NO CONFLICT
    // =================
1111

Chris Rebert's avatar
Chris Rebert committed
1112
1113
1114
1115
    $.fn.modal.noConflict = function () {
      $.fn.modal = old
      return this
    }
1116
1117


Chris Rebert's avatar
Chris Rebert committed
1118
1119
    // MODAL DATA-API
    // ==============
1120

Chris Rebert's avatar
Chris Rebert committed
1121
1122
1123
    $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
      var $this   = $(this)
      var href    = $this.attr('href')
Mark Otto's avatar
Mark Otto committed
1124
      var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
1125
      var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1126

Chris Rebert's avatar
Chris Rebert committed
1127
      if ($this.is('a')) e.preventDefault()
1128

Chris Rebert's avatar
Chris Rebert committed
1129
      $target.one('show.bs.modal', function (showEvent) {
Mark Otto's avatar
Mark Otto committed
1130
        if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
Chris Rebert's avatar
Chris Rebert committed
1131
1132
1133
        $target.one('hidden.bs.modal', function () {
          $this.is(':visible') && $this.trigger('focus')
        })
Mark Otto's avatar
grunt    
Mark Otto committed
1134
      })
Chris Rebert's avatar
Chris Rebert committed
1135
      Plugin.call($target, option, this)
Mark Otto's avatar
Mark Otto committed
1136
    })
Chris Rebert's avatar
Chris Rebert committed
1137

Jacob Thornton's avatar
Jacob Thornton committed
1138
  })
1139

Chris Rebert's avatar
Chris Rebert committed
1140
}();
1141

1142
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1143
 * Bootstrap: tooltip.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1144
 * http://getbootstrap.com/javascript/#tooltip
1145
 * Inspired by the original jQuery.tipsy by Jason Frame
1146
 * ========================================================================
1147
 * Copyright 2011-2014 Twitter, Inc.
1148
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1149
 * ======================================================================== */
1150
1151


Chris Rebert's avatar
Chris Rebert committed
1152
1153
1154
1155
1156
1157
+function () { 'use strict';

  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1158

Chris Rebert's avatar
Chris Rebert committed
1159
1160
    // TOOLTIP PUBLIC CLASS DEFINITION
    // ===============================
1161

Chris Rebert's avatar
Chris Rebert committed
1162
1163
1164
1165
1166
1167
1168
    var Tooltip = function (element, options) {
      this.type       =
      this.options    =
      this.enabled    =
      this.timeout    =
      this.hoverState =
      this.$element   = null
1169

Chris Rebert's avatar
Chris Rebert committed
1170
1171
      this.init('tooltip', element, options)
    }
1172

Chris Rebert's avatar
Chris Rebert committed
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
    Tooltip.VERSION  = '3.1.1'

    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
1188
1189
      }
    }
1190

Chris Rebert's avatar
Chris Rebert committed
1191
1192
1193
1194
1195
1196
    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)
Jacob Thornton's avatar
Jacob Thornton committed
1197

Chris Rebert's avatar
Chris Rebert committed
1198
      var triggers = this.options.trigger.split(' ')
1199

Chris Rebert's avatar
Chris Rebert committed
1200
1201
1202
1203
1204
1205
1206
1207
      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'
fat's avatar
rebuild    
fat committed
1208

Chris Rebert's avatar
Chris Rebert committed
1209
1210
1211
1212
          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))
        }
      }
Jacob Thornton's avatar
Jacob Thornton committed
1213

Chris Rebert's avatar
Chris Rebert committed
1214
1215
1216
1217
      this.options.selector ?
        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
        this.fixTitle()
    }
Mark Otto's avatar
Mark Otto committed
1218

Chris Rebert's avatar
Chris Rebert committed
1219
1220
    Tooltip.prototype.getDefaults = function () {
      return Tooltip.DEFAULTS
Mark Otto's avatar
Mark Otto committed
1221
    }
1222

Chris Rebert's avatar
Chris Rebert committed
1223
1224
    Tooltip.prototype.getOptions = function (options) {
      options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1225

Chris Rebert's avatar
Chris Rebert committed
1226
1227
1228
1229
1230
1231
      if (options.delay && typeof options.delay == 'number') {
        options.delay = {
          show: options.delay,
          hide: options.delay
        }
      }
1232

Chris Rebert's avatar
Chris Rebert committed
1233
1234
      return options
    }
1235

Chris Rebert's avatar
Chris Rebert committed
1236
1237
1238
    Tooltip.prototype.getDelegateOptions = function () {
      var options  = {}
      var defaults = this.getDefaults()
1239

Chris Rebert's avatar
Chris Rebert committed
1240
1241
1242
      this._options && $.each(this._options, function (key, value) {
        if (defaults[key] != value) options[key] = value
      })
Mark Otto's avatar
Mark Otto committed
1243

Chris Rebert's avatar
Chris Rebert committed
1244
      return options
Mark Otto's avatar
Mark Otto committed
1245
    }
1246

Chris Rebert's avatar
Chris Rebert committed
1247
1248
1249
    Tooltip.prototype.enter = function (obj) {
      var self = obj instanceof this.constructor ?
        obj : $(obj.currentTarget).data('bs.' + this.type)
fat's avatar
fat committed
1250

Chris Rebert's avatar
Chris Rebert committed
1251
1252
1253
1254
      if (!self) {
        self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        $(obj.currentTarget).data('bs.' + this.type, self)
      }
1255

Chris Rebert's avatar
Chris Rebert committed
1256
      clearTimeout(self.timeout)
1257

Chris Rebert's avatar
Chris Rebert committed
1258
      self.hoverState = 'in'
1259

Chris Rebert's avatar
Chris Rebert committed
1260
      if (!self.options.delay || !self.options.delay.show) return self.show()
1261

Chris Rebert's avatar
Chris Rebert committed
1262
1263
1264
1265
      self.timeout = setTimeout(function () {
        if (self.hoverState == 'in') self.show()
      }, self.options.delay.show)
    }
1266

Chris Rebert's avatar
Chris Rebert committed
1267
1268
1269
    Tooltip.prototype.leave = function (obj) {
      var self = obj instanceof this.constructor ?
        obj : $(obj.currentTarget).data('bs.' + this.type)
1270

Chris Rebert's avatar
Chris Rebert committed
1271
1272
1273
1274
1275
1276
      if (!self) {
        self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
        $(obj.currentTarget).data('bs.' + this.type, self)
      }

      clearTimeout(self.timeout)
fat's avatar
fat committed
1277

Chris Rebert's avatar
Chris Rebert committed
1278
      self.hoverState = 'out'
1279

Chris Rebert's avatar
Chris Rebert committed
1280
      if (!self.options.delay || !self.options.delay.hide) return self.hide()
fat's avatar
fat committed
1281

Chris Rebert's avatar
Chris Rebert committed
1282
1283
1284
1285
      self.timeout = setTimeout(function () {
        if (self.hoverState == 'out') self.hide()
      }, self.options.delay.hide)
    }
fat's avatar
fat committed
1286

Chris Rebert's avatar
Chris Rebert committed
1287
1288
    Tooltip.prototype.show = function () {
      var e = $.Event('show.bs.' + this.type)
1289

Chris Rebert's avatar
Chris Rebert committed
1290
1291
      if (this.hasContent() && this.enabled) {
        this.$element.trigger(e)
1292

Chris Rebert's avatar
Chris Rebert committed
1293
1294
1295
        var inDom = $.contains(document.documentElement, this.$element[0])
        if (e.isDefaultPrevented() || !inDom) return
        var that = this
1296

Chris Rebert's avatar
Chris Rebert committed
1297
        var $tip = this.tip()
1298

Chris Rebert's avatar
Chris Rebert committed
1299
        var tipId = this.getUID(this.type)
fat's avatar
fat committed
1300

Chris Rebert's avatar
Chris Rebert committed
1301
1302
1303
        this.setContent()
        $tip.attr('id', tipId)
        this.$element.attr('aria-describedby', tipId)
1304

Chris Rebert's avatar
Chris Rebert committed
1305
1306
1307
1308
1309
1310
1311
1312
1313
        if (this.options.animation) $tip.addClass('fade')

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

        var autoToken = /\s?auto?\s?/i
        var autoPlace = autoToken.test(placement)
        if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
fat's avatar
fat committed
1314

1315
        $tip
Chris Rebert's avatar
Chris Rebert committed
1316
1317
          .detach()
          .css({ top: 0, left: 0, display: 'block' })
1318
          .addClass(placement)
Chris Rebert's avatar
Chris Rebert committed
1319
          .data('bs.' + this.type, this)
1320

Chris Rebert's avatar
Chris Rebert committed
1321
        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1322

Chris Rebert's avatar
Chris Rebert committed
1323
1324
1325
        var pos          = this.getPosition()
        var actualWidth  = $tip[0].offsetWidth
        var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1326

Chris Rebert's avatar
Chris Rebert committed
1327
1328
1329
1330
        if (autoPlace) {
          var orgPlacement = placement
          var $parent      = this.$element.parent()
          var parentDim    = this.getPosition($parent)
fat's avatar
fat committed
1331

Chris Rebert's avatar
Chris Rebert committed
1332
1333
1334
1335
1336
          placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :
                      placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :
                      placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :
                      placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :
                      placement
fat's avatar
fat committed
1337

Chris Rebert's avatar
Chris Rebert committed
1338
1339
1340
1341
          $tip
            .removeClass(orgPlacement)
            .addClass(placement)
        }
fat's avatar
fat committed
1342

Chris Rebert's avatar
Chris Rebert committed
1343
        var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
fat's avatar
fat committed
1344

Chris Rebert's avatar
Chris Rebert committed
1345
        this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1346

Chris Rebert's avatar
Chris Rebert committed
1347
1348
1349
1350
        var complete = function () {
          that.$element.trigger('shown.bs.' + that.type)
          that.hoverState = null
        }
fat's avatar
fat committed
1351

Chris Rebert's avatar
Chris Rebert committed
1352
1353
1354
1355
1356
        $.support.transition && this.$tip.hasClass('fade') ?
          $tip
            .one('bsTransitionEnd', complete)
            .emulateTransitionEnd(150) :
          complete()
1357
      }
Chris Rebert's avatar
Chris Rebert committed
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
    }

    Tooltip.prototype.applyPlacement = function (offset, placement) {
      var $tip   = this.tip()
      var width  = $tip[0].offsetWidth
      var height = $tip[0].offsetHeight

      // manually read margins because getBoundingClientRect includes difference
      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

      // $.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)
          })
        }
      }, offset), 0)
1386

Chris Rebert's avatar
Chris Rebert committed
1387
      $tip.addClass('in')
fat's avatar
fat committed
1388

Chris Rebert's avatar
Chris Rebert committed
1389
1390
1391
      // 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
1392

Chris Rebert's avatar
Chris Rebert committed
1393
1394
1395
      if (placement == 'top' && actualHeight != height) {
        offset.top = offset.top + height - actualHeight
      }
fat's avatar
fat committed
1396

Chris Rebert's avatar
Chris Rebert committed
1397
      var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
fat's avatar
fat committed
1398

Chris Rebert's avatar
Chris Rebert committed
1399
1400
      if (delta.left) offset.left += delta.left
      else offset.top += delta.top
1401

Chris Rebert's avatar
Chris Rebert committed
1402
1403
1404
      var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
      var arrowPosition       = delta.left ? 'left'        : 'top'
      var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
1405

Chris Rebert's avatar
Chris Rebert committed
1406
1407
1408
      $tip.offset(offset)
      this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
    }
1409

Chris Rebert's avatar
Chris Rebert committed
1410
1411
1412
    Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
      this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
    }
1413

Chris Rebert's avatar
Chris Rebert committed
1414
1415
1416
    Tooltip.prototype.setContent = function () {
      var $tip  = this.tip()
      var title = this.getTitle()
1417

Chris Rebert's avatar
Chris Rebert committed
1418
1419
1420
      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
      $tip.removeClass('fade in top bottom left right')
    }
1421

Chris Rebert's avatar
Chris Rebert committed
1422
1423
1424
1425
    Tooltip.prototype.hide = function () {
      var that = this
      var $tip = this.tip()
      var e    = $.Event('hide.bs.' + this.type)
1426

Chris Rebert's avatar
Chris Rebert committed
1427
      this.$element.removeAttr('aria-describedby')
1428

Chris Rebert's avatar
Chris Rebert committed
1429
1430
1431
1432
      function complete() {
        if (that.hoverState != 'in') $tip.detach()
        that.$element.trigger('hidden.bs.' + that.type)
      }
Jacob Thornton's avatar
Jacob Thornton committed
1433

Chris Rebert's avatar
Chris Rebert committed
1434
      this.$element.trigger(e)
1435

Chris Rebert's avatar
Chris Rebert committed
1436
      if (e.isDefaultPrevented()) return
1437

Chris Rebert's avatar
Chris Rebert committed
1438
      $tip.removeClass('in')
1439

Chris Rebert's avatar
Chris Rebert committed
1440
1441
1442
1443
1444
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
          .emulateTransitionEnd(150) :
        complete()
1445

Chris Rebert's avatar
Chris Rebert committed
1446
      this.hoverState = null
1447

Chris Rebert's avatar
Chris Rebert committed
1448
1449
      return this
    }
1450

Chris Rebert's avatar
Chris Rebert committed
1451
1452
1453
1454
1455
    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', '')
      }
1456
    }
1457

Chris Rebert's avatar
Chris Rebert committed
1458
1459
1460
    Tooltip.prototype.hasContent = function () {
      return this.getTitle()
    }
1461

Chris Rebert's avatar
Chris Rebert committed
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
    Tooltip.prototype.getPosition = function ($element) {
      $element   = $element || this.$element
      var el     = $element[0]
      var isBody = el.tagName == 'BODY'
      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
        scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
        width:  isBody ? $(window).width()  : $element.outerWidth(),
        height: isBody ? $(window).height() : $element.outerHeight()
      }, isBody ? { top: 0, left: 0 } : $element.offset())
    }
1472

Chris Rebert's avatar
Chris Rebert committed
1473
1474
1475
1476
1477
    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   }
1478

Chris Rebert's avatar
Chris Rebert committed
1479
    }
1480

Chris Rebert's avatar
Chris Rebert committed
1481
1482
1483
    Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
      var delta = { top: 0, left: 0 }
      if (!this.$viewport) return delta
1484

Chris Rebert's avatar
Chris Rebert committed
1485
1486
      var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
      var viewportDimensions = this.getPosition(this.$viewport)
1487

Chris Rebert's avatar
Chris Rebert committed
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
      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
        }
1504
1505
      }

Chris Rebert's avatar
Chris Rebert committed
1506
1507
      return delta
    }
fat's avatar
fat committed
1508

Chris Rebert's avatar
Chris Rebert committed
1509
1510
1511
1512
    Tooltip.prototype.getTitle = function () {
      var title
      var $e = this.$element
      var o  = this.options
1513

Chris Rebert's avatar
Chris Rebert committed
1514
1515
      title = $e.attr('data-original-title')
        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1516

Chris Rebert's avatar
Chris Rebert committed
1517
1518
      return title
    }
1519

Chris Rebert's avatar
Chris Rebert committed
1520
1521
1522
1523
1524
    Tooltip.prototype.getUID = function (prefix) {
      do prefix += ~~(Math.random() * 1000000)
      while (document.getElementById(prefix))
      return prefix
    }
1525

Chris Rebert's avatar
Chris Rebert committed
1526
1527
1528
    Tooltip.prototype.tip = function () {
      return (this.$tip = this.$tip || $(this.options.template))
    }
1529

Chris Rebert's avatar
Chris Rebert committed
1530
1531
1532
    Tooltip.prototype.arrow = function () {
      return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
    }
1533

Chris Rebert's avatar
Chris Rebert committed
1534
1535
1536
1537
1538
1539
    Tooltip.prototype.validate = function () {
      if (!this.$element[0].parentNode) {
        this.hide()
        this.$element = null
        this.options  = null
      }
1540
    }
1541

Chris Rebert's avatar
Chris Rebert committed
1542
1543
1544
    Tooltip.prototype.enable = function () {
      this.enabled = true
    }
1545

Chris Rebert's avatar
Chris Rebert committed
1546
1547
1548
    Tooltip.prototype.disable = function () {
      this.enabled = false
    }
1549

Chris Rebert's avatar
Chris Rebert committed
1550
1551
1552
    Tooltip.prototype.toggleEnabled = function () {
      this.enabled = !this.enabled
    }
Mark Otto's avatar
Mark Otto committed
1553

Chris Rebert's avatar
Chris Rebert committed
1554
1555
1556
1557
1558
1559
1560
1561
    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
1562
      }
Chris Rebert's avatar
Chris Rebert committed
1563
1564

      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
Mark Otto's avatar
Mark Otto committed
1565
1566
    }

Chris Rebert's avatar
Chris Rebert committed
1567
1568
1569
1570
    Tooltip.prototype.destroy = function () {
      clearTimeout(this.timeout)
      this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
    }
1571

1572

Chris Rebert's avatar
Chris Rebert committed
1573
1574
    // TOOLTIP PLUGIN DEFINITION
    // =========================
1575

Chris Rebert's avatar
Chris Rebert committed
1576
1577
1578
1579
1580
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.tooltip')
        var options = typeof option == 'object' && option
1581

Chris Rebert's avatar
Chris Rebert committed
1582
1583
1584
1585
1586
        if (!data && option == 'destroy') return
        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
fat's avatar
fat committed
1587

Chris Rebert's avatar
Chris Rebert committed
1588
    var old = $.fn.tooltip
1589

Chris Rebert's avatar
Chris Rebert committed
1590
1591
    $.fn.tooltip             = Plugin
    $.fn.tooltip.Constructor = Tooltip
Mark Otto's avatar
Mark Otto committed
1592

1593

Chris Rebert's avatar
Chris Rebert committed
1594
1595
    // TOOLTIP NO CONFLICT
    // ===================
1596

Chris Rebert's avatar
Chris Rebert committed
1597
1598
1599
1600
    $.fn.tooltip.noConflict = function () {
      $.fn.tooltip = old
      return this
    }
1601

Chris Rebert's avatar
Chris Rebert committed
1602
  })
1603

Chris Rebert's avatar
Chris Rebert committed
1604
}();
1605

1606
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1607
 * Bootstrap: popover.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1608
 * http://getbootstrap.com/javascript/#popovers
1609
 * ========================================================================
1610
 * Copyright 2011-2014 Twitter, Inc.
1611
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1612
 * ======================================================================== */
1613
1614


Chris Rebert's avatar
Chris Rebert committed
1615
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1616

Chris Rebert's avatar
Chris Rebert committed
1617
1618
1619
1620
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1621

Chris Rebert's avatar
Chris Rebert committed
1622
1623
    // POPOVER PUBLIC CLASS DEFINITION
    // ===============================
fat's avatar
fat committed
1624

Chris Rebert's avatar
Chris Rebert committed
1625
1626
1627
    var Popover = function (element, options) {
      this.init('popover', element, options)
    }
1628

Chris Rebert's avatar
Chris Rebert committed
1629
    if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
fat's avatar
fat committed
1630

Chris Rebert's avatar
Chris Rebert committed
1631
    Popover.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1632

Chris Rebert's avatar
Chris Rebert committed
1633
1634
1635
1636
1637
1638
    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>'
    })
1639

fat's avatar
fat committed
1640

Chris Rebert's avatar
Chris Rebert committed
1641
1642
    // NOTE: POPOVER EXTENDS tooltip.js
    // ================================
fat's avatar
fat committed
1643

Chris Rebert's avatar
Chris Rebert committed
1644
    Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1645

Chris Rebert's avatar
Chris Rebert committed
1646
    Popover.prototype.constructor = Popover
fat's avatar
fat committed
1647

Chris Rebert's avatar
Chris Rebert committed
1648
1649
1650
    Popover.prototype.getDefaults = function () {
      return Popover.DEFAULTS
    }
1651

Chris Rebert's avatar
Chris Rebert committed
1652
1653
1654
1655
    Popover.prototype.setContent = function () {
      var $tip    = this.tip()
      var title   = this.getTitle()
      var content = this.getContent()
1656

Chris Rebert's avatar
Chris Rebert committed
1657
1658
1659
1660
      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
      $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
        this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
      ](content)
1661

Chris Rebert's avatar
Chris Rebert committed
1662
      $tip.removeClass('fade top bottom left right in')
1663

Chris Rebert's avatar
Chris Rebert committed
1664
1665
1666
1667
      // 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()
    }
1668

Chris Rebert's avatar
Chris Rebert committed
1669
1670
1671
    Popover.prototype.hasContent = function () {
      return this.getTitle() || this.getContent()
    }
1672

Chris Rebert's avatar
Chris Rebert committed
1673
1674
1675
    Popover.prototype.getContent = function () {
      var $e = this.$element
      var o  = this.options
1676

Chris Rebert's avatar
Chris Rebert committed
1677
1678
1679
1680
1681
      return $e.attr('data-content')
        || (typeof o.content == 'function' ?
              o.content.call($e[0]) :
              o.content)
    }
1682

Chris Rebert's avatar
Chris Rebert committed
1683
1684
1685
    Popover.prototype.arrow = function () {
      return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
    }
fat's avatar
fat committed
1686

Chris Rebert's avatar
Chris Rebert committed
1687
1688
1689
1690
    Popover.prototype.tip = function () {
      if (!this.$tip) this.$tip = $(this.options.template)
      return this.$tip
    }
1691

1692

Chris Rebert's avatar
Chris Rebert committed
1693
1694
    // POPOVER PLUGIN DEFINITION
    // =========================
1695

Chris Rebert's avatar
Chris Rebert committed
1696
1697
1698
1699
1700
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.popover')
        var options = typeof option == 'object' && option
1701

Chris Rebert's avatar
Chris Rebert committed
1702
1703
1704
1705
1706
1707
1708
        if (!data && option == 'destroy') return
        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }

    var old = $.fn.popover
1709

Chris Rebert's avatar
Chris Rebert committed
1710
1711
    $.fn.popover             = Plugin
    $.fn.popover.Constructor = Popover
Mark Otto's avatar
Mark Otto committed
1712

fat's avatar
fat committed
1713

Chris Rebert's avatar
Chris Rebert committed
1714
1715
    // POPOVER NO CONFLICT
    // ===================
1716

Chris Rebert's avatar
Chris Rebert committed
1717
1718
1719
1720
    $.fn.popover.noConflict = function () {
      $.fn.popover = old
      return this
    }
1721

Chris Rebert's avatar
Chris Rebert committed
1722
  })
1723

Chris Rebert's avatar
Chris Rebert committed
1724
}();
1725

1726
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1727
 * Bootstrap: scrollspy.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1728
 * http://getbootstrap.com/javascript/#scrollspy
1729
 * ========================================================================
1730
 * Copyright 2011-2014 Twitter, Inc.
1731
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1732
 * ======================================================================== */
1733
1734


Chris Rebert's avatar
Chris Rebert committed
1735
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1736

Chris Rebert's avatar
Chris Rebert committed
1737
1738
1739
1740
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1741

Chris Rebert's avatar
Chris Rebert committed
1742
1743
    // SCROLLSPY CLASS DEFINITION
    // ==========================
1744

Chris Rebert's avatar
Chris Rebert committed
1745
1746
    function ScrollSpy(element, options) {
      var process  = $.proxy(this.process, this)
1747

Chris Rebert's avatar
Chris Rebert committed
1748
1749
1750
1751
1752
1753
1754
1755
      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
1756

Chris Rebert's avatar
Chris Rebert committed
1757
1758
1759
1760
      this.$scrollElement.on('scroll.bs.scrollspy', process)
      this.refresh()
      this.process()
    }
1761

Chris Rebert's avatar
Chris Rebert committed
1762
    ScrollSpy.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1763

Chris Rebert's avatar
Chris Rebert committed
1764
1765
1766
    ScrollSpy.DEFAULTS = {
      offset: 10
    }
1767

Chris Rebert's avatar
Chris Rebert committed
1768
1769
1770
    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
1771

Chris Rebert's avatar
Chris Rebert committed
1772
1773
1774
    ScrollSpy.prototype.refresh = function () {
      var offsetMethod = 'offset'
      var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1775

Chris Rebert's avatar
Chris Rebert committed
1776
1777
1778
1779
      if (!$.isWindow(this.$scrollElement[0])) {
        offsetMethod = 'position'
        offsetBase   = this.$scrollElement.scrollTop()
      }
Mark Otto's avatar
grunt    
Mark Otto committed
1780

Chris Rebert's avatar
Chris Rebert committed
1781
1782
1783
      this.offsets = []
      this.targets = []
      this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1784

Chris Rebert's avatar
Chris Rebert committed
1785
      var self     = this
XhmikosR's avatar
XhmikosR committed
1786

Chris Rebert's avatar
Chris Rebert committed
1787
1788
1789
1790
1791
1792
      this.$body
        .find(this.selector)
        .map(function () {
          var $el   = $(this)
          var href  = $el.data('target') || $el.attr('href')
          var $href = /^#./.test(href) && $(href)
1793

Chris Rebert's avatar
Chris Rebert committed
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
          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])
        })
Mark Otto's avatar
grunt    
Mark Otto committed
1804
1805
    }

Chris Rebert's avatar
Chris Rebert committed
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
    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()
      }
1818

Chris Rebert's avatar
Chris Rebert committed
1819
1820
1821
      if (scrollTop >= maxScroll) {
        return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
      }
1822

Chris Rebert's avatar
Chris Rebert committed
1823
1824
1825
      if (activeTarget && scrollTop <= offsets[0]) {
        return activeTarget != (i = targets[0]) && this.activate(i)
      }
1826

Chris Rebert's avatar
Chris Rebert committed
1827
1828
1829
1830
1831
1832
1833
      for (i = offsets.length; i--;) {
        activeTarget != targets[i]
          && scrollTop >= offsets[i]
          && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
          && this.activate(targets[i])
      }
    }
1834

Chris Rebert's avatar
Chris Rebert committed
1835
1836
    ScrollSpy.prototype.activate = function (target) {
      this.activeTarget = target
1837

Chris Rebert's avatar
Chris Rebert committed
1838
1839
1840
      $(this.selector)
        .parentsUntil(this.options.target, '.active')
        .removeClass('active')
1841

Chris Rebert's avatar
Chris Rebert committed
1842
1843
1844
      var selector = this.selector +
          '[data-target="' + target + '"],' +
          this.selector + '[href="' + target + '"]'
1845

Chris Rebert's avatar
Chris Rebert committed
1846
1847
      var active = $(selector)
        .parents('li')
1848
        .addClass('active')
1849

Chris Rebert's avatar
Chris Rebert committed
1850
1851
1852
1853
1854
      if (active.parent('.dropdown-menu').length) {
        active = active
          .closest('li.dropdown')
          .addClass('active')
      }
1855

Chris Rebert's avatar
Chris Rebert committed
1856
1857
      active.trigger('activate.bs.scrollspy')
    }
1858

1859

Chris Rebert's avatar
Chris Rebert committed
1860
1861
    // SCROLLSPY PLUGIN DEFINITION
    // ===========================
1862

Chris Rebert's avatar
Chris Rebert committed
1863
1864
1865
1866
1867
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.scrollspy')
        var options = typeof option == 'object' && option
1868

Chris Rebert's avatar
Chris Rebert committed
1869
1870
1871
1872
        if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
Mark Otto's avatar
Mark Otto committed
1873

Chris Rebert's avatar
Chris Rebert committed
1874
    var old = $.fn.scrollspy
1875

Chris Rebert's avatar
Chris Rebert committed
1876
1877
    $.fn.scrollspy             = Plugin
    $.fn.scrollspy.Constructor = ScrollSpy
1878

1879

Chris Rebert's avatar
Chris Rebert committed
1880
1881
    // SCROLLSPY NO CONFLICT
    // =====================
1882

Chris Rebert's avatar
Chris Rebert committed
1883
1884
1885
1886
    $.fn.scrollspy.noConflict = function () {
      $.fn.scrollspy = old
      return this
    }
1887
1888


Chris Rebert's avatar
Chris Rebert committed
1889
1890
1891
1892
1893
1894
1895
1896
    // SCROLLSPY DATA-API
    // ==================

    $(window).on('load.bs.scrollspy.data-api', function () {
      $('[data-spy="scroll"]').each(function () {
        var $spy = $(this)
        Plugin.call($spy, $spy.data())
      })
1897
    })
Chris Rebert's avatar
Chris Rebert committed
1898

1899
  })
1900

Chris Rebert's avatar
Chris Rebert committed
1901
}();
1902

1903
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1904
 * Bootstrap: tab.js v3.1.1
Mark Otto's avatar
Mark Otto committed
1905
 * http://getbootstrap.com/javascript/#tabs
1906
 * ========================================================================
1907
 * Copyright 2011-2014 Twitter, Inc.
1908
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1909
 * ======================================================================== */
1910

1911

Chris Rebert's avatar
Chris Rebert committed
1912
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1913

Chris Rebert's avatar
Chris Rebert committed
1914
1915
1916
1917
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
1918

Chris Rebert's avatar
Chris Rebert committed
1919
1920
    // TAB CLASS DEFINITION
    // ====================
1921

Chris Rebert's avatar
Chris Rebert committed
1922
1923
1924
    var Tab = function (element) {
      this.element = $(element)
    }
1925

Chris Rebert's avatar
Chris Rebert committed
1926
    Tab.VERSION = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1927

Chris Rebert's avatar
Chris Rebert committed
1928
1929
1930
1931
    Tab.prototype.show = function () {
      var $this    = this.element
      var $ul      = $this.closest('ul:not(.dropdown-menu)')
      var selector = $this.data('target')
1932

Chris Rebert's avatar
Chris Rebert committed
1933
1934
      if (!selector) {
        selector = $this.attr('href')
Mark Otto's avatar
Mark Otto committed
1935
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
Chris Rebert's avatar
Chris Rebert committed
1936
      }
1937

Chris Rebert's avatar
Chris Rebert committed
1938
      if ($this.parent('li').hasClass('active')) return
1939

Chris Rebert's avatar
Chris Rebert committed
1940
1941
1942
1943
      var previous = $ul.find('.active:last a')[0]
      var e        = $.Event('show.bs.tab', {
        relatedTarget: previous
      })
1944

Chris Rebert's avatar
Chris Rebert committed
1945
      $this.trigger(e)
1946

Chris Rebert's avatar
Chris Rebert committed
1947
      if (e.isDefaultPrevented()) return
1948

Chris Rebert's avatar
Chris Rebert committed
1949
      var $target = $(selector)
1950

Chris Rebert's avatar
Chris Rebert committed
1951
1952
1953
1954
1955
1956
      this.activate($this.closest('li'), $ul)
      this.activate($target, $target.parent(), function () {
        $this.trigger({
          type: 'shown.bs.tab',
          relatedTarget: previous
        })
1957
      })
Chris Rebert's avatar
Chris Rebert committed
1958
    }
1959

Chris Rebert's avatar
Chris Rebert committed
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
    Tab.prototype.activate = function (element, container, callback) {
      var $active    = container.find('> .active')
      var transition = callback
        && $.support.transition
        && $active.hasClass('fade')

      function next() {
        $active
          .removeClass('active')
          .find('> .dropdown-menu > .active')
          .removeClass('active')

        element.addClass('active')

        if (transition) {
          element[0].offsetWidth // reflow for transition
          element.addClass('in')
        } else {
          element.removeClass('fade')
        }
1980

Chris Rebert's avatar
Chris Rebert committed
1981
1982
1983
        if (element.parent('.dropdown-menu')) {
          element.closest('li.dropdown').addClass('active')
        }
1984

Chris Rebert's avatar
Chris Rebert committed
1985
        callback && callback()
1986
      }
1987

Chris Rebert's avatar
Chris Rebert committed
1988
1989
1990
1991
1992
      transition ?
        $active
          .one('bsTransitionEnd', next)
          .emulateTransitionEnd(150) :
        next()
fat's avatar
fat committed
1993

Chris Rebert's avatar
Chris Rebert committed
1994
      $active.removeClass('in')
1995
    }
fat's avatar
fat committed
1996

1997

Chris Rebert's avatar
Chris Rebert committed
1998
1999
    // TAB PLUGIN DEFINITION
    // =====================
2000

Chris Rebert's avatar
Chris Rebert committed
2001
2002
2003
2004
    function Plugin(option) {
      return this.each(function () {
        var $this = $(this)
        var data  = $this.data('bs.tab')
2005

Chris Rebert's avatar
Chris Rebert committed
2006
2007
2008
2009
        if (!data) $this.data('bs.tab', (data = new Tab(this)))
        if (typeof option == 'string') data[option]()
      })
    }
fat's avatar
fat committed
2010

Chris Rebert's avatar
Chris Rebert committed
2011
    var old = $.fn.tab
2012

Chris Rebert's avatar
Chris Rebert committed
2013
2014
    $.fn.tab             = Plugin
    $.fn.tab.Constructor = Tab
Mark Otto's avatar
Mark Otto committed
2015

2016

Chris Rebert's avatar
Chris Rebert committed
2017
2018
    // TAB NO CONFLICT
    // ===============
2019

Chris Rebert's avatar
Chris Rebert committed
2020
2021
2022
2023
    $.fn.tab.noConflict = function () {
      $.fn.tab = old
      return this
    }
2024
2025


Chris Rebert's avatar
Chris Rebert committed
2026
2027
    // TAB DATA-API
    // ============
2028

Chris Rebert's avatar
Chris Rebert committed
2029
2030
2031
2032
    $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
      e.preventDefault()
      Plugin.call($(this), 'show')
    })
2033
2034
2035

  })

Chris Rebert's avatar
Chris Rebert committed
2036
}();
2037

2038
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2039
 * Bootstrap: affix.js v3.1.1
Mark Otto's avatar
Mark Otto committed
2040
 * http://getbootstrap.com/javascript/#affix
2041
 * ========================================================================
2042
 * Copyright 2011-2014 Twitter, Inc.
2043
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2044
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2045
2046


Chris Rebert's avatar
Chris Rebert committed
2047
+function () { 'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2048

Chris Rebert's avatar
Chris Rebert committed
2049
2050
2051
2052
  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {
Mark Otto's avatar
Mark Otto committed
2053

Chris Rebert's avatar
Chris Rebert committed
2054
2055
    // AFFIX CLASS DEFINITION
    // ======================
Mark Otto's avatar
Mark Otto committed
2056

Chris Rebert's avatar
Chris Rebert committed
2057
2058
    var Affix = function (element, options) {
      this.options = $.extend({}, Affix.DEFAULTS, options)
Chris Rebert's avatar
Chris Rebert committed
2059

Chris Rebert's avatar
Chris Rebert committed
2060
2061
2062
      this.$target = $(this.options.target)
        .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
2063

Chris Rebert's avatar
Chris Rebert committed
2064
2065
2066
2067
      this.$element     = $(element)
      this.affixed      =
      this.unpin        =
      this.pinnedOffset = null
fat's avatar
fat committed
2068

Chris Rebert's avatar
Chris Rebert committed
2069
2070
      this.checkPosition()
    }
2071

Chris Rebert's avatar
Chris Rebert committed
2072
    Affix.VERSION  = '3.1.1'
Mark Otto's avatar
grunt    
Mark Otto committed
2073

Chris Rebert's avatar
Chris Rebert committed
2074
    Affix.RESET    = 'affix affix-top affix-bottom'
2075

Chris Rebert's avatar
Chris Rebert committed
2076
2077
2078
2079
    Affix.DEFAULTS = {
      offset: 0,
      target: window
    }
2080

Chris Rebert's avatar
Chris Rebert committed
2081
2082
2083
2084
2085
2086
2087
    Affix.prototype.getPinnedOffset = function () {
      if (this.pinnedOffset) return this.pinnedOffset
      this.$element.removeClass(Affix.RESET).addClass('affix')
      var scrollTop = this.$target.scrollTop()
      var position  = this.$element.offset()
      return (this.pinnedOffset = position.top - scrollTop)
    }
fat's avatar
fat committed
2088

Chris Rebert's avatar
Chris Rebert committed
2089
2090
2091
    Affix.prototype.checkPositionWithEventLoop = function () {
      setTimeout($.proxy(this.checkPosition, this), 1)
    }
2092

Chris Rebert's avatar
Chris Rebert committed
2093
2094
    Affix.prototype.checkPosition = function () {
      if (!this.$element.is(':visible')) return
2095

Chris Rebert's avatar
Chris Rebert committed
2096
2097
2098
2099
2100
2101
      var scrollHeight = $(document).height()
      var scrollTop    = this.$target.scrollTop()
      var position     = this.$element.offset()
      var offset       = this.options.offset
      var offsetTop    = offset.top
      var offsetBottom = offset.bottom
2102

Chris Rebert's avatar
Chris Rebert committed
2103
2104
2105
      if (typeof offset != 'object')         offsetBottom = offsetTop = offset
      if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
      if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2106

Chris Rebert's avatar
Chris Rebert committed
2107
2108
2109
      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
2110

Chris Rebert's avatar
Chris Rebert committed
2111
2112
      if (this.affixed === affix) return
      if (this.unpin != null) this.$element.css('top', '')
2113

Chris Rebert's avatar
Chris Rebert committed
2114
2115
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2116

Chris Rebert's avatar
Chris Rebert committed
2117
      this.$element.trigger(e)
2118

Chris Rebert's avatar
Chris Rebert committed
2119
      if (e.isDefaultPrevented()) return
2120

Chris Rebert's avatar
Chris Rebert committed
2121
2122
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2123

Chris Rebert's avatar
Chris Rebert committed
2124
2125
2126
2127
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger($.Event(affixType.replace('affix', 'affixed')))
2128

Chris Rebert's avatar
Chris Rebert committed
2129
2130
2131
2132
2133
      if (affix == 'bottom') {
        this.$element.offset({
          top: scrollHeight - this.$element.height() - offsetBottom
        })
      }
2134
    }
Mark Otto's avatar
Mark Otto committed
2135

2136

Chris Rebert's avatar
Chris Rebert committed
2137
2138
    // AFFIX PLUGIN DEFINITION
    // =======================
2139

Chris Rebert's avatar
Chris Rebert committed
2140
2141
2142
2143
2144
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.affix')
        var options = typeof option == 'object' && option
2145

Chris Rebert's avatar
Chris Rebert committed
2146
2147
2148
2149
        if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
2150

Chris Rebert's avatar
Chris Rebert committed
2151
    var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2152

Chris Rebert's avatar
Chris Rebert committed
2153
2154
    $.fn.affix             = Plugin
    $.fn.affix.Constructor = Affix
2155
2156


Chris Rebert's avatar
Chris Rebert committed
2157
2158
    // AFFIX NO CONFLICT
    // =================
2159

Chris Rebert's avatar
Chris Rebert committed
2160
2161
2162
2163
    $.fn.affix.noConflict = function () {
      $.fn.affix = old
      return this
    }
2164
2165


Chris Rebert's avatar
Chris Rebert committed
2166
2167
    // AFFIX DATA-API
    // ==============
2168

Chris Rebert's avatar
Chris Rebert committed
2169
2170
2171
2172
    $(window).on('load', function () {
      $('[data-spy="affix"]').each(function () {
        var $spy = $(this)
        var data = $spy.data()
2173

Chris Rebert's avatar
Chris Rebert committed
2174
        data.offset = data.offset || {}
2175

Chris Rebert's avatar
Chris Rebert committed
2176
2177
        if (data.offsetBottom) data.offset.bottom = data.offsetBottom
        if (data.offsetTop)    data.offset.top    = data.offsetTop
2178

Chris Rebert's avatar
Chris Rebert committed
2179
2180
        Plugin.call($spy, data)
      })
2181
    })
Chris Rebert's avatar
Chris Rebert committed
2182

Mark Otto's avatar
Mark Otto committed
2183
2184
  })

Chris Rebert's avatar
Chris Rebert committed
2185
}();